// Copyright 2023 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . //go:build plus package models import ( "encoding/json" "errors" "fmt" "github.com/TeaOSLab/EdgeAPI/internal/utils" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" "github.com/iwind/TeaGo/dbs" ) // CopyWebConfigs 拷贝Web配置 func (this *HTTPWebDAO) CopyWebConfigs(tx *dbs.Tx, fromWebId int64, toWebIds []int64, configField string) error { if fromWebId <= 0 || len(toWebIds) == 0 { return nil } configJSON, err := this.Query(tx). Pk(fromWebId). Result(configField). FindJSONCol() if err != nil { return err } // 暂时不处理 if len(configJSON) == 0 { return nil } // 拷贝配置 for _, toWebId := range toWebIds { if toWebId == fromWebId { continue } err = this.Query(tx). Pk(toWebId). Set(configField, configJSON). UpdateQuickly() if err != nil { return err } } return nil } // CopyWebsocketConfigs 复制Websocket配置 func (this *HTTPWebDAO) CopyWebsocketConfigs(tx *dbs.Tx, fromWebId int64, toWebIds []int64) error { if fromWebId <= 0 || len(toWebIds) == 0 { return nil } websocketRefJSON, err := this.Query(tx). Pk(fromWebId). Result("websocket"). FindJSONCol() if err != nil { return err } if len(websocketRefJSON) == 0 { return nil } var websocketRef = &serverconfigs.HTTPWebsocketRef{} err = json.Unmarshal(websocketRefJSON, &websocketRef) if err != nil { return err } if websocketRef.WebsocketId <= 0 { for _, toWebId := range toWebIds { if toWebId == fromWebId { continue } err = this.Query(tx). Pk(toWebId). Set("websocket", websocketRefJSON). UpdateQuickly() if err != nil { return err } } return nil } var oldWebsocketId = websocketRef.WebsocketId for _, toWebId := range toWebIds { if toWebId == fromWebId { continue } newWebsocketId, err := SharedHTTPWebsocketDAO.CloneWebsocket(tx, oldWebsocketId) if err != nil { return err } if newWebsocketId <= 0 { continue } websocketRef.WebsocketId = newWebsocketId newWebsocketRefJSON, err := json.Marshal(websocketRef) if err != nil { return err } err = this.Query(tx). Pk(toWebId). Set("websocket", newWebsocketRefJSON). UpdateQuickly() if err != nil { return err } } return nil } // CopyPageConfigs 复制Page配置 func (this *HTTPWebDAO) CopyPageConfigs(tx *dbs.Tx, fromWebId int64, toWebIds []int64) error { if fromWebId <= 0 || len(toWebIds) == 0 { return nil } pagesJSON, err := this.Query(tx). Pk(fromWebId). Result("pages"). FindJSONCol() if err != nil { return err } if len(pagesJSON) == 0 { return nil } var pages = []*serverconfigs.HTTPPageConfig{} err = json.Unmarshal(pagesJSON, &pages) if err != nil { return err } for _, toWebId := range toWebIds { if toWebId == fromWebId { continue } var newPages = []*serverconfigs.HTTPPageConfig{} for _, page := range pages { newPageId, err := SharedHTTPPageDAO.ClonePage(tx, page.Id) if err != nil { return err } if newPageId <= 0 { continue } newPages = append(newPages, &serverconfigs.HTTPPageConfig{ Id: newPageId, }) } newPagesJSON, err := json.Marshal(newPages) if err != nil { return err } err = this.Query(tx). Pk(toWebId). Set("pages", newPagesJSON). UpdateQuickly() if err != nil { return err } } return nil } // CopyAuthConfigs 复制访问鉴权 func (this *HTTPWebDAO) CopyAuthConfigs(tx *dbs.Tx, fromWebId int64, toWebIds []int64) error { if fromWebId <= 0 || len(toWebIds) == 0 { return nil } fromAuthJSON, err := this.Query(tx). Pk(fromWebId). Result("auth"). FindJSONCol() if err != nil { return err } if len(fromAuthJSON) == 0 { return nil } var authConfig = &serverconfigs.HTTPAuthConfig{} err = json.Unmarshal(fromAuthJSON, authConfig) if err != nil { return err } oldRefs, err := utils.JSONClone[[]*serverconfigs.HTTPAuthPolicyRef](authConfig.PolicyRefs) if err != nil { return err } for _, toWebId := range toWebIds { if toWebId == fromWebId { continue } var newRefs = []*serverconfigs.HTTPAuthPolicyRef{} for _, ref := range oldRefs { if ref.AuthPolicyId > 0 { newAuthPolicyId, err := SharedHTTPAuthPolicyDAO.CloneAuthPolicy(tx, ref.AuthPolicyId) if err != nil { return err } if newAuthPolicyId <= 0 { continue } newRef, err := utils.JSONClone[*serverconfigs.HTTPAuthPolicyRef](ref) if err != nil { return err } newRef.AuthPolicyId = newAuthPolicyId newRefs = append(newRefs, newRef) } } authConfig.PolicyRefs = newRefs authConfigJSON, err := json.Marshal(authConfig) if err != nil { return err } err = this.Query(tx). Pk(toWebId). Set("auth", authConfigJSON). UpdateQuickly() if err != nil { return err } } return nil } // CopyFirewallConfigs 复制WAF func (this *HTTPWebDAO) CopyFirewallConfigs(tx *dbs.Tx, fromWebId int64, toWebIds []int64, copyRegions bool) error { if fromWebId <= 0 || len(toWebIds) == 0 { return nil } fromFirewallJSON, err := this.Query(tx). Pk(fromWebId). Result("firewall"). FindJSONCol() if err != nil { return err } var fromRef = &firewallconfigs.HTTPFirewallRef{} err = json.Unmarshal(fromFirewallJSON, fromRef) if err != nil { return err } var fromFirewallPolicy *firewallconfigs.HTTPFirewallPolicy if fromRef.FirewallPolicyId > 0 { fromFirewallPolicy, err = SharedHTTPFirewallPolicyDAO.ComposeFirewallPolicy(tx, fromRef.FirewallPolicyId, false, nil) if err != nil { return err } } for _, toWebId := range toWebIds { toFirewallJSON, err := this.Query(tx). Pk(toWebId). Result("firewall"). FindJSONCol() if err != nil { return err } var toRef = &firewallconfigs.HTTPFirewallRef{} if IsNotNull(toFirewallJSON) { err = json.Unmarshal(toFirewallJSON, toRef) if err != nil { return fmt.Errorf("decode 'toFirewallJSON' failed: %w", err) } } toRef.IsOn = fromRef.IsOn toRef.IsPrior = fromRef.IsPrior toRef.IgnoreGlobalRules = fromRef.IgnoreGlobalRules // waf policy if toRef.FirewallPolicyId == 0 && copyRegions { serverId, err := SharedServerDAO.FindEnabledServerIdWithWebId(tx, toWebId) if err != nil { return err } if serverId <= 0 { continue } toRef.FirewallPolicyId, err = SharedHTTPFirewallPolicyDAO.CreateFirewallPolicy(tx, 0, 0, serverId, true, "", "", nil, nil) if err != nil { return err } } // ref toRefJSON, err := json.Marshal(toRef) if err != nil { return err } err = this.Query(tx). Pk(toWebId). Set("firewall", toRefJSON). UpdateQuickly() if err != nil { return err } // WAF策略 if fromFirewallPolicy != nil { if fromFirewallPolicy.Inbound != nil { if copyRegions && toRef.FirewallPolicyId > 0 { err = SharedHTTPFirewallPolicyDAO.UpdateFirewallPolicyInboundRegion(tx, toRef.FirewallPolicyId, fromFirewallPolicy.Inbound.Region) if err != nil { return err } } } } } return nil } func (this *HTTPWebDAO) CopyCacheConfigs(tx *dbs.Tx, fromWebId int64, toWebIds []int64) error { if fromWebId <= 0 || len(toWebIds) == 0 { return nil } const configField = HTTPWebField_Cache configJSON, err := this.Query(tx). Pk(fromWebId). Result(configField). FindJSONCol() if err != nil { return err } var cacheConfig = &serverconfigs.HTTPCacheConfig{} err = json.Unmarshal(configJSON, cacheConfig) if err != nil { return err } cacheConfig.Key = nil // 不拷贝 key 配置 // 拷贝配置 for _, toWebId := range toWebIds { if toWebId == fromWebId { continue } oldConfigJSON, err := this.Query(tx). Pk(toWebId). Result(configField). FindJSONCol() if err != nil { return err } if len(oldConfigJSON) > 0 { var oldCacheConfig = &serverconfigs.HTTPCacheConfig{} err = json.Unmarshal(oldConfigJSON, oldCacheConfig) if err != nil { return err } cacheConfig.Key = oldCacheConfig.Key // 保留 key } newConfigJSON, err := json.Marshal(cacheConfig) if err != nil { return err } err = this.Query(tx). Pk(toWebId). Set(configField, newConfigJSON). UpdateQuickly() if err != nil { return err } } return nil } // UpdateWebHLS 修改HLS设置 func (this *HTTPWebDAO) UpdateWebHLS(tx *dbs.Tx, webId int64, hlsConfig *serverconfigs.HLSConfig) error { if webId <= 0 { return errors.New("require 'webId'") } if hlsConfig == nil { return errors.New("'hlsConfig' must not be nil") } hlsJSON, err := json.Marshal(hlsConfig) if err != nil { return err } err = this.Query(tx). Pk(webId). Set(HTTPWebField_Hls, hlsJSON). UpdateQuickly() if err != nil { return err } return this.NotifyUpdate(tx, webId) } // FindWebHLS 读取HLS设置 func (this *HTTPWebDAO) FindWebHLS(tx *dbs.Tx, webId int64) ([]byte, error) { if webId <= 0 { return nil, errors.New("require 'webId'") } return this.Query(tx). Pk(webId). Result(HTTPWebField_Hls). FindJSONCol() }