main.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  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/sub"
  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. var subServer *sub.Server
  46. subServer = sub.NewServer()
  47. global.SetSubServer(subServer)
  48. err = subServer.Start()
  49. if err != nil {
  50. log.Println(err)
  51. return
  52. }
  53. sigCh := make(chan os.Signal, 1)
  54. // Trap shutdown signals
  55. signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGTERM)
  56. for {
  57. sig := <-sigCh
  58. switch sig {
  59. case syscall.SIGHUP:
  60. err := server.Stop()
  61. if err != nil {
  62. logger.Warning("stop server err:", err)
  63. }
  64. err = subServer.Stop()
  65. if err != nil {
  66. logger.Warning("stop server err:", err)
  67. }
  68. server = web.NewServer()
  69. global.SetWebServer(server)
  70. err = server.Start()
  71. if err != nil {
  72. log.Println(err)
  73. return
  74. }
  75. subServer = sub.NewServer()
  76. global.SetSubServer(subServer)
  77. err = subServer.Start()
  78. if err != nil {
  79. log.Println(err)
  80. return
  81. }
  82. default:
  83. server.Stop()
  84. subServer.Stop()
  85. return
  86. }
  87. }
  88. }
  89. func resetSetting() {
  90. err := database.InitDB(config.GetDBPath())
  91. if err != nil {
  92. fmt.Println(err)
  93. return
  94. }
  95. settingService := service.SettingService{}
  96. err = settingService.ResetSettings()
  97. if err != nil {
  98. fmt.Println("reset setting failed:", err)
  99. } else {
  100. fmt.Println("reset setting success")
  101. }
  102. }
  103. func showSetting(show bool) {
  104. if show {
  105. settingService := service.SettingService{}
  106. port, err := settingService.GetPort()
  107. if err != nil {
  108. fmt.Println("get current port failed,error info:", err)
  109. }
  110. userService := service.UserService{}
  111. userModel, err := userService.GetFirstUser()
  112. if err != nil {
  113. fmt.Println("get current user info failed,error info:", err)
  114. }
  115. username := userModel.Username
  116. userpasswd := userModel.Password
  117. if (username == "") || (userpasswd == "") {
  118. fmt.Println("current username or password is empty")
  119. }
  120. fmt.Println("current panel settings as follows:")
  121. fmt.Println("username:", username)
  122. fmt.Println("userpasswd:", userpasswd)
  123. fmt.Println("port:", port)
  124. }
  125. }
  126. func updateTgbotEnableSts(status bool) {
  127. settingService := service.SettingService{}
  128. currentTgSts, err := settingService.GetTgbotenabled()
  129. if err != nil {
  130. fmt.Println(err)
  131. return
  132. }
  133. logger.Infof("current enabletgbot status[%v],need update to status[%v]", currentTgSts, status)
  134. if currentTgSts != status {
  135. err := settingService.SetTgbotenabled(status)
  136. if err != nil {
  137. fmt.Println(err)
  138. return
  139. } else {
  140. logger.Infof("SetTgbotenabled[%v] success", status)
  141. }
  142. }
  143. }
  144. func updateTgbotSetting(tgBotToken string, tgBotChatid string, tgBotRuntime string) {
  145. err := database.InitDB(config.GetDBPath())
  146. if err != nil {
  147. fmt.Println(err)
  148. return
  149. }
  150. settingService := service.SettingService{}
  151. if tgBotToken != "" {
  152. err := settingService.SetTgBotToken(tgBotToken)
  153. if err != nil {
  154. fmt.Println(err)
  155. return
  156. } else {
  157. logger.Info("updateTgbotSetting tgBotToken success")
  158. }
  159. }
  160. if tgBotRuntime != "" {
  161. err := settingService.SetTgbotRuntime(tgBotRuntime)
  162. if err != nil {
  163. fmt.Println(err)
  164. return
  165. } else {
  166. logger.Infof("updateTgbotSetting tgBotRuntime[%s] success", tgBotRuntime)
  167. }
  168. }
  169. if tgBotChatid != "" {
  170. err := settingService.SetTgBotChatId(tgBotChatid)
  171. if err != nil {
  172. fmt.Println(err)
  173. return
  174. } else {
  175. logger.Info("updateTgbotSetting tgBotChatid success")
  176. }
  177. }
  178. }
  179. func updateSetting(port int, username string, password string) {
  180. err := database.InitDB(config.GetDBPath())
  181. if err != nil {
  182. fmt.Println(err)
  183. return
  184. }
  185. settingService := service.SettingService{}
  186. if port > 0 {
  187. err := settingService.SetPort(port)
  188. if err != nil {
  189. fmt.Println("set port failed:", err)
  190. } else {
  191. fmt.Printf("set port %v success", port)
  192. }
  193. }
  194. if username != "" || password != "" {
  195. userService := service.UserService{}
  196. err := userService.UpdateFirstUser(username, password)
  197. if err != nil {
  198. fmt.Println("set username and password failed:", err)
  199. } else {
  200. fmt.Println("set username and password success")
  201. }
  202. }
  203. }
  204. func migrateDb() {
  205. inboundService := service.InboundService{}
  206. err := database.InitDB(config.GetDBPath())
  207. if err != nil {
  208. log.Fatal(err)
  209. }
  210. fmt.Println("Start migrating database...")
  211. inboundService.MigrateDB()
  212. fmt.Println("Migration done!")
  213. }
  214. func removeSecret() {
  215. err := database.InitDB(config.GetDBPath())
  216. if err != nil {
  217. fmt.Println(err)
  218. return
  219. }
  220. userService := service.UserService{}
  221. err = userService.RemoveUserSecret()
  222. if err != nil {
  223. fmt.Println(err)
  224. }
  225. settingService := service.SettingService{}
  226. err = settingService.SetSecretStatus(false)
  227. if err != nil {
  228. fmt.Println(err)
  229. }
  230. }
  231. func main() {
  232. if len(os.Args) < 2 {
  233. runWebServer()
  234. return
  235. }
  236. var showVersion bool
  237. flag.BoolVar(&showVersion, "v", false, "show version")
  238. runCmd := flag.NewFlagSet("run", flag.ExitOnError)
  239. settingCmd := flag.NewFlagSet("setting", flag.ExitOnError)
  240. var port int
  241. var username string
  242. var password string
  243. var tgbottoken string
  244. var tgbotchatid string
  245. var enabletgbot bool
  246. var tgbotRuntime string
  247. var reset bool
  248. var show bool
  249. var remove_secret bool
  250. settingCmd.BoolVar(&reset, "reset", false, "reset all settings")
  251. settingCmd.BoolVar(&show, "show", false, "show current settings")
  252. settingCmd.IntVar(&port, "port", 0, "set panel port")
  253. settingCmd.StringVar(&username, "username", "", "set login username")
  254. settingCmd.StringVar(&password, "password", "", "set login password")
  255. settingCmd.StringVar(&tgbottoken, "tgbottoken", "", "set telegram bot token")
  256. settingCmd.StringVar(&tgbotRuntime, "tgbotRuntime", "", "set telegram bot cron time")
  257. settingCmd.StringVar(&tgbotchatid, "tgbotchatid", "", "set telegram bot chat id")
  258. settingCmd.BoolVar(&enabletgbot, "enabletgbot", false, "enable telegram bot notify")
  259. oldUsage := flag.Usage
  260. flag.Usage = func() {
  261. oldUsage()
  262. fmt.Println()
  263. fmt.Println("Commands:")
  264. fmt.Println(" run run web panel")
  265. fmt.Println(" migrate migrate form other/old x-ui")
  266. fmt.Println(" setting set settings")
  267. }
  268. flag.Parse()
  269. if showVersion {
  270. fmt.Println(config.GetVersion())
  271. return
  272. }
  273. switch os.Args[1] {
  274. case "run":
  275. err := runCmd.Parse(os.Args[2:])
  276. if err != nil {
  277. fmt.Println(err)
  278. return
  279. }
  280. runWebServer()
  281. case "migrate":
  282. migrateDb()
  283. case "setting":
  284. err := settingCmd.Parse(os.Args[2:])
  285. if err != nil {
  286. fmt.Println(err)
  287. return
  288. }
  289. if reset {
  290. resetSetting()
  291. } else {
  292. updateSetting(port, username, password)
  293. }
  294. if show {
  295. showSetting(show)
  296. }
  297. if (tgbottoken != "") || (tgbotchatid != "") || (tgbotRuntime != "") {
  298. updateTgbotSetting(tgbottoken, tgbotchatid, tgbotRuntime)
  299. }
  300. if remove_secret {
  301. removeSecret()
  302. }
  303. if enabletgbot {
  304. updateTgbotEnableSts(enabletgbot)
  305. }
  306. default:
  307. fmt.Println("except 'run' or 'setting' subcommands")
  308. fmt.Println()
  309. runCmd.Usage()
  310. fmt.Println()
  311. settingCmd.Usage()
  312. }
  313. }