start.go 6.4 KB

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