network.go 5.0 KB

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