diff --git a/internal/web/actions/actionutils/utils.go b/internal/web/actions/actionutils/utils.go index d5754504..056cbba6 100644 --- a/internal/web/actions/actionutils/utils.go +++ b/internal/web/actions/actionutils/utils.go @@ -33,6 +33,18 @@ func MatchPath(action *actions.ActionObject, path string) bool { return action.Request.URL.Path == path } +// 查找父级Action +func FindParentAction(actionPtr actions.ActionWrapper) *ParentAction { + parentActionValue := reflect.ValueOf(actionPtr).Elem().FieldByName("ParentAction") + if parentActionValue.IsValid() { + parentAction, isOk := parentActionValue.Interface().(ParentAction) + if isOk { + return &parentAction + } + } + return nil +} + func findStack(err string) string { _, currentFilename, _, currentOk := runtime.Caller(1) if currentOk { diff --git a/internal/web/actions/default/servers/components/cache/delete.go b/internal/web/actions/default/servers/components/cache/delete.go index ed03b696..b0014b32 100644 --- a/internal/web/actions/default/servers/components/cache/delete.go +++ b/internal/web/actions/default/servers/components/cache/delete.go @@ -19,7 +19,7 @@ func (this *DeleteAction) RunPost(params struct { return } if countResp.Count > 0 { - this.Fail("此缓存策略正在被别的服务引用,请修改后再删除。") + this.Fail("此缓存策略正在被有些服务引用,请修改后再删除。") } _, err = this.RPC().HTTPCachePolicyRPC().DeleteHTTPCachePolicy(this.AdminContext(), &pb.DeleteHTTPCachePolicyRequest{CachePolicyId: params.CachePolicyId}) diff --git a/internal/web/actions/default/servers/components/waf/createPopup.go b/internal/web/actions/default/servers/components/waf/createPopup.go new file mode 100644 index 00000000..bd8163f4 --- /dev/null +++ b/internal/web/actions/default/servers/components/waf/createPopup.go @@ -0,0 +1,59 @@ +package waf + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" + "github.com/iwind/TeaGo/actions" + "github.com/iwind/TeaGo/maps" +) + +type CreatePopupAction struct { + actionutils.ParentAction +} + +func (this *CreatePopupAction) Init() { + this.Nav("", "", "") +} + +func (this *CreatePopupAction) RunGet(params struct{}) { + // 预置分组 + groups := []maps.Map{} + templatePolicy := firewallconfigs.HTTPFirewallTemplate() + for _, group := range templatePolicy.AllRuleGroups() { + groups = append(groups, maps.Map{ + "code": group.Code, + "name": group.Name, + "isOn": group.IsOn, + }) + } + this.Data["groups"] = groups + + this.Show() +} + +func (this *CreatePopupAction) RunPost(params struct { + Name string + GroupCodes []string + Description string + IsOn bool + + Must *actions.Must +}) { + params.Must. + Field("name", params.Name). + Require("请输入策略名称") + + _, err := this.RPC().HTTPFirewallPolicyRPC().CreateHTTPFirewallPolicy(this.AdminContext(), &pb.CreateHTTPFirewallPolicyRequest{ + IsOn: params.IsOn, + Name: params.Name, + Description: params.Description, + FirewallGroupCodes: params.GroupCodes, + }) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/components/waf/delete.go b/internal/web/actions/default/servers/components/waf/delete.go new file mode 100644 index 00000000..17a6ca91 --- /dev/null +++ b/internal/web/actions/default/servers/components/waf/delete.go @@ -0,0 +1,31 @@ +package waf + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +type DeleteAction struct { + actionutils.ParentAction +} + +func (this *DeleteAction) RunPost(params struct { + FirewallPolicyId int64 +}) { + countResp, err := this.RPC().ServerRPC().CountAllEnabledServersWithHTTPFirewallPolicyId(this.AdminContext(), &pb.CountAllEnabledServersWithHTTPFirewallPolicyIdRequest{FirewallPolicyId: params.FirewallPolicyId}) + if err != nil { + this.ErrorPage(err) + return + } + if countResp.Count > 0 { + this.Fail("此WAF策略正在被有些服务引用,请修改后再删除。") + } + + _, err = this.RPC().HTTPFirewallPolicyRPC().DeleteFirewallPolicy(this.AdminContext(), &pb.DeleteFirewallPolicyRequest{FirewallPolicyId: params.FirewallPolicyId}) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/components/waf/export.go b/internal/web/actions/default/servers/components/waf/export.go new file mode 100644 index 00000000..4850c0fb --- /dev/null +++ b/internal/web/actions/default/servers/components/waf/export.go @@ -0,0 +1,15 @@ +package waf + +import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + +type ExportAction struct { + actionutils.ParentAction +} + +func (this *ExportAction) Init() { + this.Nav("", "", "") +} + +func (this *ExportAction) RunGet(params struct{}) { + this.Show() +} diff --git a/internal/web/actions/default/servers/components/waf/groups.go b/internal/web/actions/default/servers/components/waf/groups.go new file mode 100644 index 00000000..d93a82c8 --- /dev/null +++ b/internal/web/actions/default/servers/components/waf/groups.go @@ -0,0 +1,15 @@ +package waf + +import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + +type GroupsAction struct { + actionutils.ParentAction +} + +func (this *GroupsAction) Init() { + this.Nav("", "", "") +} + +func (this *GroupsAction) RunGet(params struct{}) { + this.Show() +} diff --git a/internal/web/actions/default/servers/components/waf/helper.go b/internal/web/actions/default/servers/components/waf/helper.go index 0668d17b..5aadff4f 100644 --- a/internal/web/actions/default/servers/components/waf/helper.go +++ b/internal/web/actions/default/servers/components/waf/helper.go @@ -1,6 +1,10 @@ package waf import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/models" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" "github.com/iwind/TeaGo/actions" "net/http" ) @@ -12,11 +16,56 @@ func NewHelper() *Helper { return &Helper{} } -func (this *Helper) BeforeAction(action *actions.ActionObject) { +func (this *Helper) BeforeAction(actionPtr actions.ActionWrapper) (goNext bool) { + action := actionPtr.Object() if action.Request.Method != http.MethodGet { - return + return true } action.Data["mainTab"] = "component" action.Data["secondMenuItem"] = "waf" + + // 显示当前的防火墙名称 + firewallPolicyId := action.ParamInt64("firewallPolicyId") + if firewallPolicyId > 0 { + action.Data["firewallPolicyId"] = firewallPolicyId + action.Data["countInboundGroups"] = 0 + action.Data["countOutboundGroups"] = 0 + parentAction := actionutils.FindParentAction(actionPtr) + if parentAction != nil { + firewallPolicy, err := models.SharedHTTPFirewallPolicyDAO.FindEnabledPolicy(parentAction.AdminContext(), firewallPolicyId) + if err != nil { + parentAction.ErrorPage(err) + return + } + if firewallPolicy == nil { + action.WriteString("can not find firewall policy") + return + } + action.Data["firewallPolicyName"] = firewallPolicy.Name + + // inbound + if len(firewallPolicy.InboundJSON) > 0 { + inboundConfig := &firewallconfigs.HTTPFirewallInboundConfig{} + err = json.Unmarshal(firewallPolicy.InboundJSON, inboundConfig) + if err != nil { + parentAction.ErrorPage(err) + return + } + action.Data["countInboundGroups"] = len(inboundConfig.GroupRefs) + } + + // outbound + if len(firewallPolicy.OutboundJSON) > 0 { + outboundConfig := &firewallconfigs.HTTPFirewallOutboundConfig{} + err = json.Unmarshal(firewallPolicy.OutboundJSON, outboundConfig) + if err != nil { + parentAction.ErrorPage(err) + return + } + action.Data["countOutboundGroups"] = len(outboundConfig.GroupRefs) + } + } + } + return true } diff --git a/internal/web/actions/default/servers/components/waf/import.go b/internal/web/actions/default/servers/components/waf/import.go new file mode 100644 index 00000000..16f9cd62 --- /dev/null +++ b/internal/web/actions/default/servers/components/waf/import.go @@ -0,0 +1,15 @@ +package waf + +import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + +type ImportAction struct { + actionutils.ParentAction +} + +func (this *ImportAction) Init() { + this.Nav("", "", "") +} + +func (this *ImportAction) RunGet(params struct{}) { + this.Show() +} diff --git a/internal/web/actions/default/servers/components/waf/index.go b/internal/web/actions/default/servers/components/waf/index.go index a5d8175d..1243d1f5 100644 --- a/internal/web/actions/default/servers/components/waf/index.go +++ b/internal/web/actions/default/servers/components/waf/index.go @@ -1,7 +1,11 @@ package waf import ( + "encoding/json" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" + "github.com/iwind/TeaGo/maps" ) type IndexAction struct { @@ -13,6 +17,65 @@ func (this *IndexAction) Init() { } func (this *IndexAction) RunGet(params struct{}) { + countResp, err := this.RPC().HTTPFirewallPolicyRPC().CountAllEnabledFirewallPolicies(this.AdminContext(), &pb.CountAllEnabledFirewallPoliciesRequest{}) + if err != nil { + this.ErrorPage(err) + return + } + count := countResp.Count + page := this.NewPage(count) + + listResp, err := this.RPC().HTTPFirewallPolicyRPC().ListEnabledFirewallPolicies(this.AdminContext(), &pb.ListEnabledFirewallPoliciesRequest{ + Offset: page.Offset, + Size: page.Size, + }) + if err != nil { + this.ErrorPage(err) + return + } + policyMaps := []maps.Map{} + for _, policy := range listResp.FirewallPolicies { + countInbound := 0 + countOutbound := 0 + if len(policy.InboundJSON) > 0 { + inboundConfig := &firewallconfigs.HTTPFirewallInboundConfig{} + err = json.Unmarshal(policy.InboundJSON, inboundConfig) + if err != nil { + this.ErrorPage(err) + return + } + countInbound = len(inboundConfig.GroupRefs) + } + if len(policy.OutboundJSON) > 0 { + outboundConfig := &firewallconfigs.HTTPFirewallInboundConfig{} + err = json.Unmarshal(policy.OutboundJSON, outboundConfig) + if err != nil { + this.ErrorPage(err) + return + } + countOutbound = len(outboundConfig.GroupRefs) + } + + countServersResp, err := this.RPC().ServerRPC().CountAllEnabledServersWithHTTPFirewallPolicyId(this.AdminContext(), &pb.CountAllEnabledServersWithHTTPFirewallPolicyIdRequest{FirewallPolicyId: policy.Id}) + if err != nil { + this.ErrorPage(err) + return + } + countServers := countServersResp.Count + + policyMaps = append(policyMaps, maps.Map{ + "id": policy.Id, + "isOn": policy.IsOn, + "name": policy.Name, + "countInbound": countInbound, + "countOutbound": countOutbound, + "countServers": countServers, + }) + } + + this.Data["policies"] = policyMaps + + this.Data["page"] = page.AsHTML() this.Show() } diff --git a/internal/web/actions/default/servers/components/waf/init.go b/internal/web/actions/default/servers/components/waf/init.go index 99750130..10cb0772 100644 --- a/internal/web/actions/default/servers/components/waf/init.go +++ b/internal/web/actions/default/servers/components/waf/init.go @@ -14,6 +14,16 @@ func init() { Helper(componentutils.NewComponentHelper()). Prefix("/servers/components/waf"). Get("", new(IndexAction)). + GetPost("/createPopup", new(CreatePopupAction)). + Post("/delete", new(DeleteAction)). + Get("/policy", new(PolicyAction)). + Get("/groups", new(GroupsAction)). + Get("/sets", new(SetsAction)). + Get("/log", new(LogAction)). + GetPost("/update", new(UpdateAction)). + GetPost("/test", new(TestAction)). + GetPost("/export", new(ExportAction)). + GetPost("/import", new(ImportAction)). EndAll() }) } diff --git a/internal/web/actions/default/servers/components/waf/log.go b/internal/web/actions/default/servers/components/waf/log.go new file mode 100644 index 00000000..a4203c1d --- /dev/null +++ b/internal/web/actions/default/servers/components/waf/log.go @@ -0,0 +1,15 @@ +package waf + +import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + +type LogAction struct { + actionutils.ParentAction +} + +func (this *LogAction) Init() { + this.Nav("", "", "") +} + +func (this *LogAction) RunGet(params struct{}) { + this.Show() +} diff --git a/internal/web/actions/default/servers/components/waf/policy.go b/internal/web/actions/default/servers/components/waf/policy.go new file mode 100644 index 00000000..3845c8b3 --- /dev/null +++ b/internal/web/actions/default/servers/components/waf/policy.go @@ -0,0 +1,57 @@ +package waf + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/models" + "github.com/iwind/TeaGo/maps" +) + +type PolicyAction struct { + actionutils.ParentAction +} + +func (this *PolicyAction) Init() { + this.Nav("", "", "index") +} + +func (this *PolicyAction) RunGet(params struct { + FirewallPolicyId int64 +}) { + firewallPolicy, err := models.SharedHTTPFirewallPolicyDAO.FindEnabledPolicyConfig(this.AdminContext(), params.FirewallPolicyId) + if err != nil { + this.ErrorPage(err) + return + } + if firewallPolicy == nil { + this.NotFound("firewallPolicy", params.FirewallPolicyId) + return + } + + internalGroups := []maps.Map{} + if firewallPolicy.Inbound != nil { + for _, group := range firewallPolicy.Inbound.Groups { + internalGroups = append(internalGroups, maps.Map{ + "name": group.Name, + "isOn": group.IsOn, + }) + } + } + if firewallPolicy.Outbound != nil { + for _, group := range firewallPolicy.Outbound.Groups { + internalGroups = append(internalGroups, maps.Map{ + "name": group.Name, + "isOn": group.IsOn, + }) + } + } + + this.Data["firewallPolicy"] = maps.Map{ + "id": firewallPolicy.Id, + "name": firewallPolicy.Name, + "isOn": firewallPolicy.IsOn, + "description": firewallPolicy.Description, + "groups": internalGroups, + } + + this.Show() +} diff --git a/internal/web/actions/default/servers/components/waf/sets.go b/internal/web/actions/default/servers/components/waf/sets.go new file mode 100644 index 00000000..04c2e912 --- /dev/null +++ b/internal/web/actions/default/servers/components/waf/sets.go @@ -0,0 +1,15 @@ +package waf + +import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + +type SetsAction struct { + actionutils.ParentAction +} + +func (this *SetsAction) Init() { + this.Nav("", "", "") +} + +func (this *SetsAction) RunGet(params struct{}) { + this.Show() +} diff --git a/internal/web/actions/default/servers/components/waf/test.go b/internal/web/actions/default/servers/components/waf/test.go new file mode 100644 index 00000000..9f8634bd --- /dev/null +++ b/internal/web/actions/default/servers/components/waf/test.go @@ -0,0 +1,15 @@ +package waf + +import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + +type TestAction struct { + actionutils.ParentAction +} + +func (this *TestAction) Init() { + this.Nav("", "", "") +} + +func (this *TestAction) RunGet(params struct{}) { + this.Show() +} diff --git a/internal/web/actions/default/servers/components/waf/update.go b/internal/web/actions/default/servers/components/waf/update.go new file mode 100644 index 00000000..f9c09504 --- /dev/null +++ b/internal/web/actions/default/servers/components/waf/update.go @@ -0,0 +1,87 @@ +package waf + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/models" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" + "github.com/iwind/TeaGo/actions" + "github.com/iwind/TeaGo/maps" +) + +type UpdateAction struct { + actionutils.ParentAction +} + +func (this *UpdateAction) Init() { + this.Nav("", "", "update") +} + +func (this *UpdateAction) RunGet(params struct { + FirewallPolicyId int64 +}) { + firewallPolicy, err := models.SharedHTTPFirewallPolicyDAO.FindEnabledPolicyConfig(this.AdminContext(), params.FirewallPolicyId) + if err != nil { + this.ErrorPage(err) + return + } + if firewallPolicy == nil { + this.NotFound("firewallPolicy", params.FirewallPolicyId) + return + } + this.Data["firewallPolicy"] = maps.Map{ + "id": firewallPolicy.Id, + "name": firewallPolicy.Name, + "description": firewallPolicy.Description, + "isOn": firewallPolicy.IsOn, + } + + // 预置分组 + groups := []maps.Map{} + templatePolicy := firewallconfigs.HTTPFirewallTemplate() + for _, group := range templatePolicy.AllRuleGroups() { + if len(group.Code) > 0 { + usedGroup := firewallPolicy.FindRuleGroupWithCode(group.Code) + if usedGroup != nil { + group.IsOn = usedGroup.IsOn + } + } + + groups = append(groups, maps.Map{ + "code": group.Code, + "name": group.Name, + "isOn": group.IsOn, + }) + } + this.Data["groups"] = groups + + this.Show() +} + +func (this *UpdateAction) RunPost(params struct { + FirewallPolicyId int64 + Name string + GroupCodes []string + Description string + IsOn bool + + Must *actions.Must +}) { + params.Must. + Field("name", params.Name). + Require("请输入策略名称") + + _, err := this.RPC().HTTPFirewallPolicyRPC().UpdateHTTPFirewallPolicy(this.AdminContext(), &pb.UpdateHTTPFirewallPolicyRequest{ + FirewallPolicyId: params.FirewallPolicyId, + IsOn: params.IsOn, + Name: params.Name, + Description: params.Description, + FirewallGroupCodes: params.GroupCodes, + }) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/helpers/user_must_auth.go b/internal/web/helpers/user_must_auth.go index 784f764a..d9eb56f0 100644 --- a/internal/web/helpers/user_must_auth.go +++ b/internal/web/helpers/user_must_auth.go @@ -82,14 +82,9 @@ func (this *UserMustAuth) BeforeAction(actionPtr actions.ActionWrapper, paramNam }, { "code": "db", - "menuName": "数据库节点", + "menuName": "数据库", "icon": "database", }, - { - "code": "log", - "menuName": "日志节点", - "icon": "dot circle", - }, { "code": "dns", "menuName": "DNS", diff --git a/internal/web/models/http_firewall_policy_dao.go b/internal/web/models/http_firewall_policy_dao.go new file mode 100644 index 00000000..a29d418b --- /dev/null +++ b/internal/web/models/http_firewall_policy_dao.go @@ -0,0 +1,48 @@ +package models + +import ( + "context" + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/rpc" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" +) + +var SharedHTTPFirewallPolicyDAO = new(HTTPFirewallPolicyDAO) + +type HTTPFirewallPolicyDAO struct { +} + +// 查找缓存策略基本信息 +func (this *HTTPFirewallPolicyDAO) FindEnabledPolicy(ctx context.Context, policyId int64) (*pb.HTTPFirewallPolicy, error) { + client, err := rpc.SharedRPC() + if err != nil { + return nil, err + } + resp, err := client.HTTPFirewallPolicyRPC().FindEnabledFirewallPolicy(ctx, &pb.FindEnabledFirewallPolicyRequest{FirewallPolicyId: policyId}) + if err != nil { + return nil, err + } + return resp.FirewallPolicy, nil +} + +// 查找缓存策略配置 +func (this *HTTPFirewallPolicyDAO) FindEnabledPolicyConfig(ctx context.Context, policyId int64) (*firewallconfigs.HTTPFirewallPolicy, error) { + client, err := rpc.SharedRPC() + if err != nil { + return nil, err + } + resp, err := client.HTTPFirewallPolicyRPC().FindEnabledFirewallPolicyConfig(ctx, &pb.FindEnabledFirewallPolicyConfigRequest{FirewallPolicyId: policyId}) + if err != nil { + return nil, err + } + if len(resp.FirewallPolicyJSON) == 0 { + return nil, nil + } + firewallPolicy := &firewallconfigs.HTTPFirewallPolicy{} + err = json.Unmarshal(resp.FirewallPolicyJSON, firewallPolicy) + if err != nil { + return nil, err + } + return firewallPolicy, nil +} diff --git a/web/views/@default/@layout.css.map b/web/views/@default/@layout.css.map index 5ef1cd5e..2daf13b0 100644 --- a/web/views/@default/@layout.css.map +++ b/web/views/@default/@layout.css.map @@ -1 +1 @@ -{"version":3,"sources":["@left_menu.less","@layout.less"],"names":[],"mappings":"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","file":"@layout.css"} \ No newline at end of file +{"version":3,"sources":["@left_menu.less","@layout.less"],"names":[],"mappings":"AAAA;EACC,UAAA;EACA,eAAA;EACA,UAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,4BAAA;;AAPD,SASC;EACC,qBAAA;;AAVF,SASC,MAGC;EACC,gBAAA;EACA,kBAAA;EACA,4BAAA;;AAfH,SASC,MAGC,MAKC;EACC,kBAAA;EACA,QAAA;EACA,OAAA;EACA,kBAAA;;AArBJ,SASC,MAgBC,MAAK;EACJ,wCAAA;EACA,cAAA;EACA,iBAAA;EACA,wBAAA;EACA,2BAAA;;AA9BH,SASC,MAwBC,MAAK,GACJ;EACC,8BAAA;;AAnCJ,SASC,MA6BC,MAAK,IACJ,KACC;EACC,kBAAA;EACA,mBAAA;EACA,YAAA;EACA,cAAA;EACA,YAAA;EACA,kBAAA;EACA,gBAAA;;AA/CL,SASC,MA4CC;EACC,6BAAA;EACA,0BAAA;EACA,8BAAA;;AASH,SAAS;EACR,UAAA;;AAGD,SAAS;EACR,YAAA;;AAGD,SAAS;EACR,WAAA;;AAGD;EACC,eAAA;EACA,UAAA;EACA,SAAA;EACA,QAAA;EACA,UAAA;EACA,kBAAA;EACA,mBAAA;EACA,gBAAA;;AAGD,UAAU;EACT,WAAA;EACA,YAAA;;AAGD,UAAU;EACT,UAAA;;;AC3FD;EACC,WAAA;;AAGD;EACC,aAAA;;AAGD;EACC,qBAAA;;AAGD,CAAC;AAAW,CAAC,SAAS;AAAQ,CAAC,SAAS;AAAS,IAAI;EACpD,sBAAA;;AAGD,CAAC;AAAU,IAAI;AAAU,IAAI;EAC5B,cAAA;;AAGD,IAAI;AAAO,KAAK;AAAO,CAAC;EACvB,sBAAA;;AAGD,CAAC;EACA,iBAAA;;AAGD,IAAI;AAAM,GAAG;EACZ,cAAA;;AAGD,GAAG,IAAI;EACN,mBAAmB,8CAAnB;;AAGD;EACC,uBAAA;;AAGD,MAAM;EACL,sBAAA;;AAGD,MAAM;EACL,sBAAA;;AAGD,MAAM;EACL,sBAAA;;AAGD,MAAO;AAAI,MAAO;EACjB,2BAAA;;AAGD,MAAO,GAAE,OAAQ;EAChB,+BAAA;;AAGD,CAAC;AAAU,GAAG;EACb,yBAAA;EACA,kBAAA;EACA,gBAAA;;AAGD,CAAC,QAAS;AAAI,GAAG,QAAS;EACzB,6BAAA;;AAGD;EACC,mBAAA;EACA,2BAAA;EACA,gBAAA;EACA,uBAAA;;AAGD,GAAG;AAAS,CAAC;EACZ,eAAA;;;AAID,GAAG;EACF,UAAA;;AAGD,GAAG;EACF,YAAA;;AAGD,GAAG;EACF,UAAA;;AAGD,GAAG;EACF,WAAA;;;AAID,UACC,IAAG;EACF,uBAAA;EACA,2BAAA;;AAmBF,mBAfqC;EACpC,UAAW,IAAG;IACb,uBAAA;;EAGD,UAAW,IAAG,KAAM;IACnB,gBAAA;IACA,qBAAA;;EAGD,UAAW,IAAG,KAAM,MAAM;IACzB,aAAA;;;AAIF,UAAW,IAAG,QAAQ,KAAK,KAAM;EAChC,gBAAA;;;AAQD,MAAM;EACL,aAAA;;;AAID;EACC;IACC,YAAA;;EAED;IACC,YAAA;;;AAIF,IAAK,IAAG,KAAM,MAAM;EACnB,4BAAA;;AAGD,IAAI,SAAU;EACb,aAAA;;AAGD,IAAI,SAAU;EACb,aAAA;;AAGD,IAAI,SAAU;EACb,SAAA;;;AAID;EACC,2BAAA;EACA,eAAA;EACA,WAAA;EACA,aAAA;EACA,gBAAA;EACA,8BAAA;;AAGD,QAAQ;EACP,WAAA;;AAGD,QAAS,IAAG;EACX,uBAAA;EACA,wBAAA;EACA,cAAA;EACA,gBAAA;EACA,oBAAA;EACA,8BAAA;;AAGD,QAAS;EACR,kBAAA;EACA,gBAAA;EACA,mBAAA;;AAGD,QAAS,MAAK;EACb,qBAAA;;;AAID;EACC,eAAA;EACA,UAAA;EACA,WAAA;EACA,QAAA;EACA,YAAA;EACA,iBAAA;;AAGD,mBAAoB;EACnB,wBAAA;EACA,2BAAA;EACA,2BAAA;;AAGD,mBAAoB,MAAM;EACzB,kBAAA;;AAGD,mBAAoB;EACnB,wBAAA;EACA,2BAAA;;AAUD,mBAPqC;EACpC;IACC,SAAA;;;;AAKF;EACC,kBAAA;EACA,UAAA;EACA,UAAA;EACA,mBAAA;EACA,kBAAA;EACA,UAAA;;AASD,mBANqC;EACpC;IACC,SAAA;;;AAIF,KAAK;EACJ,SAAA;;AAGD,KAAK;EACJ,UAAA;;AASD,mBANqC;EACpC,KAAK;IACJ,SAAA;;;AAIF,KAAM,MAAM,GAAE;EACb,WAAA;;AAGD,KAAM,MAAM,GAAE;EACb,WAAA;;AAGD,KAAM,MAAM;EACX,mBAAA;;AAGD,KAAM,MAAM,GAAE;EACb,yCAAA;;AAGD,KAAM,MAAM,GAAE;EACb,mBAAA;;AAGD,KAAM,MAAM,GAAE;EACb,sBAAA;;AAGD,KAAM,MAAM,GAAE,aAAc;EAC3B,mBAAA;;AAGD,KAAM,MAAM,GAAG;EACd,mBAAA;EACA,kBAAA;EACA,gBAAA;;AAGD,KAAM;EACL,mBAAA;EACA,0BAAA;EACA,kBAAA;;AAGD,KAAM,GAAG;EACR,gBAAA;;AAGD,KAAM,GAAG,KAAI;EACZ,cAAA;;AAGD,KAAM,GAAG;EACR,gBAAA;EACA,0BAAA;EACA,UAAA;;AAGD,KAAM;EACL,mBAAA;;AAGD,KAAM,GAAG,KAAI;EACZ,gBAAA;;AAGD,KAAM,QAAO;EACZ,gBAAA;EACA,cAAA;EACA,gBAAA;;AAGD;EACC,eAAA;;EAEA,QAAA;EACA,SAAA;EACA,gBAAA;EACA,8BAAA;EACA,WAAA;;AAGD,UAAW;EACV,8BAAA;;AAGD,UAAU;EACT,UAAA;;AAGD,KAAM;EACL,0BAAA;EACA,2BAAA;;AAGD,KAAM,UAAU;EACf,uBAAA;;AAGD,KAAM,UAAU,MAAM;EACrB,kBAAA;;AAGD,KAAM,UAAU,MAAM;EACrB,gBAAA;EACA,mBAAA;;AAcD,mBAXqC;EACpC,KAAM;IACL,gBAAA;IACA,kBAAA;;EAGD,KAAM,UAAS;IACd,WAAA;;;AAIF,KAAM;EACL,eAAA;EACA,YAAA;EACA,WAAA;EACA,cAAA;EACA,kBAAA;EACA,kBAAA;EACA,eAAA;EACA,iBAAA;;;AAID,KAAK,aAAc;EAClB,aAAA;;AAGD;EACC,eAAA;EACA,SAAA;EACA,aAAA;EACA,QAAA;EACA,aAAA;;AAGD,SAAU;EACT,gBAAA;EACA,kBAAA;EACA,MAAA;EACA,SAAA;EACA,QAAA;EACA,OAAA;EACA,+BAAA;;AAGD,SAAU,WAAU;EACnB,UAAA;EACA,WAAA;;AAGD,SAAU;EACT,0BAAA;EACA,0BAAA;;AA0BD,mBAvBqC;EACpC;IACC,kBAAA;IACA,WAAA;IACA,OAAA;IACA,MAAA;;EAGD,SAAU;IACT,6BAAA;;EAGD,SAAU;IACT,sBAAA;IACA,0BAAA;;EAGD,SAAU,WAAW,MAAM;IAC1B,sBAAA;IACA,0BAAA;;;AAIF,SAAU,MAAM,MAAK;EACpB,8BAAA;EACA,wBAAA;;AAGD,SAAU,MAAM,MAAK,IAAI;EACxB,6BAAA;EACA,gCAAA;;AAGD,SAAU,MAAM,MAAK,IAAI,SAAU;EAClC,gBAAA;EACA,cAAA;EACA,4BAAA;EACA,gBAAA;;AAGD,SAAU,MAAM,MAAK,IAAI,SAAS;EACjC,+BAAA;EACA,sCAAA;EACA,yCAAA;EACA,gBAAA;EACA,mBAAA;;AAGD,SAAU,MAAM,MAAK;EACpB,+BAAA;;AAGD,SAAU,MAAM,MAAM;EACrB,kBAAA;;AAGD,SAAU,MAAM,MAAK,IAAI,SAAU,IAAG;EACrC,WAAA;;AAGD,SAAU,MAAM,MAAM,KAAI,IAAI;EAC7B,WAAA;;AAGD,SAAU,MAAM,MAAM,KAAI;EACzB,yBAAA;;AAGD,SAAU,WAAW,MAAM,MAAK;EAC/B,+BAAA;EACA,eAAA;;AAGD,SAAU,WAAW,MAAM,MAAK,OAAQ;EACvC,mBAAA;EACA,WAAA;EACA,gBAAA;;AAGD,SAAU,WAAW,MAAM;EAC1B,cAAA;EACA,qBAAA;EACA,2BAAA;;AAGD,SAAU,WAAW,MAAM,MAAM;EAChC,wBAAA;;AAGD,SAAU;EACT,kBAAA;;AAGD,SAAU,aAAa;AAAO,SAAU,YAAY;EACnD,sBAAA;;;AAID,KAAK;EACJ,gBAAA;;AAGD,KAAK,KAAK;EACT,UAAA;EACA,WAAA;;;AAID;EACC,eAAA;EACA,SAAA;EACA,gBAAA;EACA,WAAA;EACA,WAAA;EACA,2BAAA;EACA,WAAA;EACA,gBAAA;;AAGD,OAAO;EACN,WAAA;;AAGD,OAAQ;EACP,gBAAA;;AAGD,OAAQ,EAAE;EACT,aAAA;;AAGD,OAAQ,EAAC,MAAO;AAAM,OAAQ,EAAC,OAAQ;EACtC,aAAA;;AAGD,OAAQ,EAAC,MAAO;AAAM,OAAQ,EAAC,OAAQ;EACtC,cAAA;;AAGD,OAAQ,KAAK;EACZ,UAAA;EACA,SAAA;;AAGD;EACC,eAAA;EACA,eAAA;EACA,OAAA;EACA,MAAA;EACA,QAAA;EACA,8BAAA;EACA,aAAA;;AAGD,iBAAkB;EACjB,WAAA;EACA,kBAAA;EACA,QAAA;EACA,SAAA;EACA,iBAAA;EACA,kBAAA;;AAGD,iBAAkB,QAAQ;EACzB,WAAA;;AAGD,iBAAkB,QAAQ;EACzB,kBAAA;EACA,YAAA;EACA,UAAA;;AAWD,mBARqC;EACpC,iBAAkB;IACjB,cAAA;IACA,WAAA;;;;AAKF;EACC,wBAAA;;;AAID,iBAAkB;EACjB,2BAAA;;AAGD,iBAAkB,MAAK;EACtB,UAAA;;AAGD,iBAAkB,MAAM;EACvB,2BAAA;;AAGD,MAAM;EACL,sBAAA;;;AAWD,mBAPqC;EACpC,OAAO,IAAI;IACV,sBAAA;;;AAKF,KAAK;EACJ,0BAAA;;AAGD,KAAK;EACJ,yBAAA;;;AAID,WAAY,MAAK;EAChB,wBAAA;EACA,2BAAA;;AAGD,WAAY;EACX,wBAAA;EACA,2BAAA;;AAGD,YAAa,MAAK;EACjB,wBAAA;EACA,2BAAA;;AAGD,YAAa,MAAK,KAAM;EACvB,kBAAA;;AAGD,YAAa;EACZ,wBAAA;;AAGD,KAAM;EACL,aAAA;;;AAID,IAAI;AAAQ,GAAG;EACd,yBAAA;;AAGD,GAAG;EACF,8BAAA;;;AAID,SAAU,MAAM;AAAG,SAAU;EAC5B,2BAAA;;;AAID;EACC,eAAA;EAEA,2BAAA;;AAHD,KAKC;EACC,qBAAA;EACA,mBAAA;EACA,WAAA;EACA,iBAAA;EACA,SAAA;EACA,gBAAA;EACA,sBAAA;EACA,cAAA;;AAbF,KAgBC,EAAC;EACA,8BAAA;EACA,YAAA;;AAlBF,KAqBC,EAAC;EACA,gBAAA;;;AAKF;EACC,kBAAA;;AAGD;AAAc,YAAY;EACzB,SAAA;;AAGD,cAAc;AAAQ,aAAa;EAClC,iCAAA;;AAGD;AAAgB;EACf,iCAAA;;AAGD;EACC,2BAAA;;AAID,IACC;EACC,2BAAA;;;AAKF;EACC,2BAAA;EACA,YAAA;;AAGD;EACC,YAAA;;AAGD,KAAK;EACJ,eAAA;;AAGD,MAAM;EACL,4BAAA;EACA,+BAAA;EACA,cAAA;EACA,gBAAA;;AAID;EACC,qBAAA;;AAGD,EAAG,OAAM;EACR,+BAAA;;AAID;EACC,qBAAA","file":"@layout.css"} \ No newline at end of file diff --git a/web/views/@default/@layout.html b/web/views/@default/@layout.html index bd5f63a9..5e21565f 100644 --- a/web/views/@default/@layout.html +++ b/web/views/@default/@layout.html @@ -48,10 +48,12 @@ --> - - - - {{module.menuName}} + + + + + {{module.menuName}} + diff --git a/web/views/@default/@layout.less b/web/views/@default/@layout.less index 9a10554a..3e8c1c68 100644 --- a/web/views/@default/@layout.less +++ b/web/views/@default/@layout.less @@ -100,9 +100,11 @@ div.margin, p.margin { } /** 主菜单 **/ -.main-menu .ui.menu { - width: 9.5em !important; - border-radius: 0 !important; +.main-menu { + .ui.menu { + width: 9.5em !important; + border-radius: 0 !important; + } } @media screen and (max-width: 512px) { diff --git a/web/views/@default/servers/components/cache/@policy_menu.html b/web/views/@default/servers/components/cache/@policy_menu.html index 014c5bee..26de2c11 100644 --- a/web/views/@default/servers/components/cache/@policy_menu.html +++ b/web/views/@default/servers/components/cache/@policy_menu.html @@ -1,9 +1,9 @@ 列表 | - {{cachePolicyName}} + {{cachePolicyName}} 测试 - 统计 + 统计 清理 删除 预热 diff --git a/web/views/@default/servers/components/waf/@waf_menu.html b/web/views/@default/servers/components/waf/@waf_menu.html new file mode 100644 index 00000000..1ffb574c --- /dev/null +++ b/web/views/@default/servers/components/waf/@waf_menu.html @@ -0,0 +1,13 @@ + + 列表 + | + {{firewallPolicyName}} + 入站规则集({{countInboundGroups}}) + 出站规则集({{countOutboundGroups}}) + IP管理 + 拦截日志 + 测试 + 导入 + 导出 + 修改 + \ No newline at end of file diff --git a/web/views/@default/servers/components/waf/createPopup.html b/web/views/@default/servers/components/waf/createPopup.html new file mode 100644 index 00000000..233b0cc1 --- /dev/null +++ b/web/views/@default/servers/components/waf/createPopup.html @@ -0,0 +1,44 @@ +{$layout "layout_popup"} + +
+ + + + + + + + + + + + + + + + + + + + + + +
策略名称 * + +

给策略起一个容易识别的名字。

+
启用预置的规则 +
+ + +
+

可以启用一些我们预置的规则组。

+
描述 + +
是否启用 +
+ + +
+
+ +
\ No newline at end of file diff --git a/web/views/@default/servers/components/waf/createPopup.js b/web/views/@default/servers/components/waf/createPopup.js new file mode 100644 index 00000000..c8fe9515 --- /dev/null +++ b/web/views/@default/servers/components/waf/createPopup.js @@ -0,0 +1,3 @@ +Tea.context(function () { + this.success = NotifyPopup +}) \ No newline at end of file diff --git a/web/views/@default/servers/components/waf/index.html b/web/views/@default/servers/components/waf/index.html index fb2dbfb9..3c4a4a6d 100644 --- a/web/views/@default/servers/components/waf/index.html +++ b/web/views/@default/servers/components/waf/index.html @@ -2,5 +2,37 @@ {$template "/left_menu"}
-

此功能暂未开放敬请期待。

+ + 列表 + | + [创建] + + +

暂时还没有WAF策略。

+ + + + + + + + + + + + + + + + + + + + +
策略名称入站规则分组出站规则分组引用服务状态操作
{{policy.name}}{{policy.countInbound}}{{policy.countOutbound}}{{policy.countServers}} + 详情   + 删除 +
+ +
\ No newline at end of file diff --git a/web/views/@default/servers/components/waf/index.js b/web/views/@default/servers/components/waf/index.js new file mode 100644 index 00000000..36f027a1 --- /dev/null +++ b/web/views/@default/servers/components/waf/index.js @@ -0,0 +1,25 @@ +Tea.context(function () { + // 创建策略 + this.createPolicy = function () { + teaweb.popup("/servers/components/waf/createPopup", { + height: "27em", + callback: function () { + teaweb.success("保存成功", function () { + window.location.reload() + }) + } + }) + } + + // 删除策略 + this.deletePolicy = function (policyId) { + let that = this + teaweb.confirm("确定要删除此WAF策略吗?", function () { + that.$post("/servers/components/waf/delete") + .params({ + firewallPolicyId: policyId + }) + .refresh() + }) + } +}) \ No newline at end of file diff --git a/web/views/@default/servers/components/waf/policy.html b/web/views/@default/servers/components/waf/policy.html new file mode 100644 index 00000000..0bd9d2cd --- /dev/null +++ b/web/views/@default/servers/components/waf/policy.html @@ -0,0 +1,32 @@ +{$layout} +{$template "/left_menu"} + +
+ {$template "waf_menu"} + + + + + + + + + + + + + + + + + + +
策略名称{{firewallPolicy.name}}
是否启用 + +
预置的规则分组 + {{group.name}} +
描述 + {{firewallPolicy.description}} + 暂时还没有描述。 +
+
\ No newline at end of file diff --git a/web/views/@default/servers/components/waf/update.html b/web/views/@default/servers/components/waf/update.html new file mode 100644 index 00000000..a8cb6692 --- /dev/null +++ b/web/views/@default/servers/components/waf/update.html @@ -0,0 +1,50 @@ +{$layout} +{$template "/left_menu"} + +
+ {$template "waf_menu"} + +
+ + + + + + + + + + + + + + + + + + + + + + + +
策略名称 * + +

给策略起一个容易识别的名字。

+
启用预置的规则 +
+ + +
+

可以启用一些我们预置的规则组。

+
描述 + +
是否启用 +
+ + +
+
+ +
+
\ No newline at end of file diff --git a/web/views/@default/servers/components/waf/update.js b/web/views/@default/servers/components/waf/update.js new file mode 100644 index 00000000..d6ed17ee --- /dev/null +++ b/web/views/@default/servers/components/waf/update.js @@ -0,0 +1,3 @@ +Tea.context(function () { + this.success = NotifySuccess("保存成功", "/servers/components/waf/policy?firewallPolicyId=" + this.firewallPolicyId) +}) \ No newline at end of file