root.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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", "h", "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. return
  108. }
  109. func parseServerCommonCfgFromIni(filePath string) (err error) {
  110. b, err := ioutil.ReadFile(filePath)
  111. if err != nil {
  112. return err
  113. }
  114. content := string(b)
  115. cfg, err := config.UnmarshalServerConfFromIni(&g.GlbServerCfg.ServerCommonConf, content)
  116. if err != nil {
  117. return err
  118. }
  119. g.GlbServerCfg.ServerCommonConf = *cfg
  120. return
  121. }
  122. func parseServerCommonCfgFromCmd() (err error) {
  123. g.GlbServerCfg.BindAddr = bindAddr
  124. g.GlbServerCfg.BindPort = bindPort
  125. g.GlbServerCfg.BindUdpPort = bindUdpPort
  126. g.GlbServerCfg.KcpBindPort = kcpBindPort
  127. g.GlbServerCfg.ProxyBindAddr = proxyBindAddr
  128. g.GlbServerCfg.VhostHttpPort = vhostHttpPort
  129. g.GlbServerCfg.VhostHttpsPort = vhostHttpsPort
  130. g.GlbServerCfg.DashboardAddr = dashboardAddr
  131. g.GlbServerCfg.DashboardPort = dashboardPort
  132. g.GlbServerCfg.DashboardUser = dashboardUser
  133. g.GlbServerCfg.DashboardPwd = dashboardPwd
  134. g.GlbServerCfg.LogFile = logFile
  135. g.GlbServerCfg.LogWay = logWay
  136. g.GlbServerCfg.LogLevel = logLevel
  137. g.GlbServerCfg.LogMaxDays = logMaxDays
  138. g.GlbServerCfg.Token = token
  139. g.GlbServerCfg.AuthTimeout = authTimeout
  140. g.GlbServerCfg.SubDomainHost = subDomainHost
  141. g.GlbServerCfg.MaxPortsPerClient = maxPortsPerClient
  142. return
  143. }
  144. func runServer() (err error) {
  145. log.InitLog(g.GlbServerCfg.LogWay, g.GlbServerCfg.LogFile, g.GlbServerCfg.LogLevel,
  146. g.GlbServerCfg.LogMaxDays)
  147. svr, err := server.NewService()
  148. if err != nil {
  149. return err
  150. }
  151. log.Info("Start frps success")
  152. server.ServerService = svr
  153. svr.Run()
  154. return
  155. }