main.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  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. var vars struct {
  217. showVersion bool
  218. dbPath string
  219. port int
  220. username string
  221. password string
  222. tgbottoken string
  223. tgbotchatid string
  224. enableTelegramBot bool
  225. tgbotRuntime string
  226. resetSettings bool
  227. showSettings bool
  228. removeAllSecretsFlag bool
  229. }
  230. func main() {
  231. var rootCmd = &cobra.Command{
  232. Use: "x-ui",
  233. }
  234. var runCmd = &cobra.Command{
  235. Use: "run",
  236. Short: "Run the web server",
  237. Run: func(cmd *cobra.Command, args []string) {
  238. runWebServer()
  239. },
  240. }
  241. var migrateCmd = &cobra.Command{
  242. Use: "migrate",
  243. Short: "Migrate from other/old x-ui",
  244. Run: func(cmd *cobra.Command, args []string) {
  245. migrateDb()
  246. },
  247. }
  248. var v2uiCmd = &cobra.Command{
  249. Use: "v2-ui",
  250. Short: "Migrate from v2-ui",
  251. Run: func(cmd *cobra.Command, args []string) {
  252. dbPath, _ := cmd.Flags().GetString("db")
  253. err := v2ui.MigrateFromV2UI(dbPath)
  254. if err != nil {
  255. fmt.Println("migrate from v2-ui failed:", err)
  256. }
  257. },
  258. }
  259. v2uiCmd.Flags().String("db", fmt.Sprintf("%s/v2-ui.db", config.GetDBFolderPath()), "set v2-ui db file path")
  260. var settingCmd = &cobra.Command{
  261. Use: "setting",
  262. Short: "Set settings",
  263. }
  264. var resetCmd = &cobra.Command{
  265. Use: "reset",
  266. Short: "Reset all settings",
  267. Run: func(cmd *cobra.Command, args []string) {
  268. resetSetting()
  269. },
  270. }
  271. var showCmd = &cobra.Command{
  272. Use: "show",
  273. Short: "Show current settings",
  274. Run: func(cmd *cobra.Command, args []string) {
  275. showSetting(true)
  276. },
  277. }
  278. var updateCmd = &cobra.Command{
  279. Use: "update",
  280. Short: "Update settings",
  281. Run: func(cmd *cobra.Command, args []string) {
  282. port, _ := cmd.Flags().GetInt("port")
  283. username, _ := cmd.Flags().GetString("username")
  284. password, _ := cmd.Flags().GetString("password")
  285. updateSetting(port, username, password)
  286. },
  287. }
  288. updateCmd.Flags().Int("port", 0, "set panel port")
  289. updateCmd.Flags().String("username", "", "set login username")
  290. updateCmd.Flags().String("password", "", "set login password")
  291. var tgbotCmd = &cobra.Command{
  292. Use: "tgbot",
  293. Short: "Update telegram bot settings",
  294. Run: func(cmd *cobra.Command, args []string) {
  295. tgbottoken, _ := cmd.Flags().GetString("tgbottoken")
  296. tgbotchatid, _ := cmd.Flags().GetString("tgbotchatid")
  297. tgbotRuntime, _ := cmd.Flags().GetString("tgbotRuntime")
  298. enabletgbot, _ := cmd.Flags().GetBool("enabletgbot")
  299. remove_secret, _ := cmd.Flags().GetBool("remove_secret")
  300. if tgbottoken != "" || tgbotchatid != "" || tgbotRuntime != "" {
  301. updateTgbotSetting(tgbottoken, tgbotchatid, tgbotRuntime)
  302. }
  303. if remove_secret {
  304. removeSecret()
  305. }
  306. if enabletgbot {
  307. updateTgbotEnableSts(enabletgbot)
  308. }
  309. },
  310. }
  311. tgbotCmd.Flags().String("tgbottoken", "", "set telegram bot token")
  312. tgbotCmd.Flags().String("tgbotchatid", "", "set telegram bot chat id")
  313. tgbotCmd.Flags().String("tgbotRuntime", "", "set telegram bot cron time")
  314. tgbotCmd.Flags().Bool("enabletgbot", false, "enable telegram bot notify")
  315. tgbotCmd.Flags().Bool("remove_secret", false, "remove secret")
  316. settingCmd.AddCommand(resetCmd, showCmd, updateCmd, tgbotCmd)
  317. rootCmd.AddCommand(runCmd, migrateCmd, v2uiCmd, settingCmd)
  318. if err := rootCmd.Execute(); err != nil {
  319. fmt.Println(err)
  320. os.Exit(1)
  321. }
  322. }