network.go 5.7 KB

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