main.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/spf13/cobra"
  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. 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.MigrationRequirements()
  196. inboundService.RemoveOrphanedTraffics()
  197. fmt.Println("Migration done!")
  198. }
  199. func removeSecret() {
  200. err := database.InitDB(config.GetDBPath())
  201. if err != nil {
  202. fmt.Println(err)
  203. return
  204. }
  205. userService := service.UserService{}
  206. err = userService.RemoveUserSecret()
  207. if err != nil {
  208. fmt.Println(err)
  209. }
  210. settingService := service.SettingService{}
  211. err = settingService.SetSecretStatus(false)
  212. if err != nil {
  213. fmt.Println(err)
  214. }
  215. }
  216. func main() {
  217. var rootCmd = &cobra.Command{
  218. Use: "x-ui",
  219. }
  220. var runCmd = &cobra.Command{
  221. Use: "run",
  222. Short: "Run the web server",
  223. Run: func(cmd *cobra.Command, args []string) {
  224. runWebServer()
  225. },
  226. }
  227. var migrateCmd = &cobra.Command{
  228. Use: "migrate",
  229. Short: "Migrate from other/old x-ui",
  230. Run: func(cmd *cobra.Command, args []string) {
  231. migrateDb()
  232. },
  233. }
  234. var v2uiCmd = &cobra.Command{
  235. Use: "v2-ui",
  236. Short: "Migrate from v2-ui",
  237. Run: func(cmd *cobra.Command, args []string) {
  238. dbPath, _ := cmd.Flags().GetString("db")
  239. err := v2ui.MigrateFromV2UI(dbPath)
  240. if err != nil {
  241. fmt.Println("migrate from v2-ui failed:", err)
  242. }
  243. },
  244. }
  245. v2uiCmd.Flags().String("db", fmt.Sprintf("%s/v2-ui.db", config.GetDBFolderPath()), "set v2-ui db file path")
  246. var settingCmd = &cobra.Command{
  247. Use: "setting",
  248. Short: "Set settings",
  249. }
  250. var resetCmd = &cobra.Command{
  251. Use: "reset",
  252. Short: "Reset all settings",
  253. Run: func(cmd *cobra.Command, args []string) {
  254. resetSetting()
  255. },
  256. }
  257. var showCmd = &cobra.Command{
  258. Use: "show",
  259. Short: "Show current settings",
  260. Run: func(cmd *cobra.Command, args []string) {
  261. showSetting(true)
  262. },
  263. }
  264. var updateCmd = &cobra.Command{
  265. Use: "update",
  266. Short: "Update settings",
  267. Run: func(cmd *cobra.Command, args []string) {
  268. port, _ := cmd.Flags().GetInt("port")
  269. username, _ := cmd.Flags().GetString("username")
  270. password, _ := cmd.Flags().GetString("password")
  271. updateSetting(port, username, password)
  272. },
  273. }
  274. updateCmd.Flags().Int("port", 0, "set panel port")
  275. updateCmd.Flags().String("username", "", "set login username")
  276. updateCmd.Flags().String("password", "", "set login password")
  277. var tgbotCmd = &cobra.Command{
  278. Use: "tgbot",
  279. Short: "Update telegram bot settings",
  280. Run: func(cmd *cobra.Command, args []string) {
  281. tgbottoken, _ := cmd.Flags().GetString("tgbottoken")
  282. tgbotchatid, _ := cmd.Flags().GetString("tgbotchatid")
  283. tgbotRuntime, _ := cmd.Flags().GetString("tgbotRuntime")
  284. enabletgbot, _ := cmd.Flags().GetBool("enabletgbot")
  285. remove_secret, _ := cmd.Flags().GetBool("remove_secret")
  286. if tgbottoken != "" || tgbotchatid != "" || tgbotRuntime != "" {
  287. updateTgbotSetting(tgbottoken, tgbotchatid, tgbotRuntime)
  288. }
  289. if remove_secret {
  290. removeSecret()
  291. }
  292. if enabletgbot {
  293. updateTgbotEnableSts(enabletgbot)
  294. }
  295. },
  296. }
  297. tgbotCmd.Flags().String("tgbottoken", "", "set telegram bot token")
  298. tgbotCmd.Flags().String("tgbotchatid", "", "set telegram bot chat id")
  299. tgbotCmd.Flags().String("tgbotRuntime", "", "set telegram bot cron time")
  300. tgbotCmd.Flags().Bool("enabletgbot", false, "enable telegram bot notify")
  301. tgbotCmd.Flags().Bool("remove_secret", false, "remove secret")
  302. settingCmd.AddCommand(resetCmd, showCmd, updateCmd, tgbotCmd)
  303. rootCmd.AddCommand(runCmd, migrateCmd, v2uiCmd, settingCmd)
  304. if err := rootCmd.Execute(); err != nil {
  305. fmt.Println(err)
  306. os.Exit(1)
  307. }
  308. }