main.go 7.6 KB

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