network.go 4.9 KB

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