diff --git a/.travis.yml b/.travis.yml index 3570be0..b49aa7c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,8 +2,8 @@ sudo: false language: go go: - - 1.7.5 - - 1.8 + - 1.7.x + - 1.8.x install: - make diff --git a/client/control.go b/client/control.go index a132eba..5a094da 100644 --- a/client/control.go +++ b/client/control.go @@ -106,9 +106,20 @@ func NewControl(svr *Service, pxyCfgs map[string]config.ProxyConf) *Control { // 7. In controler(): start new reader(), writer(), manager() // controler() will keep running func (ctl *Control) Run() error { - err := ctl.login() - if err != nil { - return err + for { + err := ctl.login() + if err != nil { + // if login_fail_exit is true, just exit this program + // otherwise sleep a while and continues relogin to server + if config.ClientCommonCfg.LoginFailExit { + return err + } else { + ctl.Warn("login to server fail: %v", err) + time.Sleep(30 * time.Second) + } + } else { + break + } } go ctl.controler() diff --git a/conf/frpc.ini b/conf/frpc.ini index 8546eae..13a8e5f 100644 --- a/conf/frpc.ini +++ b/conf/frpc.ini @@ -1,92 +1,9 @@ -# [common] is integral section [common] -# A literal address or host name for IPv6 must be enclosed -# in square brackets, as in "[::1]:80", "[ipv6-host]:http" or "[ipv6-host%zone]:80" -server_addr = 0.0.0.0 +server_addr = 127.0.0.1 server_port = 7000 -# if you want to connect frps by http proxy, you can set http_proxy here or in global environment variables -# http_proxy = http://user:pwd@192.168.1.128:8080 - -# console or real logFile path like ./frpc.log -log_file = ./frpc.log - -# trace, debug, info, warn, error -log_level = info - -log_max_days = 3 - -# for authentication -privilege_token = 12345678 - -# connections will be established in advance, default value is zero -pool_count = 5 - -# if tcp stream multiplexing is used, default is true, it must be same with frps -tcp_mux = true - -# your proxy name will be changed to {user}.{proxy} -user = your_name - -# heartbeat configure, it's not recommended to modify the default value -# the default value of heartbeat_interval is 10 and heartbeat_timeout is 90 -# heartbeat_interval = 30 -# heartbeat_timeout = 90 - -# ssh is the proxy name same as server's configuration -# if user in [common] section is not empty, it will be changed to {user}.{proxy} such as your_name.ssh [ssh] -# tcp | udp | http | https, default is tcp type = tcp local_ip = 127.0.0.1 local_port = 22 -# true or false, if true, messages between frps and frpc will be encrypted, default is false -use_encryption = false -# if true, message will be compressed -use_compression = false -# remote port listen by frps -remote_port = 6001 - -[dns] -type = udp -local_ip = 114.114.114.114 -local_port = 53 -remote_port = 6002 -use_encryption = false -use_compression = false - -# Resolve your domain names to [server_addr] so you can use http://web01.yourdomain.com to browse web01 and http://web02.yourdomain.com to browse web02 -[web01] -type = http -local_ip = 127.0.0.1 -local_port = 80 -use_encryption = false -use_compression = true -# http username and password are safety certification for http protocol -# if not set, you can access this custom_domains without certification -http_user = admin -http_pwd = admin -# if domain for frps is frps.com, then you can access [web01] proxy by URL http://test.frps.com -subdomain = web01 -custom_domains = web02.yourdomain.com -# locations is only useful for http type -locations = /,/pic -host_header_rewrite = example.com - -[web02] -type = https -local_ip = 127.0.0.1 -local_port = 8000 -use_encryption = false -use_compression = false -subdomain = web01 -custom_domains = web02.yourdomain.com - -[unix_domain] -type = tcp -remote_port = 6001 -# if plugin is defined, local_ip and local_port is useless -# plugin will handle connections got from frps -plugin = unix_domain_socket -# params set with prefix "plugin_" that plugin needed -plugin_unix_path = /var/run/docker.sock +remote_port = 6000 diff --git a/conf/frpc_full.ini b/conf/frpc_full.ini new file mode 100644 index 0000000..ff99241 --- /dev/null +++ b/conf/frpc_full.ini @@ -0,0 +1,96 @@ +# [common] is integral section +[common] +# A literal address or host name for IPv6 must be enclosed +# in square brackets, as in "[::1]:80", "[ipv6-host]:http" or "[ipv6-host%zone]:80" +server_addr = 0.0.0.0 +server_port = 7000 + +# if you want to connect frps by http proxy, you can set http_proxy here or in global environment variables +# http_proxy = http://user:pwd@192.168.1.128:8080 + +# console or real logFile path like ./frpc.log +log_file = ./frpc.log + +# trace, debug, info, warn, error +log_level = info + +log_max_days = 3 + +# for authentication +privilege_token = 12345678 + +# connections will be established in advance, default value is zero +pool_count = 5 + +# if tcp stream multiplexing is used, default is true, it must be same with frps +tcp_mux = true + +# your proxy name will be changed to {user}.{proxy} +user = your_name + +# decide if exit program when first login failed, otherwise continuous relogin to frps +# default is true +login_fail_exit = true + +# heartbeat configure, it's not recommended to modify the default value +# the default value of heartbeat_interval is 10 and heartbeat_timeout is 90 +# heartbeat_interval = 30 +# heartbeat_timeout = 90 + +# ssh is the proxy name same as server's configuration +# if user in [common] section is not empty, it will be changed to {user}.{proxy} such as your_name.ssh +[ssh] +# tcp | udp | http | https, default is tcp +type = tcp +local_ip = 127.0.0.1 +local_port = 22 +# true or false, if true, messages between frps and frpc will be encrypted, default is false +use_encryption = false +# if true, message will be compressed +use_compression = false +# remote port listen by frps +remote_port = 6001 + +[dns] +type = udp +local_ip = 114.114.114.114 +local_port = 53 +remote_port = 6002 +use_encryption = false +use_compression = false + +# Resolve your domain names to [server_addr] so you can use http://web01.yourdomain.com to browse web01 and http://web02.yourdomain.com to browse web02 +[web01] +type = http +local_ip = 127.0.0.1 +local_port = 80 +use_encryption = false +use_compression = true +# http username and password are safety certification for http protocol +# if not set, you can access this custom_domains without certification +http_user = admin +http_pwd = admin +# if domain for frps is frps.com, then you can access [web01] proxy by URL http://test.frps.com +subdomain = web01 +custom_domains = web02.yourdomain.com +# locations is only useful for http type +locations = /,/pic +host_header_rewrite = example.com + +[web02] +type = https +local_ip = 127.0.0.1 +local_port = 8000 +use_encryption = false +use_compression = false +subdomain = web01 +custom_domains = web02.yourdomain.com + +[unix_domain_socket] +type = tcp +remote_port = 6001 +# if plugin is defined, local_ip and local_port is useless +# plugin will handle connections got from frps +plugin = unix_domain_socket +# params set with prefix "plugin_" that plugin needed +plugin_unix_path = /var/run/docker.sock diff --git a/conf/frpc_min.ini b/conf/frpc_min.ini deleted file mode 100644 index ac6a688..0000000 --- a/conf/frpc_min.ini +++ /dev/null @@ -1,10 +0,0 @@ -[common] -server_addr = 0.0.0.0 -server_port = 7000 -#privilege_token = 12345678 - -[ssh] -type = tcp -local_ip = 127.0.0.1 -local_port = 22 -remote_port = 6000 diff --git a/conf/frps.ini b/conf/frps.ini index d28f8f3..229567a 100644 --- a/conf/frps.ini +++ b/conf/frps.ini @@ -1,51 +1,2 @@ -# [common] is integral section [common] -# A literal address or host name for IPv6 must be enclosed -# in square brackets, as in "[::1]:80", "[ipv6-host]:http" or "[ipv6-host%zone]:80" -bind_addr = 0.0.0.0 bind_port = 7000 - -# if you want to support virtual host, you must set the http port for listening (optional) -vhost_http_port = 80 -vhost_https_port = 443 - -# if you want to configure or reload frps by dashboard, dashboard_port must be set -dashboard_port = 7500 - -# dashboard user and pwd for basic auth protect, if not set, both default value is admin -dashboard_user = admin -dashboard_pwd = admin - -# dashboard assets directory(only for debug mode) -# assets_dir = ./static -# console or real logFile path like ./frps.log -log_file = ./frps.log - -# trace, debug, info, warn, error -log_level = info - -log_max_days = 3 - -# privilege mode is the only supported mode since v0.10.0 -privilege_token = 12345678 - -# heartbeat configure, it's not recommended to modify the default value -# the default value of heartbeat_timeout is 90 -# heartbeat_timeout = 90 - -# only allow frpc to bind ports you list, if you set nothing, there won't be any limit -privilege_allow_ports = 2000-3000,3001,3003,4000-50000 - -# pool_count in each proxy will change to max_pool_count if they exceed the maximum value -max_pool_count = 5 - -# authentication_timeout means the timeout interval (seconds) when the frpc connects frps -# if authentication_timeout is zero, the time is not verified, default is 900s -authentication_timeout = 900 - -# if subdomain_host is not empty, you can set subdomain when type is http or https in frpc's configure file -# when subdomain is test, the host used by routing is test.frps.com -subdomain_host = frps.com - -# if tcp stream multiplexing is used, default is true -tcp_mux = true diff --git a/conf/frps_full.ini b/conf/frps_full.ini new file mode 100644 index 0000000..d28f8f3 --- /dev/null +++ b/conf/frps_full.ini @@ -0,0 +1,51 @@ +# [common] is integral section +[common] +# A literal address or host name for IPv6 must be enclosed +# in square brackets, as in "[::1]:80", "[ipv6-host]:http" or "[ipv6-host%zone]:80" +bind_addr = 0.0.0.0 +bind_port = 7000 + +# if you want to support virtual host, you must set the http port for listening (optional) +vhost_http_port = 80 +vhost_https_port = 443 + +# if you want to configure or reload frps by dashboard, dashboard_port must be set +dashboard_port = 7500 + +# dashboard user and pwd for basic auth protect, if not set, both default value is admin +dashboard_user = admin +dashboard_pwd = admin + +# dashboard assets directory(only for debug mode) +# assets_dir = ./static +# console or real logFile path like ./frps.log +log_file = ./frps.log + +# trace, debug, info, warn, error +log_level = info + +log_max_days = 3 + +# privilege mode is the only supported mode since v0.10.0 +privilege_token = 12345678 + +# heartbeat configure, it's not recommended to modify the default value +# the default value of heartbeat_timeout is 90 +# heartbeat_timeout = 90 + +# only allow frpc to bind ports you list, if you set nothing, there won't be any limit +privilege_allow_ports = 2000-3000,3001,3003,4000-50000 + +# pool_count in each proxy will change to max_pool_count if they exceed the maximum value +max_pool_count = 5 + +# authentication_timeout means the timeout interval (seconds) when the frpc connects frps +# if authentication_timeout is zero, the time is not verified, default is 900s +authentication_timeout = 900 + +# if subdomain_host is not empty, you can set subdomain when type is http or https in frpc's configure file +# when subdomain is test, the host used by routing is test.frps.com +subdomain_host = frps.com + +# if tcp stream multiplexing is used, default is true +tcp_mux = true diff --git a/conf/frps_min.ini b/conf/frps_min.ini deleted file mode 100644 index d6446cc..0000000 --- a/conf/frps_min.ini +++ /dev/null @@ -1,7 +0,0 @@ -[common] -bind_addr = 0.0.0.0 -bind_port = 7000 -vhost_http_port = 80 -vhost_https_port = 443 -dashboard_port = 7500 -#privilege_token = 12345678 diff --git a/models/config/client_common.go b/models/config/client_common.go index 3384a37..c1b622a 100644 --- a/models/config/client_common.go +++ b/models/config/client_common.go @@ -38,6 +38,7 @@ type ClientCommonConf struct { PoolCount int TcpMux bool User string + LoginFailExit bool HeartBeatInterval int64 HeartBeatTimeout int64 } @@ -56,6 +57,7 @@ func GetDeaultClientCommonConf() *ClientCommonConf { PoolCount: 1, TcpMux: true, User: "", + LoginFailExit: true, HeartBeatInterval: 30, HeartBeatTimeout: 90, } @@ -134,6 +136,13 @@ func LoadClientCommonConf(conf ini.File) (cfg *ClientCommonConf, err error) { cfg.User = tmpStr } + tmpStr, ok = conf.Get("common", "login_fail_exit") + if ok && tmpStr == "false" { + cfg.LoginFailExit = false + } else { + cfg.LoginFailExit = true + } + tmpStr, ok = conf.Get("common", "heartbeat_timeout") if ok { v, err = strconv.ParseInt(tmpStr, 10, 64)