-
-
Notifications
You must be signed in to change notification settings - Fork 13.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
optimize the code of the command line (#3614)
- Loading branch information
Showing
41 changed files
with
566 additions
and
1,363 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,8 @@ | ||
### Features | ||
|
||
* Configuration: We now support TOML, YAML, and JSON for configuration. Please note that INI is deprecated and will be removed in future releases. New features will only be available in TOML, YAML, or JSON. Users wanting these new features should switch their configuration format accordingly. #2521 | ||
|
||
### Breaking Changes | ||
|
||
* Change the way to start the visitor through the command line from `frpc stcp --role=visitor xxx` to `frpc stcp visitor xxx`. | ||
* Modified the semantics of the `server_addr` in the command line, no longer including the port. Added the `server_port` parameter to configure the port. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
// Copyright 2023 The frp Authors | ||
// | ||
// 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. | ||
|
||
package sub | ||
|
||
import ( | ||
"fmt" | ||
"os" | ||
"strings" | ||
|
||
"github.com/rodaine/table" | ||
"github.com/spf13/cobra" | ||
|
||
"github.com/fatedier/frp/pkg/config" | ||
v1 "github.com/fatedier/frp/pkg/config/v1" | ||
clientsdk "github.com/fatedier/frp/pkg/sdk/client" | ||
) | ||
|
||
func init() { | ||
rootCmd.AddCommand(NewAdminCommand( | ||
"reload", | ||
"Hot-Reload frpc configuration", | ||
ReloadHandler, | ||
)) | ||
|
||
rootCmd.AddCommand(NewAdminCommand( | ||
"status", | ||
"Overview of all proxies status", | ||
StatusHandler, | ||
)) | ||
|
||
rootCmd.AddCommand(NewAdminCommand( | ||
"stop", | ||
"Stop the running frpc", | ||
StopHandler, | ||
)) | ||
} | ||
|
||
func NewAdminCommand(name, short string, handler func(*v1.ClientCommonConfig) error) *cobra.Command { | ||
return &cobra.Command{ | ||
Use: name, | ||
Short: short, | ||
Run: func(cmd *cobra.Command, args []string) { | ||
cfg, _, _, _, err := config.LoadClientConfig(cfgFile) | ||
if err != nil { | ||
fmt.Println(err) | ||
os.Exit(1) | ||
} | ||
if cfg.WebServer.Port <= 0 { | ||
fmt.Println("web server port should be set if you want to use this feature") | ||
os.Exit(1) | ||
} | ||
|
||
if err := handler(cfg); err != nil { | ||
fmt.Println(err) | ||
os.Exit(1) | ||
} | ||
}, | ||
} | ||
} | ||
|
||
func ReloadHandler(clientCfg *v1.ClientCommonConfig) error { | ||
client := clientsdk.New(clientCfg.WebServer.Addr, clientCfg.WebServer.Port) | ||
client.SetAuth(clientCfg.WebServer.User, clientCfg.WebServer.Password) | ||
if err := client.Reload(); err != nil { | ||
return err | ||
} | ||
fmt.Println("reload success") | ||
return nil | ||
} | ||
|
||
func StatusHandler(clientCfg *v1.ClientCommonConfig) error { | ||
client := clientsdk.New(clientCfg.WebServer.Addr, clientCfg.WebServer.Port) | ||
client.SetAuth(clientCfg.WebServer.User, clientCfg.WebServer.Password) | ||
res, err := client.GetAllProxyStatus() | ||
if err != nil { | ||
return err | ||
} | ||
|
||
fmt.Printf("Proxy Status...\n\n") | ||
for _, typ := range proxyTypes { | ||
arrs := res[typ] | ||
if len(arrs) == 0 { | ||
continue | ||
} | ||
|
||
fmt.Println(strings.ToUpper(typ)) | ||
tbl := table.New("Name", "Status", "LocalAddr", "Plugin", "RemoteAddr", "Error") | ||
for _, ps := range arrs { | ||
tbl.AddRow(ps.Name, ps.Status, ps.LocalAddr, ps.Plugin, ps.RemoteAddr, ps.Err) | ||
} | ||
tbl.Print() | ||
fmt.Println("") | ||
} | ||
return nil | ||
} | ||
|
||
func StopHandler(clientCfg *v1.ClientCommonConfig) error { | ||
client := clientsdk.New(clientCfg.WebServer.Addr, clientCfg.WebServer.Port) | ||
client.SetAuth(clientCfg.WebServer.User, clientCfg.WebServer.Password) | ||
if err := client.Stop(); err != nil { | ||
return err | ||
} | ||
fmt.Println("stop success") | ||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
// Copyright 2023 The frp Authors | ||
// | ||
// 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. | ||
|
||
package sub | ||
|
||
import ( | ||
"fmt" | ||
|
||
"github.com/spf13/cobra" | ||
|
||
"github.com/fatedier/frp/pkg/config/types" | ||
v1 "github.com/fatedier/frp/pkg/config/v1" | ||
"github.com/fatedier/frp/pkg/config/v1/validation" | ||
) | ||
|
||
type BandwidthQuantityFlag struct { | ||
V *types.BandwidthQuantity | ||
} | ||
|
||
func (f *BandwidthQuantityFlag) Set(s string) error { | ||
return f.V.UnmarshalString(s) | ||
} | ||
|
||
func (f *BandwidthQuantityFlag) String() string { | ||
return f.V.String() | ||
} | ||
|
||
func (f *BandwidthQuantityFlag) Type() string { | ||
return "string" | ||
} | ||
|
||
func RegisterProxyFlags(cmd *cobra.Command, c v1.ProxyConfigurer) { | ||
registerProxyBaseConfigFlags(cmd, c.GetBaseConfig()) | ||
switch cc := c.(type) { | ||
case *v1.TCPProxyConfig: | ||
cmd.Flags().IntVarP(&cc.RemotePort, "remote_port", "r", 0, "remote port") | ||
case *v1.UDPProxyConfig: | ||
cmd.Flags().IntVarP(&cc.RemotePort, "remote_port", "r", 0, "remote port") | ||
case *v1.HTTPProxyConfig: | ||
registerProxyDomainConfigFlags(cmd, &cc.DomainConfig) | ||
cmd.Flags().StringSliceVarP(&cc.Locations, "locations", "", []string{}, "locations") | ||
cmd.Flags().StringVarP(&cc.HTTPUser, "http_user", "", "", "http auth user") | ||
cmd.Flags().StringVarP(&cc.HTTPPassword, "http_pwd", "", "", "http auth password") | ||
cmd.Flags().StringVarP(&cc.HostHeaderRewrite, "host_header_rewrite", "", "", "host header rewrite") | ||
case *v1.HTTPSProxyConfig: | ||
registerProxyDomainConfigFlags(cmd, &cc.DomainConfig) | ||
case *v1.TCPMuxProxyConfig: | ||
registerProxyDomainConfigFlags(cmd, &cc.DomainConfig) | ||
cmd.Flags().StringVarP(&cc.Multiplexer, "mux", "", "", "multiplexer") | ||
case *v1.STCPProxyConfig: | ||
cmd.Flags().StringVarP(&cc.Secretkey, "sk", "", "", "secret key") | ||
case *v1.SUDPProxyConfig: | ||
cmd.Flags().StringVarP(&cc.Secretkey, "sk", "", "", "secret key") | ||
case *v1.XTCPProxyConfig: | ||
cmd.Flags().StringVarP(&cc.Secretkey, "sk", "", "", "secret key") | ||
} | ||
} | ||
|
||
func registerProxyBaseConfigFlags(cmd *cobra.Command, c *v1.ProxyBaseConfig) { | ||
if c == nil { | ||
return | ||
} | ||
cmd.Flags().StringVarP(&c.Name, "proxy_name", "n", "", "proxy name") | ||
cmd.Flags().StringVarP(&c.LocalIP, "local_ip", "i", "127.0.0.1", "local ip") | ||
cmd.Flags().IntVarP(&c.LocalPort, "local_port", "l", 0, "local port") | ||
cmd.Flags().BoolVarP(&c.Transport.UseEncryption, "ue", "", false, "use encryption") | ||
cmd.Flags().BoolVarP(&c.Transport.UseCompression, "uc", "", false, "use compression") | ||
cmd.Flags().StringVarP(&c.Transport.BandwidthLimitMode, "bandwidth_limit_mode", "", types.BandwidthLimitModeClient, "bandwidth limit mode") | ||
cmd.Flags().VarP(&BandwidthQuantityFlag{V: &c.Transport.BandwidthLimit}, "bandwidth_limit", "", "bandwidth limit (e.g. 100KB or 1MB)") | ||
} | ||
|
||
func registerProxyDomainConfigFlags(cmd *cobra.Command, c *v1.DomainConfig) { | ||
if c == nil { | ||
return | ||
} | ||
cmd.Flags().StringSliceVarP(&c.CustomDomains, "custom_domain", "d", []string{}, "custom domains") | ||
cmd.Flags().StringVarP(&c.SubDomain, "sd", "", "", "sub domain") | ||
} | ||
|
||
func RegisterVisitorFlags(cmd *cobra.Command, c v1.VisitorConfigurer) { | ||
registerVisitorBaseConfigFlags(cmd, c.GetBaseConfig()) | ||
|
||
// add visitor flags if exist | ||
} | ||
|
||
func registerVisitorBaseConfigFlags(cmd *cobra.Command, c *v1.VisitorBaseConfig) { | ||
if c == nil { | ||
return | ||
} | ||
cmd.Flags().StringVarP(&c.Name, "visitor_name", "n", "", "visitor name") | ||
cmd.Flags().BoolVarP(&c.Transport.UseEncryption, "ue", "", false, "use encryption") | ||
cmd.Flags().BoolVarP(&c.Transport.UseCompression, "uc", "", false, "use compression") | ||
cmd.Flags().StringVarP(&c.SecretKey, "sk", "", "", "secret key") | ||
cmd.Flags().StringVarP(&c.ServerName, "server_name", "", "", "server name") | ||
cmd.Flags().StringVarP(&c.BindAddr, "bind_addr", "", "", "bind addr") | ||
cmd.Flags().IntVarP(&c.BindPort, "bind_port", "", 0, "bind port") | ||
} | ||
|
||
func RegisterClientCommonConfigFlags(cmd *cobra.Command, c *v1.ClientCommonConfig) { | ||
cmd.PersistentFlags().StringVarP(&c.ServerAddr, "server_addr", "s", "127.0.0.1", "frp server's address") | ||
cmd.PersistentFlags().IntVarP(&c.ServerPort, "server_port", "P", 7000, "frp server's port") | ||
cmd.PersistentFlags().StringVarP(&c.User, "user", "u", "", "user") | ||
cmd.PersistentFlags().StringVarP(&c.Transport.Protocol, "protocol", "p", "tcp", | ||
fmt.Sprintf("optional values are %v", validation.SupportedTransportProtocols)) | ||
cmd.PersistentFlags().StringVarP(&c.Auth.Token, "token", "t", "", "auth token") | ||
cmd.PersistentFlags().StringVarP(&c.Log.Level, "log_level", "", "info", "log level") | ||
cmd.PersistentFlags().StringVarP(&c.Log.To, "log_file", "", "console", "console or file path") | ||
cmd.PersistentFlags().Int64VarP(&c.Log.MaxDays, "log_max_days", "", 3, "log file reversed days") | ||
cmd.PersistentFlags().BoolVarP(&c.Log.DisablePrintColor, "disable_log_color", "", false, "disable log color in console") | ||
cmd.PersistentFlags().StringVarP(&c.Transport.TLS.ServerName, "tls_server_name", "", "", "specify the custom server name of tls certificate") | ||
cmd.PersistentFlags().StringVarP(&c.DNSServer, "dns_server", "", "", "specify dns server instead of using system default one") | ||
|
||
c.Transport.TLS.Enable = cmd.PersistentFlags().BoolP("tls_enable", "", true, "enable frpc tls") | ||
} |
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.