main.go 7.5 KB

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