main.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "os"
  7. "os/signal"
  8. "syscall"
  9. _ "unsafe"
  10. "x-ui/config"
  11. "x-ui/database"
  12. "x-ui/logger"
  13. "x-ui/v2ui"
  14. "x-ui/web"
  15. "x-ui/web/global"
  16. "x-ui/web/service"
  17. "github.com/op/go-logging"
  18. )
  19. func runWebServer() {
  20. log.Printf("%v %v", config.GetName(), config.GetVersion())
  21. switch config.GetLogLevel() {
  22. case config.Debug:
  23. logger.InitLogger(logging.DEBUG)
  24. case config.Info:
  25. logger.InitLogger(logging.INFO)
  26. case config.Warn:
  27. logger.InitLogger(logging.WARNING)
  28. case config.Error:
  29. logger.InitLogger(logging.ERROR)
  30. default:
  31. log.Fatal("unknown log level:", config.GetLogLevel())
  32. }
  33. err := database.InitDB(config.GetDBPath())
  34. if err != nil {
  35. log.Fatal(err)
  36. }
  37. var server *web.Server
  38. server = web.NewServer()
  39. global.SetWebServer(server)
  40. err = server.Start()
  41. if err != nil {
  42. log.Println(err)
  43. return
  44. }
  45. sigCh := make(chan os.Signal, 1)
  46. //信号量捕获处理
  47. signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGTERM, syscall.SIGKILL)
  48. for {
  49. sig := <-sigCh
  50. switch sig {
  51. case syscall.SIGHUP:
  52. err := server.Stop()
  53. if err != nil {
  54. logger.Warning("stop server err:", err)
  55. }
  56. server = web.NewServer()
  57. global.SetWebServer(server)
  58. err = server.Start()
  59. if err != nil {
  60. log.Println(err)
  61. return
  62. }
  63. default:
  64. server.Stop()
  65. return
  66. }
  67. }
  68. }
  69. func resetSetting() {
  70. err := database.InitDB(config.GetDBPath())
  71. if err != nil {
  72. fmt.Println(err)
  73. return
  74. }
  75. settingService := service.SettingService{}
  76. err = settingService.ResetSettings()
  77. if err != nil {
  78. fmt.Println("reset setting failed:", err)
  79. } else {
  80. fmt.Println("reset setting success")
  81. }
  82. }
  83. func showSetting(show bool) {
  84. if show {
  85. settingService := service.SettingService{}
  86. port, err := settingService.GetPort()
  87. if err != nil {
  88. fmt.Println("get current port fialed,error info:", err)
  89. }
  90. userService := service.UserService{}
  91. userModel, err := userService.GetFirstUser()
  92. if err != nil {
  93. fmt.Println("get current user info failed,error info:", err)
  94. }
  95. username := userModel.Username
  96. userpasswd := userModel.Password
  97. if (username == "") || (userpasswd == "") {
  98. fmt.Println("current username or password is empty")
  99. }
  100. fmt.Println("current pannel settings as follows:")
  101. fmt.Println("username:", username)
  102. fmt.Println("userpasswd:", userpasswd)
  103. fmt.Println("port:", port)
  104. }
  105. }
  106. func updateTgbotEnableSts(status bool) {
  107. settingService := service.SettingService{}
  108. currentTgSts, err := settingService.GetTgbotenabled()
  109. if err != nil {
  110. fmt.Println(err)
  111. return
  112. }
  113. logger.Infof("current enabletgbot status[%v],need update to status[%v]", currentTgSts, status)
  114. if currentTgSts != status {
  115. err := settingService.SetTgbotenabled(status)
  116. if err != nil {
  117. fmt.Println(err)
  118. return
  119. } else {
  120. logger.Infof("SetTgbotenabled[%v] success", status)
  121. }
  122. }
  123. return
  124. }
  125. func updateTgbotSetting(tgBotToken string, tgBotChatid int, tgBotRuntime string) {
  126. err := database.InitDB(config.GetDBPath())
  127. if err != nil {
  128. fmt.Println(err)
  129. return
  130. }
  131. settingService := service.SettingService{}
  132. if tgBotToken != "" {
  133. err := settingService.SetTgBotToken(tgBotToken)
  134. if err != nil {
  135. fmt.Println(err)
  136. return
  137. } else {
  138. logger.Info("updateTgbotSetting tgBotToken success")
  139. }
  140. }
  141. if tgBotRuntime != "" {
  142. err := settingService.SetTgbotRuntime(tgBotRuntime)
  143. if err != nil {
  144. fmt.Println(err)
  145. return
  146. } else {
  147. logger.Infof("updateTgbotSetting tgBotRuntime[%s] success", tgBotRuntime)
  148. }
  149. }
  150. if tgBotChatid != 0 {
  151. err := settingService.SetTgBotChatId(tgBotChatid)
  152. if err != nil {
  153. fmt.Println(err)
  154. return
  155. } else {
  156. logger.Info("updateTgbotSetting tgBotChatid success")
  157. }
  158. }
  159. }
  160. func updateSetting(port int, username string, password string) {
  161. err := database.InitDB(config.GetDBPath())
  162. if err != nil {
  163. fmt.Println(err)
  164. return
  165. }
  166. settingService := service.SettingService{}
  167. if port > 0 {
  168. err := settingService.SetPort(port)
  169. if err != nil {
  170. fmt.Println("set port failed:", err)
  171. } else {
  172. fmt.Printf("set port %v success", port)
  173. }
  174. }
  175. if username != "" || password != "" {
  176. userService := service.UserService{}
  177. err := userService.UpdateFirstUser(username, password)
  178. if err != nil {
  179. fmt.Println("set username and password failed:", err)
  180. } else {
  181. fmt.Println("set username and password success")
  182. }
  183. }
  184. }
  185. func main() {
  186. if len(os.Args) < 2 {
  187. runWebServer()
  188. return
  189. }
  190. var showVersion bool
  191. flag.BoolVar(&showVersion, "v", false, "show version")
  192. runCmd := flag.NewFlagSet("run", flag.ExitOnError)
  193. v2uiCmd := flag.NewFlagSet("v2-ui", flag.ExitOnError)
  194. var dbPath string
  195. v2uiCmd.StringVar(&dbPath, "db", "/etc/v2-ui/v2-ui.db", "set v2-ui db file path")
  196. settingCmd := flag.NewFlagSet("setting", flag.ExitOnError)
  197. var port int
  198. var username string
  199. var password string
  200. var tgbottoken string
  201. var tgbotchatid int
  202. var enabletgbot bool
  203. var tgbotRuntime string
  204. var reset bool
  205. var show bool
  206. settingCmd.BoolVar(&reset, "reset", false, "reset all settings")
  207. settingCmd.BoolVar(&show, "show", false, "show current settings")
  208. settingCmd.IntVar(&port, "port", 0, "set panel port")
  209. settingCmd.StringVar(&username, "username", "", "set login username")
  210. settingCmd.StringVar(&password, "password", "", "set login password")
  211. settingCmd.StringVar(&tgbottoken, "tgbottoken", "", "set telegrame bot token")
  212. settingCmd.StringVar(&tgbotRuntime, "tgbotRuntime", "", "set telegrame bot cron time")
  213. settingCmd.IntVar(&tgbotchatid, "tgbotchatid", 0, "set telegrame bot chat id")
  214. settingCmd.BoolVar(&enabletgbot, "enabletgbot", false, "enable telegram bot notify")
  215. oldUsage := flag.Usage
  216. flag.Usage = func() {
  217. oldUsage()
  218. fmt.Println()
  219. fmt.Println("Commands:")
  220. fmt.Println(" run run web panel")
  221. fmt.Println(" v2-ui migrate form v2-ui")
  222. fmt.Println(" setting set settings")
  223. }
  224. flag.Parse()
  225. if showVersion {
  226. fmt.Println(config.GetVersion())
  227. return
  228. }
  229. switch os.Args[1] {
  230. case "run":
  231. err := runCmd.Parse(os.Args[2:])
  232. if err != nil {
  233. fmt.Println(err)
  234. return
  235. }
  236. runWebServer()
  237. case "v2-ui":
  238. err := v2uiCmd.Parse(os.Args[2:])
  239. if err != nil {
  240. fmt.Println(err)
  241. return
  242. }
  243. err = v2ui.MigrateFromV2UI(dbPath)
  244. if err != nil {
  245. fmt.Println("migrate from v2-ui failed:", err)
  246. }
  247. case "setting":
  248. err := settingCmd.Parse(os.Args[2:])
  249. if err != nil {
  250. fmt.Println(err)
  251. return
  252. }
  253. if reset {
  254. resetSetting()
  255. } else {
  256. updateSetting(port, username, password)
  257. }
  258. if show {
  259. showSetting(show)
  260. }
  261. if (tgbottoken != "") || (tgbotchatid != 0) || (tgbotRuntime != "") {
  262. updateTgbotSetting(tgbottoken, tgbotchatid, tgbotRuntime)
  263. }
  264. default:
  265. fmt.Println("except 'run' or 'v2-ui' or 'setting' subcommands")
  266. fmt.Println()
  267. runCmd.Usage()
  268. fmt.Println()
  269. v2uiCmd.Usage()
  270. fmt.Println()
  271. settingCmd.Usage()
  272. }
  273. }