main.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. package main
  2. import (
  3. "database/sql"
  4. "encoding/json"
  5. "flag"
  6. "fmt"
  7. "html/template"
  8. "log"
  9. "net/http"
  10. "os"
  11. "os/signal"
  12. "strings"
  13. "syscall"
  14. _ "github.com/mattn/go-sqlite3"
  15. )
  16. type Config struct {
  17. Host string
  18. Port string
  19. Database string
  20. RootPwd string
  21. LogDir string
  22. TmplDir string
  23. ResourcesDir string
  24. SessionTTL int64
  25. }
  26. var (
  27. Cfg *Config
  28. Db *sql.DB
  29. SessPoll *SessionPoll
  30. TmplFuncMap template.FuncMap
  31. Srv *http.Server
  32. Sender *MailSender
  33. SysSetting Setting
  34. )
  35. func loadConfig() *Config {
  36. var (
  37. cfgfile string
  38. cfg *Config = &Config{}
  39. )
  40. flag.StringVar(&cfgfile, "c", "", "config file")
  41. flag.Parse()
  42. if cfgfile == "" {
  43. log.Fatalf("Usage: %s -c <config file>\n", os.Args[0])
  44. }
  45. file, err := os.OpenFile(cfgfile, os.O_RDONLY, 0644)
  46. if err != nil {
  47. log.Fatal(err)
  48. }
  49. decoder := json.NewDecoder(file)
  50. if err = decoder.Decode(cfg); err != nil {
  51. log.Fatal(err)
  52. }
  53. if cfg.Port == "" {
  54. log.Fatalf("Port is empty!\n")
  55. }
  56. if cfg.Database == "" {
  57. log.Fatalf("Database is empty!\n")
  58. }
  59. if cfg.RootPwd == "" {
  60. log.Fatalf("RootPwd is empty!\n")
  61. }
  62. if cfg.LogDir == "" {
  63. log.Fatalf("LogDir is empty!\n")
  64. }
  65. if cfg.TmplDir == "" {
  66. log.Fatalf("TmplDir is empty!\n")
  67. }
  68. if cfg.ResourcesDir == "" {
  69. log.Fatalf("ResourcesDir is empty!\n")
  70. }
  71. if cfg.SessionTTL == 0 {
  72. cfg.SessionTTL = 900
  73. }
  74. return cfg
  75. }
  76. func waitSignal() {
  77. ch := make(chan os.Signal, 1)
  78. signal.Notify(ch, syscall.SIGUSR1)
  79. signal.Notify(ch, syscall.SIGQUIT)
  80. for {
  81. sig := <-ch
  82. switch sig {
  83. //重启
  84. case syscall.SIGUSR1:
  85. close(ch)
  86. if Srv != nil {
  87. Srv.Close()
  88. }
  89. syscall.Exec(os.Args[0], os.Args[1:], nil)
  90. //退出
  91. case syscall.SIGQUIT:
  92. close(ch)
  93. if Srv != nil {
  94. Srv.Close()
  95. }
  96. os.Exit(0)
  97. }
  98. }
  99. }
  100. func openDatabase(dbfile string) *sql.DB {
  101. db, err := sql.Open("sqlite3", dbfile)
  102. if err != nil {
  103. log.Fatalf("sql.Open() Error: %s\n", err.Error())
  104. }
  105. db.Exec(Sql_Table_Syscfg)
  106. db.Exec(Sql_Table_Accounts)
  107. db.Exec(Sql_Table_Rediscfg)
  108. db.Exec(Sql_Table_Syslog)
  109. db.Exec(Sql_Index_Syslog)
  110. db.Exec(Sql_Table_Statuslog)
  111. db.Exec(Sql_Table_Warnlog)
  112. db.Exec(Sql_Table_Processlog)
  113. db.Exec(Sql_Values_Accounts)
  114. return db
  115. }
  116. func loadSystemSetting() map[string]string {
  117. }
  118. func start_http_server() *http.Server {
  119. handle := http.NewServeMux()
  120. //登录
  121. handle.HandleFunc("/login", login_index)
  122. //首页
  123. handle.HandleFunc("/", index_default)
  124. handle.HandleFunc("/index/stats", index_stats)
  125. handle.HandleFunc("/index/info", index_info)
  126. //用户操作
  127. handle.HandleFunc("/profile/logout", profile_logout)
  128. handle.HandleFunc("/profile/passwd", profile_passwd)
  129. //配置-redis
  130. handle.HandleFunc("/syscfg/redis", syscfg_redis)
  131. handle.HandleFunc("/syscfg/redis_list", syscfg_redis_list)
  132. handle.HandleFunc("/syscfg/redis_get", syscfg_redis_get)
  133. handle.HandleFunc("/syscfg/redis_set", syscfg_redis_set)
  134. handle.HandleFunc("/syscfg/redis_del", syscfg_redis_del)
  135. //配置-报警
  136. handle.HandleFunc("/syscfg/warn", syscfg_warn)
  137. handle.HandleFunc("/syscfg/warn_get", syscfg_warn_get)
  138. handle.HandleFunc("/syscfg/warn_set", syscfg_warn_set)
  139. //配置-账号
  140. handle.HandleFunc("/syscfg/account", syscfg_account)
  141. handle.HandleFunc("/syscfg/account_list", syscfg_account_list)
  142. handle.HandleFunc("/syscfg/account_get", syscfg_account_get)
  143. handle.HandleFunc("/syscfg/account_set", syscfg_account_set)
  144. handle.HandleFunc("/syscfg/account_del", syscfg_account_del)
  145. handle.HandleFunc("/syscfg/account_reset_pwd", syscfg_account_reset_pwd)
  146. //配置-杂项
  147. handle.HandleFunc("/syscfg/misc", syscfg_misc)
  148. handle.HandleFunc("/syscfg/misc_get", syscfg_misc_get)
  149. handle.HandleFunc("/syscfg/misc_set", syscfg_misc_set)
  150. //日志-报警
  151. handle.HandleFunc("/log/warn", log_warn)
  152. handle.HandleFunc("/log/warn_list", log_warn_list)
  153. //日志-扩容
  154. handle.HandleFunc("/log/autoprocess", log_autoprocess)
  155. handle.HandleFunc("/log/autoprocess_list", log_autoprocess_list)
  156. //日志-系统错误
  157. handle.HandleFunc("/log/syslog", log_syslog)
  158. handle.HandleFunc("/log/syslog_list", log_syslog_list)
  159. //日志-后台操作
  160. handle.HandleFunc("/log/account", log_account)
  161. handle.HandleFunc("/log/account_list", log_account_list)
  162. //资源文件
  163. handle.Handle("/resources/", http.StripPrefix("/resources/", http.FileServer(http.Dir(Cfg.ResourcesDir))))
  164. //启动HTTP服务
  165. srv := &http.Server{
  166. Addr: fmt.Sprintf("%s:%s", Cfg.Host, Cfg.Port),
  167. Handler: handle,
  168. }
  169. go func(s *http.Server) {
  170. if err := s.ListenAndServe(); err != nil {
  171. log.Fatal(err)
  172. }
  173. }(srv)
  174. return srv
  175. }
  176. func main() {
  177. //加载基础配置
  178. Cfg = loadConfig()
  179. //连接DB
  180. Db = openDatabase(Cfg.Database)
  181. defer Db.Close()
  182. //创建HTTP会话池
  183. SessPoll = NewSessionPoll(Cfg.SessionTTL)
  184. //添加HTML模板函数
  185. TmplFuncMap = make(template.FuncMap)
  186. TmplFuncMap["has_prefix"] = strings.HasPrefix
  187. //从DB加载业务配置
  188. SysSetting = NewSetting()
  189. SysSetting.Load()
  190. //开始HTTP服务
  191. Srv = start_http_server()
  192. //开始监控Redis状态
  193. go monitor_loop()
  194. //开始处理邮件发送队列
  195. Sender = NewMailSender()
  196. go Sender.Loop()
  197. //监听信号
  198. waitSignal()
  199. }