main.go 7.2 KB

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