root.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "os"
  6. "github.com/spf13/cobra"
  7. "github.com/fatedier/frp/g"
  8. "github.com/fatedier/frp/models/config"
  9. "github.com/fatedier/frp/server"
  10. "github.com/fatedier/frp/utils/log"
  11. "github.com/fatedier/frp/utils/version"
  12. )
  13. const (
  14. CfgFileTypeIni = iota
  15. CfgFileTypeCmd
  16. )
  17. var (
  18. cfgFile string
  19. showVersion bool
  20. bindAddr string
  21. bindPort int
  22. bindUdpPort int
  23. kcpBindPort int
  24. proxyBindAddr string
  25. vhostHttpPort int
  26. vhostHttpsPort int
  27. dashboardAddr string
  28. dashboardPort int
  29. dashboardUser string
  30. dashboardPwd string
  31. assetsDir string
  32. logFile string
  33. logWay string
  34. logLevel string
  35. logMaxDays int64
  36. token string
  37. authTimeout int64
  38. subDomainHost string
  39. tcpMux bool
  40. allowPorts string
  41. maxPoolCount int64
  42. maxPortsPerClient int64
  43. )
  44. func init() {
  45. rootCmd.PersistentFlags().StringVarP(&cfgFile, "", "c", "", "config file of frps")
  46. rootCmd.PersistentFlags().BoolVarP(&showVersion, "version", "v", false, "version of frpc")
  47. rootCmd.PersistentFlags().StringVarP(&bindAddr, "bind_addr", "", "0.0.0.0", "bind address")
  48. rootCmd.PersistentFlags().IntVarP(&bindPort, "bind_port", "p", 7000, "bind port")
  49. rootCmd.PersistentFlags().IntVarP(&bindUdpPort, "bind_udp_port", "", 0, "bind udp port")
  50. rootCmd.PersistentFlags().IntVarP(&kcpBindPort, "kcp_bind_port", "", 0, "kcp bind udp port")
  51. rootCmd.PersistentFlags().StringVarP(&proxyBindAddr, "proxy_bind_addr", "", "0.0.0.0", "proxy bind address")
  52. rootCmd.PersistentFlags().IntVarP(&vhostHttpPort, "vhost_http_port", "", 0, "vhost http port")
  53. rootCmd.PersistentFlags().IntVarP(&vhostHttpsPort, "vhost_https_port", "", 0, "vhost https port")
  54. rootCmd.PersistentFlags().StringVarP(&dashboardAddr, "dashboard_addr", "", "0.0.0.0", "dasboard address")
  55. rootCmd.PersistentFlags().IntVarP(&dashboardPort, "dashboard_port", "", 0, "dashboard port")
  56. rootCmd.PersistentFlags().StringVarP(&dashboardUser, "dashboard_user", "", "admin", "dashboard user")
  57. rootCmd.PersistentFlags().StringVarP(&dashboardPwd, "dashboard_pwd", "", "admin", "dashboard password")
  58. rootCmd.PersistentFlags().StringVarP(&logFile, "log_file", "", "console", "log file")
  59. rootCmd.PersistentFlags().StringVarP(&logWay, "log_way", "", "console", "log way")
  60. rootCmd.PersistentFlags().StringVarP(&logLevel, "log_level", "", "info", "log level")
  61. rootCmd.PersistentFlags().Int64VarP(&logMaxDays, "log_max_days", "", 3, "log_max_days")
  62. rootCmd.PersistentFlags().StringVarP(&token, "token", "", "", "auth token")
  63. rootCmd.PersistentFlags().Int64VarP(&authTimeout, "auth_timeout", "", 900, "auth timeout")
  64. rootCmd.PersistentFlags().StringVarP(&subDomainHost, "subdomain_host", "", "", "subdomain host")
  65. rootCmd.PersistentFlags().Int64VarP(&maxPortsPerClient, "max_ports_per_client", "", 0, "max ports per client")
  66. }
  67. var rootCmd = &cobra.Command{
  68. Use: "frps",
  69. Short: "frps is the server of frp (https://github.com/fatedier/frp)",
  70. RunE: func(cmd *cobra.Command, args []string) error {
  71. if showVersion {
  72. fmt.Println(version.Full())
  73. return nil
  74. }
  75. if cfgFile != "" {
  76. parseServerCommonCfg(CfgFileTypeIni, cfgFile)
  77. } else {
  78. parseServerCommonCfg(CfgFileTypeCmd, "")
  79. }
  80. err := runServer()
  81. if err != nil {
  82. fmt.Println(err)
  83. os.Exit(1)
  84. }
  85. return nil
  86. },
  87. }
  88. func Execute() {
  89. if err := rootCmd.Execute(); err != nil {
  90. os.Exit(1)
  91. }
  92. }
  93. func parseServerCommonCfg(fileType int, filePath string) (err error) {
  94. if fileType == CfgFileTypeIni {
  95. err = parseServerCommonCfgFromIni(filePath)
  96. } else if fileType == CfgFileTypeCmd {
  97. err = parseServerCommonCfgFromCmd()
  98. }
  99. if err != nil {
  100. return
  101. }
  102. g.GlbServerCfg.CfgFile = cfgFile
  103. err = g.GlbServerCfg.ServerCommonConf.Check()
  104. if err != nil {
  105. return
  106. }
  107. config.InitServerCfg(&g.GlbServerCfg.ServerCommonConf)
  108. return
  109. }
  110. func parseServerCommonCfgFromIni(filePath string) (err error) {
  111. b, err := ioutil.ReadFile(filePath)
  112. if err != nil {
  113. return err
  114. }
  115. content := string(b)
  116. cfg, err := config.UnmarshalServerConfFromIni(&g.GlbServerCfg.ServerCommonConf, content)
  117. if err != nil {
  118. return err
  119. }
  120. g.GlbServerCfg.ServerCommonConf = *cfg
  121. return
  122. }
  123. func parseServerCommonCfgFromCmd() (err error) {
  124. g.GlbServerCfg.BindAddr = bindAddr
  125. g.GlbServerCfg.BindPort = bindPort
  126. g.GlbServerCfg.BindUdpPort = bindUdpPort
  127. g.GlbServerCfg.KcpBindPort = kcpBindPort
  128. g.GlbServerCfg.ProxyBindAddr = proxyBindAddr
  129. g.GlbServerCfg.VhostHttpPort = vhostHttpPort
  130. g.GlbServerCfg.VhostHttpsPort = vhostHttpsPort
  131. g.GlbServerCfg.DashboardAddr = dashboardAddr
  132. g.GlbServerCfg.DashboardPort = dashboardPort
  133. g.GlbServerCfg.DashboardUser = dashboardUser
  134. g.GlbServerCfg.DashboardPwd = dashboardPwd
  135. g.GlbServerCfg.LogFile = logFile
  136. g.GlbServerCfg.LogWay = logWay
  137. g.GlbServerCfg.LogLevel = logLevel
  138. g.GlbServerCfg.LogMaxDays = logMaxDays
  139. g.GlbServerCfg.Token = token
  140. g.GlbServerCfg.AuthTimeout = authTimeout
  141. g.GlbServerCfg.SubDomainHost = subDomainHost
  142. g.GlbServerCfg.MaxPortsPerClient = maxPortsPerClient
  143. return
  144. }
  145. func runServer() (err error) {
  146. log.InitLog(g.GlbServerCfg.LogWay, g.GlbServerCfg.LogFile, g.GlbServerCfg.LogLevel,
  147. g.GlbServerCfg.LogMaxDays)
  148. svr, err := server.NewService()
  149. if err != nil {
  150. return err
  151. }
  152. log.Info("Start frps success")
  153. server.ServerService = svr
  154. svr.Run()
  155. return
  156. }