frp/cmd/frps/root.go

213 lines
6.7 KiB
Go
Raw Normal View History

2018-05-02 22:09:15 +08:00
// Copyright 2018 fatedier, fatedier@gmail.com
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
2018-04-10 17:46:49 +08:00
package main
import (
"fmt"
"os"
2020-09-23 13:49:14 +08:00
"github.com/fatedier/frp/pkg/auth"
"github.com/fatedier/frp/pkg/config"
"github.com/fatedier/frp/pkg/util/log"
"github.com/fatedier/frp/pkg/util/util"
"github.com/fatedier/frp/pkg/util/version"
2018-04-10 17:46:49 +08:00
"github.com/fatedier/frp/server"
2020-09-23 13:49:14 +08:00
"github.com/spf13/cobra"
2018-04-10 17:46:49 +08:00
)
const (
CfgFileTypeIni = iota
CfgFileTypeCmd
)
var (
cfgFile string
showVersion bool
bindAddr string
bindPort int
2020-05-24 17:48:37 +08:00
bindUDPPort int
2018-04-10 17:46:49 +08:00
kcpBindPort int
proxyBindAddr string
2020-05-24 17:48:37 +08:00
vhostHTTPPort int
vhostHTTPSPort int
vhostHTTPTimeout int64
2018-04-10 17:46:49 +08:00
dashboardAddr string
dashboardPort int
dashboardUser string
dashboardPwd string
enablePrometheus bool
2018-04-10 17:46:49 +08:00
assetsDir string
logFile string
logLevel string
logMaxDays int64
disableLogColor bool
2018-04-10 17:46:49 +08:00
token string
subDomainHost string
tcpMux bool
allowPorts string
maxPoolCount int64
maxPortsPerClient int64
tlsOnly bool
2018-04-10 17:46:49 +08:00
)
func init() {
2019-04-08 15:39:14 +08:00
rootCmd.PersistentFlags().StringVarP(&cfgFile, "config", "c", "", "config file of frps")
2020-05-10 17:58:35 +08:00
rootCmd.PersistentFlags().BoolVarP(&showVersion, "version", "v", false, "version of frps")
2018-04-10 17:46:49 +08:00
2018-04-23 02:40:25 +08:00
rootCmd.PersistentFlags().StringVarP(&bindAddr, "bind_addr", "", "0.0.0.0", "bind address")
2018-04-10 17:46:49 +08:00
rootCmd.PersistentFlags().IntVarP(&bindPort, "bind_port", "p", 7000, "bind port")
2020-05-24 17:48:37 +08:00
rootCmd.PersistentFlags().IntVarP(&bindUDPPort, "bind_udp_port", "", 0, "bind udp port")
2018-04-10 17:46:49 +08:00
rootCmd.PersistentFlags().IntVarP(&kcpBindPort, "kcp_bind_port", "", 0, "kcp bind udp port")
rootCmd.PersistentFlags().StringVarP(&proxyBindAddr, "proxy_bind_addr", "", "0.0.0.0", "proxy bind address")
2020-05-24 17:48:37 +08:00
rootCmd.PersistentFlags().IntVarP(&vhostHTTPPort, "vhost_http_port", "", 0, "vhost http port")
rootCmd.PersistentFlags().IntVarP(&vhostHTTPSPort, "vhost_https_port", "", 0, "vhost https port")
rootCmd.PersistentFlags().Int64VarP(&vhostHTTPTimeout, "vhost_http_timeout", "", 60, "vhost http response header timeout")
2018-04-10 17:46:49 +08:00
rootCmd.PersistentFlags().StringVarP(&dashboardAddr, "dashboard_addr", "", "0.0.0.0", "dasboard address")
rootCmd.PersistentFlags().IntVarP(&dashboardPort, "dashboard_port", "", 0, "dashboard port")
rootCmd.PersistentFlags().StringVarP(&dashboardUser, "dashboard_user", "", "admin", "dashboard user")
rootCmd.PersistentFlags().StringVarP(&dashboardPwd, "dashboard_pwd", "", "admin", "dashboard password")
rootCmd.PersistentFlags().BoolVarP(&enablePrometheus, "enable_prometheus", "", false, "enable prometheus dashboard")
2018-04-10 17:46:49 +08:00
rootCmd.PersistentFlags().StringVarP(&logFile, "log_file", "", "console", "log file")
rootCmd.PersistentFlags().StringVarP(&logLevel, "log_level", "", "info", "log level")
2019-06-01 10:09:13 +08:00
rootCmd.PersistentFlags().Int64VarP(&logMaxDays, "log_max_days", "", 3, "log max days")
rootCmd.PersistentFlags().BoolVarP(&disableLogColor, "disable_log_color", "", false, "disable log color in console")
2018-05-18 10:58:08 +08:00
rootCmd.PersistentFlags().StringVarP(&token, "token", "t", "", "auth token")
2018-04-10 17:46:49 +08:00
rootCmd.PersistentFlags().StringVarP(&subDomainHost, "subdomain_host", "", "", "subdomain host")
2018-06-07 00:25:55 +08:00
rootCmd.PersistentFlags().StringVarP(&allowPorts, "allow_ports", "", "", "allow ports")
2018-04-10 17:46:49 +08:00
rootCmd.PersistentFlags().Int64VarP(&maxPortsPerClient, "max_ports_per_client", "", 0, "max ports per client")
rootCmd.PersistentFlags().BoolVarP(&tlsOnly, "tls_only", "", false, "frps tls only")
2018-04-10 17:46:49 +08:00
}
var rootCmd = &cobra.Command{
Use: "frps",
Short: "frps is the server of frp (https://github.com/fatedier/frp)",
RunE: func(cmd *cobra.Command, args []string) error {
if showVersion {
fmt.Println(version.Full())
return nil
}
var cfg config.ServerCommonConf
2018-04-28 00:30:13 +08:00
var err error
2018-04-10 17:46:49 +08:00
if cfgFile != "" {
var content []byte
content, err = config.GetRenderedConfFromFile(cfgFile)
if err != nil {
return err
}
cfg, err = parseServerCommonCfg(CfgFileTypeIni, content)
2018-04-10 17:46:49 +08:00
} else {
cfg, err = parseServerCommonCfg(CfgFileTypeCmd, nil)
2018-04-28 00:30:13 +08:00
}
if err != nil {
return err
2018-04-10 17:46:49 +08:00
}
err = runServer(cfg)
2018-04-10 17:46:49 +08:00
if err != nil {
fmt.Println(err)
os.Exit(1)
}
return nil
},
}
func Execute() {
if err := rootCmd.Execute(); err != nil {
os.Exit(1)
}
}
func parseServerCommonCfg(fileType int, source []byte) (cfg config.ServerCommonConf, err error) {
2018-04-10 17:46:49 +08:00
if fileType == CfgFileTypeIni {
cfg, err = config.UnmarshalServerConfFromIni(source)
2018-04-10 17:46:49 +08:00
} else if fileType == CfgFileTypeCmd {
cfg, err = parseServerCommonCfgFromCmd()
2018-04-10 17:46:49 +08:00
}
if err != nil {
return
}
2021-03-22 14:53:30 +08:00
cfg.Complete()
err = cfg.Validate()
2018-04-10 17:46:49 +08:00
if err != nil {
2021-03-22 14:53:30 +08:00
err = fmt.Errorf("Parse config error: %v", err)
2018-04-10 17:46:49 +08:00
return
}
return
}
func parseServerCommonCfgFromCmd() (cfg config.ServerCommonConf, err error) {
cfg = config.GetDefaultServerConf()
cfg.BindAddr = bindAddr
cfg.BindPort = bindPort
2020-05-24 17:48:37 +08:00
cfg.BindUDPPort = bindUDPPort
cfg.KCPBindPort = kcpBindPort
cfg.ProxyBindAddr = proxyBindAddr
2020-05-24 17:48:37 +08:00
cfg.VhostHTTPPort = vhostHTTPPort
cfg.VhostHTTPSPort = vhostHTTPSPort
cfg.VhostHTTPTimeout = vhostHTTPTimeout
cfg.DashboardAddr = dashboardAddr
cfg.DashboardPort = dashboardPort
cfg.DashboardUser = dashboardUser
cfg.DashboardPwd = dashboardPwd
cfg.EnablePrometheus = enablePrometheus
cfg.LogFile = logFile
cfg.LogLevel = logLevel
cfg.LogMaxDays = logMaxDays
cfg.SubDomainHost = subDomainHost
2020-05-24 17:48:37 +08:00
cfg.TLSOnly = tlsOnly
// Only token authentication is supported in cmd mode
2020-05-24 17:48:37 +08:00
cfg.ServerConfig = auth.GetDefaultServerConf()
cfg.Token = token
2018-06-07 00:25:55 +08:00
if len(allowPorts) > 0 {
// e.g. 1000-2000,2001,2002,3000-4000
ports, errRet := util.ParseRangeNumbers(allowPorts)
if errRet != nil {
err = fmt.Errorf("Parse conf error: allow_ports: %v", errRet)
return
}
for _, port := range ports {
cfg.AllowPorts[int(port)] = struct{}{}
2018-06-07 00:25:55 +08:00
}
}
cfg.MaxPortsPerClient = maxPortsPerClient
cfg.DisableLogColor = disableLogColor
2018-04-10 17:46:49 +08:00
return
}
func runServer(cfg config.ServerCommonConf) (err error) {
log.InitLog(cfg.LogWay, cfg.LogFile, cfg.LogLevel, cfg.LogMaxDays, cfg.DisableLogColor)
2021-03-22 14:53:30 +08:00
if cfgFile != "" {
log.Info("frps uses config file: %s", cfgFile)
} else {
log.Info("frps uses command line arguments for config")
}
svr, err := server.NewService(cfg)
2018-04-10 17:46:49 +08:00
if err != nil {
return err
}
log.Info("frps started successfully")
2018-04-10 17:46:49 +08:00
svr.Run()
return
}