network.go 4.1 KB

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