network.go 5.1 KB

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