main.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  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/spf13/cobra"
  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. sigCh := make(chan os.Signal, 1)
  47. // Trap shutdown signals
  48. signal.Notify(sigCh, syscall.SIGHUP, syscall.SIGTERM)
  49. for {
  50. sig := <-sigCh
  51. switch sig {
  52. case syscall.SIGHUP:
  53. err := server.Stop()
  54. if err != nil {
  55. logger.Warning("stop server err:", err)
  56. }
  57. server = web.NewServer()
  58. global.SetWebServer(server)
  59. err = server.Start()
  60. if err != nil {
  61. log.Println(err)
  62. return
  63. }
  64. default:
  65. server.Stop()
  66. return
  67. }
  68. }
  69. }
  70. func resetSetting() {
  71. err := database.InitDB(config.GetDBPath())
  72. if err != nil {
  73. fmt.Println(err)
  74. return
  75. }
  76. settingService := service.SettingService{}
  77. err = settingService.ResetSettings()
  78. if err != nil {
  79. fmt.Println("reset setting failed:", err)
  80. } else {
  81. fmt.Println("reset setting success")
  82. }
  83. }
  84. func showSetting(show bool) {
  85. if show {
  86. settingService := service.SettingService{}
  87. port, err := settingService.GetPort()
  88. if err != nil {
  89. fmt.Println("get current port failed,error info:", err)
  90. }
  91. userService := service.UserService{}
  92. userModel, err := userService.GetFirstUser()
  93. if err != nil {
  94. fmt.Println("get current user info failed,error info:", err)
  95. }
  96. username := userModel.Username
  97. userpasswd := userModel.Password
  98. if (username == "") || (userpasswd == "") {
  99. fmt.Println("current username or password is empty")
  100. }
  101. fmt.Println("current panel settings as follows:")
  102. fmt.Println("username:", username)
  103. fmt.Println("userpasswd:", userpasswd)
  104. fmt.Println("port:", port)
  105. }
  106. }
  107. func updateTgbotEnableSts(status bool) {
  108. settingService := service.SettingService{}
  109. currentTgSts, err := settingService.GetTgbotenabled()
  110. if err != nil {
  111. fmt.Println(err)
  112. return
  113. }
  114. logger.Infof("current enabletgbot status[%v],need update to status[%v]", currentTgSts, status)
  115. if currentTgSts != status {
  116. err := settingService.SetTgbotenabled(status)
  117. if err != nil {
  118. fmt.Println(err)
  119. return
  120. } else {
  121. logger.Infof("SetTgbotenabled[%v] success", status)
  122. }
  123. }
  124. return
  125. }
  126. func updateTgbotSetting(tgBotToken string, tgBotChatid string, tgBotRuntime string) {
  127. err := database.InitDB(config.GetDBPath())
  128. if err != nil {
  129. fmt.Println(err)
  130. return
  131. }
  132. settingService := service.SettingService{}
  133. if tgBotToken != "" {
  134. err := settingService.SetTgBotToken(tgBotToken)
  135. if err != nil {
  136. fmt.Println(err)
  137. return
  138. } else {
  139. logger.Info("updateTgbotSetting tgBotToken success")
  140. }
  141. }
  142. if tgBotRuntime != "" {
  143. err := settingService.SetTgbotRuntime(tgBotRuntime)
  144. if err != nil {
  145. fmt.Println(err)
  146. return
  147. } else {
  148. logger.Infof("updateTgbotSetting tgBotRuntime[%s] success", tgBotRuntime)
  149. }
  150. }
  151. if tgBotChatid != "" {
  152. err := settingService.SetTgBotChatId(tgBotChatid)
  153. if err != nil {
  154. fmt.Println(err)
  155. return
  156. } else {
  157. logger.Info("updateTgbotSetting tgBotChatid success")
  158. }
  159. }
  160. }
  161. func updateSetting(port int, username string, password string) {
  162. err := database.InitDB(config.GetDBPath())
  163. if err != nil {
  164. fmt.Println(err)
  165. return
  166. }
  167. settingService := service.SettingService{}
  168. if port > 0 {
  169. err := settingService.SetPort(port)
  170. if err != nil {
  171. fmt.Println("set port failed:", err)
  172. } else {
  173. fmt.Printf("set port %v success", port)
  174. }
  175. }
  176. if username != "" || password != "" {
  177. userService := service.UserService{}
  178. err := userService.UpdateFirstUser(username, password)
  179. if err != nil {
  180. fmt.Println("set username and password failed:", err)
  181. } else {
  182. fmt.Println("set username and password success")
  183. }
  184. }
  185. }
  186. func migrateDb() {
  187. inboundService := service.InboundService{}
  188. err := database.InitDB(config.GetDBPath())
  189. if err != nil {
  190. log.Fatal(err)
  191. }
  192. fmt.Println("Start migrating database...")
  193. inboundService.MigrateDB()
  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. }