network.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. package main
  2. import (
  3. "net/http"
  4. "strconv"
  5. "imuslab.com/arozos/mod/common"
  6. network "imuslab.com/arozos/mod/network"
  7. mdns "imuslab.com/arozos/mod/network/mdns"
  8. "imuslab.com/arozos/mod/network/netstat"
  9. ssdp "imuslab.com/arozos/mod/network/ssdp"
  10. upnp "imuslab.com/arozos/mod/network/upnp"
  11. "imuslab.com/arozos/mod/network/websocket"
  12. prout "imuslab.com/arozos/mod/prouter"
  13. "imuslab.com/arozos/mod/www"
  14. )
  15. var (
  16. MDNS *mdns.MDNSHost
  17. UPNP *upnp.UPnPClient
  18. SSDP *ssdp.SSDPHost
  19. WebSocketRouter *websocket.Router
  20. )
  21. func NetworkServiceInit() {
  22. systemWideLogger.PrintAndLog("Network", "Starting ArOZ Network Services", nil)
  23. //Create a router that allow users with System Setting access to access these api endpoints
  24. router := prout.NewModuleRouter(prout.RouterOption{
  25. ModuleName: "System Setting",
  26. AdminOnly: false,
  27. UserHandler: userHandler,
  28. DeniedHandler: func(w http.ResponseWriter, r *http.Request) {
  29. common.SendErrorResponse(w, "Permission Denied")
  30. },
  31. })
  32. /*
  33. Standard Network Utilties
  34. */
  35. //Register handler endpoints
  36. if *allow_hardware_management {
  37. router.HandleFunc("/system/network/getNICinfo", network.GetNICInfo)
  38. router.HandleFunc("/system/network/getPing", network.GetPing)
  39. //Register as a system setting
  40. registerSetting(settingModule{
  41. Name: "Network Info",
  42. Desc: "System Information",
  43. IconPath: "SystemAO/network/img/ethernet.png",
  44. Group: "Network",
  45. StartDir: "SystemAO/network/hardware.html",
  46. })
  47. }
  48. router.HandleFunc("/system/network/getNICUsage", netstat.HandleGetNetworkInterfaceStats)
  49. //Start the services that depends on network interface
  50. StartNetworkServices()
  51. //Start the port forward configuration interface
  52. portForwardInit()
  53. //Start userhomepage if enabled
  54. //Handle user webroot routings if homepage is enabled
  55. if *allow_homepage {
  56. userWwwHandler = www.NewWebRootHandler(www.Options{
  57. UserHandler: userHandler,
  58. Database: sysdb,
  59. })
  60. router.HandleFunc("/system/network/www/toggle", userWwwHandler.HandleToggleHomepage)
  61. router.HandleFunc("/system/network/www/webRoot", userWwwHandler.HandleSetWebRoot)
  62. //Register as a system setting
  63. registerSetting(settingModule{
  64. Name: "Personal Page",
  65. Desc: "Personal Web Page",
  66. IconPath: "SystemAO/www/img/homepage.png",
  67. Group: "Network",
  68. StartDir: "SystemAO/www/config.html",
  69. })
  70. }
  71. userRouter := prout.NewModuleRouter(prout.RouterOption{
  72. AdminOnly: false,
  73. UserHandler: userHandler,
  74. DeniedHandler: func(w http.ResponseWriter, r *http.Request) {
  75. common.SendErrorResponse(w, "Permission Denied")
  76. },
  77. })
  78. WebSocketRouter = websocket.NewRouter()
  79. userRouter.HandleFunc("/system/ws", WebSocketRouter.HandleWebSocketRouting)
  80. }
  81. func StartNetworkServices() {
  82. /*
  83. MDNS Services
  84. */
  85. if *allow_mdns {
  86. m, err := mdns.NewMDNS(mdns.NetworkHost{
  87. HostName: *host_name + "_" + deviceUUID, //To handle more than one identical model within the same network, this must be unique
  88. Port: *listen_port,
  89. Domain: "arozos.com",
  90. Model: deviceModel,
  91. UUID: deviceUUID,
  92. Vendor: deviceVendor,
  93. BuildVersion: build_version,
  94. MinorVersion: internal_version,
  95. })
  96. if err != nil {
  97. systemWideLogger.PrintAndLog("Network", "MDNS Startup Failed. Running in Offline Mode.", err)
  98. } else {
  99. MDNS = m
  100. }
  101. }
  102. /*
  103. SSDP Discovery Services
  104. */
  105. if *allow_ssdp {
  106. //Get outbound ip
  107. obip, err := network.GetOutboundIP()
  108. if err != nil {
  109. systemWideLogger.PrintAndLog("Network", "SSDP Startup Failed. Running in Offline Mode.", err)
  110. } else {
  111. thisIp := obip.String()
  112. adv, err := ssdp.NewSSDPHost(thisIp, *listen_port, "system/ssdp.xml", ssdp.SSDPOption{
  113. URLBase: "http://" + thisIp + ":" + strconv.Itoa(*listen_port), //This must be http if used as local hosting devices
  114. Hostname: *host_name,
  115. Vendor: deviceVendor,
  116. VendorURL: deviceVendorURL,
  117. ModelName: deviceModel,
  118. ModelDesc: deviceModelDesc,
  119. UUID: deviceUUID,
  120. Serial: "generic",
  121. })
  122. if err != nil {
  123. systemWideLogger.PrintAndLog("Network", "SSDP Startup Failed. Running in Offline Mode.", err)
  124. } else {
  125. //OK! Start SSDP Service
  126. SSDP = adv
  127. SSDP.Start()
  128. }
  129. }
  130. }
  131. /*
  132. UPNP / Setup automatic port forwarding
  133. */
  134. if *allow_upnp {
  135. var u *upnp.UPnPClient
  136. var err error = nil
  137. if *use_tls {
  138. u, err = upnp.NewUPNPClient(*tls_listen_port, *host_name+"-https")
  139. } else {
  140. u, err = upnp.NewUPNPClient(*listen_port, *host_name+"-http")
  141. }
  142. if err != nil {
  143. systemWideLogger.PrintAndLog("Network", "UPnP Startup Failed: "+err.Error(), err)
  144. } else {
  145. //Bind the http port if running in https and http server is not disabled
  146. if *use_tls && !*disable_http {
  147. u.ForwardPort(*listen_port, *host_name+"-http")
  148. }
  149. UPNP = u
  150. //Register nightly listener for upnp renew
  151. nightlyManager.RegisterNightlyTask(func() {
  152. UPNP.RenewForwardRules()
  153. })
  154. //Show a tip for success port forward
  155. connectionEndpoint := UPNP.ExternalIP + ":" + strconv.Itoa(*listen_port)
  156. obip, err := network.GetOutboundIP()
  157. obipstring := "[Outbound IP]"
  158. if err != nil {
  159. } else {
  160. obipstring = obip.String()
  161. }
  162. localEndpoint := obipstring + ":" + strconv.Itoa(*listen_port)
  163. systemWideLogger.PrintAndLog("Network", "Automatic Port Forwarding Completed. Forwarding all request from "+connectionEndpoint+" to "+localEndpoint, nil)
  164. }
  165. }
  166. }
  167. func StopNetworkServices() {
  168. //systemWideLogger.PrintAndLog("Shutting Down Network Services...",nil)
  169. //Shutdown uPNP service if enabled
  170. if *allow_upnp {
  171. systemWideLogger.PrintAndLog("System", "<!> Shutting down uPNP service", nil)
  172. UPNP.Close()
  173. }
  174. //Shutdown SSDP service if enabled
  175. if *allow_ssdp {
  176. systemWideLogger.PrintAndLog("System", "<!> Shutting down SSDP service", nil)
  177. SSDP.Close()
  178. }
  179. //Shutdown MDNS if enabled
  180. if *allow_mdns {
  181. systemWideLogger.PrintAndLog("System", "<!> Shutting down MDNS service", nil)
  182. MDNS.Close()
  183. }
  184. }