|
@@ -27,7 +27,9 @@ import (
|
|
|
ini "github.com/vaughan0/go-ini"
|
|
|
)
|
|
|
|
|
|
-var proxyConfTypeMap map[string]reflect.Type
|
|
|
+var (
|
|
|
+ proxyConfTypeMap map[string]reflect.Type
|
|
|
+)
|
|
|
|
|
|
func init() {
|
|
|
proxyConfTypeMap = make(map[string]reflect.Type)
|
|
@@ -51,17 +53,16 @@ func NewConfByType(proxyType string) ProxyConf {
|
|
|
}
|
|
|
|
|
|
type ProxyConf interface {
|
|
|
- GetName() string
|
|
|
- GetType() string
|
|
|
GetBaseInfo() *BaseProxyConf
|
|
|
- LoadFromMsg(pMsg *msg.NewProxy)
|
|
|
- LoadFromFile(name string, conf ini.Section) error
|
|
|
- UnMarshalToMsg(pMsg *msg.NewProxy)
|
|
|
- Check() error
|
|
|
+ UnmarshalFromMsg(pMsg *msg.NewProxy)
|
|
|
+ UnmarshalFromIni(prefix string, name string, conf ini.Section) error
|
|
|
+ MarshalToMsg(pMsg *msg.NewProxy)
|
|
|
+ CheckForCli() error
|
|
|
+ CheckForSvr() error
|
|
|
Compare(conf ProxyConf) bool
|
|
|
}
|
|
|
|
|
|
-func NewProxyConf(pMsg *msg.NewProxy) (cfg ProxyConf, err error) {
|
|
|
+func NewProxyConfFromMsg(pMsg *msg.NewProxy) (cfg ProxyConf, err error) {
|
|
|
if pMsg.ProxyType == "" {
|
|
|
pMsg.ProxyType = consts.TcpProxy
|
|
|
}
|
|
@@ -71,12 +72,12 @@ func NewProxyConf(pMsg *msg.NewProxy) (cfg ProxyConf, err error) {
|
|
|
err = fmt.Errorf("proxy [%s] type [%s] error", pMsg.ProxyName, pMsg.ProxyType)
|
|
|
return
|
|
|
}
|
|
|
- cfg.LoadFromMsg(pMsg)
|
|
|
- err = cfg.Check()
|
|
|
+ cfg.UnmarshalFromMsg(pMsg)
|
|
|
+ err = cfg.CheckForSvr()
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func NewProxyConfFromFile(name string, section ini.Section) (cfg ProxyConf, err error) {
|
|
|
+func NewProxyConfFromIni(prefix string, name string, section ini.Section) (cfg ProxyConf, err error) {
|
|
|
proxyType := section["type"]
|
|
|
if proxyType == "" {
|
|
|
proxyType = consts.TcpProxy
|
|
@@ -87,7 +88,10 @@ func NewProxyConfFromFile(name string, section ini.Section) (cfg ProxyConf, err
|
|
|
err = fmt.Errorf("proxy [%s] type [%s] error", name, proxyType)
|
|
|
return
|
|
|
}
|
|
|
- err = cfg.LoadFromFile(name, section)
|
|
|
+ if err = cfg.UnmarshalFromIni(prefix, name, section); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err = cfg.CheckForCli()
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -100,14 +104,6 @@ type BaseProxyConf struct {
|
|
|
UseCompression bool `json:"use_compression"`
|
|
|
}
|
|
|
|
|
|
-func (cfg *BaseProxyConf) GetName() string {
|
|
|
- return cfg.ProxyName
|
|
|
-}
|
|
|
-
|
|
|
-func (cfg *BaseProxyConf) GetType() string {
|
|
|
- return cfg.ProxyType
|
|
|
-}
|
|
|
-
|
|
|
func (cfg *BaseProxyConf) GetBaseInfo() *BaseProxyConf {
|
|
|
return cfg
|
|
|
}
|
|
@@ -122,23 +118,19 @@ func (cfg *BaseProxyConf) compare(cmp *BaseProxyConf) bool {
|
|
|
return true
|
|
|
}
|
|
|
|
|
|
-func (cfg *BaseProxyConf) LoadFromMsg(pMsg *msg.NewProxy) {
|
|
|
+func (cfg *BaseProxyConf) UnmarshalFromMsg(pMsg *msg.NewProxy) {
|
|
|
cfg.ProxyName = pMsg.ProxyName
|
|
|
cfg.ProxyType = pMsg.ProxyType
|
|
|
cfg.UseEncryption = pMsg.UseEncryption
|
|
|
cfg.UseCompression = pMsg.UseCompression
|
|
|
}
|
|
|
|
|
|
-func (cfg *BaseProxyConf) LoadFromFile(name string, section ini.Section) error {
|
|
|
+func (cfg *BaseProxyConf) UnmarshalFromIni(prefix string, name string, section ini.Section) error {
|
|
|
var (
|
|
|
tmpStr string
|
|
|
ok bool
|
|
|
)
|
|
|
- if ClientCommonCfg.User != "" {
|
|
|
- cfg.ProxyName = ClientCommonCfg.User + "." + name
|
|
|
- } else {
|
|
|
- cfg.ProxyName = name
|
|
|
- }
|
|
|
+ cfg.ProxyName = prefix + name
|
|
|
cfg.ProxyType = section["type"]
|
|
|
|
|
|
tmpStr, ok = section["use_encryption"]
|
|
@@ -153,7 +145,7 @@ func (cfg *BaseProxyConf) LoadFromFile(name string, section ini.Section) error {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-func (cfg *BaseProxyConf) UnMarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
+func (cfg *BaseProxyConf) MarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
pMsg.ProxyName = cfg.ProxyName
|
|
|
pMsg.ProxyType = cfg.ProxyType
|
|
|
pMsg.UseEncryption = cfg.UseEncryption
|
|
@@ -162,24 +154,21 @@ func (cfg *BaseProxyConf) UnMarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
|
|
|
// Bind info
|
|
|
type BindInfoConf struct {
|
|
|
- BindAddr string `json:"bind_addr"`
|
|
|
- RemotePort int `json:"remote_port"`
|
|
|
+ RemotePort int `json:"remote_port"`
|
|
|
}
|
|
|
|
|
|
func (cfg *BindInfoConf) compare(cmp *BindInfoConf) bool {
|
|
|
- if cfg.BindAddr != cmp.BindAddr ||
|
|
|
- cfg.RemotePort != cmp.RemotePort {
|
|
|
+ if cfg.RemotePort != cmp.RemotePort {
|
|
|
return false
|
|
|
}
|
|
|
return true
|
|
|
}
|
|
|
|
|
|
-func (cfg *BindInfoConf) LoadFromMsg(pMsg *msg.NewProxy) {
|
|
|
- cfg.BindAddr = ServerCommonCfg.ProxyBindAddr
|
|
|
+func (cfg *BindInfoConf) UnmarshalFromMsg(pMsg *msg.NewProxy) {
|
|
|
cfg.RemotePort = pMsg.RemotePort
|
|
|
}
|
|
|
|
|
|
-func (cfg *BindInfoConf) LoadFromFile(name string, section ini.Section) (err error) {
|
|
|
+func (cfg *BindInfoConf) UnmarshalFromIni(prefix string, name string, section ini.Section) (err error) {
|
|
|
var (
|
|
|
tmpStr string
|
|
|
ok bool
|
|
@@ -197,14 +186,10 @@ func (cfg *BindInfoConf) LoadFromFile(name string, section ini.Section) (err err
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-func (cfg *BindInfoConf) UnMarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
+func (cfg *BindInfoConf) MarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
pMsg.RemotePort = cfg.RemotePort
|
|
|
}
|
|
|
|
|
|
-func (cfg *BindInfoConf) check() (err error) {
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
// Domain info
|
|
|
type DomainConf struct {
|
|
|
CustomDomains []string `json:"custom_domains"`
|
|
@@ -219,12 +204,12 @@ func (cfg *DomainConf) compare(cmp *DomainConf) bool {
|
|
|
return true
|
|
|
}
|
|
|
|
|
|
-func (cfg *DomainConf) LoadFromMsg(pMsg *msg.NewProxy) {
|
|
|
+func (cfg *DomainConf) UnmarshalFromMsg(pMsg *msg.NewProxy) {
|
|
|
cfg.CustomDomains = pMsg.CustomDomains
|
|
|
cfg.SubDomain = pMsg.SubDomain
|
|
|
}
|
|
|
|
|
|
-func (cfg *DomainConf) LoadFromFile(name string, section ini.Section) (err error) {
|
|
|
+func (cfg *DomainConf) UnmarshalFromIni(prefix string, name string, section ini.Section) (err error) {
|
|
|
var (
|
|
|
tmpStr string
|
|
|
ok bool
|
|
@@ -239,42 +224,60 @@ func (cfg *DomainConf) LoadFromFile(name string, section ini.Section) (err error
|
|
|
if tmpStr, ok = section["subdomain"]; ok {
|
|
|
cfg.SubDomain = tmpStr
|
|
|
}
|
|
|
-
|
|
|
- if len(cfg.CustomDomains) == 0 && cfg.SubDomain == "" {
|
|
|
- return fmt.Errorf("Parse conf error: proxy [%s] custom_domains and subdomain should set at least one of them", name)
|
|
|
- }
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func (cfg *DomainConf) UnMarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
+func (cfg *DomainConf) MarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
pMsg.CustomDomains = cfg.CustomDomains
|
|
|
pMsg.SubDomain = cfg.SubDomain
|
|
|
}
|
|
|
|
|
|
func (cfg *DomainConf) check() (err error) {
|
|
|
+ if len(cfg.CustomDomains) == 0 && cfg.SubDomain == "" {
|
|
|
+ err = fmt.Errorf("custom_domains and subdomain should set at least one of them")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (cfg *DomainConf) checkForCli() (err error) {
|
|
|
+ if err = cfg.check(); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (cfg *DomainConf) checkForSvr() (err error) {
|
|
|
+ if err = cfg.check(); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
for _, domain := range cfg.CustomDomains {
|
|
|
- if ServerCommonCfg.SubDomainHost != "" && len(strings.Split(ServerCommonCfg.SubDomainHost, ".")) < len(strings.Split(domain, ".")) {
|
|
|
- if strings.Contains(domain, ServerCommonCfg.SubDomainHost) {
|
|
|
- return fmt.Errorf("custom domain [%s] should not belong to subdomain_host [%s]", domain, ServerCommonCfg.SubDomainHost)
|
|
|
+ if subDomainHost != "" && len(strings.Split(subDomainHost, ".")) < len(strings.Split(domain, ".")) {
|
|
|
+ if strings.Contains(domain, subDomainHost) {
|
|
|
+ return fmt.Errorf("custom domain [%s] should not belong to subdomain_host [%s]", domain, subDomainHost)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if cfg.SubDomain != "" {
|
|
|
- if ServerCommonCfg.SubDomainHost == "" {
|
|
|
+ if subDomainHost == "" {
|
|
|
return fmt.Errorf("subdomain is not supported because this feature is not enabled by frps")
|
|
|
}
|
|
|
if strings.Contains(cfg.SubDomain, ".") || strings.Contains(cfg.SubDomain, "*") {
|
|
|
return fmt.Errorf("'.' and '*' is not supported in subdomain")
|
|
|
}
|
|
|
}
|
|
|
- return nil
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
// Local service info
|
|
|
type LocalSvrConf struct {
|
|
|
- LocalIp string `json:"-"`
|
|
|
- LocalPort int `json:"-"`
|
|
|
+ LocalIp string `json:"local_ip"`
|
|
|
+ LocalPort int `json:"local_port"`
|
|
|
+
|
|
|
+ Plugin string `json:"plugin"`
|
|
|
+ PluginParams map[string]string `json:"plugin_params"`
|
|
|
}
|
|
|
|
|
|
func (cfg *LocalSvrConf) compare(cmp *LocalSvrConf) bool {
|
|
@@ -282,30 +285,6 @@ func (cfg *LocalSvrConf) compare(cmp *LocalSvrConf) bool {
|
|
|
cfg.LocalPort != cmp.LocalPort {
|
|
|
return false
|
|
|
}
|
|
|
- return true
|
|
|
-}
|
|
|
-
|
|
|
-func (cfg *LocalSvrConf) LoadFromFile(name string, section ini.Section) (err error) {
|
|
|
- if cfg.LocalIp = section["local_ip"]; cfg.LocalIp == "" {
|
|
|
- cfg.LocalIp = "127.0.0.1"
|
|
|
- }
|
|
|
-
|
|
|
- if tmpStr, ok := section["local_port"]; ok {
|
|
|
- if cfg.LocalPort, err = strconv.Atoi(tmpStr); err != nil {
|
|
|
- return fmt.Errorf("Parse conf error: proxy [%s] local_port error", name)
|
|
|
- }
|
|
|
- } else {
|
|
|
- return fmt.Errorf("Parse conf error: proxy [%s] local_port not found", name)
|
|
|
- }
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-type PluginConf struct {
|
|
|
- Plugin string `json:"-"`
|
|
|
- PluginParams map[string]string `json:"-"`
|
|
|
-}
|
|
|
-
|
|
|
-func (cfg *PluginConf) compare(cmp *PluginConf) bool {
|
|
|
if cfg.Plugin != cmp.Plugin ||
|
|
|
len(cfg.PluginParams) != len(cmp.PluginParams) {
|
|
|
return false
|
|
@@ -319,7 +298,7 @@ func (cfg *PluginConf) compare(cmp *PluginConf) bool {
|
|
|
return true
|
|
|
}
|
|
|
|
|
|
-func (cfg *PluginConf) LoadFromFile(name string, section ini.Section) (err error) {
|
|
|
+func (cfg *LocalSvrConf) UnmarshalFromIni(prefix string, name string, section ini.Section) (err error) {
|
|
|
cfg.Plugin = section["plugin"]
|
|
|
cfg.PluginParams = make(map[string]string)
|
|
|
if cfg.Plugin != "" {
|
|
@@ -330,7 +309,17 @@ func (cfg *PluginConf) LoadFromFile(name string, section ini.Section) (err error
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
- return fmt.Errorf("Parse conf error: proxy [%s] no plugin info found", name)
|
|
|
+ if cfg.LocalIp = section["local_ip"]; cfg.LocalIp == "" {
|
|
|
+ cfg.LocalIp = "127.0.0.1"
|
|
|
+ }
|
|
|
+
|
|
|
+ if tmpStr, ok := section["local_port"]; ok {
|
|
|
+ if cfg.LocalPort, err = strconv.Atoi(tmpStr); err != nil {
|
|
|
+ return fmt.Errorf("Parse conf error: proxy [%s] local_port error", name)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return fmt.Errorf("Parse conf error: proxy [%s] local_port not found", name)
|
|
|
+ }
|
|
|
}
|
|
|
return
|
|
|
}
|
|
@@ -341,7 +330,6 @@ type TcpProxyConf struct {
|
|
|
BindInfoConf
|
|
|
|
|
|
LocalSvrConf
|
|
|
- PluginConf
|
|
|
}
|
|
|
|
|
|
func (cfg *TcpProxyConf) Compare(cmp ProxyConf) bool {
|
|
@@ -352,43 +340,38 @@ func (cfg *TcpProxyConf) Compare(cmp ProxyConf) bool {
|
|
|
|
|
|
if !cfg.BaseProxyConf.compare(&cmpConf.BaseProxyConf) ||
|
|
|
!cfg.BindInfoConf.compare(&cmpConf.BindInfoConf) ||
|
|
|
- !cfg.LocalSvrConf.compare(&cmpConf.LocalSvrConf) ||
|
|
|
- !cfg.PluginConf.compare(&cmpConf.PluginConf) {
|
|
|
+ !cfg.LocalSvrConf.compare(&cmpConf.LocalSvrConf) {
|
|
|
return false
|
|
|
}
|
|
|
return true
|
|
|
}
|
|
|
|
|
|
-func (cfg *TcpProxyConf) LoadFromMsg(pMsg *msg.NewProxy) {
|
|
|
- cfg.BaseProxyConf.LoadFromMsg(pMsg)
|
|
|
- cfg.BindInfoConf.LoadFromMsg(pMsg)
|
|
|
+func (cfg *TcpProxyConf) UnmarshalFromMsg(pMsg *msg.NewProxy) {
|
|
|
+ cfg.BaseProxyConf.UnmarshalFromMsg(pMsg)
|
|
|
+ cfg.BindInfoConf.UnmarshalFromMsg(pMsg)
|
|
|
}
|
|
|
|
|
|
-func (cfg *TcpProxyConf) LoadFromFile(name string, section ini.Section) (err error) {
|
|
|
- if err = cfg.BaseProxyConf.LoadFromFile(name, section); err != nil {
|
|
|
+func (cfg *TcpProxyConf) UnmarshalFromIni(prefix string, name string, section ini.Section) (err error) {
|
|
|
+ if err = cfg.BaseProxyConf.UnmarshalFromIni(prefix, name, section); err != nil {
|
|
|
return
|
|
|
}
|
|
|
- if err = cfg.BindInfoConf.LoadFromFile(name, section); err != nil {
|
|
|
+ if err = cfg.BindInfoConf.UnmarshalFromIni(prefix, name, section); err != nil {
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
- if err = cfg.PluginConf.LoadFromFile(name, section); err != nil {
|
|
|
- if err = cfg.LocalSvrConf.LoadFromFile(name, section); err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
+ if err = cfg.LocalSvrConf.UnmarshalFromIni(prefix, name, section); err != nil {
|
|
|
+ return
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func (cfg *TcpProxyConf) UnMarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
- cfg.BaseProxyConf.UnMarshalToMsg(pMsg)
|
|
|
- cfg.BindInfoConf.UnMarshalToMsg(pMsg)
|
|
|
+func (cfg *TcpProxyConf) MarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
+ cfg.BaseProxyConf.MarshalToMsg(pMsg)
|
|
|
+ cfg.BindInfoConf.MarshalToMsg(pMsg)
|
|
|
}
|
|
|
|
|
|
-func (cfg *TcpProxyConf) Check() (err error) {
|
|
|
- err = cfg.BindInfoConf.check()
|
|
|
- return
|
|
|
-}
|
|
|
+func (cfg *TcpProxyConf) CheckForCli() error { return nil }
|
|
|
+
|
|
|
+func (cfg *TcpProxyConf) CheckForSvr() error { return nil }
|
|
|
|
|
|
// UDP
|
|
|
type UdpProxyConf struct {
|
|
@@ -412,33 +395,32 @@ func (cfg *UdpProxyConf) Compare(cmp ProxyConf) bool {
|
|
|
return true
|
|
|
}
|
|
|
|
|
|
-func (cfg *UdpProxyConf) LoadFromMsg(pMsg *msg.NewProxy) {
|
|
|
- cfg.BaseProxyConf.LoadFromMsg(pMsg)
|
|
|
- cfg.BindInfoConf.LoadFromMsg(pMsg)
|
|
|
+func (cfg *UdpProxyConf) UnmarshalFromMsg(pMsg *msg.NewProxy) {
|
|
|
+ cfg.BaseProxyConf.UnmarshalFromMsg(pMsg)
|
|
|
+ cfg.BindInfoConf.UnmarshalFromMsg(pMsg)
|
|
|
}
|
|
|
|
|
|
-func (cfg *UdpProxyConf) LoadFromFile(name string, section ini.Section) (err error) {
|
|
|
- if err = cfg.BaseProxyConf.LoadFromFile(name, section); err != nil {
|
|
|
+func (cfg *UdpProxyConf) UnmarshalFromIni(prefix string, name string, section ini.Section) (err error) {
|
|
|
+ if err = cfg.BaseProxyConf.UnmarshalFromIni(prefix, name, section); err != nil {
|
|
|
return
|
|
|
}
|
|
|
- if err = cfg.BindInfoConf.LoadFromFile(name, section); err != nil {
|
|
|
+ if err = cfg.BindInfoConf.UnmarshalFromIni(prefix, name, section); err != nil {
|
|
|
return
|
|
|
}
|
|
|
- if err = cfg.LocalSvrConf.LoadFromFile(name, section); err != nil {
|
|
|
+ if err = cfg.LocalSvrConf.UnmarshalFromIni(prefix, name, section); err != nil {
|
|
|
return
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func (cfg *UdpProxyConf) UnMarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
- cfg.BaseProxyConf.UnMarshalToMsg(pMsg)
|
|
|
- cfg.BindInfoConf.UnMarshalToMsg(pMsg)
|
|
|
+func (cfg *UdpProxyConf) MarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
+ cfg.BaseProxyConf.MarshalToMsg(pMsg)
|
|
|
+ cfg.BindInfoConf.MarshalToMsg(pMsg)
|
|
|
}
|
|
|
|
|
|
-func (cfg *UdpProxyConf) Check() (err error) {
|
|
|
- err = cfg.BindInfoConf.check()
|
|
|
- return
|
|
|
-}
|
|
|
+func (cfg *UdpProxyConf) CheckForCli() error { return nil }
|
|
|
+
|
|
|
+func (cfg *UdpProxyConf) CheckForSvr() error { return nil }
|
|
|
|
|
|
// HTTP
|
|
|
type HttpProxyConf struct {
|
|
@@ -446,12 +428,11 @@ type HttpProxyConf struct {
|
|
|
DomainConf
|
|
|
|
|
|
LocalSvrConf
|
|
|
- PluginConf
|
|
|
|
|
|
Locations []string `json:"locations"`
|
|
|
HostHeaderRewrite string `json:"host_header_rewrite"`
|
|
|
- HttpUser string `json:"-"`
|
|
|
- HttpPwd string `json:"-"`
|
|
|
+ HttpUser string `json:"http_user"`
|
|
|
+ HttpPwd string `json:"http_pwd"`
|
|
|
}
|
|
|
|
|
|
func (cfg *HttpProxyConf) Compare(cmp ProxyConf) bool {
|
|
@@ -463,7 +444,6 @@ func (cfg *HttpProxyConf) Compare(cmp ProxyConf) bool {
|
|
|
if !cfg.BaseProxyConf.compare(&cmpConf.BaseProxyConf) ||
|
|
|
!cfg.DomainConf.compare(&cmpConf.DomainConf) ||
|
|
|
!cfg.LocalSvrConf.compare(&cmpConf.LocalSvrConf) ||
|
|
|
- !cfg.PluginConf.compare(&cmpConf.PluginConf) ||
|
|
|
strings.Join(cfg.Locations, " ") != strings.Join(cmpConf.Locations, " ") ||
|
|
|
cfg.HostHeaderRewrite != cmpConf.HostHeaderRewrite ||
|
|
|
cfg.HttpUser != cmpConf.HttpUser ||
|
|
@@ -473,9 +453,9 @@ func (cfg *HttpProxyConf) Compare(cmp ProxyConf) bool {
|
|
|
return true
|
|
|
}
|
|
|
|
|
|
-func (cfg *HttpProxyConf) LoadFromMsg(pMsg *msg.NewProxy) {
|
|
|
- cfg.BaseProxyConf.LoadFromMsg(pMsg)
|
|
|
- cfg.DomainConf.LoadFromMsg(pMsg)
|
|
|
+func (cfg *HttpProxyConf) UnmarshalFromMsg(pMsg *msg.NewProxy) {
|
|
|
+ cfg.BaseProxyConf.UnmarshalFromMsg(pMsg)
|
|
|
+ cfg.DomainConf.UnmarshalFromMsg(pMsg)
|
|
|
|
|
|
cfg.Locations = pMsg.Locations
|
|
|
cfg.HostHeaderRewrite = pMsg.HostHeaderRewrite
|
|
@@ -483,17 +463,15 @@ func (cfg *HttpProxyConf) LoadFromMsg(pMsg *msg.NewProxy) {
|
|
|
cfg.HttpPwd = pMsg.HttpPwd
|
|
|
}
|
|
|
|
|
|
-func (cfg *HttpProxyConf) LoadFromFile(name string, section ini.Section) (err error) {
|
|
|
- if err = cfg.BaseProxyConf.LoadFromFile(name, section); err != nil {
|
|
|
+func (cfg *HttpProxyConf) UnmarshalFromIni(prefix string, name string, section ini.Section) (err error) {
|
|
|
+ if err = cfg.BaseProxyConf.UnmarshalFromIni(prefix, name, section); err != nil {
|
|
|
return
|
|
|
}
|
|
|
- if err = cfg.DomainConf.LoadFromFile(name, section); err != nil {
|
|
|
+ if err = cfg.DomainConf.UnmarshalFromIni(prefix, name, section); err != nil {
|
|
|
return
|
|
|
}
|
|
|
- if err = cfg.PluginConf.LoadFromFile(name, section); err != nil {
|
|
|
- if err = cfg.LocalSvrConf.LoadFromFile(name, section); err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
+ if err = cfg.LocalSvrConf.UnmarshalFromIni(prefix, name, section); err != nil {
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
var (
|
|
@@ -512,9 +490,9 @@ func (cfg *HttpProxyConf) LoadFromFile(name string, section ini.Section) (err er
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func (cfg *HttpProxyConf) UnMarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
- cfg.BaseProxyConf.UnMarshalToMsg(pMsg)
|
|
|
- cfg.DomainConf.UnMarshalToMsg(pMsg)
|
|
|
+func (cfg *HttpProxyConf) MarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
+ cfg.BaseProxyConf.MarshalToMsg(pMsg)
|
|
|
+ cfg.DomainConf.MarshalToMsg(pMsg)
|
|
|
|
|
|
pMsg.Locations = cfg.Locations
|
|
|
pMsg.HostHeaderRewrite = cfg.HostHeaderRewrite
|
|
@@ -522,11 +500,20 @@ func (cfg *HttpProxyConf) UnMarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
pMsg.HttpPwd = cfg.HttpPwd
|
|
|
}
|
|
|
|
|
|
-func (cfg *HttpProxyConf) Check() (err error) {
|
|
|
- if ServerCommonCfg.VhostHttpPort == 0 {
|
|
|
- return fmt.Errorf("type [http] not support when vhost_http_port is not set")
|
|
|
+func (cfg *HttpProxyConf) CheckForCli() (err error) {
|
|
|
+ if err = cfg.DomainConf.checkForCli(); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (cfg *HttpProxyConf) CheckForSvr() (err error) {
|
|
|
+ if vhostHttpPort == 0 {
|
|
|
+ err = fmt.Errorf("type [http] not support when vhost_http_port is not set")
|
|
|
+ }
|
|
|
+ if err = cfg.DomainConf.checkForSvr(); err != nil {
|
|
|
+ return
|
|
|
}
|
|
|
- err = cfg.DomainConf.check()
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -536,7 +523,6 @@ type HttpsProxyConf struct {
|
|
|
DomainConf
|
|
|
|
|
|
LocalSvrConf
|
|
|
- PluginConf
|
|
|
}
|
|
|
|
|
|
func (cfg *HttpsProxyConf) Compare(cmp ProxyConf) bool {
|
|
@@ -547,43 +533,49 @@ func (cfg *HttpsProxyConf) Compare(cmp ProxyConf) bool {
|
|
|
|
|
|
if !cfg.BaseProxyConf.compare(&cmpConf.BaseProxyConf) ||
|
|
|
!cfg.DomainConf.compare(&cmpConf.DomainConf) ||
|
|
|
- !cfg.LocalSvrConf.compare(&cmpConf.LocalSvrConf) ||
|
|
|
- !cfg.PluginConf.compare(&cmpConf.PluginConf) {
|
|
|
+ !cfg.LocalSvrConf.compare(&cmpConf.LocalSvrConf) {
|
|
|
return false
|
|
|
}
|
|
|
return true
|
|
|
}
|
|
|
|
|
|
-func (cfg *HttpsProxyConf) LoadFromMsg(pMsg *msg.NewProxy) {
|
|
|
- cfg.BaseProxyConf.LoadFromMsg(pMsg)
|
|
|
- cfg.DomainConf.LoadFromMsg(pMsg)
|
|
|
+func (cfg *HttpsProxyConf) UnmarshalFromMsg(pMsg *msg.NewProxy) {
|
|
|
+ cfg.BaseProxyConf.UnmarshalFromMsg(pMsg)
|
|
|
+ cfg.DomainConf.UnmarshalFromMsg(pMsg)
|
|
|
}
|
|
|
|
|
|
-func (cfg *HttpsProxyConf) LoadFromFile(name string, section ini.Section) (err error) {
|
|
|
- if err = cfg.BaseProxyConf.LoadFromFile(name, section); err != nil {
|
|
|
+func (cfg *HttpsProxyConf) UnmarshalFromIni(prefix string, name string, section ini.Section) (err error) {
|
|
|
+ if err = cfg.BaseProxyConf.UnmarshalFromIni(prefix, name, section); err != nil {
|
|
|
return
|
|
|
}
|
|
|
- if err = cfg.DomainConf.LoadFromFile(name, section); err != nil {
|
|
|
+ if err = cfg.DomainConf.UnmarshalFromIni(prefix, name, section); err != nil {
|
|
|
return
|
|
|
}
|
|
|
- if err = cfg.PluginConf.LoadFromFile(name, section); err != nil {
|
|
|
- if err = cfg.LocalSvrConf.LoadFromFile(name, section); err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
+ if err = cfg.LocalSvrConf.UnmarshalFromIni(prefix, name, section); err != nil {
|
|
|
+ return
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func (cfg *HttpsProxyConf) UnMarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
- cfg.BaseProxyConf.UnMarshalToMsg(pMsg)
|
|
|
- cfg.DomainConf.UnMarshalToMsg(pMsg)
|
|
|
+func (cfg *HttpsProxyConf) MarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
+ cfg.BaseProxyConf.MarshalToMsg(pMsg)
|
|
|
+ cfg.DomainConf.MarshalToMsg(pMsg)
|
|
|
}
|
|
|
|
|
|
-func (cfg *HttpsProxyConf) Check() (err error) {
|
|
|
- if ServerCommonCfg.VhostHttpsPort == 0 {
|
|
|
+func (cfg *HttpsProxyConf) CheckForCli() (err error) {
|
|
|
+ if err = cfg.DomainConf.checkForCli(); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (cfg *HttpsProxyConf) CheckForSvr() (err error) {
|
|
|
+ if vhostHttpsPort == 0 {
|
|
|
return fmt.Errorf("type [https] not support when vhost_https_port is not set")
|
|
|
}
|
|
|
- err = cfg.DomainConf.check()
|
|
|
+ if err = cfg.DomainConf.checkForSvr(); err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -596,7 +588,6 @@ type StcpProxyConf struct {
|
|
|
|
|
|
// used in role server
|
|
|
LocalSvrConf
|
|
|
- PluginConf
|
|
|
|
|
|
// used in role visitor
|
|
|
ServerName string `json:"server_name"`
|
|
@@ -612,7 +603,6 @@ func (cfg *StcpProxyConf) Compare(cmp ProxyConf) bool {
|
|
|
|
|
|
if !cfg.BaseProxyConf.compare(&cmpConf.BaseProxyConf) ||
|
|
|
!cfg.LocalSvrConf.compare(&cmpConf.LocalSvrConf) ||
|
|
|
- !cfg.PluginConf.compare(&cmpConf.PluginConf) ||
|
|
|
cfg.Role != cmpConf.Role ||
|
|
|
cfg.Sk != cmpConf.Sk ||
|
|
|
cfg.ServerName != cmpConf.ServerName ||
|
|
@@ -624,13 +614,13 @@ func (cfg *StcpProxyConf) Compare(cmp ProxyConf) bool {
|
|
|
}
|
|
|
|
|
|
// Only for role server.
|
|
|
-func (cfg *StcpProxyConf) LoadFromMsg(pMsg *msg.NewProxy) {
|
|
|
- cfg.BaseProxyConf.LoadFromMsg(pMsg)
|
|
|
+func (cfg *StcpProxyConf) UnmarshalFromMsg(pMsg *msg.NewProxy) {
|
|
|
+ cfg.BaseProxyConf.UnmarshalFromMsg(pMsg)
|
|
|
cfg.Sk = pMsg.Sk
|
|
|
}
|
|
|
|
|
|
-func (cfg *StcpProxyConf) LoadFromFile(name string, section ini.Section) (err error) {
|
|
|
- if err = cfg.BaseProxyConf.LoadFromFile(name, section); err != nil {
|
|
|
+func (cfg *StcpProxyConf) UnmarshalFromIni(prefix string, name string, section ini.Section) (err error) {
|
|
|
+ if err = cfg.BaseProxyConf.UnmarshalFromIni(prefix, name, section); err != nil {
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -661,21 +651,33 @@ func (cfg *StcpProxyConf) LoadFromFile(name string, section ini.Section) (err er
|
|
|
return fmt.Errorf("Parse conf error: proxy [%s] bind_port not found", name)
|
|
|
}
|
|
|
} else {
|
|
|
- if err = cfg.PluginConf.LoadFromFile(name, section); err != nil {
|
|
|
- if err = cfg.LocalSvrConf.LoadFromFile(name, section); err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
+ if err = cfg.LocalSvrConf.UnmarshalFromIni(prefix, name, section); err != nil {
|
|
|
+ return
|
|
|
}
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func (cfg *StcpProxyConf) UnMarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
- cfg.BaseProxyConf.UnMarshalToMsg(pMsg)
|
|
|
+func (cfg *StcpProxyConf) MarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
+ cfg.BaseProxyConf.MarshalToMsg(pMsg)
|
|
|
pMsg.Sk = cfg.Sk
|
|
|
}
|
|
|
|
|
|
-func (cfg *StcpProxyConf) Check() (err error) {
|
|
|
+func (cfg *StcpProxyConf) CheckForCli() (err error) {
|
|
|
+ if cfg.Role != "server" && cfg.Role != "visitor" {
|
|
|
+ err = fmt.Errorf("role should be 'server' or 'visitor'")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if cfg.Role == "visitor" {
|
|
|
+ if cfg.BindAddr == "" {
|
|
|
+ err = fmt.Errorf("bind_addr shouldn't be empty")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (cfg *StcpProxyConf) CheckForSvr() (err error) {
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -688,7 +690,6 @@ type XtcpProxyConf struct {
|
|
|
|
|
|
// used in role server
|
|
|
LocalSvrConf
|
|
|
- PluginConf
|
|
|
|
|
|
// used in role visitor
|
|
|
ServerName string `json:"server_name"`
|
|
@@ -704,7 +705,6 @@ func (cfg *XtcpProxyConf) Compare(cmp ProxyConf) bool {
|
|
|
|
|
|
if !cfg.BaseProxyConf.compare(&cmpConf.BaseProxyConf) ||
|
|
|
!cfg.LocalSvrConf.compare(&cmpConf.LocalSvrConf) ||
|
|
|
- !cfg.PluginConf.compare(&cmpConf.PluginConf) ||
|
|
|
cfg.Role != cmpConf.Role ||
|
|
|
cfg.Sk != cmpConf.Sk ||
|
|
|
cfg.ServerName != cmpConf.ServerName ||
|
|
@@ -716,13 +716,13 @@ func (cfg *XtcpProxyConf) Compare(cmp ProxyConf) bool {
|
|
|
}
|
|
|
|
|
|
// Only for role server.
|
|
|
-func (cfg *XtcpProxyConf) LoadFromMsg(pMsg *msg.NewProxy) {
|
|
|
- cfg.BaseProxyConf.LoadFromMsg(pMsg)
|
|
|
+func (cfg *XtcpProxyConf) UnmarshalFromMsg(pMsg *msg.NewProxy) {
|
|
|
+ cfg.BaseProxyConf.UnmarshalFromMsg(pMsg)
|
|
|
cfg.Sk = pMsg.Sk
|
|
|
}
|
|
|
|
|
|
-func (cfg *XtcpProxyConf) LoadFromFile(name string, section ini.Section) (err error) {
|
|
|
- if err = cfg.BaseProxyConf.LoadFromFile(name, section); err != nil {
|
|
|
+func (cfg *XtcpProxyConf) UnmarshalFromIni(prefix string, name string, section ini.Section) (err error) {
|
|
|
+ if err = cfg.BaseProxyConf.UnmarshalFromIni(prefix, name, section); err != nil {
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -753,21 +753,33 @@ func (cfg *XtcpProxyConf) LoadFromFile(name string, section ini.Section) (err er
|
|
|
return fmt.Errorf("Parse conf error: proxy [%s] bind_port not found", name)
|
|
|
}
|
|
|
} else {
|
|
|
- if err = cfg.PluginConf.LoadFromFile(name, section); err != nil {
|
|
|
- if err = cfg.LocalSvrConf.LoadFromFile(name, section); err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
+ if err = cfg.LocalSvrConf.UnmarshalFromIni(prefix, name, section); err != nil {
|
|
|
+ return
|
|
|
}
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func (cfg *XtcpProxyConf) UnMarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
- cfg.BaseProxyConf.UnMarshalToMsg(pMsg)
|
|
|
+func (cfg *XtcpProxyConf) MarshalToMsg(pMsg *msg.NewProxy) {
|
|
|
+ cfg.BaseProxyConf.MarshalToMsg(pMsg)
|
|
|
pMsg.Sk = cfg.Sk
|
|
|
}
|
|
|
|
|
|
-func (cfg *XtcpProxyConf) Check() (err error) {
|
|
|
+func (cfg *XtcpProxyConf) CheckForCli() (err error) {
|
|
|
+ if cfg.Role != "server" && cfg.Role != "visitor" {
|
|
|
+ err = fmt.Errorf("role should be 'server' or 'visitor'")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if cfg.Role == "visitor" {
|
|
|
+ if cfg.BindAddr == "" {
|
|
|
+ err = fmt.Errorf("bind_addr shouldn't be empty")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (cfg *XtcpProxyConf) CheckForSvr() (err error) {
|
|
|
return
|
|
|
}
|
|
|
|
|
@@ -805,7 +817,7 @@ func ParseRangeSection(name string, section ini.Section) (sections map[string]in
|
|
|
|
|
|
// if len(startProxy) is 0, start all
|
|
|
// otherwise just start proxies in startProxy map
|
|
|
-func LoadProxyConfFromFile(prefix string, conf ini.File, startProxy map[string]struct{}) (
|
|
|
+func LoadProxyConfFromIni(prefix string, conf ini.File, startProxy map[string]struct{}) (
|
|
|
proxyConfs map[string]ProxyConf, visitorConfs map[string]ProxyConf, err error) {
|
|
|
|
|
|
if prefix != "" {
|
|
@@ -842,9 +854,7 @@ func LoadProxyConfFromFile(prefix string, conf ini.File, startProxy map[string]s
|
|
|
}
|
|
|
|
|
|
for subName, subSection := range subSections {
|
|
|
- // some proxy or visotr configure may be used this prefix
|
|
|
- subSection["prefix"] = prefix
|
|
|
- cfg, err := NewProxyConfFromFile(subName, subSection)
|
|
|
+ cfg, err := NewProxyConfFromIni(prefix, subName, subSection)
|
|
|
if err != nil {
|
|
|
return proxyConfs, visitorConfs, err
|
|
|
}
|