main.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  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. // Trap shutdown signals
  47. signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGTERM)
  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 failed,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 panel 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 string, 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 != "" {
  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 migrateDb() {
  186. inboundService := service.InboundService{}
  187. err := database.InitDB(config.GetDBPath())
  188. if err != nil {
  189. log.Fatal(err)
  190. }
  191. fmt.Println("Start migrating database...")
  192. inboundService.MigrateDB()
  193. fmt.Println("Migration done!")
  194. }
  195. func removeSecret() {
  196. err := database.InitDB(config.GetDBPath())
  197. if err != nil {
  198. fmt.Println(err)
  199. return
  200. }
  201. userService := service.UserService{}
  202. err = userService.RemoveUserSecret()
  203. if err != nil {
  204. fmt.Println(err)
  205. }
  206. settingService := service.SettingService{}
  207. err = settingService.SetSecretStatus(false)
  208. if err != nil {
  209. fmt.Println(err)
  210. }
  211. }
  212. func main() {
  213. if len(os.Args) < 2 {
  214. runWebServer()
  215. return
  216. }
  217. var showVersion bool
  218. flag.BoolVar(&showVersion, "v", false, "show version")
  219. runCmd := flag.NewFlagSet("run", flag.ExitOnError)
  220. v2uiCmd := flag.NewFlagSet("v2-ui", flag.ExitOnError)
  221. var dbPath string
  222. v2uiCmd.StringVar(&dbPath, "db", fmt.Sprintf("%s/v2-ui.db", config.GetDBFolderPath()), "set v2-ui db file path")
  223. settingCmd := flag.NewFlagSet("setting", flag.ExitOnError)
  224. var port int
  225. var username string
  226. var password string
  227. var tgbottoken string
  228. var tgbotchatid string
  229. var enabletgbot bool
  230. var tgbotRuntime string
  231. var reset bool
  232. var show bool
  233. var remove_secret bool
  234. settingCmd.BoolVar(&reset, "reset", false, "reset all settings")
  235. settingCmd.BoolVar(&show, "show", false, "show current settings")
  236. settingCmd.IntVar(&port, "port", 0, "set panel port")
  237. settingCmd.StringVar(&username, "username", "", "set login username")
  238. settingCmd.StringVar(&password, "password", "", "set login password")
  239. settingCmd.StringVar(&tgbottoken, "tgbottoken", "", "set telegram bot token")
  240. settingCmd.StringVar(&tgbotRuntime, "tgbotRuntime", "", "set telegram bot cron time")
  241. settingCmd.StringVar(&tgbotchatid, "tgbotchatid", "", "set telegram bot chat id")
  242. settingCmd.BoolVar(&enabletgbot, "enabletgbot", false, "enable telegram bot notify")
  243. oldUsage := flag.Usage
  244. flag.Usage = func() {
  245. oldUsage()
  246. fmt.Println()
  247. fmt.Println("Commands:")
  248. fmt.Println(" run run web panel")
  249. fmt.Println(" v2-ui migrate form v2-ui")
  250. fmt.Println(" migrate migrate form other/old x-ui")
  251. fmt.Println(" setting set settings")
  252. }
  253. flag.Parse()
  254. if showVersion {
  255. fmt.Println(config.GetVersion())
  256. return
  257. }
  258. switch os.Args[1] {
  259. case "run":
  260. err := runCmd.Parse(os.Args[2:])
  261. if err != nil {
  262. fmt.Println(err)
  263. return
  264. }
  265. runWebServer()
  266. case "migrate":
  267. migrateDb()
  268. case "v2-ui":
  269. err := v2uiCmd.Parse(os.Args[2:])
  270. if err != nil {
  271. fmt.Println(err)
  272. return
  273. }
  274. err = v2ui.MigrateFromV2UI(dbPath)
  275. if err != nil {
  276. fmt.Println("migrate from v2-ui failed:", err)
  277. }
  278. case "setting":
  279. err := settingCmd.Parse(os.Args[2:])
  280. if err != nil {
  281. fmt.Println(err)
  282. return
  283. }
  284. if reset {
  285. resetSetting()
  286. } else {
  287. updateSetting(port, username, password)
  288. }
  289. if show {
  290. showSetting(show)
  291. }
  292. if (tgbottoken != "") || (tgbotchatid != "") || (tgbotRuntime != "") {
  293. updateTgbotSetting(tgbottoken, tgbotchatid, tgbotRuntime)
  294. }
  295. if remove_secret {
  296. removeSecret()
  297. }
  298. if enabletgbot {
  299. updateTgbotEnableSts(enabletgbot)
  300. }
  301. default:
  302. fmt.Println("except 'run' or 'v2-ui' or 'setting' subcommands")
  303. fmt.Println()
  304. runCmd.Usage()
  305. fmt.Println()
  306. v2uiCmd.Usage()
  307. fmt.Println()
  308. settingCmd.Usage()
  309. }
  310. }