main.go 8.0 KB

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