mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 07:50:25 +08:00 
			
		
		
		
	实现HTTP部分功能
This commit is contained in:
		
							
								
								
									
										4
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.mod
									
									
									
									
									
								
							@@ -9,9 +9,7 @@ require (
 | 
			
		||||
	github.com/go-sql-driver/mysql v1.5.0
 | 
			
		||||
	github.com/go-yaml/yaml v2.1.0+incompatible
 | 
			
		||||
	github.com/golang/protobuf v1.4.2
 | 
			
		||||
	github.com/iwind/TeaGo v0.0.0-20200923021120-f5d76441fe9e
 | 
			
		||||
	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 | 
			
		||||
	github.com/modern-go/reflect2 v1.0.1 // indirect
 | 
			
		||||
	github.com/iwind/TeaGo v0.0.0-20200924024009-d088df3778a6
 | 
			
		||||
	github.com/pkg/sftp v1.12.0
 | 
			
		||||
	golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a
 | 
			
		||||
	google.golang.org/grpc v1.32.0
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								go.sum
									
									
									
									
									
								
							@@ -4,7 +4,6 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7
 | 
			
		||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
			
		||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 | 
			
		||||
github.com/DataDog/sketches-go v0.0.0-20190923095040-43f19ad77ff7/go.mod h1:Q5DbzQ+3AkgGwymQO7aZFNP7ns2lZKGtvRBzRXfdi60=
 | 
			
		||||
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
 | 
			
		||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
			
		||||
@@ -22,8 +21,6 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
 | 
			
		||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 | 
			
		||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 | 
			
		||||
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
 | 
			
		||||
github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
 | 
			
		||||
github.com/go-redis/redis/v8 v8.0.0-beta.7/go.mod h1:FGJAWDWFht1sQ4qxyJHZZbVyvnVcKQN0E3u5/5lRz+g=
 | 
			
		||||
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
 | 
			
		||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 | 
			
		||||
@@ -53,13 +50,10 @@ github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
 | 
			
		||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 | 
			
		||||
github.com/iwind/TeaGo v0.0.0-20200822074248-b1cf7248c98a/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc=
 | 
			
		||||
github.com/iwind/TeaGo v0.0.0-20200910072805-729cffe36729 h1:/v0WhSFVeNay/dA5zU9iCBXlgVDfxnztuanlauXE0gM=
 | 
			
		||||
github.com/iwind/TeaGo v0.0.0-20200910072805-729cffe36729/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc=
 | 
			
		||||
github.com/iwind/TeaGo v0.0.0-20200916035436-dbdbf25f8524 h1:WnARCxusBjX5vJ8E71AjhuxSeAMGfEiYvi42XVK/Yf8=
 | 
			
		||||
github.com/iwind/TeaGo v0.0.0-20200916035436-dbdbf25f8524/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc=
 | 
			
		||||
github.com/iwind/TeaGo v0.0.0-20200923021120-f5d76441fe9e h1:/xn7wUvlwaoA5IkdBUctv2OQbJSZ0/Dw8qRJmn55sJk=
 | 
			
		||||
github.com/iwind/TeaGo v0.0.0-20200923021120-f5d76441fe9e/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc=
 | 
			
		||||
github.com/iwind/TeaGo v0.0.0-20200924024009-d088df3778a6 h1:7OZC/Qy7Z/hK9vG6YQOwHNOUPunSImYYJMiIfvuDQZ0=
 | 
			
		||||
github.com/iwind/TeaGo v0.0.0-20200924024009-d088df3778a6/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc=
 | 
			
		||||
github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
 | 
			
		||||
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 | 
			
		||||
github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8=
 | 
			
		||||
@@ -93,9 +87,7 @@ github.com/pkg/sftp v1.12.0 h1:/f3b24xrDhkhddlaobPe2JgBqfdt+gC/NYl0QY9IOuI=
 | 
			
		||||
github.com/pkg/sftp v1.12.0/go.mod h1:fUqqXB5vEgVCZ131L+9say31RAri6aF6KDViawhxKK8=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M=
 | 
			
		||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
			
		||||
github.com/shirou/gopsutil v2.20.7+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 | 
			
		||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
			
		||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
			
		||||
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,20 @@ func NewHTTPAccessLogPolicyDAO() *HTTPAccessLogPolicyDAO {
 | 
			
		||||
 | 
			
		||||
var SharedHTTPAccessLogPolicyDAO = NewHTTPAccessLogPolicyDAO()
 | 
			
		||||
 | 
			
		||||
// 初始化
 | 
			
		||||
func (this *HTTPAccessLogPolicyDAO) Init() {
 | 
			
		||||
	this.DAOObject.Init()
 | 
			
		||||
	this.DAOObject.OnUpdate(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnInsert(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnDelete(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 启用条目
 | 
			
		||||
func (this *HTTPAccessLogPolicyDAO) EnableHTTPAccessLogPolicy(id int64) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
@@ -104,14 +118,13 @@ func (this *HTTPAccessLogPolicyDAO) ComposeAccessLogPolicyConfig(policyId int64)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 条件
 | 
			
		||||
	if IsNotNull(policy.Conds) {
 | 
			
		||||
		// TODO 需要用更全面的条件管理器来代替RequestCond
 | 
			
		||||
		conds := []*shared.RequestCond{}
 | 
			
		||||
		err = json.Unmarshal([]byte(policy.Conds), &conds)
 | 
			
		||||
	if IsNotNull(policy.CondGroups) {
 | 
			
		||||
		condGroups := []*shared.HTTPRequestCondGroup{}
 | 
			
		||||
		err = json.Unmarshal([]byte(policy.CondGroups), &condGroups)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		config.Conds = conds
 | 
			
		||||
		config.CondGroups = condGroups
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return config, nil
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ type HTTPAccessLogPolicy struct {
 | 
			
		||||
	IsOn       uint8  `field:"isOn"`       // 是否启用
 | 
			
		||||
	Type       string `field:"type"`       // 存储类型
 | 
			
		||||
	Options    string `field:"options"`    // 存储选项
 | 
			
		||||
	Conds      string `field:"conds"`      // 请求条件
 | 
			
		||||
	CondGroups string `field:"condGroups"` // 请求条件
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type HTTPAccessLogPolicyOperator struct {
 | 
			
		||||
@@ -26,7 +26,7 @@ type HTTPAccessLogPolicyOperator struct {
 | 
			
		||||
	IsOn       interface{} // 是否启用
 | 
			
		||||
	Type       interface{} // 存储类型
 | 
			
		||||
	Options    interface{} // 存储选项
 | 
			
		||||
	Conds      interface{} // 请求条件
 | 
			
		||||
	CondGroups interface{} // 请求条件
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewHTTPAccessLogPolicyOperator() *HTTPAccessLogPolicyOperator {
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,20 @@ func NewHTTPCachePolicyDAO() *HTTPCachePolicyDAO {
 | 
			
		||||
 | 
			
		||||
var SharedHTTPCachePolicyDAO = NewHTTPCachePolicyDAO()
 | 
			
		||||
 | 
			
		||||
// 初始化
 | 
			
		||||
func (this *HTTPCachePolicyDAO) Init() {
 | 
			
		||||
	this.DAOObject.Init()
 | 
			
		||||
	this.DAOObject.OnUpdate(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnInsert(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnDelete(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 启用条目
 | 
			
		||||
func (this *HTTPCachePolicyDAO) EnableHTTPCachePolicy(id int64) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,7 @@ type HTTPCachePolicy struct {
 | 
			
		||||
	SkipCacheControlValues   string `field:"skipCacheControlValues"`   // 忽略的cache-control
 | 
			
		||||
	SkipSetCookie            uint8  `field:"skipSetCookie"`            // 是否忽略Set-Cookie Header
 | 
			
		||||
	EnableRequestCachePragma uint8  `field:"enableRequestCachePragma"` // 是否支持客户端的Pragma: no-cache
 | 
			
		||||
	Conds                    string `field:"conds"`                    // 请求条件
 | 
			
		||||
	CondGroups               string `field:"condGroups"`               // 请求条件
 | 
			
		||||
	CreatedAt                uint64 `field:"createdAt"`                // 创建时间
 | 
			
		||||
	State                    uint8  `field:"state"`                    // 状态
 | 
			
		||||
}
 | 
			
		||||
@@ -36,7 +36,7 @@ type HTTPCachePolicyOperator struct {
 | 
			
		||||
	SkipCacheControlValues   interface{} // 忽略的cache-control
 | 
			
		||||
	SkipSetCookie            interface{} // 是否忽略Set-Cookie Header
 | 
			
		||||
	EnableRequestCachePragma interface{} // 是否支持客户端的Pragma: no-cache
 | 
			
		||||
	Conds                    interface{} // 请求条件
 | 
			
		||||
	CondGroups               interface{} // 请求条件
 | 
			
		||||
	CreatedAt                interface{} // 创建时间
 | 
			
		||||
	State                    interface{} // 状态
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,20 @@ func NewHTTPFirewallPolicyDAO() *HTTPFirewallPolicyDAO {
 | 
			
		||||
 | 
			
		||||
var SharedHTTPFirewallPolicyDAO = NewHTTPFirewallPolicyDAO()
 | 
			
		||||
 | 
			
		||||
// 初始化
 | 
			
		||||
func (this *HTTPFirewallPolicyDAO) Init() {
 | 
			
		||||
	this.DAOObject.Init()
 | 
			
		||||
	this.DAOObject.OnUpdate(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnInsert(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnDelete(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 启用条目
 | 
			
		||||
func (this *HTTPFirewallPolicyDAO) EnableHTTPFirewallPolicy(id int64) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ type HTTPFirewallPolicy struct {
 | 
			
		||||
	Name       string `field:"name"`       // 名称
 | 
			
		||||
	Inbound    string `field:"inbound"`    // 入站规则
 | 
			
		||||
	Outbound   string `field:"outbound"`   // 出站规则
 | 
			
		||||
	Conds      string `field:"conds"`      // 条件
 | 
			
		||||
	CondGroups string `field:"condGroups"` // 条件
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type HTTPFirewallPolicyOperator struct {
 | 
			
		||||
@@ -26,7 +26,7 @@ type HTTPFirewallPolicyOperator struct {
 | 
			
		||||
	Name       interface{} // 名称
 | 
			
		||||
	Inbound    interface{} // 入站规则
 | 
			
		||||
	Outbound   interface{} // 出站规则
 | 
			
		||||
	Conds      interface{} // 条件
 | 
			
		||||
	CondGroups interface{} // 条件
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewHTTPFirewallPolicyOperator() *HTTPFirewallPolicyOperator {
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,20 @@ func NewHTTPFirewallRuleDAO() *HTTPFirewallRuleDAO {
 | 
			
		||||
 | 
			
		||||
var SharedHTTPFirewallRuleDAO = NewHTTPFirewallRuleDAO()
 | 
			
		||||
 | 
			
		||||
// 初始化
 | 
			
		||||
func (this *HTTPFirewallRuleDAO) Init() {
 | 
			
		||||
	this.DAOObject.Init()
 | 
			
		||||
	this.DAOObject.OnUpdate(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnInsert(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnDelete(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 启用条目
 | 
			
		||||
func (this *HTTPFirewallRuleDAO) EnableHTTPFirewallRule(id uint32) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,20 @@ func NewHTTPFirewallRuleGroupDAO() *HTTPFirewallRuleGroupDAO {
 | 
			
		||||
 | 
			
		||||
var SharedHTTPFirewallRuleGroupDAO = NewHTTPFirewallRuleGroupDAO()
 | 
			
		||||
 | 
			
		||||
// 初始化
 | 
			
		||||
func (this *HTTPFirewallRuleGroupDAO) Init() {
 | 
			
		||||
	this.DAOObject.Init()
 | 
			
		||||
	this.DAOObject.OnUpdate(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnInsert(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnDelete(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 启用条目
 | 
			
		||||
func (this *HTTPFirewallRuleGroupDAO) EnableHTTPFirewallRuleGroup(id uint32) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,20 @@ func NewHTTPFirewallRuleSetDAO() *HTTPFirewallRuleSetDAO {
 | 
			
		||||
 | 
			
		||||
var SharedHTTPFirewallRuleSetDAO = NewHTTPFirewallRuleSetDAO()
 | 
			
		||||
 | 
			
		||||
// 初始化
 | 
			
		||||
func (this *HTTPFirewallRuleSetDAO) Init() {
 | 
			
		||||
	this.DAOObject.Init()
 | 
			
		||||
	this.DAOObject.OnUpdate(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnInsert(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnDelete(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 启用条目
 | 
			
		||||
func (this *HTTPFirewallRuleSetDAO) EnableHTTPFirewallRuleSet(id uint32) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,20 @@ func NewHTTPGzipDAO() *HTTPGzipDAO {
 | 
			
		||||
 | 
			
		||||
var SharedHTTPGzipDAO = NewHTTPGzipDAO()
 | 
			
		||||
 | 
			
		||||
// 初始化
 | 
			
		||||
func (this *HTTPGzipDAO) Init() {
 | 
			
		||||
	this.DAOObject.Init()
 | 
			
		||||
	this.DAOObject.OnUpdate(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnInsert(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnDelete(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 启用条目
 | 
			
		||||
func (this *HTTPGzipDAO) EnableHTTPGzip(id int64) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
 
 | 
			
		||||
@@ -2,29 +2,29 @@ package models
 | 
			
		||||
 | 
			
		||||
// Gzip配置
 | 
			
		||||
type HTTPGzip struct {
 | 
			
		||||
	Id        uint32 `field:"id"`        // ID
 | 
			
		||||
	AdminId   uint32 `field:"adminId"`   // 管理员ID
 | 
			
		||||
	UserId    uint32 `field:"userId"`    // 用户ID
 | 
			
		||||
	IsOn      uint8  `field:"isOn"`      // 是否启用
 | 
			
		||||
	Level     uint32 `field:"level"`     // 压缩级别
 | 
			
		||||
	MinLength string `field:"minLength"` // 可压缩最小值
 | 
			
		||||
	MaxLength string `field:"maxLength"` // 可压缩最大值
 | 
			
		||||
	State     uint8  `field:"state"`     // 状态
 | 
			
		||||
	CreatedAt uint64 `field:"createdAt"` // 创建时间
 | 
			
		||||
	Conds     string `field:"conds"`     // 条件
 | 
			
		||||
	Id         uint32 `field:"id"`         // ID
 | 
			
		||||
	AdminId    uint32 `field:"adminId"`    // 管理员ID
 | 
			
		||||
	UserId     uint32 `field:"userId"`     // 用户ID
 | 
			
		||||
	IsOn       uint8  `field:"isOn"`       // 是否启用
 | 
			
		||||
	Level      uint32 `field:"level"`      // 压缩级别
 | 
			
		||||
	MinLength  string `field:"minLength"`  // 可压缩最小值
 | 
			
		||||
	MaxLength  string `field:"maxLength"`  // 可压缩最大值
 | 
			
		||||
	State      uint8  `field:"state"`      // 状态
 | 
			
		||||
	CreatedAt  uint64 `field:"createdAt"`  // 创建时间
 | 
			
		||||
	CondGroups string `field:"condGroups"` // 条件
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type HTTPGzipOperator struct {
 | 
			
		||||
	Id        interface{} // ID
 | 
			
		||||
	AdminId   interface{} // 管理员ID
 | 
			
		||||
	UserId    interface{} // 用户ID
 | 
			
		||||
	IsOn      interface{} // 是否启用
 | 
			
		||||
	Level     interface{} // 压缩级别
 | 
			
		||||
	MinLength interface{} // 可压缩最小值
 | 
			
		||||
	MaxLength interface{} // 可压缩最大值
 | 
			
		||||
	State     interface{} // 状态
 | 
			
		||||
	CreatedAt interface{} // 创建时间
 | 
			
		||||
	Conds     interface{} // 条件
 | 
			
		||||
	Id         interface{} // ID
 | 
			
		||||
	AdminId    interface{} // 管理员ID
 | 
			
		||||
	UserId     interface{} // 用户ID
 | 
			
		||||
	IsOn       interface{} // 是否启用
 | 
			
		||||
	Level      interface{} // 压缩级别
 | 
			
		||||
	MinLength  interface{} // 可压缩最小值
 | 
			
		||||
	MaxLength  interface{} // 可压缩最大值
 | 
			
		||||
	State      interface{} // 状态
 | 
			
		||||
	CreatedAt  interface{} // 创建时间
 | 
			
		||||
	CondGroups interface{} // 条件
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewHTTPGzipOperator() *HTTPGzipOperator {
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,20 @@ func NewHTTPHeaderDAO() *HTTPHeaderDAO {
 | 
			
		||||
 | 
			
		||||
var SharedHTTPHeaderDAO = NewHTTPHeaderDAO()
 | 
			
		||||
 | 
			
		||||
// 初始化
 | 
			
		||||
func (this *HTTPHeaderDAO) Init() {
 | 
			
		||||
	this.DAOObject.Init()
 | 
			
		||||
	this.DAOObject.OnUpdate(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnInsert(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnDelete(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 启用条目
 | 
			
		||||
func (this *HTTPHeaderDAO) EnableHTTPHeader(id int64) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
@@ -75,7 +89,17 @@ func (this *HTTPHeaderDAO) CreateHeader(name string, value string) (int64, error
 | 
			
		||||
	op.IsOn = true
 | 
			
		||||
	op.Name = name
 | 
			
		||||
	op.Value = value
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
 | 
			
		||||
	statusConfig := &shared.HTTPStatusConfig{
 | 
			
		||||
		Always: true,
 | 
			
		||||
	}
 | 
			
		||||
	statusJSON, err := json.Marshal(statusConfig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
	op.Status = statusJSON
 | 
			
		||||
 | 
			
		||||
	_, err = this.Save(op)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,20 @@ func NewHTTPHeaderPolicyDAO() *HTTPHeaderPolicyDAO {
 | 
			
		||||
 | 
			
		||||
var SharedHTTPHeaderPolicyDAO = NewHTTPHeaderPolicyDAO()
 | 
			
		||||
 | 
			
		||||
// 初始化
 | 
			
		||||
func (this *HTTPHeaderPolicyDAO) Init() {
 | 
			
		||||
	this.DAOObject.Init()
 | 
			
		||||
	this.DAOObject.OnUpdate(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnInsert(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnDelete(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 启用条目
 | 
			
		||||
func (this *HTTPHeaderPolicyDAO) EnableHTTPHeaderPolicy(id int64) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
@@ -83,8 +97,6 @@ func (this *HTTPHeaderPolicyDAO) UpdateAddingHeaders(policyId int64, headersJSON
 | 
			
		||||
	op.AddHeaders = headersJSON
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
 | 
			
		||||
	// TODO 更新相关配置
 | 
			
		||||
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -99,8 +111,6 @@ func (this *HTTPHeaderPolicyDAO) UpdateSettingHeaders(policyId int64, headersJSO
 | 
			
		||||
	op.SetHeaders = headersJSON
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
 | 
			
		||||
	// TODO 更新相关配置
 | 
			
		||||
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -115,8 +125,6 @@ func (this *HTTPHeaderPolicyDAO) UpdateReplacingHeaders(policyId int64, headersJ
 | 
			
		||||
	op.ReplaceHeaders = headersJSON
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
 | 
			
		||||
	// TODO 更新相关配置
 | 
			
		||||
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -131,8 +139,6 @@ func (this *HTTPHeaderPolicyDAO) UpdateAddingTrailers(policyId int64, headersJSO
 | 
			
		||||
	op.AddTrailers = headersJSON
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
 | 
			
		||||
	// TODO 更新相关配置
 | 
			
		||||
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -152,8 +158,6 @@ func (this *HTTPHeaderPolicyDAO) UpdateDeletingHeaders(policyId int64, headerNam
 | 
			
		||||
	op.DeleteHeaders = string(namesJSON)
 | 
			
		||||
	_, err = this.Save(op)
 | 
			
		||||
 | 
			
		||||
	// TODO 更新相关配置
 | 
			
		||||
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -173,78 +177,91 @@ func (this *HTTPHeaderPolicyDAO) ComposeHeaderPolicyConfig(headerPolicyId int64)
 | 
			
		||||
 | 
			
		||||
	// AddHeaders
 | 
			
		||||
	if len(policy.AddHeaders) > 0 {
 | 
			
		||||
		headers := []*shared.HTTPHeaderConfig{}
 | 
			
		||||
		err = json.Unmarshal([]byte(policy.AddHeaders), &headers)
 | 
			
		||||
		refs := []*shared.HTTPHeaderRef{}
 | 
			
		||||
		err = json.Unmarshal([]byte(policy.AddHeaders), &refs)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		if len(headers) > 0 {
 | 
			
		||||
			for k, header := range headers {
 | 
			
		||||
				headerConfig, err := SharedHTTPHeaderDAO.ComposeHeaderConfig(header.Id)
 | 
			
		||||
		if len(refs) > 0 {
 | 
			
		||||
			for _, ref := range refs {
 | 
			
		||||
				headerConfig, err := SharedHTTPHeaderDAO.ComposeHeaderConfig(ref.HeaderId)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return nil, err
 | 
			
		||||
				}
 | 
			
		||||
				headers[k] = headerConfig
 | 
			
		||||
				config.AddHeaders = append(config.AddHeaders, headerConfig)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			config.AddHeaders = headers
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// AddTrailers
 | 
			
		||||
	if len(policy.AddTrailers) > 0 {
 | 
			
		||||
		headers := []*shared.HTTPHeaderConfig{}
 | 
			
		||||
		err = json.Unmarshal([]byte(policy.AddTrailers), &headers)
 | 
			
		||||
		refs := []*shared.HTTPHeaderRef{}
 | 
			
		||||
		err = json.Unmarshal([]byte(policy.AddTrailers), &refs)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		if len(headers) > 0 {
 | 
			
		||||
			for k, header := range headers {
 | 
			
		||||
				headerConfig, err := SharedHTTPHeaderDAO.ComposeHeaderConfig(header.Id)
 | 
			
		||||
		if len(refs) > 0 {
 | 
			
		||||
			resultRefs := []*shared.HTTPHeaderRef{}
 | 
			
		||||
			for _, ref := range refs {
 | 
			
		||||
				headerConfig, err := SharedHTTPHeaderDAO.ComposeHeaderConfig(ref.HeaderId)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return nil, err
 | 
			
		||||
				}
 | 
			
		||||
				headers[k] = headerConfig
 | 
			
		||||
				if headerConfig == nil {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				resultRefs = append(resultRefs, ref)
 | 
			
		||||
				config.AddTrailers = append(config.AddTrailers, headerConfig)
 | 
			
		||||
			}
 | 
			
		||||
			config.AddTrailers = headers
 | 
			
		||||
			config.AddHeaderRefs = resultRefs
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// SetHeaders
 | 
			
		||||
	if len(policy.SetHeaders) > 0 {
 | 
			
		||||
		headers := []*shared.HTTPHeaderConfig{}
 | 
			
		||||
		err = json.Unmarshal([]byte(policy.SetHeaders), &headers)
 | 
			
		||||
		refs := []*shared.HTTPHeaderRef{}
 | 
			
		||||
		err = json.Unmarshal([]byte(policy.SetHeaders), &refs)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		if len(headers) > 0 {
 | 
			
		||||
			for k, header := range headers {
 | 
			
		||||
				headerConfig, err := SharedHTTPHeaderDAO.ComposeHeaderConfig(header.Id)
 | 
			
		||||
		if len(refs) > 0 {
 | 
			
		||||
			resultRefs := []*shared.HTTPHeaderRef{}
 | 
			
		||||
			for _, ref := range refs {
 | 
			
		||||
				headerConfig, err := SharedHTTPHeaderDAO.ComposeHeaderConfig(ref.HeaderId)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return nil, err
 | 
			
		||||
				}
 | 
			
		||||
				headers[k] = headerConfig
 | 
			
		||||
				if headerConfig == nil {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				resultRefs = append(resultRefs, ref)
 | 
			
		||||
				config.SetHeaders = append(config.SetHeaders, headerConfig)
 | 
			
		||||
			}
 | 
			
		||||
			config.SetHeaders = headers
 | 
			
		||||
			config.SetHeaderRefs = resultRefs
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// ReplaceHeaders
 | 
			
		||||
	if len(policy.ReplaceHeaders) > 0 {
 | 
			
		||||
		headers := []*shared.HTTPHeaderConfig{}
 | 
			
		||||
		err = json.Unmarshal([]byte(policy.ReplaceHeaders), &headers)
 | 
			
		||||
		refs := []*shared.HTTPHeaderRef{}
 | 
			
		||||
		err = json.Unmarshal([]byte(policy.ReplaceHeaders), &refs)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		if len(headers) > 0 {
 | 
			
		||||
			for k, header := range headers {
 | 
			
		||||
				headerConfig, err := SharedHTTPHeaderDAO.ComposeHeaderConfig(header.Id)
 | 
			
		||||
		if len(refs) > 0 {
 | 
			
		||||
			resultRefs := []*shared.HTTPHeaderRef{}
 | 
			
		||||
			for _, ref := range refs {
 | 
			
		||||
				headerConfig, err := SharedHTTPHeaderDAO.ComposeHeaderConfig(ref.HeaderId)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return nil, err
 | 
			
		||||
				}
 | 
			
		||||
				headers[k] = headerConfig
 | 
			
		||||
				if headerConfig == nil {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
				resultRefs = append(resultRefs, ref)
 | 
			
		||||
				config.ReplaceHeaders = append(config.ReplaceHeaders, headerConfig)
 | 
			
		||||
			}
 | 
			
		||||
			config.ReplaceHeaders = headers
 | 
			
		||||
			config.ReplaceHeaderRefs = resultRefs
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -255,7 +272,7 @@ func (this *HTTPHeaderPolicyDAO) ComposeHeaderPolicyConfig(headerPolicyId int64)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		config.DeletedHeaders = headers
 | 
			
		||||
		config.DeleteHeaders = headers
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Expires
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,20 @@ func NewHTTPLocationDAO() *HTTPLocationDAO {
 | 
			
		||||
 | 
			
		||||
var SharedHTTPLocationDAO = NewHTTPLocationDAO()
 | 
			
		||||
 | 
			
		||||
// 初始化
 | 
			
		||||
func (this *HTTPLocationDAO) Init() {
 | 
			
		||||
	this.DAOObject.Init()
 | 
			
		||||
	this.DAOObject.OnUpdate(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnInsert(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnDelete(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 启用条目
 | 
			
		||||
func (this *HTTPLocationDAO) EnableHTTPLocation(id int64) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@ type HTTPLocation struct {
 | 
			
		||||
	ReverseProxy string `field:"reverseProxy"` // 反向代理
 | 
			
		||||
	UrlPrefix    string `field:"urlPrefix"`    // URL前缀
 | 
			
		||||
	IsBreak      uint8  `field:"isBreak"`      // 是否终止匹配
 | 
			
		||||
	CondGroups   string `field:"condGroups"`   // 匹配条件
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type HTTPLocationOperator struct {
 | 
			
		||||
@@ -35,6 +36,7 @@ type HTTPLocationOperator struct {
 | 
			
		||||
	ReverseProxy interface{} // 反向代理
 | 
			
		||||
	UrlPrefix    interface{} // URL前缀
 | 
			
		||||
	IsBreak      interface{} // 是否终止匹配
 | 
			
		||||
	CondGroups   interface{} // 匹配条件
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewHTTPLocationOperator() *HTTPLocationOperator {
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,20 @@ func NewHTTPPageDAO() *HTTPPageDAO {
 | 
			
		||||
 | 
			
		||||
var SharedHTTPPageDAO = NewHTTPPageDAO()
 | 
			
		||||
 | 
			
		||||
// 初始化
 | 
			
		||||
func (this *HTTPPageDAO) Init() {
 | 
			
		||||
	this.DAOObject.Init()
 | 
			
		||||
	this.DAOObject.OnUpdate(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnInsert(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnDelete(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 启用条目
 | 
			
		||||
func (this *HTTPPageDAO) EnableHTTPPage(id int64) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
@@ -107,7 +121,6 @@ func (this *HTTPPageDAO) UpdatePage(pageId int64, statusList []string, url strin
 | 
			
		||||
	op.NewStatus = newStatus
 | 
			
		||||
	_, err = this.Save(op)
 | 
			
		||||
 | 
			
		||||
	// TODO 修改相关引用的对象
 | 
			
		||||
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,19 @@ func NewHTTPWebDAO() *HTTPWebDAO {
 | 
			
		||||
 | 
			
		||||
var SharedHTTPWebDAO = NewHTTPWebDAO()
 | 
			
		||||
 | 
			
		||||
func (this *HTTPWebDAO) Init() {
 | 
			
		||||
	this.DAOObject.Init()
 | 
			
		||||
	this.DAOObject.OnUpdate(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnInsert(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnDelete(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 启用条目
 | 
			
		||||
func (this *HTTPWebDAO) EnableHTTPWeb(id int64) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
@@ -238,8 +251,6 @@ func (this *HTTPWebDAO) ComposeWebConfig(webId int64) (*serverconfigs.HTTPWebCon
 | 
			
		||||
		config.RedirectToHttps = redirectToHTTPSConfig
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// TODO 更多配置
 | 
			
		||||
 | 
			
		||||
	return config, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -264,11 +275,7 @@ func (this *HTTPWebDAO) UpdateWeb(webId int64, root string) error {
 | 
			
		||||
	op.Id = webId
 | 
			
		||||
	op.Root = root
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.NotifyUpdating(webId)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 修改Gzip配置
 | 
			
		||||
@@ -280,11 +287,7 @@ func (this *HTTPWebDAO) UpdateWebGzip(webId int64, gzipJSON []byte) error {
 | 
			
		||||
	op.Id = webId
 | 
			
		||||
	op.Gzip = gzipJSON
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.NotifyUpdating(webId)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 修改字符编码
 | 
			
		||||
@@ -296,11 +299,7 @@ func (this *HTTPWebDAO) UpdateWebCharset(webId int64, charsetJSON []byte) error
 | 
			
		||||
	op.Id = webId
 | 
			
		||||
	op.Charset = charsetJSON
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.NotifyUpdating(webId)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 更改请求Header策略
 | 
			
		||||
@@ -312,11 +311,7 @@ func (this *HTTPWebDAO) UpdateWebRequestHeaderPolicy(webId int64, headerPolicyJS
 | 
			
		||||
	op.Id = webId
 | 
			
		||||
	op.RequestHeader = JSONBytes(headerPolicyJSON)
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.NotifyUpdating(webId)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 更改响应Header策略
 | 
			
		||||
@@ -328,11 +323,7 @@ func (this *HTTPWebDAO) UpdateWebResponseHeaderPolicy(webId int64, headerPolicyJ
 | 
			
		||||
	op.Id = webId
 | 
			
		||||
	op.ResponseHeader = JSONBytes(headerPolicyJSON)
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.NotifyUpdating(webId)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 更改特殊页面配置
 | 
			
		||||
@@ -344,11 +335,7 @@ func (this *HTTPWebDAO) UpdateWebPages(webId int64, pagesJSON []byte) error {
 | 
			
		||||
	op.Id = webId
 | 
			
		||||
	op.Pages = JSONBytes(pagesJSON)
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.NotifyUpdating(webId)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 更改Shutdown配置
 | 
			
		||||
@@ -360,11 +347,7 @@ func (this *HTTPWebDAO) UpdateWebShutdown(webId int64, shutdownJSON []byte) erro
 | 
			
		||||
	op.Id = webId
 | 
			
		||||
	op.Shutdown = JSONBytes(shutdownJSON)
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.NotifyUpdating(webId)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 更改访问日志策略
 | 
			
		||||
@@ -376,11 +359,7 @@ func (this *HTTPWebDAO) UpdateWebAccessLogConfig(webId int64, accessLogJSON []by
 | 
			
		||||
	op.Id = webId
 | 
			
		||||
	op.AccessLog = JSONBytes(accessLogJSON)
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.NotifyUpdating(webId)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 更改统计配置
 | 
			
		||||
@@ -392,11 +371,7 @@ func (this *HTTPWebDAO) UpdateWebStat(webId int64, statJSON []byte) error {
 | 
			
		||||
	op.Id = webId
 | 
			
		||||
	op.Stat = JSONBytes(statJSON)
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.NotifyUpdating(webId)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 更改缓存配置
 | 
			
		||||
@@ -408,11 +383,7 @@ func (this *HTTPWebDAO) UpdateWebCache(webId int64, cacheJSON []byte) error {
 | 
			
		||||
	op.Id = webId
 | 
			
		||||
	op.Cache = JSONBytes(cacheJSON)
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.NotifyUpdating(webId)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 更改防火墙配置
 | 
			
		||||
@@ -424,11 +395,7 @@ func (this *HTTPWebDAO) UpdateWebFirewall(webId int64, firewallJSON []byte) erro
 | 
			
		||||
	op.Id = webId
 | 
			
		||||
	op.Firewall = JSONBytes(firewallJSON)
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.NotifyUpdating(webId)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 更改路径规则配置
 | 
			
		||||
@@ -440,11 +407,7 @@ func (this *HTTPWebDAO) UpdateWebLocations(webId int64, locationsJSON []byte) er
 | 
			
		||||
	op.Id = webId
 | 
			
		||||
	op.Locations = JSONBytes(locationsJSON)
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.NotifyUpdating(webId)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 更改跳转到HTTPS设置
 | 
			
		||||
@@ -456,21 +419,5 @@ func (this *HTTPWebDAO) UpdateWebRedirectToHTTPS(webId int64, redirectToHTTPSJSO
 | 
			
		||||
	op.Id = webId
 | 
			
		||||
	op.RedirectToHttps = JSONBytes(redirectToHTTPSJSON)
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.NotifyUpdating(webId)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 通知更新
 | 
			
		||||
func (this *HTTPWebDAO) NotifyUpdating(webId int64) error {
 | 
			
		||||
	err := SharedServerDAO.UpdateServerIsUpdatingWithWebId(webId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// TODO 更新所有使用此Web配置的Location所在服务
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,20 +3,20 @@ package models
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
			
		||||
	_ "github.com/go-sql-driver/mysql"
 | 
			
		||||
	"github.com/iwind/TeaGo/Tea"
 | 
			
		||||
	"github.com/iwind/TeaGo/dbs"
 | 
			
		||||
	"github.com/iwind/TeaGo/rands"
 | 
			
		||||
	"github.com/iwind/TeaGo/types"
 | 
			
		||||
	"strconv"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	NodeStateEnabled  = 1 // 已启用
 | 
			
		||||
	NodeStateDisabled = 0 // 已禁用
 | 
			
		||||
 | 
			
		||||
	NodeInstallStateAll          = 0 // 全部
 | 
			
		||||
	NodeInstallStateInstalled    = 1 // 已安装
 | 
			
		||||
	NodeInstallStateNotInstalled = 2 // 未安装
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type NodeDAO dbs.DAO
 | 
			
		||||
@@ -182,7 +182,7 @@ func (this *NodeDAO) CountAllEnabledNodes() (int64, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 列出单页节点
 | 
			
		||||
func (this *NodeDAO) ListEnabledNodesMatch(offset int64, size int64, clusterId int64, installState int8) (result []*Node, err error) {
 | 
			
		||||
func (this *NodeDAO) ListEnabledNodesMatch(offset int64, size int64, clusterId int64, installState configutils.BoolState, activeState configutils.BoolState) (result []*Node, err error) {
 | 
			
		||||
	query := this.Query().
 | 
			
		||||
		State(NodeStateEnabled).
 | 
			
		||||
		Offset(offset).
 | 
			
		||||
@@ -197,14 +197,24 @@ func (this *NodeDAO) ListEnabledNodesMatch(offset int64, size int64, clusterId i
 | 
			
		||||
 | 
			
		||||
	// 安装状态
 | 
			
		||||
	switch installState {
 | 
			
		||||
	case NodeInstallStateAll:
 | 
			
		||||
		// 不做任何事情
 | 
			
		||||
	case NodeInstallStateInstalled:
 | 
			
		||||
	case configutils.BoolStateAll:
 | 
			
		||||
		// 所有
 | 
			
		||||
	case configutils.BoolStateYes:
 | 
			
		||||
		query.Attr("isInstalled", 1)
 | 
			
		||||
	case NodeInstallStateNotInstalled:
 | 
			
		||||
	case configutils.BoolStateNo:
 | 
			
		||||
		query.Attr("isInstalled", 0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 在线状态
 | 
			
		||||
	switch activeState {
 | 
			
		||||
	case configutils.BoolStateAll:
 | 
			
		||||
		// 所有
 | 
			
		||||
	case configutils.BoolStateYes:
 | 
			
		||||
		query.Where("JSON_EXTRACT(status, '$.isActive') AND JSON_EXTRACT(status, '$.updatedAt')-UNIX_TIMESTAMP()<=60")
 | 
			
		||||
	case configutils.BoolStateNo:
 | 
			
		||||
		query.Where("(status IS NULL OR NOT JSON_EXTRACT(status, '$.isActive') OR JSON_EXTRACT(status, '$.updatedAt')-UNIX_TIMESTAMP()>60)")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err = query.FindAll()
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
@@ -266,7 +276,7 @@ func (this *NodeDAO) FindAllNodeIdsMatch(clusterId int64) (result []int64, err e
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 计算节点数量
 | 
			
		||||
func (this *NodeDAO) CountAllEnabledNodesMatch(clusterId int64, installState int8) (int64, error) {
 | 
			
		||||
func (this *NodeDAO) CountAllEnabledNodesMatch(clusterId int64, installState configutils.BoolState, activeState configutils.BoolState) (int64, error) {
 | 
			
		||||
	query := this.Query()
 | 
			
		||||
	query.State(NodeStateEnabled)
 | 
			
		||||
 | 
			
		||||
@@ -277,14 +287,24 @@ func (this *NodeDAO) CountAllEnabledNodesMatch(clusterId int64, installState int
 | 
			
		||||
 | 
			
		||||
	// 安装状态
 | 
			
		||||
	switch installState {
 | 
			
		||||
	case NodeInstallStateAll:
 | 
			
		||||
		// 不做任何事情
 | 
			
		||||
	case NodeInstallStateInstalled:
 | 
			
		||||
	case configutils.BoolStateAll:
 | 
			
		||||
		// 所有
 | 
			
		||||
	case configutils.BoolStateYes:
 | 
			
		||||
		query.Attr("isInstalled", 1)
 | 
			
		||||
	case NodeInstallStateNotInstalled:
 | 
			
		||||
	case configutils.BoolStateNo:
 | 
			
		||||
		query.Attr("isInstalled", 0)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 在线状态
 | 
			
		||||
	switch activeState {
 | 
			
		||||
	case configutils.BoolStateAll:
 | 
			
		||||
		// 所有
 | 
			
		||||
	case configutils.BoolStateYes:
 | 
			
		||||
		query.Where("JSON_EXTRACT(status, '$.isActive') AND JSON_EXTRACT(status, '$.updatedAt')-UNIX_TIMESTAMP()<=60")
 | 
			
		||||
	case configutils.BoolStateNo:
 | 
			
		||||
		query.Where("(status IS NULL OR NOT JSON_EXTRACT(status, '$.isActive') OR JSON_EXTRACT(status, '$.updatedAt')-UNIX_TIMESTAMP()>60)")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return query.Count()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -347,6 +367,61 @@ func (this *NodeDAO) UpdateNodeInstallStatus(nodeId int64, status *NodeInstallSt
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 组合配置
 | 
			
		||||
func (this *NodeDAO) ComposeNodeConfig(nodeId int64) (*nodeconfigs.NodeConfig, error) {
 | 
			
		||||
	node, err := this.FindEnabledNode(nodeId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if node == nil {
 | 
			
		||||
		return nil, errors.New("node not found '" + strconv.FormatInt(nodeId, 10) + "'")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	config := &nodeconfigs.NodeConfig{
 | 
			
		||||
		Id:      node.UniqueId,
 | 
			
		||||
		IsOn:    node.IsOn == 1,
 | 
			
		||||
		Servers: nil,
 | 
			
		||||
		Version: int64(node.Version),
 | 
			
		||||
		Name:    node.Name,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 获取所有的服务
 | 
			
		||||
	servers, err := SharedServerDAO.FindAllEnabledServersWithNode(int64(node.Id))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, server := range servers {
 | 
			
		||||
		if len(server.Config) == 0 {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		serverConfig := &serverconfigs.ServerConfig{}
 | 
			
		||||
		err = json.Unmarshal([]byte(server.Config), serverConfig)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		config.Servers = append(config.Servers, serverConfig)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 全局设置
 | 
			
		||||
	// TODO 根据用户的不同读取不同的全局设置
 | 
			
		||||
	settingJSON, err := SharedSysSettingDAO.ReadSetting(SettingCodeGlobalConfig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if len(settingJSON) > 0 {
 | 
			
		||||
		globalConfig := &serverconfigs.GlobalConfig{}
 | 
			
		||||
		err = json.Unmarshal(settingJSON, globalConfig)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		config.GlobalConfig = globalConfig
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return config, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 生成唯一ID
 | 
			
		||||
func (this *NodeDAO) genUniqueId() (string, error) {
 | 
			
		||||
	for {
 | 
			
		||||
 
 | 
			
		||||
@@ -32,6 +32,20 @@ func NewOriginDAO() *OriginDAO {
 | 
			
		||||
 | 
			
		||||
var SharedOriginDAO = NewOriginDAO()
 | 
			
		||||
 | 
			
		||||
// 初始化
 | 
			
		||||
func (this *OriginDAO) Init() {
 | 
			
		||||
	this.DAOObject.Init()
 | 
			
		||||
	this.DAOObject.OnUpdate(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnInsert(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnDelete(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 启用条目
 | 
			
		||||
func (this *OriginDAO) EnableOrigin(id int64) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
@@ -167,7 +181,7 @@ func (this *OriginDAO) ComposeOriginConfig(originId int64) (*serverconfigs.Origi
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		if policyConfig != nil {
 | 
			
		||||
			config.RequestHeaders = policyConfig
 | 
			
		||||
			config.RequestHeaderPolicy = policyConfig
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -177,7 +191,7 @@ func (this *OriginDAO) ComposeOriginConfig(originId int64) (*serverconfigs.Origi
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		if policyConfig != nil {
 | 
			
		||||
			config.ResponseHeaders = policyConfig
 | 
			
		||||
			config.ResponseHeaderPolicy = policyConfig
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestOriginServerDAO_ComposeOriginConfig(t *testing.T) {
 | 
			
		||||
	config, err := SharedOriginServerDAO.ComposeOriginConfig(1)
 | 
			
		||||
	config, err := SharedOriginDAO.ComposeOriginConfig(1)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -30,13 +30,30 @@ func NewReverseProxyDAO() *ReverseProxyDAO {
 | 
			
		||||
 | 
			
		||||
var SharedReverseProxyDAO = NewReverseProxyDAO()
 | 
			
		||||
 | 
			
		||||
// 初始化
 | 
			
		||||
func (this *ReverseProxyDAO) Init() {
 | 
			
		||||
	this.DAOObject.Init()
 | 
			
		||||
	this.DAOObject.OnUpdate(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnInsert(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnDelete(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 启用条目
 | 
			
		||||
func (this *ReverseProxyDAO) EnableReverseProxy(id int64) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
		Pk(id).
 | 
			
		||||
		Set("state", ReverseProxyStateEnabled).
 | 
			
		||||
		Update()
 | 
			
		||||
	return err
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return this.CreateEvent()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 禁用条目
 | 
			
		||||
@@ -45,7 +62,10 @@ func (this *ReverseProxyDAO) DisableReverseProxy(id int64) error {
 | 
			
		||||
		Pk(id).
 | 
			
		||||
		Set("state", ReverseProxyStateDisabled).
 | 
			
		||||
		Update()
 | 
			
		||||
	return err
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return this.CreateEvent()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 查找启用中的条目
 | 
			
		||||
@@ -106,7 +126,7 @@ func (this *ReverseProxyDAO) ComposeReverseProxyConfig(reverseProxyId int64) (*s
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		for _, originConfig := range originRefs {
 | 
			
		||||
			originConfig, err := SharedOriginDAO.ComposeOriginConfig(int64(originConfig.OriginId))
 | 
			
		||||
			originConfig, err := SharedOriginDAO.ComposeOriginConfig(originConfig.OriginId)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
@@ -155,8 +175,6 @@ func (this *ReverseProxyDAO) UpdateReverseProxyScheduling(reverseProxyId int64,
 | 
			
		||||
	}
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
 | 
			
		||||
	// TODO 更新所有使用此反向代理的服务
 | 
			
		||||
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -174,8 +192,6 @@ func (this *ReverseProxyDAO) UpdateReverseProxyPrimaryOrigins(reverseProxyId int
 | 
			
		||||
	}
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
 | 
			
		||||
	// TODO 更新所有使用此反向代理的服务
 | 
			
		||||
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -193,8 +209,6 @@ func (this *ReverseProxyDAO) UpdateReverseProxyBackupOrigins(reverseProxyId int6
 | 
			
		||||
	}
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
 | 
			
		||||
	// TODO 更新所有使用此反向代理的服务
 | 
			
		||||
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -206,3 +220,8 @@ func (this *ReverseProxyDAO) UpdateReverseProxyIsOn(reverseProxyId int64, isOn b
 | 
			
		||||
		Update()
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 通知更新
 | 
			
		||||
func (this *ReverseProxyDAO) CreateEvent() error {
 | 
			
		||||
	return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,14 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto/md5"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
			
		||||
	_ "github.com/go-sql-driver/mysql"
 | 
			
		||||
	"github.com/iwind/TeaGo/Tea"
 | 
			
		||||
	"github.com/iwind/TeaGo/dbs"
 | 
			
		||||
	"github.com/iwind/TeaGo/rands"
 | 
			
		||||
	"github.com/iwind/TeaGo/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -31,6 +32,13 @@ func NewServerDAO() *ServerDAO {
 | 
			
		||||
 | 
			
		||||
var SharedServerDAO = NewServerDAO()
 | 
			
		||||
 | 
			
		||||
// 初始化
 | 
			
		||||
func (this *ServerDAO) Init() {
 | 
			
		||||
	this.DAOObject.Init()
 | 
			
		||||
 | 
			
		||||
	// 这里不处理增删改事件,是为了避免Server修改本身的时候,也要触发别的Server变更
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 启用条目
 | 
			
		||||
func (this *ServerDAO) EnableServer(id uint32) (rowsAffected int64, err error) {
 | 
			
		||||
	return this.Query().
 | 
			
		||||
@@ -70,13 +78,7 @@ func (this *ServerDAO) FindEnabledServerType(serverId int64) (string, error) {
 | 
			
		||||
 | 
			
		||||
// 创建服务
 | 
			
		||||
func (this *ServerDAO) CreateServer(adminId int64, userId int64, serverType serverconfigs.ServerType, name string, description string, serverNamesJSON string, httpJSON string, httpsJSON string, tcpJSON string, tlsJSON string, unixJSON string, udpJSON string, webId int64, reverseProxyJSON []byte, clusterId int64, includeNodesJSON string, excludeNodesJSON string) (serverId int64, err error) {
 | 
			
		||||
	uniqueId, err := this.genUniqueId()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	op := NewServerOperator()
 | 
			
		||||
	op.UniqueId = uniqueId
 | 
			
		||||
	op.UserId = userId
 | 
			
		||||
	op.AdminId = adminId
 | 
			
		||||
	op.Name = name
 | 
			
		||||
@@ -127,8 +129,7 @@ func (this *ServerDAO) CreateServer(adminId int64, userId int64, serverType serv
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	serverId = types.Int64(op.Id)
 | 
			
		||||
	err = this.RenewServerConfig(serverId)
 | 
			
		||||
	return serverId, err
 | 
			
		||||
	return serverId, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 修改服务基本信息
 | 
			
		||||
@@ -141,25 +142,47 @@ func (this *ServerDAO) UpdateServerBasic(serverId int64, name string, descriptio
 | 
			
		||||
	op.Name = name
 | 
			
		||||
	op.Description = description
 | 
			
		||||
	op.ClusterId = clusterId
 | 
			
		||||
	op.Version = dbs.SQL("version=version+1")
 | 
			
		||||
	_, err := this.Save(op)
 | 
			
		||||
	return err
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return this.createEvent()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 修改服务配置
 | 
			
		||||
func (this *ServerDAO) UpdateServerConfig(serverId int64, config []byte) error {
 | 
			
		||||
func (this *ServerDAO) UpdateServerConfig(serverId int64, configJSON []byte) (isChanged bool, err error) {
 | 
			
		||||
	if serverId <= 0 {
 | 
			
		||||
		return errors.New("serverId should not be smaller than 0")
 | 
			
		||||
		return false, errors.New("serverId should not be smaller than 0")
 | 
			
		||||
	}
 | 
			
		||||
	if len(config) == 0 {
 | 
			
		||||
		config = []byte("null")
 | 
			
		||||
	}
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
 | 
			
		||||
	// 查询以前的md5
 | 
			
		||||
	oldConfigMd5, err := this.Query().
 | 
			
		||||
		Pk(serverId).
 | 
			
		||||
		Set("config", string(config)).
 | 
			
		||||
		Set("version", dbs.SQL("version+1")).
 | 
			
		||||
		Update()
 | 
			
		||||
	return err
 | 
			
		||||
		Result("configMd5").
 | 
			
		||||
		FindStringCol("")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	m := md5.New()
 | 
			
		||||
	_, _ = m.Write(configJSON)
 | 
			
		||||
	h := m.Sum(nil)
 | 
			
		||||
	newConfigMd5 := fmt.Sprintf("%x", h)
 | 
			
		||||
 | 
			
		||||
	// 如果配置相同则不更改
 | 
			
		||||
	if oldConfigMd5 == newConfigMd5 {
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	op := NewServerOperator()
 | 
			
		||||
	op.Id = serverId
 | 
			
		||||
	op.Config = JSONBytes(configJSON)
 | 
			
		||||
	op.Version = dbs.SQL("version+1")
 | 
			
		||||
 | 
			
		||||
	op.ConfigMd5 = newConfigMd5
 | 
			
		||||
	_, err = this.Save(op)
 | 
			
		||||
	return true, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 修改HTTP配置
 | 
			
		||||
@@ -177,7 +200,8 @@ func (this *ServerDAO) UpdateServerHTTP(serverId int64, config []byte) error {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return this.RenewServerConfig(serverId)
 | 
			
		||||
 | 
			
		||||
	return this.createEvent()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 修改HTTPS配置
 | 
			
		||||
@@ -195,7 +219,8 @@ func (this *ServerDAO) UpdateServerHTTPS(serverId int64, config []byte) error {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return this.RenewServerConfig(serverId)
 | 
			
		||||
 | 
			
		||||
	return this.createEvent()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 修改TCP配置
 | 
			
		||||
@@ -213,7 +238,8 @@ func (this *ServerDAO) UpdateServerTCP(serverId int64, config []byte) error {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return this.RenewServerConfig(serverId)
 | 
			
		||||
 | 
			
		||||
	return this.createEvent()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 修改TLS配置
 | 
			
		||||
@@ -231,7 +257,8 @@ func (this *ServerDAO) UpdateServerTLS(serverId int64, config []byte) error {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return this.RenewServerConfig(serverId)
 | 
			
		||||
 | 
			
		||||
	return this.createEvent()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 修改Unix配置
 | 
			
		||||
@@ -249,7 +276,8 @@ func (this *ServerDAO) UpdateServerUnix(serverId int64, config []byte) error {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return this.RenewServerConfig(serverId)
 | 
			
		||||
 | 
			
		||||
	return this.createEvent()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 修改UDP配置
 | 
			
		||||
@@ -267,7 +295,8 @@ func (this *ServerDAO) UpdateServerUDP(serverId int64, config []byte) error {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return this.RenewServerConfig(serverId)
 | 
			
		||||
 | 
			
		||||
	return this.createEvent()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 修改Web配置
 | 
			
		||||
@@ -282,7 +311,7 @@ func (this *ServerDAO) UpdateServerWeb(serverId int64, webId int64) error {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return this.RenewServerConfig(serverId)
 | 
			
		||||
	return this.createEvent()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 初始化Web配置
 | 
			
		||||
@@ -304,6 +333,11 @@ func (this *ServerDAO) InitServerWeb(serverId int64) (int64, error) {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = this.createEvent()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return webId, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return webId, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -322,7 +356,8 @@ func (this *ServerDAO) UpdateServerNames(serverId int64, config []byte) error {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return this.RenewServerConfig(serverId)
 | 
			
		||||
 | 
			
		||||
	return this.createEvent()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 修改反向代理配置
 | 
			
		||||
@@ -337,7 +372,8 @@ func (this *ServerDAO) UpdateServerReverseProxy(serverId int64, config []byte) e
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return this.RenewServerConfig(serverId)
 | 
			
		||||
 | 
			
		||||
	return this.createEvent()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 计算所有可用服务数量
 | 
			
		||||
@@ -379,6 +415,36 @@ func (this *ServerDAO) FindAllEnabledServersWithNode(nodeId int64) (result []*Se
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 获取所有的服务ID
 | 
			
		||||
func (this *ServerDAO) FindAllEnabledServerIds() (serverIds []int64, err error) {
 | 
			
		||||
	ones, err := this.Query().
 | 
			
		||||
		State(ServerStateEnabled).
 | 
			
		||||
		AscPk().
 | 
			
		||||
		ResultPk().
 | 
			
		||||
		FindAll()
 | 
			
		||||
	for _, one := range ones {
 | 
			
		||||
		serverIds = append(serverIds, int64(one.(*Server).Id))
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 查找服务的搜索条件
 | 
			
		||||
func (this *ServerDAO) FindServerNodeFilters(serverId int64) (isOk bool, clusterId int64, err error) {
 | 
			
		||||
	one, err := this.Query().
 | 
			
		||||
		Pk(serverId).
 | 
			
		||||
		Result("clusterId").
 | 
			
		||||
		Find()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false, 0, err
 | 
			
		||||
	}
 | 
			
		||||
	if one == nil {
 | 
			
		||||
		isOk = false
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	server := one.(*Server)
 | 
			
		||||
	return true, int64(server.ClusterId), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 构造服务的Config
 | 
			
		||||
func (this *ServerDAO) ComposeServerConfig(serverId int64) (*serverconfigs.ServerConfig, error) {
 | 
			
		||||
	server, err := this.FindEnabledServer(serverId)
 | 
			
		||||
@@ -396,12 +462,6 @@ func (this *ServerDAO) ComposeServerConfig(serverId int64) (*serverconfigs.Serve
 | 
			
		||||
	config.Name = server.Name
 | 
			
		||||
	config.Description = server.Description
 | 
			
		||||
 | 
			
		||||
	// Components
 | 
			
		||||
	// TODO
 | 
			
		||||
 | 
			
		||||
	// Filters
 | 
			
		||||
	// TODO
 | 
			
		||||
 | 
			
		||||
	// ServerNames
 | 
			
		||||
	if len(server.ServerNames) > 0 && server.ServerNames != "null" {
 | 
			
		||||
		serverNames := []*serverconfigs.ServerNameConfig{}
 | 
			
		||||
@@ -505,14 +565,14 @@ func (this *ServerDAO) ComposeServerConfig(serverId int64) (*serverconfigs.Serve
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 更新服务的Config配置
 | 
			
		||||
func (this *ServerDAO) RenewServerConfig(serverId int64) error {
 | 
			
		||||
func (this *ServerDAO) RenewServerConfig(serverId int64) (isChanged bool, err error) {
 | 
			
		||||
	serverConfig, err := this.ComposeServerConfig(serverId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
	data, err := serverConfig.AsJSON()
 | 
			
		||||
	data, err := json.Marshal(serverConfig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
	return this.UpdateServerConfig(serverId, data)
 | 
			
		||||
}
 | 
			
		||||
@@ -534,32 +594,6 @@ func (this *ServerDAO) FindReverseProxyRef(serverId int64) (*serverconfigs.Rever
 | 
			
		||||
	return config, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 查找需要更新的Server
 | 
			
		||||
func (this *ServerDAO) FindUpdatingServerIds() (serverIds []int64, err error) {
 | 
			
		||||
	ones, err := this.Query().
 | 
			
		||||
		State(ServerStateEnabled).
 | 
			
		||||
		Attr("isUpdating", true).
 | 
			
		||||
		ResultPk().
 | 
			
		||||
		FindAll()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	for _, one := range ones {
 | 
			
		||||
		serverIds = append(serverIds, int64(one.(*Server).Id))
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 修改服务是否需要更新
 | 
			
		||||
func (this *ServerDAO) UpdateServerIsUpdating(serverId int64, isUpdating bool) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
		Pk(serverId).
 | 
			
		||||
		Set("isUpdating", isUpdating).
 | 
			
		||||
		Update()
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 查找WebId
 | 
			
		||||
func (this *ServerDAO) FindServerWebId(serverId int64) (int64, error) {
 | 
			
		||||
	webId, err := this.Query().
 | 
			
		||||
		Pk(serverId).
 | 
			
		||||
@@ -571,28 +605,7 @@ func (this *ServerDAO) FindServerWebId(serverId int64) (int64, error) {
 | 
			
		||||
	return int64(webId), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 更新所有Web相关的处于更新状态
 | 
			
		||||
func (this *ServerDAO) UpdateServerIsUpdatingWithWebId(webId int64) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
		Attr("webId", webId).
 | 
			
		||||
		Set("isUpdating", true).
 | 
			
		||||
		Update()
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 生成唯一ID
 | 
			
		||||
func (this *ServerDAO) genUniqueId() (string, error) {
 | 
			
		||||
	for {
 | 
			
		||||
		uniqueId := rands.HexString(32)
 | 
			
		||||
		ok, err := this.Query().
 | 
			
		||||
			Attr("uniqueId", uniqueId).
 | 
			
		||||
			Exist()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", err
 | 
			
		||||
		}
 | 
			
		||||
		if ok {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		return uniqueId, nil
 | 
			
		||||
	}
 | 
			
		||||
// 创建事件
 | 
			
		||||
func (this *ServerDAO) createEvent() error {
 | 
			
		||||
	return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,8 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto/md5"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	_ "github.com/go-sql-driver/mysql"
 | 
			
		||||
	"github.com/iwind/TeaGo/logs"
 | 
			
		||||
	"testing"
 | 
			
		||||
@@ -13,3 +15,30 @@ func TestServerDAO_ComposeServerConfig(t *testing.T) {
 | 
			
		||||
	}
 | 
			
		||||
	logs.PrintAsJSON(config, t)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestServerDAO_UpdateServerConfig(t *testing.T) {
 | 
			
		||||
	config, err := SharedServerDAO.ComposeServerConfig(1)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	configJSON, err := json.Marshal(config)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	_, err = SharedServerDAO.UpdateServerConfig(1, configJSON)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	t.Log("ok")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestNewServerDAO_md5(t *testing.T) {
 | 
			
		||||
	m := md5.New()
 | 
			
		||||
	_, err := m.Write([]byte("123456"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	h := m.Sum(nil)
 | 
			
		||||
	t.Logf("%x", h)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,6 @@ package models
 | 
			
		||||
type Server struct {
 | 
			
		||||
	Id           uint32 `field:"id"`           // ID
 | 
			
		||||
	IsOn         uint8  `field:"isOn"`         // 是否启用
 | 
			
		||||
	UniqueId     string `field:"uniqueId"`     // 唯一ID
 | 
			
		||||
	UserId       uint32 `field:"userId"`       // 用户ID
 | 
			
		||||
	AdminId      uint32 `field:"adminId"`      // 管理员ID
 | 
			
		||||
	Type         string `field:"type"`         // 服务类型
 | 
			
		||||
@@ -21,19 +20,18 @@ type Server struct {
 | 
			
		||||
	ReverseProxy string `field:"reverseProxy"` // 反向代理配置
 | 
			
		||||
	GroupIds     string `field:"groupIds"`     // 分组ID列表
 | 
			
		||||
	Config       string `field:"config"`       // 服务配置,自动生成
 | 
			
		||||
	ConfigMd5    string `field:"configMd5"`    // Md5
 | 
			
		||||
	ClusterId    uint32 `field:"clusterId"`    // 集群ID
 | 
			
		||||
	IncludeNodes string `field:"includeNodes"` // 部署条件
 | 
			
		||||
	ExcludeNodes string `field:"excludeNodes"` // 节点排除条件
 | 
			
		||||
	Version      uint32 `field:"version"`      // 版本号
 | 
			
		||||
	CreatedAt    uint64 `field:"createdAt"`    // 创建时间
 | 
			
		||||
	IsUpdating   uint8  `field:"isUpdating"`   // 是否正在更新
 | 
			
		||||
	State        uint8  `field:"state"`        // 状态
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ServerOperator struct {
 | 
			
		||||
	Id           interface{} // ID
 | 
			
		||||
	IsOn         interface{} // 是否启用
 | 
			
		||||
	UniqueId     interface{} // 唯一ID
 | 
			
		||||
	UserId       interface{} // 用户ID
 | 
			
		||||
	AdminId      interface{} // 管理员ID
 | 
			
		||||
	Type         interface{} // 服务类型
 | 
			
		||||
@@ -50,12 +48,12 @@ type ServerOperator struct {
 | 
			
		||||
	ReverseProxy interface{} // 反向代理配置
 | 
			
		||||
	GroupIds     interface{} // 分组ID列表
 | 
			
		||||
	Config       interface{} // 服务配置,自动生成
 | 
			
		||||
	ConfigMd5    interface{} // Md5
 | 
			
		||||
	ClusterId    interface{} // 集群ID
 | 
			
		||||
	IncludeNodes interface{} // 部署条件
 | 
			
		||||
	ExcludeNodes interface{} // 节点排除条件
 | 
			
		||||
	Version      interface{} // 版本号
 | 
			
		||||
	CreatedAt    interface{} // 创建时间
 | 
			
		||||
	IsUpdating   interface{} // 是否正在更新
 | 
			
		||||
	State        interface{} // 状态
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										61
									
								
								internal/db/models/sys_event_dao.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								internal/db/models/sys_event_dao.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	_ "github.com/go-sql-driver/mysql"
 | 
			
		||||
	"github.com/iwind/TeaGo/Tea"
 | 
			
		||||
	"github.com/iwind/TeaGo/dbs"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SysEventDAO dbs.DAO
 | 
			
		||||
 | 
			
		||||
func NewSysEventDAO() *SysEventDAO {
 | 
			
		||||
	return dbs.NewDAO(&SysEventDAO{
 | 
			
		||||
		DAOObject: dbs.DAOObject{
 | 
			
		||||
			DB:     Tea.Env,
 | 
			
		||||
			Table:  "edgeSysEvents",
 | 
			
		||||
			Model:  new(SysEvent),
 | 
			
		||||
			PkName: "id",
 | 
			
		||||
		},
 | 
			
		||||
	}).(*SysEventDAO)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var SharedSysEventDAO = NewSysEventDAO()
 | 
			
		||||
 | 
			
		||||
// 创建事件
 | 
			
		||||
func (this *SysEventDAO) CreateEvent(event EventInterface) error {
 | 
			
		||||
	if event == nil {
 | 
			
		||||
		return errors.New("event should not be nil")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	op := NewSysEventOperator()
 | 
			
		||||
	op.Type = event.Type()
 | 
			
		||||
 | 
			
		||||
	eventJSON, err := json.Marshal(event)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	op.Params = eventJSON
 | 
			
		||||
 | 
			
		||||
	_, err = this.Save(op)
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 查找事件
 | 
			
		||||
func (this *SysEventDAO) FindEvents(size int64) (result []*SysEvent, err error) {
 | 
			
		||||
	_, err = this.Query().
 | 
			
		||||
		Asc().
 | 
			
		||||
		Limit(size).
 | 
			
		||||
		Slice(&result).
 | 
			
		||||
		FindAll()
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 删除事件
 | 
			
		||||
func (this *SysEventDAO) DeleteEvent(eventId int64) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
		Pk(eventId).
 | 
			
		||||
		Delete()
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								internal/db/models/sys_event_dao_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								internal/db/models/sys_event_dao_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	_ "github.com/go-sql-driver/mysql"
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestSysEvent_DecodeEvent(t *testing.T) {
 | 
			
		||||
	event := &SysEvent{
 | 
			
		||||
		Type: "serverChange",
 | 
			
		||||
	}
 | 
			
		||||
	eventObj, err := event.DecodeEvent()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	t.Log(eventObj)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										20
									
								
								internal/db/models/sys_event_model.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								internal/db/models/sys_event_model.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
// 系统事件
 | 
			
		||||
type SysEvent struct {
 | 
			
		||||
	Id        uint64 `field:"id"`        // ID
 | 
			
		||||
	Type      string `field:"type"`      // 类型
 | 
			
		||||
	Params    string `field:"params"`    // 参数
 | 
			
		||||
	CreatedAt uint64 `field:"createdAt"` // 创建时间
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type SysEventOperator struct {
 | 
			
		||||
	Id        interface{} // ID
 | 
			
		||||
	Type      interface{} // 类型
 | 
			
		||||
	Params    interface{} // 参数
 | 
			
		||||
	CreatedAt interface{} // 创建时间
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewSysEventOperator() *SysEventOperator {
 | 
			
		||||
	return &SysEventOperator{}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										27
									
								
								internal/db/models/sys_event_model_ext.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								internal/db/models/sys_event_model_ext.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"reflect"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 解码事件
 | 
			
		||||
func (this *SysEvent) DecodeEvent() (EventInterface, error) {
 | 
			
		||||
	// 解析数据类型
 | 
			
		||||
	t, isOk := eventTypeMapping[this.Type]
 | 
			
		||||
	if !isOk {
 | 
			
		||||
		return nil, errors.New("can not found event type '" + this.Type + "'")
 | 
			
		||||
	}
 | 
			
		||||
	ptr := reflect.New(t).Interface().(EventInterface)
 | 
			
		||||
 | 
			
		||||
	// 解析参数
 | 
			
		||||
	if IsNotNull(this.Params) {
 | 
			
		||||
		err := json.Unmarshal([]byte(this.Params), ptr)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ptr, nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										64
									
								
								internal/db/models/sys_event_types.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								internal/db/models/sys_event_types.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,64 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"reflect"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var eventTypeMapping = map[string]reflect.Type{} // eventType => reflect type
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	for _, event := range []EventInterface{
 | 
			
		||||
		NewServerChangeEvent(),
 | 
			
		||||
	} {
 | 
			
		||||
		eventTypeMapping[event.Type()] = reflect.ValueOf(event).Elem().Type()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 接口
 | 
			
		||||
type EventInterface interface {
 | 
			
		||||
	Type() string
 | 
			
		||||
	Run() error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 服务变化
 | 
			
		||||
type ServerChangeEvent struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewServerChangeEvent() *ServerChangeEvent {
 | 
			
		||||
	return &ServerChangeEvent{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *ServerChangeEvent) Type() string {
 | 
			
		||||
	return "serverChange"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *ServerChangeEvent) Run() error {
 | 
			
		||||
	serverIds, err := SharedServerDAO.FindAllEnabledServerIds()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	for _, serverId := range serverIds {
 | 
			
		||||
		isChanged, err := SharedServerDAO.RenewServerConfig(serverId)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if !isChanged {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 检查节点是否需要更新
 | 
			
		||||
		isOk, clusterId, err := SharedServerDAO.FindServerNodeFilters(serverId)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		if !isOk {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		err = SharedNodeDAO.UpdateAllNodesLatestVersionMatch(clusterId)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										106
									
								
								internal/db/models/sys_locker_dao.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								internal/db/models/sys_locker_dao.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,106 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	_ "github.com/go-sql-driver/mysql"
 | 
			
		||||
	"github.com/iwind/TeaGo/Tea"
 | 
			
		||||
	"github.com/iwind/TeaGo/dbs"
 | 
			
		||||
	"github.com/iwind/TeaGo/types"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SysLockerDAO dbs.DAO
 | 
			
		||||
 | 
			
		||||
func NewSysLockerDAO() *SysLockerDAO {
 | 
			
		||||
	return dbs.NewDAO(&SysLockerDAO{
 | 
			
		||||
		DAOObject: dbs.DAOObject{
 | 
			
		||||
			DB:     Tea.Env,
 | 
			
		||||
			Table:  "edgeSysLockers",
 | 
			
		||||
			Model:  new(SysLocker),
 | 
			
		||||
			PkName: "id",
 | 
			
		||||
		},
 | 
			
		||||
	}).(*SysLockerDAO)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var SharedSysLockerDAO = NewSysLockerDAO()
 | 
			
		||||
 | 
			
		||||
// 开锁
 | 
			
		||||
func (this *SysLockerDAO) Lock(key string, timeout int64) (bool, error) {
 | 
			
		||||
	maxErrors := 5
 | 
			
		||||
	for {
 | 
			
		||||
		one, err := this.Query().
 | 
			
		||||
			Attr("key", key).
 | 
			
		||||
			Find()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			maxErrors--
 | 
			
		||||
			if maxErrors < 0 {
 | 
			
		||||
				return false, err
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 如果没有锁,则创建
 | 
			
		||||
		if one == nil {
 | 
			
		||||
			op := NewSysLockerOperator()
 | 
			
		||||
			op.Key = key
 | 
			
		||||
			op.TimeoutAt = time.Now().Unix() + timeout
 | 
			
		||||
			op.Version = 1
 | 
			
		||||
			_, err := this.Save(op)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				maxErrors--
 | 
			
		||||
				if maxErrors < 0 {
 | 
			
		||||
					return false, err
 | 
			
		||||
				}
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return true, nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 如果已经有锁
 | 
			
		||||
		locker := one.(*SysLocker)
 | 
			
		||||
		if time.Now().Unix() <= int64(locker.TimeoutAt) {
 | 
			
		||||
			return false, nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 修改
 | 
			
		||||
		op := NewSysLockerOperator()
 | 
			
		||||
		op.Id = locker.Id
 | 
			
		||||
		op.Version = locker.Version + 1
 | 
			
		||||
		op.TimeoutAt = time.Now().Unix() + timeout
 | 
			
		||||
		_, err = this.Save(op)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			maxErrors--
 | 
			
		||||
			if maxErrors < 0 {
 | 
			
		||||
				return false, err
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 再次查询版本
 | 
			
		||||
		version, err := this.Query().
 | 
			
		||||
			Attr("key", key).
 | 
			
		||||
			Result("version").
 | 
			
		||||
			FindCol("0")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			maxErrors--
 | 
			
		||||
			if maxErrors < 0 {
 | 
			
		||||
				return false, err
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if types.Int64(version) != int64(locker.Version)+1 {
 | 
			
		||||
			return false, nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return true, nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 解锁
 | 
			
		||||
func (this *SysLockerDAO) Unlock(key string) error {
 | 
			
		||||
	_, err := this.Query().
 | 
			
		||||
		Attr("key", key).
 | 
			
		||||
		Set("timeoutAt", time.Now().Unix()-86400*365).
 | 
			
		||||
		Update()
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								internal/db/models/sys_locker_dao_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								internal/db/models/sys_locker_dao_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	_ "github.com/go-sql-driver/mysql"
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestSysLockerDAO_Lock(t *testing.T) {
 | 
			
		||||
	isOk, err := SharedSysLockerDAO.Lock("test", 600)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	t.Log(isOk)
 | 
			
		||||
 | 
			
		||||
	if isOk {
 | 
			
		||||
		err = SharedSysLockerDAO.Unlock("test")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										20
									
								
								internal/db/models/sys_locker_model.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								internal/db/models/sys_locker_model.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
// 并发锁
 | 
			
		||||
type SysLocker struct {
 | 
			
		||||
	Id        uint64 `field:"id"`        // ID
 | 
			
		||||
	Key       string `field:"key"`       // 键值
 | 
			
		||||
	Version   uint64 `field:"version"`   // 版本号
 | 
			
		||||
	TimeoutAt uint64 `field:"timeoutAt"` // 超时时间
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type SysLockerOperator struct {
 | 
			
		||||
	Id        interface{} // ID
 | 
			
		||||
	Key       interface{} // 键值
 | 
			
		||||
	Version   interface{} // 版本号
 | 
			
		||||
	TimeoutAt interface{} // 超时时间
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewSysLockerOperator() *SysLockerOperator {
 | 
			
		||||
	return &SysLockerOperator{}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								internal/db/models/sys_locker_model_ext.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								internal/db/models/sys_locker_model_ext.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
package models
 | 
			
		||||
							
								
								
									
										86
									
								
								internal/db/models/sys_setting_dao.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								internal/db/models/sys_setting_dao.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,86 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	_ "github.com/go-sql-driver/mysql"
 | 
			
		||||
	"github.com/iwind/TeaGo/Tea"
 | 
			
		||||
	"github.com/iwind/TeaGo/dbs"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SysSettingDAO dbs.DAO
 | 
			
		||||
 | 
			
		||||
type SettingCode = string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	SettingCodeGlobalConfig SettingCode = "globalConfig"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func NewSysSettingDAO() *SysSettingDAO {
 | 
			
		||||
	return dbs.NewDAO(&SysSettingDAO{
 | 
			
		||||
		DAOObject: dbs.DAOObject{
 | 
			
		||||
			DB:     Tea.Env,
 | 
			
		||||
			Table:  "edgeSysSettings",
 | 
			
		||||
			Model:  new(SysSetting),
 | 
			
		||||
			PkName: "id",
 | 
			
		||||
		},
 | 
			
		||||
	}).(*SysSettingDAO)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var SharedSysSettingDAO = NewSysSettingDAO()
 | 
			
		||||
 | 
			
		||||
// 设置配置
 | 
			
		||||
func (this *SysSettingDAO) UpdateSetting(code string, valueJSON []byte, args ...interface{}) error {
 | 
			
		||||
	if len(args) > 0 {
 | 
			
		||||
		code = fmt.Sprintf(code, args...)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	countRetries := 3
 | 
			
		||||
	var lastErr error
 | 
			
		||||
	for i := 0; i < countRetries; i++ {
 | 
			
		||||
		settingId, err := this.Query().
 | 
			
		||||
			Attr("code", code).
 | 
			
		||||
			ResultPk().
 | 
			
		||||
			FindInt64Col(0)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if settingId == 0 {
 | 
			
		||||
			// 新建
 | 
			
		||||
			op := NewSysSettingOperator()
 | 
			
		||||
			op.Code = code
 | 
			
		||||
			op.Value = valueJSON
 | 
			
		||||
			_, err = this.Save(op)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				lastErr = err
 | 
			
		||||
 | 
			
		||||
				// 因为错误的原因可能是因为code冲突,所以这里我们继续执行
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 修改
 | 
			
		||||
		op := NewSysSettingOperator()
 | 
			
		||||
		op.Id = settingId
 | 
			
		||||
		op.Value = valueJSON
 | 
			
		||||
		_, err = this.Save(op)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return lastErr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 读取配置
 | 
			
		||||
func (this *SysSettingDAO) ReadSetting(code string, args ...interface{}) (valueJSON []byte, err error) {
 | 
			
		||||
	if len(args) > 0 {
 | 
			
		||||
		code = fmt.Sprintf(code, args...)
 | 
			
		||||
	}
 | 
			
		||||
	col, err := this.Query().
 | 
			
		||||
		Attr("code", code).
 | 
			
		||||
		Result("value").
 | 
			
		||||
		FindStringCol("")
 | 
			
		||||
	return []byte(col), err
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										32
									
								
								internal/db/models/sys_setting_dao_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								internal/db/models/sys_setting_dao_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	_ "github.com/go-sql-driver/mysql"
 | 
			
		||||
	"testing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestSysSettingDAO_UpdateSetting(t *testing.T) {
 | 
			
		||||
	err := SharedSysSettingDAO.UpdateSetting("hello", []byte(`"world"`))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	value, err := SharedSysSettingDAO.ReadSetting("hello")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	t.Log("value:", string(value))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestSysSettingDAO_UpdateSetting_Args(t *testing.T) {
 | 
			
		||||
	err := SharedSysSettingDAO.UpdateSetting("hello %d", []byte(`"world 123"`), 123)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	value, err := SharedSysSettingDAO.ReadSetting("hello %d", 123)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	t.Log("value:", string(value))
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										20
									
								
								internal/db/models/sys_setting_model.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								internal/db/models/sys_setting_model.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
package models
 | 
			
		||||
 | 
			
		||||
// 系统配置
 | 
			
		||||
type SysSetting struct {
 | 
			
		||||
	Id     uint32 `field:"id"`     // ID
 | 
			
		||||
	UserId uint32 `field:"userId"` // 用户ID
 | 
			
		||||
	Code   string `field:"code"`   // 代号
 | 
			
		||||
	Value  string `field:"value"`  // 配置值
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type SysSettingOperator struct {
 | 
			
		||||
	Id     interface{} // ID
 | 
			
		||||
	UserId interface{} // 用户ID
 | 
			
		||||
	Code   interface{} // 代号
 | 
			
		||||
	Value  interface{} // 配置值
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewSysSettingOperator() *SysSettingOperator {
 | 
			
		||||
	return &SysSettingOperator{}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								internal/db/models/sys_setting_model_ext.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								internal/db/models/sys_setting_model_ext.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
package models
 | 
			
		||||
@@ -20,3 +20,17 @@ func NewTCPFirewallPolicyDAO() *TCPFirewallPolicyDAO {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var SharedTCPFirewallPolicyDAO = NewTCPFirewallPolicyDAO()
 | 
			
		||||
 | 
			
		||||
// 初始化
 | 
			
		||||
func (this *TCPFirewallPolicyDAO) Init() {
 | 
			
		||||
	this.DAOObject.Init()
 | 
			
		||||
	this.DAOObject.OnUpdate(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnInsert(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
	this.DAOObject.OnDelete(func() error {
 | 
			
		||||
		return SharedSysEventDAO.CreateEvent(NewServerChangeEvent())
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ func (this *HTTPAccessLogPolicyService) FindAllEnabledHTTPAccessLogPolicies(ctx
 | 
			
		||||
			IsOn:        policy.IsOn == 1,
 | 
			
		||||
			Type:        policy.Name,
 | 
			
		||||
			OptionsJSON: []byte(policy.Options),
 | 
			
		||||
			CondsJSON:   []byte(policy.Conds),
 | 
			
		||||
			CondsJSON:   []byte(policy.CondGroups),
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,10 +7,9 @@ import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAPI/internal/installers"
 | 
			
		||||
	rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
			
		||||
	"github.com/iwind/TeaGo/logs"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
	"github.com/iwind/TeaGo/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type NodeService struct {
 | 
			
		||||
@@ -62,7 +61,7 @@ func (this *NodeService) CountAllEnabledNodesMatch(ctx context.Context, req *pb.
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	count, err := models.SharedNodeDAO.CountAllEnabledNodesMatch(req.ClusterId, types.Int8(req.InstallState))
 | 
			
		||||
	count, err := models.SharedNodeDAO.CountAllEnabledNodesMatch(req.ClusterId, configutils.ToBoolState(req.InstallState), configutils.ToBoolState(req.ActiveState))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -75,7 +74,7 @@ func (this *NodeService) ListEnabledNodesMatch(ctx context.Context, req *pb.List
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	nodes, err := models.SharedNodeDAO.ListEnabledNodesMatch(req.Offset, req.Size, req.ClusterId, types.Int8(req.InstallState))
 | 
			
		||||
	nodes, err := models.SharedNodeDAO.ListEnabledNodesMatch(req.Offset, req.Size, req.ClusterId, configutils.ToBoolState(req.InstallState), configutils.ToBoolState(req.ActiveState))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -106,6 +105,7 @@ func (this *NodeService) ListEnabledNodesMatch(ctx context.Context, req *pb.List
 | 
			
		||||
		result = append(result, &pb.Node{
 | 
			
		||||
			Id:          int64(node.Id),
 | 
			
		||||
			Name:        node.Name,
 | 
			
		||||
			Version:     int64(node.Version),
 | 
			
		||||
			IsInstalled: node.IsInstalled == 1,
 | 
			
		||||
			Status:      node.Status,
 | 
			
		||||
			Cluster: &pb.NodeCluster{
 | 
			
		||||
@@ -223,13 +223,15 @@ func (this *NodeService) FindEnabledNode(ctx context.Context, req *pb.FindEnable
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &pb.FindEnabledNodeResponse{Node: &pb.Node{
 | 
			
		||||
		Id:          int64(node.Id),
 | 
			
		||||
		Name:        node.Name,
 | 
			
		||||
		Status:      node.Status,
 | 
			
		||||
		UniqueId:    node.UniqueId,
 | 
			
		||||
		Secret:      node.Secret,
 | 
			
		||||
		InstallDir:  node.InstallDir,
 | 
			
		||||
		IsInstalled: node.IsInstalled == 1,
 | 
			
		||||
		Id:            int64(node.Id),
 | 
			
		||||
		Name:          node.Name,
 | 
			
		||||
		Status:        node.Status,
 | 
			
		||||
		UniqueId:      node.UniqueId,
 | 
			
		||||
		Version:       int64(node.Version),
 | 
			
		||||
		LatestVersion: int64(node.LatestVersion),
 | 
			
		||||
		Secret:        node.Secret,
 | 
			
		||||
		InstallDir:    node.InstallDir,
 | 
			
		||||
		IsInstalled:   node.IsInstalled == 1,
 | 
			
		||||
		Cluster: &pb.NodeCluster{
 | 
			
		||||
			Id:   int64(node.ClusterId),
 | 
			
		||||
			Name: clusterName,
 | 
			
		||||
@@ -241,50 +243,19 @@ func (this *NodeService) FindEnabledNode(ctx context.Context, req *pb.FindEnable
 | 
			
		||||
 | 
			
		||||
// 组合节点配置
 | 
			
		||||
func (this *NodeService) ComposeNodeConfig(ctx context.Context, req *pb.ComposeNodeConfigRequest) (*pb.ComposeNodeConfigResponse, error) {
 | 
			
		||||
	_ = req
 | 
			
		||||
 | 
			
		||||
	// 校验节点
 | 
			
		||||
	_, nodeId, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeNode)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	node, err := models.SharedNodeDAO.FindEnabledNode(nodeId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if node == nil {
 | 
			
		||||
		return nil, errors.New("node validate failed, please check 'nodeId' or 'secret'")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	nodeMap := maps.Map{
 | 
			
		||||
		"id":      node.UniqueId,
 | 
			
		||||
		"isOn":    node.IsOn == 1,
 | 
			
		||||
		"servers": []maps.Map{},
 | 
			
		||||
		"version": node.Version,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 获取所有的服务
 | 
			
		||||
	servers, err := models.SharedServerDAO.FindAllEnabledServersWithNode(int64(node.Id))
 | 
			
		||||
	nodeConfig, err := models.SharedNodeDAO.ComposeNodeConfig(nodeId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	serverMaps := []maps.Map{}
 | 
			
		||||
	for _, server := range servers {
 | 
			
		||||
		if len(server.Config) == 0 {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		configMap := maps.Map{}
 | 
			
		||||
		err = json.Unmarshal([]byte(server.Config), &configMap)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		configMap["id"] = server.UniqueId
 | 
			
		||||
		configMap["version"] = server.Version
 | 
			
		||||
		serverMaps = append(serverMaps, configMap)
 | 
			
		||||
	}
 | 
			
		||||
	nodeMap["servers"] = serverMaps
 | 
			
		||||
 | 
			
		||||
	data, err := json.Marshal(nodeMap)
 | 
			
		||||
	data, err := json.Marshal(nodeConfig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -294,6 +265,7 @@ func (this *NodeService) ComposeNodeConfig(ctx context.Context, req *pb.ComposeN
 | 
			
		||||
 | 
			
		||||
// 节点stream
 | 
			
		||||
func (this *NodeService) NodeStream(server pb.NodeService_NodeStreamServer) error {
 | 
			
		||||
	// TODO 使用此stream快速通知边缘节点更新
 | 
			
		||||
	// 校验节点
 | 
			
		||||
	_, nodeId, err := rpcutils.ValidateRequest(server.Context(), rpcutils.UserTypeNode)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -301,6 +273,8 @@ func (this *NodeService) NodeStream(server pb.NodeService_NodeStreamServer) erro
 | 
			
		||||
	}
 | 
			
		||||
	logs.Println("nodeId:", nodeId)
 | 
			
		||||
 | 
			
		||||
	_ = server.Send(&pb.NodeStreamResponse{})
 | 
			
		||||
 | 
			
		||||
	for {
 | 
			
		||||
		req, err := server.Recv()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
 
 | 
			
		||||
@@ -101,12 +101,6 @@ func (this *ServerService) UpdateServerHTTP(ctx context.Context, req *pb.UpdateS
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 更新新的节点版本
 | 
			
		||||
	err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(int64(server.ClusterId))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &pb.RPCUpdateSuccess{}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -136,12 +130,6 @@ func (this *ServerService) UpdateServerHTTPS(ctx context.Context, req *pb.Update
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 更新新的节点版本
 | 
			
		||||
	err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(int64(server.ClusterId))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &pb.RPCUpdateSuccess{}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -171,12 +159,6 @@ func (this *ServerService) UpdateServerTCP(ctx context.Context, req *pb.UpdateSe
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 更新新的节点版本
 | 
			
		||||
	err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(int64(server.ClusterId))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &pb.RPCUpdateSuccess{}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -206,12 +188,6 @@ func (this *ServerService) UpdateServerTLS(ctx context.Context, req *pb.UpdateSe
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 更新新的节点版本
 | 
			
		||||
	err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(int64(server.ClusterId))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &pb.RPCUpdateSuccess{}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -241,12 +217,6 @@ func (this *ServerService) UpdateServerUnix(ctx context.Context, req *pb.UpdateS
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 更新新的节点版本
 | 
			
		||||
	err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(int64(server.ClusterId))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &pb.RPCUpdateSuccess{}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -276,12 +246,6 @@ func (this *ServerService) UpdateServerUDP(ctx context.Context, req *pb.UpdateSe
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 更新新的节点版本
 | 
			
		||||
	err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(int64(server.ClusterId))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &pb.RPCUpdateSuccess{}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -311,12 +275,6 @@ func (this *ServerService) UpdateServerWeb(ctx context.Context, req *pb.UpdateSe
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 更新新的节点版本
 | 
			
		||||
	err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(int64(server.ClusterId))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &pb.RPCUpdateSuccess{}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -346,12 +304,6 @@ func (this *ServerService) UpdateServerReverseProxy(ctx context.Context, req *pb
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 更新新的节点版本
 | 
			
		||||
	err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(int64(server.ClusterId))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &pb.RPCUpdateSuccess{}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -381,12 +333,6 @@ func (this *ServerService) UpdateServerNames(ctx context.Context, req *pb.Update
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 更新新的节点版本
 | 
			
		||||
	err = models.SharedNodeDAO.UpdateAllNodesLatestVersionMatch(int64(server.ClusterId))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &pb.RPCUpdateSuccess{}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										69
									
								
								internal/tasks/event_looper.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								internal/tasks/event_looper.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,69 @@
 | 
			
		||||
package tasks
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
			
		||||
	"github.com/iwind/TeaGo/logs"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	looper := NewEventLooper()
 | 
			
		||||
	go looper.Start()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type EventLooper struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewEventLooper() *EventLooper {
 | 
			
		||||
	return &EventLooper{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *EventLooper) Start() {
 | 
			
		||||
	ticker := time.NewTicker(2 * time.Second)
 | 
			
		||||
	for range ticker.C {
 | 
			
		||||
		err := this.loop()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logs.Println("[EVENT_LOOPER]" + err.Error())
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *EventLooper) loop() error {
 | 
			
		||||
	lockerKey := "eventLooper"
 | 
			
		||||
	isOk, err := models.SharedSysLockerDAO.Lock(lockerKey, 3600)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	defer func() {
 | 
			
		||||
		err = models.SharedSysLockerDAO.Unlock(lockerKey)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logs.Println("[EVENT_LOOPER]" + err.Error())
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
	if !isOk {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	events, err := models.SharedSysEventDAO.FindEvents(100)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	for _, eventOne := range events {
 | 
			
		||||
		event, err := eventOne.DecodeEvent()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logs.Println("[EVENT_LOOPER]" + err.Error())
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		err = event.Run()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logs.Println("[EVENT_LOOPER]" + err.Error())
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		err = models.SharedSysEventDAO.DeleteEvent(int64(eventOne.Id))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
@@ -1,70 +0,0 @@
 | 
			
		||||
package tasks
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
			
		||||
	"github.com/iwind/TeaGo/logs"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// TODO 考虑多个API服务同时运行的冲突
 | 
			
		||||
func init() {
 | 
			
		||||
	task := &ServerUpdateTask{}
 | 
			
		||||
	go task.Run()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 更新服务配置
 | 
			
		||||
type ServerUpdateTask struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *ServerUpdateTask) Run() {
 | 
			
		||||
	ticker := time.NewTicker(1 * time.Second)
 | 
			
		||||
	for range ticker.C {
 | 
			
		||||
		this.loop()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *ServerUpdateTask) loop() {
 | 
			
		||||
	serverIds, err := models.SharedServerDAO.FindUpdatingServerIds()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		logs.Println("[ServerUpdateTask]" + err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if len(serverIds) == 0 {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	for _, serverId := range serverIds {
 | 
			
		||||
		// 查找配置
 | 
			
		||||
		config, err := models.SharedServerDAO.ComposeServerConfig(serverId)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logs.Println("[ServerUpdateTask]" + err.Error())
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if config == nil {
 | 
			
		||||
			err = models.SharedServerDAO.UpdateServerIsUpdating(serverId, false)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				logs.Println("[ServerUpdateTask]" + err.Error())
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		configData, err := json.Marshal(config)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logs.Println("[ServerUpdateTask]" + err.Error())
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 修改配置
 | 
			
		||||
		err = models.SharedServerDAO.UpdateServerConfig(serverId, configData)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logs.Println("[ServerUpdateTask]" + err.Error())
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// 修改更新状态
 | 
			
		||||
		err = models.SharedServerDAO.UpdateServerIsUpdating(serverId, false)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			logs.Println("[ServerUpdateTask]" + err.Error())
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user