| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 | package mainimport (	"log"	"net/http"	"strconv"	"imuslab.com/arozos/mod/common"	network "imuslab.com/arozos/mod/network"	mdns "imuslab.com/arozos/mod/network/mdns"	"imuslab.com/arozos/mod/network/netstat"	ssdp "imuslab.com/arozos/mod/network/ssdp"	upnp "imuslab.com/arozos/mod/network/upnp"	prout "imuslab.com/arozos/mod/prouter"	"imuslab.com/arozos/mod/www")var (	MDNS *mdns.MDNSHost	UPNP *upnp.UPnPClient	SSDP *ssdp.SSDPHost)func NetworkServiceInit() {	log.Println("Starting ArOZ Network Services")	//Create a router that allow users with System Setting access to access these api endpoints	router := prout.NewModuleRouter(prout.RouterOption{		ModuleName:  "System Setting",		AdminOnly:   false,		UserHandler: userHandler,		DeniedHandler: func(w http.ResponseWriter, r *http.Request) {			common.SendErrorResponse(w, "Permission Denied")		},	})	/*		Standard Network Utilties	*/	//Register handler endpoints	if *allow_hardware_management {		router.HandleFunc("/system/network/getNICinfo", network.GetNICInfo)		router.HandleFunc("/system/network/getPing", network.GetPing)		//Register as a system setting		registerSetting(settingModule{			Name:     "Network Info",			Desc:     "System Information",			IconPath: "SystemAO/network/img/ethernet.png",			Group:    "Network",			StartDir: "SystemAO/network/hardware.html",		})	}	router.HandleFunc("/system/network/getNICUsage", netstat.HandleGetNetworkInterfaceStats)	//Start the services that depends on network interface	StartNetworkServices()	//Start the port forward configuration interface	portForwardInit()	//Start userhomepage if enabled	//Handle user webroot routings if homepage is enabled	if *allow_homepage {		userWwwHandler = www.NewWebRootHandler(www.Options{			UserHandler: userHandler,			Database:    sysdb,		})		router.HandleFunc("/system/network/www/toggle", userWwwHandler.HandleToggleHomepage)		router.HandleFunc("/system/network/www/webRoot", userWwwHandler.HandleSetWebRoot)		//Register as a system setting		registerSetting(settingModule{			Name:     "Personal Page",			Desc:     "Personal Web Page",			IconPath: "SystemAO/www/img/homepage.png",			Group:    "Network",			StartDir: "SystemAO/www/config.html",		})	}}func StartNetworkServices() {	/*		MDNS Services	*/	if *allow_mdns {		m, err := mdns.NewMDNS(mdns.NetworkHost{			HostName:     *host_name + "_" + deviceUUID, //To handle more than one identical model within the same network, this must be unique			Port:         *listen_port,			Domain:       "arozos.com",			Model:        deviceModel,			UUID:         deviceUUID,			Vendor:       deviceVendor,			BuildVersion: build_version,			MinorVersion: internal_version,		})		if err != nil {			log.Println("MDNS Startup Failed: " + err.Error() + ". Running in Offline Mode.")		} else {			MDNS = m		}	}	/*		SSDP Discovery Services	*/	if *allow_ssdp {		//Get outbound ip		obip, err := network.GetOutboundIP()		if err != nil {			log.Println("SSDP Startup Failed: " + err.Error() + ". Running in Offline Mode.")		} else {			thisIp := obip.String()			adv, err := ssdp.NewSSDPHost(thisIp, *listen_port, "system/ssdp.xml", ssdp.SSDPOption{				URLBase:   "http://" + thisIp + ":" + strconv.Itoa(*listen_port), //This must be http if used as local hosting devices				Hostname:  *host_name,				Vendor:    deviceVendor,				VendorURL: deviceVendorURL,				ModelName: deviceModel,				ModelDesc: deviceModelDesc,				UUID:      deviceUUID,				Serial:    "generic",			})			if err != nil {				log.Println("SSDP Startup Failed: " + err.Error() + ". Running in Offline Mode.")			} else {				//OK! Start SSDP Service				SSDP = adv				SSDP.Start()			}		}	}	/*		UPNP / Setup automatic port forwarding	*/	if *allow_upnp {		var u *upnp.UPnPClient		var err error = nil		if *use_tls {			u, err = upnp.NewUPNPClient(*tls_listen_port, *host_name+"-https")		} else {			u, err = upnp.NewUPNPClient(*listen_port, *host_name+"-http")		}		if err != nil {			log.Println("UPnP Startup Failed: " + err.Error())		} else {			//Bind the http port if running in https and http server is not disabled			if *use_tls && !*disable_http {				u.ForwardPort(*listen_port, *host_name+"-http")			}			UPNP = u			//Register nightly listener for upnp renew			nightlyManager.RegisterNightlyTask(func() {				UPNP.RenewForwardRules()			})			//Show a tip for success port forward			connectionEndpoint := UPNP.ExternalIP + ":" + strconv.Itoa(*listen_port)			obip, err := network.GetOutboundIP()			obipstring := "[Outbound IP]"			if err != nil {			} else {				obipstring = obip.String()			}			localEndpoint := obipstring + ":" + strconv.Itoa(*listen_port)			log.Println("Automatic Port Forwarding Completed. Forwarding all request from " + connectionEndpoint + " to " + localEndpoint)		}	}}func StopNetworkServices() {	//log.Println("Shutting Down Network Services...")	//Shutdown uPNP service if enabled	if *allow_upnp {		log.Println("\r- Shutting down uPNP service")		UPNP.Close()	}	//Shutdown SSDP service if enabled	if *allow_ssdp {		log.Println("\r- Shutting down SSDP service")		SSDP.Close()	}	//Shutdown MDNS if enabled	if *allow_mdns {		log.Println("\r- Shutting down MDNS service")		MDNS.Close()	}}
 |