diff --git a/internal/web/actions/default/servers/accesslogs/createPopup.go b/internal/web/actions/default/servers/accesslogs/createPopup.go new file mode 100644 index 00000000..02a6bd71 --- /dev/null +++ b/internal/web/actions/default/servers/accesslogs/createPopup.go @@ -0,0 +1,179 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package ipbox + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/iwind/TeaGo/actions" + "github.com/iwind/TeaGo/cmd" +) + +type CreatePopupAction struct { + actionutils.ParentAction +} + +func (this *CreatePopupAction) Init() { + this.Nav("", "", "") +} + +func (this *CreatePopupAction) RunGet(params struct{}) { + this.Data["types"] = serverconfigs.FindAllAccessLogStorageTypes() + this.Data["syslogPriorities"] = serverconfigs.AccessLogSyslogStoragePriorities + + this.Show() +} + +func (this *CreatePopupAction) RunPost(params struct { + Name string + Type string + + // file + FilePath string + FileAutoCreate bool + + // es + EsEndpoint string + EsIndex string + EsMappingType string + EsUsername string + EsPassword string + + // mysql + MysqlHost string + MysqlPort int + MysqlUsername string + MysqlPassword string + MysqlDatabase string + MysqlTable string + MysqlLogField string + + // tcp + TcpNetwork string + TcpAddr string + + // syslog + SyslogProtocol string + SyslogServerAddr string + SyslogServerPort int + SyslogSocket string + SyslogTag string + SyslogPriority int + + // command + CommandCommand string + CommandArgs string + CommandDir string + + IsPublic bool + + Must *actions.Must + CSRF *actionutils.CSRF +}) { + var policyId int64 = 0 + defer func() { + this.CreateLogInfo("创建访问日志策略 %d", policyId) + }() + + params.Must. + Field("name", params.Name). + Require("请输入日志策略的名称"). + Field("type", params.Type). + Require("请选择存储类型") + + var options interface{} = nil + switch params.Type { + case serverconfigs.AccessLogStorageTypeFile: + params.Must. + Field("filePath", params.FilePath). + Require("请输入日志文件路径") + + storage := new(serverconfigs.AccessLogFileStorageConfig) + storage.Path = params.FilePath + storage.AutoCreate = params.FileAutoCreate + options = storage + case serverconfigs.AccessLogStorageTypeES: + params.Must. + Field("esEndpoint", params.EsEndpoint). + Require("请输入Endpoint"). + Field("esIndex", params.EsIndex). + Require("请输入Index名称"). + Field("esMappingType", params.EsMappingType). + Require("请输入Mapping名称") + + storage := new(serverconfigs.AccessLogESStorageConfig) + storage.Endpoint = params.EsEndpoint + storage.Index = params.EsIndex + storage.MappingType = params.EsMappingType + storage.Username = params.EsUsername + storage.Password = params.EsPassword + options = storage + case serverconfigs.AccessLogStorageTypeTCP: + params.Must. + Field("tcpNetwork", params.TcpNetwork). + Require("请选择网络协议"). + Field("tcpAddr", params.TcpAddr). + Require("请输入网络地址") + + storage := new(serverconfigs.AccessLogTCPStorageConfig) + storage.Network = params.TcpNetwork + storage.Addr = params.TcpAddr + options = storage + case serverconfigs.AccessLogStorageTypeSyslog: + switch params.SyslogProtocol { + case serverconfigs.AccessLogSyslogStorageProtocolTCP, serverconfigs.AccessLogSyslogStorageProtocolUDP: + params.Must. + Field("syslogServerAddr", params.SyslogServerAddr). + Require("请输入网络地址") + case serverconfigs.AccessLogSyslogStorageProtocolSocket: + params.Must. + Field("syslogSocket", params.SyslogSocket). + Require("请输入Socket路径") + } + + storage := new(serverconfigs.AccessLogSyslogStorageConfig) + storage.Protocol = params.SyslogProtocol + storage.ServerAddr = params.SyslogServerAddr + storage.ServerPort = params.SyslogServerPort + storage.Socket = params.SyslogSocket + storage.Tag = params.SyslogTag + storage.Priority = params.SyslogPriority + options = storage + case serverconfigs.AccessLogStorageTypeCommand: + params.Must. + Field("commandCommand", params.CommandCommand). + Require("请输入可执行命令") + + storage := new(serverconfigs.AccessLogCommandStorageConfig) + storage.Command = params.CommandCommand + storage.Args = cmd.ParseArgs(params.CommandArgs) + storage.Dir = params.CommandDir + options = storage + } + + if options == nil { + this.Fail("找不到选择的存储类型") + } + + optionsJSON, err := json.Marshal(options) + if err != nil { + this.ErrorPage(err) + return + } + createResp, err := this.RPC().HTTPAccessLogPolicyRPC().CreateHTTPAccessLogPolicy(this.AdminContext(), &pb.CreateHTTPAccessLogPolicyRequest{ + Name: params.Name, + Type: params.Type, + OptionsJSON: optionsJSON, + CondsJSON: nil, // TODO + IsPublic: params.IsPublic, + }) + if err != nil { + this.ErrorPage(err) + return + } + policyId = createResp.HttpAccessLogPolicyId + + this.Success() +} diff --git a/internal/web/actions/default/servers/accesslogs/delete.go b/internal/web/actions/default/servers/accesslogs/delete.go new file mode 100644 index 00000000..0b7631b7 --- /dev/null +++ b/internal/web/actions/default/servers/accesslogs/delete.go @@ -0,0 +1,26 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package ipbox + +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 { + PolicyId int64 +}) { + defer this.CreateLogInfo("删除访问日志策略 %d", params.PolicyId) + + _, err := this.RPC().HTTPAccessLogPolicyRPC().DeleteHTTPAccessLogPolicy(this.AdminContext(), &pb.DeleteHTTPAccessLogPolicyRequest{HttpAccessLogPolicyId: params.PolicyId}) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/accesslogs/index.go b/internal/web/actions/default/servers/accesslogs/index.go new file mode 100644 index 00000000..ab47f60f --- /dev/null +++ b/internal/web/actions/default/servers/accesslogs/index.go @@ -0,0 +1,57 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package ipbox + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/iwind/TeaGo/maps" +) + +type IndexAction struct { + actionutils.ParentAction +} + +func (this *IndexAction) Init() { + this.Nav("", "", "index") +} + +func (this *IndexAction) RunGet(params struct{}) { + countResp, err := this.RPC().HTTPAccessLogPolicyRPC().CountAllEnabledHTTPAccessLogPolicies(this.AdminContext(), &pb.CountAllEnabledHTTPAccessLogPoliciesRequest{}) + if err != nil { + this.ErrorPage(err) + return + } + page := this.NewPage(countResp.Count) + this.Data["page"] = page.AsHTML() + + policiesResp, err := this.RPC().HTTPAccessLogPolicyRPC().ListEnabledHTTPAccessLogPolicies(this.AdminContext(), &pb.ListEnabledHTTPAccessLogPoliciesRequest{ + Offset: page.Offset, + Size: page.Size, + }) + var policyMaps = []maps.Map{} + for _, policy := range policiesResp.HttpAccessLogPolicies { + var optionsMap = maps.Map{} + if len(policy.OptionsJSON) > 0 { + err = json.Unmarshal(policy.OptionsJSON, &optionsMap) + if err != nil { + this.ErrorPage(err) + return + } + } + policyMaps = append(policyMaps, maps.Map{ + "id": policy.Id, + "name": policy.Name, + "type": policy.Type, + "typeName": serverconfigs.FindAccessLogStorageTypeName(policy.Type), + "isOn": policy.IsOn, + "isPublic": policy.IsPublic, + "options": optionsMap, + }) + } + this.Data["policies"] = policyMaps + + this.Show() +} diff --git a/internal/web/actions/default/servers/accesslogs/init.go b/internal/web/actions/default/servers/accesslogs/init.go new file mode 100644 index 00000000..9a8d28a8 --- /dev/null +++ b/internal/web/actions/default/servers/accesslogs/init.go @@ -0,0 +1,26 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package ipbox + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/configloaders" + "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" + "github.com/iwind/TeaGo" +) + +func init() { + TeaGo.BeforeStart(func(server *TeaGo.Server) { + server. + Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeServer)). + Prefix("/servers/accesslogs"). + Data("teaMenu", "servers"). + Data("teaSubMenu", "accesslog"). + Get("", new(IndexAction)). + GetPost("/createPopup", new(CreatePopupAction)). + Get("/policy", new(PolicyAction)). + GetPost("/test", new(TestAction)). + GetPost("/update", new(UpdateAction)). + Post("/delete", new(DeleteAction)). + EndAll() + }) +} diff --git a/internal/web/actions/default/servers/accesslogs/policy.go b/internal/web/actions/default/servers/accesslogs/policy.go new file mode 100644 index 00000000..2eab6f7b --- /dev/null +++ b/internal/web/actions/default/servers/accesslogs/policy.go @@ -0,0 +1,36 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package ipbox + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/accesslogs/policyutils" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" +) + +type PolicyAction struct { + actionutils.ParentAction +} + +func (this *PolicyAction) Init() { + this.Nav("", "", "policy") +} + +func (this *PolicyAction) RunGet(params struct { + PolicyId int64 +}) { + err := policyutils.InitPolicy(this.Parent(), params.PolicyId) + if err != nil { + this.ErrorPage(err) + return + } + + var policyMap = this.Data.GetMap("policy") + if policyMap.GetString("type") == serverconfigs.AccessLogStorageTypeSyslog { + this.Data["syslogPriorityName"] = serverconfigs.FindAccessLogSyslogStoragePriorityName(policyMap.GetMap("options").GetInt("priority")) + } else { + this.Data["syslogPriorityName"] = "" + } + + this.Show() +} diff --git a/internal/web/actions/default/servers/accesslogs/policyutils/utils.go b/internal/web/actions/default/servers/accesslogs/policyutils/utils.go new file mode 100644 index 00000000..54953685 --- /dev/null +++ b/internal/web/actions/default/servers/accesslogs/policyutils/utils.go @@ -0,0 +1,49 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package policyutils + +import ( + "encoding/json" + "errors" + "github.com/TeaOSLab/EdgeAdmin/internal/rpc" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/iwind/TeaGo/maps" + "github.com/iwind/TeaGo/types" +) + +// InitPolicy 初始化访问日志策略 +func InitPolicy(parent *actionutils.ParentAction, policyId int64) error { + rpcClient, err := rpc.SharedRPC() + if err != nil { + return err + } + policyResp, err := rpcClient.HTTPAccessLogPolicyRPC().FindEnabledHTTPAccessLogPolicy(parent.AdminContext(), &pb.FindEnabledHTTPAccessLogPolicyRequest{HttpAccessLogPolicyId: policyId}) + if err != nil { + return err + } + var policy = policyResp.HttpAccessLogPolicy + if policy == nil { + return errors.New("can not find policy '" + types.String(policyId) + "'") + } + + var options = maps.Map{} + if len(policy.OptionsJSON) > 0 { + err = json.Unmarshal(policy.OptionsJSON, &options) + if err != nil { + return err + } + } + + parent.Data["policy"] = maps.Map{ + "id": policy.Id, + "name": policy.Name, + "type": policy.Type, + "typeName": serverconfigs.FindAccessLogStorageTypeName(policy.Type), + "isOn": policy.IsOn, + "isPublic": policy.IsPublic, + "options": options, + } + return nil +} diff --git a/internal/web/actions/default/servers/accesslogs/test.go b/internal/web/actions/default/servers/accesslogs/test.go new file mode 100644 index 00000000..47cf62c5 --- /dev/null +++ b/internal/web/actions/default/servers/accesslogs/test.go @@ -0,0 +1,57 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package ipbox + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/accesslogs/policyutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/actions" +) + +type TestAction struct { + actionutils.ParentAction +} + +func (this *TestAction) Init() { + this.Nav("", "", "test") +} + +func (this *TestAction) RunGet(params struct { + PolicyId int64 +}) { + err := policyutils.InitPolicy(this.Parent(), params.PolicyId) + if err != nil { + this.ErrorPage(err) + return + } + + this.Show() +} + +func (this *TestAction) RunPost(params struct { + PolicyId int64 + BodyJSON []byte + + Must *actions.Must +}) { + defer this.CreateLogInfo("测试向访问日志策略 %d 写入数据", params.PolicyId) + + var accessLog = &pb.HTTPAccessLog{} + err := json.Unmarshal(params.BodyJSON, accessLog) + if err != nil { + this.Fail("发送内容不是有效的JSON:" + err.Error()) + } + + _, err = this.RPC().HTTPAccessLogPolicyRPC().WriteHTTPAccessLogPolicy(this.AdminContext(), &pb.WriteHTTPAccessLogPolicyRequest{ + HttpAccessLogPolicyId: params.PolicyId, + HttpAccessLog: accessLog, + }) + if err != nil { + this.Fail("发送失败:" + err.Error()) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/accesslogs/update.go b/internal/web/actions/default/servers/accesslogs/update.go new file mode 100644 index 00000000..f686584e --- /dev/null +++ b/internal/web/actions/default/servers/accesslogs/update.go @@ -0,0 +1,195 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package ipbox + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/accesslogs/policyutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/iwind/TeaGo/actions" + "github.com/iwind/TeaGo/cmd" +) + +type UpdateAction struct { + actionutils.ParentAction +} + +func (this *UpdateAction) Init() { + this.Nav("", "", "update") +} + +func (this *UpdateAction) RunGet(params struct { + PolicyId int64 +}) { + err := policyutils.InitPolicy(this.Parent(), params.PolicyId) + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["types"] = serverconfigs.FindAllAccessLogStorageTypes() + this.Data["syslogPriorities"] = serverconfigs.AccessLogSyslogStoragePriorities + + this.Show() +} + +func (this *UpdateAction) RunPost(params struct { + PolicyId int64 + Name string + + // file + FilePath string + FileAutoCreate bool + + // es + EsEndpoint string + EsIndex string + EsMappingType string + EsUsername string + EsPassword string + + // mysql + MysqlHost string + MysqlPort int + MysqlUsername string + MysqlPassword string + MysqlDatabase string + MysqlTable string + MysqlLogField string + + // tcp + TcpNetwork string + TcpAddr string + + // syslog + SyslogProtocol string + SyslogServerAddr string + SyslogServerPort int + SyslogSocket string + SyslogTag string + SyslogPriority int + + // command + CommandCommand string + CommandArgs string + CommandDir string + + IsOn bool + IsPublic bool + + Must *actions.Must + CSRF *actionutils.CSRF +}) { + defer this.CreateLogInfo("修改访问日志策略 %d", params.PolicyId) + + policyResp, err := this.RPC().HTTPAccessLogPolicyRPC().FindEnabledHTTPAccessLogPolicy(this.AdminContext(), &pb.FindEnabledHTTPAccessLogPolicyRequest{HttpAccessLogPolicyId: params.PolicyId}) + if err != nil { + this.ErrorPage(err) + return + } + var policy = policyResp.HttpAccessLogPolicy + if policy == nil { + this.Fail("找不到要修改的策略") + return + } + + params.Must. + Field("name", params.Name). + Require("请输入日志策略的名称") + + var options interface{} = nil + switch policy.Type { + case serverconfigs.AccessLogStorageTypeFile: + params.Must. + Field("filePath", params.FilePath). + Require("请输入日志文件路径") + + storage := new(serverconfigs.AccessLogFileStorageConfig) + storage.Path = params.FilePath + storage.AutoCreate = params.FileAutoCreate + options = storage + case serverconfigs.AccessLogStorageTypeES: + params.Must. + Field("esEndpoint", params.EsEndpoint). + Require("请输入Endpoint"). + Field("esIndex", params.EsIndex). + Require("请输入Index名称"). + Field("esMappingType", params.EsMappingType). + Require("请输入Mapping名称") + + storage := new(serverconfigs.AccessLogESStorageConfig) + storage.Endpoint = params.EsEndpoint + storage.Index = params.EsIndex + storage.MappingType = params.EsMappingType + storage.Username = params.EsUsername + storage.Password = params.EsPassword + options = storage + case serverconfigs.AccessLogStorageTypeTCP: + params.Must. + Field("tcpNetwork", params.TcpNetwork). + Require("请选择网络协议"). + Field("tcpAddr", params.TcpAddr). + Require("请输入网络地址") + + storage := new(serverconfigs.AccessLogTCPStorageConfig) + storage.Network = params.TcpNetwork + storage.Addr = params.TcpAddr + options = storage + case serverconfigs.AccessLogStorageTypeSyslog: + switch params.SyslogProtocol { + case serverconfigs.AccessLogSyslogStorageProtocolTCP, serverconfigs.AccessLogSyslogStorageProtocolUDP: + params.Must. + Field("syslogServerAddr", params.SyslogServerAddr). + Require("请输入网络地址") + case serverconfigs.AccessLogSyslogStorageProtocolSocket: + params.Must. + Field("syslogSocket", params.SyslogSocket). + Require("请输入Socket路径") + } + + storage := new(serverconfigs.AccessLogSyslogStorageConfig) + storage.Protocol = params.SyslogProtocol + storage.ServerAddr = params.SyslogServerAddr + storage.ServerPort = params.SyslogServerPort + storage.Socket = params.SyslogSocket + storage.Tag = params.SyslogTag + storage.Priority = params.SyslogPriority + options = storage + case serverconfigs.AccessLogStorageTypeCommand: + params.Must. + Field("commandCommand", params.CommandCommand). + Require("请输入可执行命令") + + storage := new(serverconfigs.AccessLogCommandStorageConfig) + storage.Command = params.CommandCommand + storage.Args = cmd.ParseArgs(params.CommandArgs) + storage.Dir = params.CommandDir + options = storage + } + + if options == nil { + this.Fail("找不到选择的存储类型") + } + + optionsJSON, err := json.Marshal(options) + if err != nil { + this.ErrorPage(err) + return + } + _, err = this.RPC().HTTPAccessLogPolicyRPC().UpdateHTTPAccessLogPolicy(this.AdminContext(), &pb.UpdateHTTPAccessLogPolicyRequest{ + HttpAccessLogPolicyId: params.PolicyId, + Name: params.Name, + OptionsJSON: optionsJSON, + CondsJSON: nil, // TODO + IsOn: params.IsOn, + IsPublic: params.IsPublic, + }) + if err != nil { + this.ErrorPage(err) + return + } + + this.Success() +} diff --git a/internal/web/actions/default/servers/server/settings/accessLog/index.go b/internal/web/actions/default/servers/server/settings/accessLog/index.go index cc46e2c4..1764c671 100644 --- a/internal/web/actions/default/servers/server/settings/accessLog/index.go +++ b/internal/web/actions/default/servers/server/settings/accessLog/index.go @@ -7,7 +7,6 @@ import ( "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/iwind/TeaGo/actions" - "github.com/iwind/TeaGo/maps" ) type IndexAction struct { @@ -31,22 +30,6 @@ func (this *IndexAction) RunGet(params struct { this.Data["webId"] = webConfig.Id this.Data["accessLogConfig"] = webConfig.AccessLogRef - // 可选的缓存策略 - policiesResp, err := this.RPC().HTTPAccessLogPolicyRPC().FindAllEnabledHTTPAccessLogPolicies(this.AdminContext(), &pb.FindAllEnabledHTTPAccessLogPoliciesRequest{}) - if err != nil { - this.ErrorPage(err) - return - } - policyMaps := []maps.Map{} - for _, policy := range policiesResp.AccessLogPolicies { - policyMaps = append(policyMaps, maps.Map{ - "id": policy.Id, - "name": policy.Name, - "isOn": policy.IsOn, // TODO 这里界面上显示是否开启状态 - }) - } - this.Data["accessLogPolicies"] = policyMaps - // 通用变量 this.Data["fields"] = serverconfigs.HTTPAccessLogFields this.Data["defaultFieldCodes"] = serverconfigs.HTTPAccessLogDefaultFieldsCodes diff --git a/internal/web/actions/default/servers/server/settings/locations/accessLog/index.go b/internal/web/actions/default/servers/server/settings/locations/accessLog/index.go index 45d44fdd..ccee155e 100644 --- a/internal/web/actions/default/servers/server/settings/locations/accessLog/index.go +++ b/internal/web/actions/default/servers/server/settings/locations/accessLog/index.go @@ -6,7 +6,6 @@ import ( "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/iwind/TeaGo/actions" - "github.com/iwind/TeaGo/maps" ) type IndexAction struct { @@ -28,22 +27,6 @@ func (this *IndexAction) RunGet(params struct { this.Data["webId"] = webConfig.Id this.Data["accessLogConfig"] = webConfig.AccessLogRef - // 可选的缓存策略 - policiesResp, err := this.RPC().HTTPAccessLogPolicyRPC().FindAllEnabledHTTPAccessLogPolicies(this.AdminContext(), &pb.FindAllEnabledHTTPAccessLogPoliciesRequest{}) - if err != nil { - this.ErrorPage(err) - return - } - policyMaps := []maps.Map{} - for _, policy := range policiesResp.AccessLogPolicies { - policyMaps = append(policyMaps, maps.Map{ - "id": policy.Id, - "name": policy.Name, - "isOn": policy.IsOn, // TODO 这里界面上显示是否开启状态 - }) - } - this.Data["accessLogPolicies"] = policyMaps - // 通用变量 this.Data["fields"] = serverconfigs.HTTPAccessLogFields this.Data["defaultFieldCodes"] = serverconfigs.HTTPAccessLogDefaultFieldsCodes diff --git a/internal/web/helpers/user_must_auth.go b/internal/web/helpers/user_must_auth.go index 7e06d5e0..203ca48c 100644 --- a/internal/web/helpers/user_must_auth.go +++ b/internal/web/helpers/user_must_auth.go @@ -194,6 +194,12 @@ func (this *userMustAuth) modules(adminId int64) []maps.Map { "url": "/servers/components/waf", "code": "waf", }, + { + "name": "日志策略", + "url": "/servers/accesslogs", + "code": "accesslog", + "isOn": teaconst.IsPlus, + }, { "name": "IP名单", "url": "/servers/iplists", diff --git a/internal/web/import.go b/internal/web/import.go index 71bfd264..479554e0 100644 --- a/internal/web/import.go +++ b/internal/web/import.go @@ -54,6 +54,7 @@ import ( // 服务相关 _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers" + _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/accesslogs" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/certs" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/components" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/components/cache" diff --git a/web/public/js/components/common/source-code-box.js b/web/public/js/components/common/source-code-box.js index 4253a464..a007a4f3 100644 --- a/web/public/js/components/common/source-code-box.js +++ b/web/public/js/components/common/source-code-box.js @@ -1,8 +1,13 @@ let sourceCodeBoxIndex = 0 Vue.component("source-code-box", { - props: ["type", "id"], + props: ["name", "type", "id", "read-only"], mounted: function () { + let readOnly = this.readOnly + if (typeof readOnly != "boolean") { + readOnly = true + } + console.log("readonly:", readOnly) // TODO let box = document.getElementById("source-code-box-" + this.index) let valueBox = document.getElementById(this.valueBoxId) let value = "" @@ -15,7 +20,7 @@ Vue.component("source-code-box", { theme: "idea", lineNumbers: true, value: "", - readOnly: true, + readOnly: readOnly, showCursorWhenSelecting: true, height: "auto", //scrollbarStyle: null, @@ -49,6 +54,6 @@ Vue.component("source-code-box", { }, template: `
选中表示只输出日志到日志策略,而停止默认的日志存储。
-暂时还没有访问日志策略。
+ +| 策略名称 | +类型 | +主要参数 | +状态 | +操作 | +
|---|---|---|---|---|
| {{policy.name}}
+
+ 公用
+
+ |
+ {{policy.typeName}} | ++ - + Endpoint: {{policy.options.endpoint}} + 文件路径:{{policy.options.path}} + 网络地址:{{policy.options.addr}} + 可执行命令:{{policy.options.command}} + + TCP {{policy.options.serverAddr}} + UDP {{policy.options.serverAddr}} + SOCK {{policy.options.socket}} + + | +
+ |
+ + 详情 删除 + | +
| 策略名称 | ++ {{policy.name}} + | +
| 状态 | +
+ |
+
| 存储类型 | ++ {{policy.typeName}} + | +
| 日志文件路径 | ++ {{policy.options.path}} + | +
| 是否自动创建目录 | ++ Y + N + | +
| Endpoint | ++ {{policy.options.endpoint}} + | +
| Index | ++ {{policy.options.index}} + | +
| Mapping Type | ++ {{policy.options.mappingType}} + | +
| 认证用户名 | ++ {{policy.options.username}} + 没有填写。 + | +
| 认证密码 | ++ {{policy.options.password}} + 没有填写。 + | +
| 网络协议 | ++ {{policy.options.network.toUpperCase()}} + | +
| 网络地址 | ++ {{policy.options.addr}} + | +
| 网络协议 | ++ [无] + TCP + UDP + Unix Socket + | +
| 网络地址 | ++ {{policy.options.serverAddr}} + | +
| 端口 | ++ {{policy.options.serverPort}} + | +
| Socket路径 | ++ {{policy.options.socket}} + | +
| 标签(Tag) | ++ {{policy.options.tag}} + 没有设置 + | +
| 优先级(Priority) | ++ {{syslogPriorityName}} + | +
| 可执行命令 | ++ {{policy.options.command}} + | +
| 参数 | +
+
+ {{arg}}
+
+ 没有设置参数。
+ |
+
| 工作目录 | ++ {{policy.options.dir}} + 没有设置工作目录。 + | +
| 是否公用 | ++ Y + N + | +