root.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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. var err error
  76. if cfgFile != "" {
  77. err = parseServerCommonCfg(CfgFileTypeIni, cfgFile)
  78. } else {
  79. err = parseServerCommonCfg(CfgFileTypeCmd, "")
  80. }
  81. if err != nil {
  82. return err
  83. }
  84. err = runServer()
  85. if err != nil {
  86. fmt.Println(err)
  87. os.Exit(1)
  88. }
  89. return nil
  90. },
  91. }
  92. func Execute() {
  93. if err := rootCmd.Execute(); err != nil {
  94. os.Exit(1)
  95. }
  96. }
  97. func parseServerCommonCfg(fileType int, filePath string) (err error) {
  98. if fileType == CfgFileTypeIni {
  99. err = parseServerCommonCfgFromIni(filePath)
  100. } else if fileType == CfgFileTypeCmd {
  101. err = parseServerCommonCfgFromCmd()
  102. }
  103. if err != nil {
  104. return
  105. }
  106. g.GlbServerCfg.CfgFile = filePath
  107. err = g.GlbServerCfg.ServerCommonConf.Check()
  108. if err != nil {
  109. return
  110. }
  111. config.InitServerCfg(&g.GlbServerCfg.ServerCommonConf)
  112. return
  113. }
  114. func parseServerCommonCfgFromIni(filePath string) (err error) {
  115. b, err := ioutil.ReadFile(filePath)
  116. if err != nil {
  117. return err
  118. }
  119. content := string(b)
  120. cfg, err := config.UnmarshalServerConfFromIni(&g.GlbServerCfg.ServerCommonConf, content)
  121. if err != nil {
  122. return err
  123. }
  124. g.GlbServerCfg.ServerCommonConf = *cfg
  125. return
  126. }
  127. func parseServerCommonCfgFromCmd() (err error) {
  128. g.GlbServerCfg.BindAddr = bindAddr
  129. g.GlbServerCfg.BindPort = bindPort
  130. g.GlbServerCfg.BindUdpPort = bindUdpPort
  131. g.GlbServerCfg.KcpBindPort = kcpBindPort
  132. g.GlbServerCfg.ProxyBindAddr = proxyBindAddr
  133. g.GlbServerCfg.VhostHttpPort = vhostHttpPort
  134. g.GlbServerCfg.VhostHttpsPort = vhostHttpsPort
  135. g.GlbServerCfg.DashboardAddr = dashboardAddr
  136. g.GlbServerCfg.DashboardPort = dashboardPort
  137. g.GlbServerCfg.DashboardUser = dashboardUser
  138. g.GlbServerCfg.DashboardPwd = dashboardPwd
  139. g.GlbServerCfg.LogFile = logFile
  140. g.GlbServerCfg.LogWay = logWay
  141. g.GlbServerCfg.LogLevel = logLevel
  142. g.GlbServerCfg.LogMaxDays = logMaxDays
  143. g.GlbServerCfg.Token = token
  144. g.GlbServerCfg.AuthTimeout = authTimeout
  145. g.GlbServerCfg.SubDomainHost = subDomainHost
  146. g.GlbServerCfg.MaxPortsPerClient = maxPortsPerClient
  147. return
  148. }
  149. func runServer() (err error) {
  150. log.InitLog(g.GlbServerCfg.LogWay, g.GlbServerCfg.LogFile, g.GlbServerCfg.LogLevel,
  151. g.GlbServerCfg.LogMaxDays)
  152. svr, err := server.NewService()
  153. if err != nil {
  154. return err
  155. }
  156. log.Info("Start frps success")
  157. server.ServerService = svr
  158. svr.Run()
  159. return
  160. }