Kaynağa Gözat

auto update script executed

tobychui 1 yıl önce
ebeveyn
işleme
cbba2182e5
6 değiştirilmiş dosya ile 6 ekleme ve 386 silme
  1. 0 6
      api.go
  2. 0 0
      deprecated/upnp.html
  3. 0 9
      main.go
  4. 0 146
      mod/upnp/upnp.go
  5. 0 219
      upnp.go
  6. 6 6
      web/index.html

+ 0 - 6
api.go

@@ -72,12 +72,6 @@ func initAPIs() {
 	authRouter.HandleFunc("/api/stats/summary", statisticCollector.HandleTodayStatLoad)
 	authRouter.HandleFunc("/api/stats/countries", HandleCountryDistrSummary)
 	authRouter.HandleFunc("/api/utm/list", HandleUptimeMonitorListing)
-	//Upnp
-	authRouter.HandleFunc("/api/upnp/discover", handleUpnpDiscover)
-	authRouter.HandleFunc("/api/upnp/list", handleListOfflineUpnpPorts)
-	authRouter.HandleFunc("/api/upnp/toggle", handleToggleUPnP)
-	authRouter.HandleFunc("/api/upnp/add", handleAddUpnpPort)
-	authRouter.HandleFunc("/api/upnp/remove", handleRemoveUpnpPort)
 
 	//If you got APIs to add, append them here
 }

+ 0 - 0
web/components/upnp.html → deprecated/upnp.html


+ 0 - 9
main.go

@@ -17,7 +17,6 @@ import (
 	"imuslab.com/zoraxy/mod/geodb"
 	"imuslab.com/zoraxy/mod/statistic"
 	"imuslab.com/zoraxy/mod/tlscert"
-	"imuslab.com/zoraxy/mod/upnp"
 	"imuslab.com/zoraxy/mod/uptime"
 )
 
@@ -36,7 +35,6 @@ var (
 	redirectTable      *redirection.RuleTable //Handle special redirection rule sets
 	geodbStore         *geodb.Store           //GeoIP database
 	statisticCollector *statistic.Collector   //Collecting statistic from visitors
-	upnpClient         *upnp.UPnPClient       //UPnP Client for poking holes
 	uptimeMonitor      *uptime.Monitor        //Uptime monitor service worker
 )
 
@@ -49,7 +47,6 @@ func SetupCloseHandler() {
 		log.Println("\r- Shutting down " + name)
 		geodbStore.Close()
 		statisticCollector.Close()
-		upnpClient.Close()
 
 		//Close database, final
 		sysdb.Close()
@@ -128,12 +125,6 @@ func main() {
 		panic(err)
 	}
 
-	//Create a upnp client
-	err = initUpnp()
-	if err != nil {
-		panic(err)
-	}
-
 	//Initiate management interface APIs
 	initAPIs()
 

+ 0 - 146
mod/upnp/upnp.go

@@ -1,146 +0,0 @@
-package upnp
-
-import (
-	"errors"
-	"log"
-	"sync"
-	"time"
-
-	"gitlab.com/NebulousLabs/go-upnp"
-)
-
-/*
-	uPNP Module
-
-	This module handles uPNP Connections to the gateway router and create a port forward entry
-	for the host system at the given port (set with -port paramter)
-*/
-
-type UPnPClient struct {
-	Connection    *upnp.IGD //UPnP conenction object
-	ExternalIP    string    //Storage of external IP address
-	RequiredPorts []int     //All the required ports will be recored
-	PolicyNames   sync.Map  //Name for the required port nubmer
-	RenewStopChan chan bool
-}
-
-func NewUPNPClient() (*UPnPClient, error) {
-	//Create uPNP forwarding in the NAT router
-	log.Println("Discovering UPnP router in Local Area Network...")
-	d, err := upnp.Discover()
-	if err != nil {
-		return &UPnPClient{}, err
-	}
-
-	// discover external IP
-	ip, err := d.ExternalIP()
-	if err != nil {
-		return &UPnPClient{}, err
-	}
-
-	//Create the final obejcts
-
-	ticker := time.NewTicker(6 * time.Hour)
-	stop := make(chan bool)
-	newUPnPObject := &UPnPClient{
-		Connection:    d,
-		ExternalIP:    ip,
-		RequiredPorts: []int{},
-		RenewStopChan: stop,
-	}
-	go func() {
-		defer ticker.Stop()
-		for {
-			select {
-			case <-stop:
-				return
-			case <-ticker.C:
-				newUPnPObject.RenewForwardRules()
-			}
-		}
-	}()
-
-	return newUPnPObject, nil
-}
-
-func (u *UPnPClient) ForwardPort(portNumber int, ruleName string) error {
-	log.Println("UPnP forwarding new port: ", portNumber, "for "+ruleName+" service")
-
-	//Check if port already forwarded
-	_, ok := u.PolicyNames.Load(portNumber)
-	if ok {
-		//Port already forward. Ignore this request
-		return errors.New("Port already forwarded")
-	}
-
-	// forward a port
-	err := u.Connection.Forward(uint16(portNumber), ruleName)
-	if err != nil {
-		return err
-	}
-
-	u.RequiredPorts = append(u.RequiredPorts, portNumber)
-	u.PolicyNames.Store(portNumber, ruleName)
-	return nil
-}
-
-func (u *UPnPClient) ClosePort(portNumber int) error {
-	//Check if port is opened
-	portOpened := false
-	newRequiredPort := []int{}
-	for _, thisPort := range u.RequiredPorts {
-		if thisPort != portNumber {
-			newRequiredPort = append(newRequiredPort, thisPort)
-		} else {
-			portOpened = true
-		}
-	}
-
-	if portOpened {
-		//Update the port list
-		u.RequiredPorts = newRequiredPort
-
-		// Close the port
-		log.Println("Closing UPnP Port Forward: ", portNumber)
-		err := u.Connection.Clear(uint16(portNumber))
-
-		//Delete the name registry
-		u.PolicyNames.Delete(portNumber)
-
-		if err != nil {
-			log.Println(err)
-			return err
-		}
-	}
-	return nil
-}
-
-// Renew forward rules, prevent router lease time from flushing the Upnp config
-func (u *UPnPClient) RenewForwardRules() {
-	portsToRenew := u.RequiredPorts
-	for _, thisPort := range portsToRenew {
-		ruleName, ok := u.PolicyNames.Load(thisPort)
-		if !ok {
-			continue
-		}
-		u.ClosePort(thisPort)
-		time.Sleep(100 * time.Millisecond)
-		u.ForwardPort(thisPort, ruleName.(string))
-	}
-	log.Println("UPnP Port Forward rule renew completed")
-}
-
-func (u *UPnPClient) Close() {
-	//Shutdown the default UPnP Object
-	if u != nil {
-		if u.RenewStopChan != nil {
-			u.RenewStopChan <- true
-		}
-		for _, portNumber := range u.RequiredPorts {
-			err := u.Connection.Clear(uint16(portNumber))
-			if err != nil {
-				log.Println(err)
-			}
-		}
-	}
-}

+ 0 - 219
upnp.go

@@ -1,219 +0,0 @@
-package main
-
-import (
-	"encoding/json"
-	"log"
-	"net/http"
-	"regexp"
-	"strconv"
-	"time"
-
-	"imuslab.com/zoraxy/mod/upnp"
-	"imuslab.com/zoraxy/mod/utils"
-)
-
-var upnpEnabled = false
-var preforwardMap map[int]string
-
-func initUpnp() error {
-	go func() {
-		//Let UPnP discovery run in background
-		var err error
-		upnpClient, err = upnp.NewUPNPClient()
-		if err != nil {
-			log.Println("UPnP router discover error: ", err.Error())
-			return
-		}
-
-		if upnpEnabled {
-			//Forward all the ports
-			for port, policyName := range preforwardMap {
-				upnpClient.ForwardPort(port, policyName)
-				log.Println("Upnp forwarding ", port, " for "+policyName)
-				time.Sleep(300 * time.Millisecond)
-			}
-		}
-	}()
-
-	//Check if the upnp was enabled
-	sysdb.NewTable("upnp")
-	sysdb.Read("upnp", "enabled", &upnpEnabled)
-
-	//Load all the ports from database
-	portsMap := map[int]string{}
-	sysdb.Read("upnp", "portmap", &portsMap)
-	preforwardMap = portsMap
-
-	return nil
-}
-
-func handleUpnpDiscover(w http.ResponseWriter, r *http.Request) {
-	restart, err := utils.PostPara(r, "restart")
-	if err != nil {
-		type UpnpInfo struct {
-			ExternalIp    string
-			RequiredPorts []int
-		}
-
-		if upnpClient == nil {
-			utils.SendErrorResponse(w, "No UPnP router discovered")
-			return
-		}
-
-		result := UpnpInfo{
-			ExternalIp:    upnpClient.ExternalIP,
-			RequiredPorts: upnpClient.RequiredPorts,
-		}
-
-		//Show if there is a upnpclient
-		js, _ := json.Marshal(result)
-		utils.SendJSONResponse(w, string(js))
-	} else {
-		if restart == "true" {
-			//Close the upnp client if exists
-			if upnpClient != nil {
-				saveForwardingPortsToDatabase()
-				upnpClient.Close()
-			}
-
-			//Restart a new one
-			initUpnp()
-
-			utils.SendOK(w)
-		}
-	}
-}
-
-//List the Upnp ports that is not currently forwarded
-func handleListOfflineUpnpPorts(w http.ResponseWriter, r *http.Request) {
-	js, _ := json.Marshal(preforwardMap)
-	utils.SendJSONResponse(w, string(js))
-}
-
-func handleToggleUPnP(w http.ResponseWriter, r *http.Request) {
-	newMode, err := utils.PostPara(r, "mode")
-	if err != nil {
-		//Send the current mode to client side
-		js, _ := json.Marshal(upnpEnabled)
-		utils.SendJSONResponse(w, string(js))
-	} else {
-		if newMode == "true" {
-			upnpEnabled = true
-			sysdb.Write("upnp", "enabled", true)
-
-			log.Println("UPnP Enabled. Forwarding all required ports")
-			//Mount all Upnp requests from preforward Map
-			for port, policyName := range preforwardMap {
-				upnpClient.ForwardPort(port, policyName)
-				log.Println("Upnp forwarding ", port, " for "+policyName)
-				time.Sleep(300 * time.Millisecond)
-			}
-
-			utils.SendOK(w)
-			return
-
-		} else if newMode == "false" {
-			upnpEnabled = false
-			sysdb.Write("upnp", "enabled", false)
-			log.Println("UPnP disabled. Closing all forwarded ports")
-			//Save the current forwarded ports
-			saveForwardingPortsToDatabase()
-
-			//Unmount all Upnp request
-			for _, port := range upnpClient.RequiredPorts {
-				upnpClient.ClosePort(port)
-				log.Println("UPnP port closed: ", port)
-				time.Sleep(300 * time.Millisecond)
-			}
-
-			//done
-			utils.SendOK(w)
-			return
-		}
-	}
-}
-
-func filterRFC2141(input string) string {
-	rfc2141 := regexp.MustCompile(`^[\w\-.!~*'()]*(\%[\da-fA-F]{2}[\w\-.!~*'()]*)*$`)
-	var result []rune
-	for _, char := range input {
-		if char <= 127 && rfc2141.MatchString(string(char)) {
-			result = append(result, char)
-		}
-	}
-	return string(result)
-}
-
-func handleAddUpnpPort(w http.ResponseWriter, r *http.Request) {
-	portString, err := utils.PostPara(r, "port")
-	if err != nil {
-		utils.SendErrorResponse(w, "invalid port given")
-		return
-	}
-
-	portNumber, err := strconv.Atoi(portString)
-	if err != nil {
-		utils.SendErrorResponse(w, "invalid port given")
-		return
-	}
-
-	policyName, err := utils.PostPara(r, "name")
-	if err != nil {
-		utils.SendErrorResponse(w, "invalid policy name")
-		return
-	}
-
-	policyName = filterRFC2141(policyName)
-
-	if upnpEnabled {
-		err = upnpClient.ForwardPort(portNumber, policyName)
-		if err != nil {
-			utils.SendErrorResponse(w, err.Error())
-			return
-		}
-	}
-
-	preforwardMap[portNumber] = policyName
-	saveForwardingPortsToDatabase()
-
-	utils.SendOK(w)
-}
-
-func handleRemoveUpnpPort(w http.ResponseWriter, r *http.Request) {
-	portString, err := utils.PostPara(r, "port")
-	if err != nil {
-		utils.SendErrorResponse(w, "invalid port given")
-		return
-	}
-
-	portNumber, err := strconv.Atoi(portString)
-	if err != nil {
-		utils.SendErrorResponse(w, "invalid port given")
-		return
-	}
-
-	if upnpEnabled {
-		upnpClient.ClosePort(portNumber)
-	}
-	delete(preforwardMap, portNumber)
-
-	saveForwardingPortsToDatabase()
-
-}
-
-func saveForwardingPortsToDatabase() {
-	//Move the sync map to map[int]string
-	m := make(map[int]string)
-	upnpClient.PolicyNames.Range(func(key, value interface{}) bool {
-		if k, ok := key.(int); ok {
-			if v, ok := value.(string); ok {
-				m[k] = v
-			}
-		}
-		return true
-	})
-
-	preforwardMap = m
-	sysdb.Write("upnp", "portmap", &preforwardMap)
-
-}

+ 6 - 6
web/index.html

@@ -55,16 +55,16 @@
                     <a class="item" tag="blacklist">
                         <i class="red ban icon"></i> Blacklist
                     </a>
-                    <a class="item" tag="upnp">
-                        <i class="blue exchange icon"></i> Port Forward
-                    </a>
                     <div class="ui divider menudivider">Bridging</div>
-                    <a class="item" tag="">
-                        <i class="remove icon"></i> TCP Proxy
+                    <a class="item" tag="gan">
+                        <i class="blue exchange icon"></i> Global Area Network
                     </a>
                     <a class="item" tag="">
                         <i class="remove icon"></i> HTTP over Websocket
                     </a>
+                    <a class="item" tag="">
+                        <i class="remove icon"></i> TCP Proxy
+                    </a>
                     <div class="ui divider menudivider">Others</div>
                     <a class="item" tag="utm">
                         <i class="green time icon"></i> Uptime Monitor
@@ -106,7 +106,7 @@
                 <div id="blacklist" class="functiontab" target="blacklist.html"></div>
 
                 <!-- UPnP based port fowarding -->
-                <div id="upnp" class="functiontab" target="upnp.html"></div>
+                <div id="gan" class="functiontab" target="gan.html"></div>
 
                 <!-- Up Time Monitor -->
                 <div id="utm" class="functiontab" target="uptime.html"></div>