main.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "os/signal"
  7. "syscall"
  8. _ "unsafe"
  9. "x-ui/config"
  10. "x-ui/database"
  11. "x-ui/logger"
  12. "x-ui/v2ui"
  13. "x-ui/web"
  14. "x-ui/web/global"
  15. "x-ui/web/service"
  16. "github.com/spf13/cobra"
  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. err := server.Stop()
  65. if err != nil {
  66. return
  67. }
  68. return
  69. }
  70. }
  71. }
  72. func resetSetting() {
  73. err := database.InitDB(config.GetDBPath())
  74. if err != nil {
  75. fmt.Println(err)
  76. return
  77. }
  78. settingService := service.SettingService{}
  79. err = settingService.ResetSettings()
  80. if err != nil {
  81. fmt.Println("reset setting failed:", err)
  82. } else {
  83. fmt.Println("reset setting success")
  84. }
  85. }
  86. func showSetting(show bool) {
  87. if show {
  88. settingService := service.SettingService{}
  89. port, err := settingService.GetPort()
  90. if err != nil {
  91. fmt.Println("get current port failed,error info:", err)
  92. }
  93. userService := service.UserService{}
  94. userModel, err := userService.GetFirstUser()
  95. if err != nil {
  96. fmt.Println("get current user info failed,error info:", err)
  97. }
  98. username := userModel.Username
  99. userpasswd := userModel.Password
  100. if (username == "") || (userpasswd == "") {
  101. fmt.Println("current username or password is empty")
  102. }
  103. fmt.Println("current panel settings as follows:")
  104. fmt.Println("username:", username)
  105. fmt.Println("userpasswd:", userpasswd)
  106. fmt.Println("port:", port)
  107. }
  108. }
  109. func updateTgbotEnableSts(status bool) {
  110. settingService := service.SettingService{}
  111. currentTgSts, err := settingService.GetTgbotenabled()
  112. if err != nil {
  113. fmt.Println(err)
  114. return
  115. }
  116. logger.Infof("current enabletgbot status[%v],need update to status[%v]", currentTgSts, status)
  117. if currentTgSts != status {
  118. err := settingService.SetTgbotenabled(status)
  119. if err != nil {
  120. fmt.Println(err)
  121. return
  122. } else {
  123. logger.Infof("SetTgbotenabled[%v] success", status)
  124. }
  125. }
  126. return
  127. }
  128. func updateTgbotSetting(tgBotToken string, tgBotChatid string, tgBotRuntime string) {
  129. err := database.InitDB(config.GetDBPath())
  130. if err != nil {
  131. fmt.Println(err)
  132. return
  133. }
  134. settingService := service.SettingService{}
  135. if tgBotToken != "" {
  136. err := settingService.SetTgBotToken(tgBotToken)
  137. if err != nil {
  138. fmt.Println(err)
  139. return
  140. } else {
  141. logger.Info("updateTgbotSetting tgBotToken success")
  142. }
  143. }
  144. if tgBotRuntime != "" {
  145. err := settingService.SetTgbotRuntime(tgBotRuntime)
  146. if err != nil {
  147. fmt.Println(err)
  148. return
  149. } else {
  150. logger.Infof("updateTgbotSetting tgBotRuntime[%s] success", tgBotRuntime)
  151. }
  152. }
  153. if tgBotChatid != "" {
  154. err := settingService.SetTgBotChatId(tgBotChatid)
  155. if err != nil {
  156. fmt.Println(err)
  157. return
  158. } else {
  159. logger.Info("updateTgbotSetting tgBotChatid success")
  160. }
  161. }
  162. }
  163. func updateSetting(port int, username string, password string) {
  164. err := database.InitDB(config.GetDBPath())
  165. if err != nil {
  166. fmt.Println(err)
  167. return
  168. }
  169. settingService := service.SettingService{}
  170. if port > 0 {
  171. err := settingService.SetPort(port)
  172. if err != nil {
  173. fmt.Println("set port failed:", err)
  174. } else {
  175. fmt.Printf("set port %v success", port)
  176. }
  177. }
  178. if username != "" || password != "" {
  179. userService := service.UserService{}
  180. err := userService.UpdateFirstUser(username, password)
  181. if err != nil {
  182. fmt.Println("set username and password failed:", err)
  183. } else {
  184. fmt.Println("set username and password success")
  185. }
  186. }
  187. }
  188. func migrateDb() {
  189. inboundService := service.InboundService{}
  190. err := database.InitDB(config.GetDBPath())
  191. if err != nil {
  192. log.Fatal(err)
  193. }
  194. fmt.Println("Start migrating database...")
  195. inboundService.MigrateDB()
  196. fmt.Println("Migration done!")
  197. }
  198. func removeSecret() {
  199. err := database.InitDB(config.GetDBPath())
  200. if err != nil {
  201. fmt.Println(err)
  202. return
  203. }
  204. userService := service.UserService{}
  205. err = userService.RemoveUserSecret()
  206. if err != nil {
  207. fmt.Println(err)
  208. }
  209. settingService := service.SettingService{}
  210. err = settingService.SetSecretStatus(false)
  211. if err != nil {
  212. fmt.Println(err)
  213. }
  214. }
  215. func main() {
  216. var rootCmd = &cobra.Command{
  217. Use: "x-ui",
  218. }
  219. var runCmd = &cobra.Command{
  220. Use: "run",
  221. Short: "Run the web server",
  222. Run: func(cmd *cobra.Command, args []string) {
  223. runWebServer()
  224. },
  225. }
  226. var migrateCmd = &cobra.Command{
  227. Use: "migrate",
  228. Short: "Migrate from other/old x-ui",
  229. Run: func(cmd *cobra.Command, args []string) {
  230. migrateDb()
  231. },
  232. }
  233. var v2uiCmd = &cobra.Command{
  234. Use: "v2-ui",
  235. Short: "Migrate from v2-ui",
  236. Run: func(cmd *cobra.Command, args []string) {
  237. dbPath, _ := cmd.Flags().GetString("db")
  238. err := v2ui.MigrateFromV2UI(dbPath)
  239. if err != nil {
  240. fmt.Println("migrate from v2-ui failed:", err)
  241. }
  242. },
  243. }
  244. v2uiCmd.Flags().String("db", fmt.Sprintf("%s/v2-ui.db", config.GetDBFolderPath()), "set v2-ui db file path")
  245. var settingCmd = &cobra.Command{
  246. Use: "setting",
  247. Short: "Set settings",
  248. }
  249. var resetCmd = &cobra.Command{
  250. Use: "reset",
  251. Short: "Reset all settings",
  252. Run: func(cmd *cobra.Command, args []string) {
  253. resetSetting()
  254. },
  255. }
  256. var showCmd = &cobra.Command{
  257. Use: "show",
  258. Short: "Show current settings",
  259. Run: func(cmd *cobra.Command, args []string) {
  260. showSetting(true)
  261. },
  262. }
  263. var updateCmd = &cobra.Command{
  264. Use: "update",
  265. Short: "Update settings",
  266. Run: func(cmd *cobra.Command, args []string) {
  267. port, _ := cmd.Flags().GetInt("port")
  268. username, _ := cmd.Flags().GetString("username")
  269. password, _ := cmd.Flags().GetString("password")
  270. updateSetting(port, username, password)
  271. },
  272. }
  273. updateCmd.Flags().Int("port", 0, "set panel port")
  274. updateCmd.Flags().String("username", "", "set login username")
  275. updateCmd.Flags().String("password", "", "set login password")
  276. var tgbotCmd = &cobra.Command{
  277. Use: "tgbot",
  278. Short: "Update telegram bot settings",
  279. Run: func(cmd *cobra.Command, args []string) {
  280. tgbottoken, _ := cmd.Flags().GetString("tgbottoken")
  281. tgbotchatid, _ := cmd.Flags().GetString("tgbotchatid")
  282. tgbotRuntime, _ := cmd.Flags().GetString("tgbotRuntime")
  283. enabletgbot, _ := cmd.Flags().GetBool("enabletgbot")
  284. remove_secret, _ := cmd.Flags().GetBool("remove_secret")
  285. if tgbottoken != "" || tgbotchatid != "" || tgbotRuntime != "" {
  286. updateTgbotSetting(tgbottoken, tgbotchatid, tgbotRuntime)
  287. }
  288. if remove_secret {
  289. removeSecret()
  290. }
  291. if enabletgbot {
  292. updateTgbotEnableSts(enabletgbot)
  293. }
  294. },
  295. }
  296. tgbotCmd.Flags().String("tgbottoken", "", "set telegram bot token")
  297. tgbotCmd.Flags().String("tgbotchatid", "", "set telegram bot chat id")
  298. tgbotCmd.Flags().String("tgbotRuntime", "", "set telegram bot cron time")
  299. tgbotCmd.Flags().Bool("enabletgbot", false, "enable telegram bot notify")
  300. tgbotCmd.Flags().Bool("remove_secret", false, "remove secret")
  301. settingCmd.AddCommand(resetCmd, showCmd, updateCmd, tgbotCmd)
  302. rootCmd.AddCommand(runCmd, migrateCmd, v2uiCmd, settingCmd)
  303. if err := rootCmd.Execute(); err != nil {
  304. fmt.Println(err)
  305. os.Exit(1)
  306. }
  307. }