1
0

start.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. package main
  2. import (
  3. "log"
  4. "net/http"
  5. "os"
  6. "strconv"
  7. "strings"
  8. "time"
  9. "imuslab.com/zoraxy/mod/acme"
  10. "imuslab.com/zoraxy/mod/auth"
  11. "imuslab.com/zoraxy/mod/database"
  12. "imuslab.com/zoraxy/mod/dynamicproxy/redirection"
  13. "imuslab.com/zoraxy/mod/ganserv"
  14. "imuslab.com/zoraxy/mod/geodb"
  15. "imuslab.com/zoraxy/mod/mdns"
  16. "imuslab.com/zoraxy/mod/netstat"
  17. "imuslab.com/zoraxy/mod/pathrule"
  18. "imuslab.com/zoraxy/mod/sshprox"
  19. "imuslab.com/zoraxy/mod/statistic"
  20. "imuslab.com/zoraxy/mod/statistic/analytic"
  21. "imuslab.com/zoraxy/mod/tcpprox"
  22. "imuslab.com/zoraxy/mod/tlscert"
  23. "imuslab.com/zoraxy/mod/webserv"
  24. )
  25. /*
  26. Startup Sequence
  27. This function starts the startup sequence of all
  28. required modules
  29. */
  30. var (
  31. /*
  32. MDNS related
  33. */
  34. previousmdnsScanResults = []*mdns.NetworkHost{}
  35. mdnsTickerStop chan bool
  36. )
  37. func startupSequence() {
  38. //Create database
  39. db, err := database.NewDatabase("sys.db", false)
  40. if err != nil {
  41. log.Fatal(err)
  42. }
  43. sysdb = db
  44. //Create tables for the database
  45. sysdb.NewTable("settings")
  46. //Create tmp folder and conf folder
  47. os.MkdirAll("./tmp", 0775)
  48. os.MkdirAll("./conf/proxy/", 0775)
  49. //Create an auth agent
  50. sessionKey, err := auth.GetSessionKey(sysdb)
  51. if err != nil {
  52. log.Fatal(err)
  53. }
  54. authAgent = auth.NewAuthenticationAgent(name, []byte(sessionKey), sysdb, true, func(w http.ResponseWriter, r *http.Request) {
  55. //Not logged in. Redirecting to login page
  56. http.Redirect(w, r, ppf("/login.html"), http.StatusTemporaryRedirect)
  57. })
  58. //Create a TLS certificate manager
  59. tlsCertManager, err = tlscert.NewManager("./conf/certs", development)
  60. if err != nil {
  61. panic(err)
  62. }
  63. //Create a redirection rule table
  64. redirectTable, err = redirection.NewRuleTable("./conf/redirect")
  65. if err != nil {
  66. panic(err)
  67. }
  68. //Create a geodb store
  69. geodbStore, err = geodb.NewGeoDb(sysdb, &geodb.StoreOptions{
  70. AllowSlowIpv4LookUp: !*enableHighSpeedGeoIPLookup,
  71. AllowSloeIpv6Lookup: !*enableHighSpeedGeoIPLookup,
  72. })
  73. if err != nil {
  74. panic(err)
  75. }
  76. //Create a statistic collector
  77. statisticCollector, err = statistic.NewStatisticCollector(statistic.CollectorOption{
  78. Database: sysdb,
  79. })
  80. if err != nil {
  81. panic(err)
  82. }
  83. //Create a netstat buffer
  84. netstatBuffers, err = netstat.NewNetStatBuffer(300)
  85. if err != nil {
  86. log.Println("Failed to load network statistic info")
  87. panic(err)
  88. }
  89. /*
  90. Path Rules
  91. This section of starutp script start the path rules where
  92. user can define their own routing logics
  93. */
  94. pathRuleHandler = pathrule.NewPathRuleHandler(&pathrule.Options{
  95. Enabled: false,
  96. ConfigFolder: "./conf/rules/pathrules",
  97. })
  98. /*
  99. MDNS Discovery Service
  100. This discover nearby ArozOS Nodes or other services
  101. that provide mDNS discovery with domain (e.g. Synology NAS)
  102. */
  103. if *allowMdnsScanning {
  104. portInt, err := strconv.Atoi(strings.Split(handler.Port, ":")[1])
  105. if err != nil {
  106. portInt = 8000
  107. }
  108. mdnsScanner, err = mdns.NewMDNS(mdns.NetworkHost{
  109. HostName: "zoraxy_" + nodeUUID,
  110. Port: portInt,
  111. Domain: "zoraxy.arozos.com",
  112. Model: "Network Gateway",
  113. UUID: nodeUUID,
  114. Vendor: "imuslab.com",
  115. BuildVersion: version,
  116. }, "")
  117. if err != nil {
  118. log.Println("Unable to startup mDNS service. Disabling mDNS services")
  119. } else {
  120. //Start initial scanning
  121. go func() {
  122. hosts := mdnsScanner.Scan(30, "")
  123. previousmdnsScanResults = hosts
  124. log.Println("mDNS Startup scan completed")
  125. }()
  126. //Create a ticker to update mDNS results every 5 minutes
  127. ticker := time.NewTicker(15 * time.Minute)
  128. stopChan := make(chan bool)
  129. go func() {
  130. for {
  131. select {
  132. case <-stopChan:
  133. ticker.Stop()
  134. case <-ticker.C:
  135. hosts := mdnsScanner.Scan(30, "")
  136. previousmdnsScanResults = hosts
  137. log.Println("mDNS scan result updated")
  138. }
  139. }
  140. }()
  141. mdnsTickerStop = stopChan
  142. }
  143. }
  144. /*
  145. Global Area Network
  146. Require zerotier token to work
  147. */
  148. usingZtAuthToken := *ztAuthToken
  149. if usingZtAuthToken == "" {
  150. usingZtAuthToken, err = ganserv.TryLoadorAskUserForAuthkey()
  151. if err != nil {
  152. log.Println("Failed to load ZeroTier controller API authtoken")
  153. }
  154. }
  155. ganManager = ganserv.NewNetworkManager(&ganserv.NetworkManagerOptions{
  156. AuthToken: usingZtAuthToken,
  157. ApiPort: *ztAPIPort,
  158. Database: sysdb,
  159. })
  160. //Create WebSSH Manager
  161. webSshManager = sshprox.NewSSHProxyManager()
  162. //Create TCP Proxy Manager
  163. tcpProxyManager = tcpprox.NewTCProxy(&tcpprox.Options{
  164. Database: sysdb,
  165. AccessControlHandler: geodbStore.AllowConnectionAccess,
  166. })
  167. //Create WoL MAC storage table
  168. sysdb.NewTable("wolmac")
  169. //Create an email sender if SMTP config exists
  170. sysdb.NewTable("smtp")
  171. EmailSender = loadSMTPConfig()
  172. //Create an analytic loader
  173. AnalyticLoader = analytic.NewDataLoader(sysdb, statisticCollector)
  174. /*
  175. ACME API
  176. Obtaining certificates from ACME Server
  177. */
  178. //Create a table just to store acme related preferences
  179. sysdb.NewTable("acmepref")
  180. acmeHandler = initACME()
  181. acmeAutoRenewer, err = acme.NewAutoRenewer("./conf/acme_conf.json", "./conf/certs/", int64(*acmeAutoRenewInterval), acmeHandler)
  182. if err != nil {
  183. log.Fatal(err)
  184. }
  185. /*
  186. Static Web Server
  187. Start the static web server
  188. */
  189. staticWebServer = webserv.NewWebServer(&webserv.WebServerOptions{
  190. Sysdb: sysdb,
  191. Port: "5487", //Default Port
  192. WebRoot: *staticWebServerRoot,
  193. EnableDirectoryListing: true,
  194. EnableWebDirManager: *allowWebFileManager,
  195. })
  196. //Restore the web server to previous shutdown state
  197. staticWebServer.RestorePreviousState()
  198. }
  199. // This sequence start after everything is initialized
  200. func finalSequence() {
  201. //Start ACME renew agent
  202. acmeRegisterSpecialRoutingRule()
  203. }