diff --git a/build/configs/.gitignore b/build/configs/.gitignore index fb0ef7fb..8d069de8 100644 --- a/build/configs/.gitignore +++ b/build/configs/.gitignore @@ -1,3 +1,4 @@ server.yaml api_db.yaml -api.yaml \ No newline at end of file +api.yaml +*.pem \ No newline at end of file diff --git a/internal/utils/strings.go b/internal/utils/strings.go new file mode 100644 index 00000000..d17693b6 --- /dev/null +++ b/internal/utils/strings.go @@ -0,0 +1,15 @@ +package utils + +import "strings" + +// format address +func FormatAddress(addr string) string { + if strings.HasSuffix(addr, "unix:") { + return addr + } + addr = strings.Replace(addr, " ", "", -1) + addr = strings.Replace(addr, "\t", "", -1) + addr = strings.Replace(addr, ":", ":", -1) + addr = strings.TrimSpace(addr) + return addr +} diff --git a/internal/web/actions/default/about/init.go b/internal/web/actions/default/about/init.go new file mode 100644 index 00000000..0cbca509 --- /dev/null +++ b/internal/web/actions/default/about/init.go @@ -0,0 +1,12 @@ +package about + +import "github.com/iwind/TeaGo" + +func init() { + TeaGo.BeforeStart(func(server *TeaGo.Server) { + server. + Prefix("/about"). + Get("/qq", new(QqAction)). + EndAll() + }) +} diff --git a/internal/web/actions/default/about/qq.go b/internal/web/actions/default/about/qq.go new file mode 100644 index 00000000..c04a4205 --- /dev/null +++ b/internal/web/actions/default/about/qq.go @@ -0,0 +1,15 @@ +package about + +import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + +type QqAction struct { + actionutils.ParentAction +} + +func (this *QqAction) Init() { + this.Nav("", "", "") +} + +func (this *QqAction) RunGet(params struct{}) { + this.Show() +} diff --git a/internal/web/actions/default/clusters/checkChange.go b/internal/web/actions/default/clusters/checkChange.go index 61c6d25b..b8034b95 100644 --- a/internal/web/actions/default/clusters/checkChange.go +++ b/internal/web/actions/default/clusters/checkChange.go @@ -4,7 +4,6 @@ import ( "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/maps" - "time" ) // 检查变更的集群列表 @@ -19,47 +18,20 @@ func (this *CheckChangeAction) Init() { func (this *CheckChangeAction) RunPost(params struct { IsNotifying bool }) { - timeout := time.NewTimer(55 * time.Second) // 比客户端提前结束,避免在客户端产生一个请求错误 - - this.Data["clusters"] = []interface{}{} - -Loop: - for { - select { - case <-this.Request.Context().Done(): - break Loop - case <-timeout.C: - break Loop - default: - // 继续 - } - - resp, err := this.RPC().NodeClusterRPC().FindAllChangedNodeClusters(this.AdminContext(), &pb.FindAllChangedNodeClustersRequest{}) - if err != nil { - this.ErrorPage(err) - return - } - - result := []maps.Map{} - for _, cluster := range resp.Clusters { - result = append(result, maps.Map{ - "id": cluster.Id, - "name": cluster.Name, - }) - } - - // 从提醒到提醒消失 - if len(result) == 0 && params.IsNotifying { - break - } - - this.Data["clusters"] = result - if len(result) > 0 { - break - } - - time.Sleep(1 * time.Second) + resp, err := this.RPC().NodeClusterRPC().FindAllChangedNodeClusters(this.AdminContext(), &pb.FindAllChangedNodeClustersRequest{}) + if err != nil { + this.ErrorPage(err) + return } + result := []maps.Map{} + for _, cluster := range resp.Clusters { + result = append(result, maps.Map{ + "id": cluster.Id, + "name": cluster.Name, + }) + } + + this.Data["clusters"] = result this.Success() } diff --git a/internal/web/actions/default/servers/components/ssl/selectPopup.go b/internal/web/actions/default/servers/components/ssl/selectPopup.go index 67268d08..f85584cd 100644 --- a/internal/web/actions/default/servers/components/ssl/selectPopup.go +++ b/internal/web/actions/default/servers/components/ssl/selectPopup.go @@ -19,10 +19,17 @@ func (this *SelectPopupAction) Init() { this.Nav("", "", "") } -func (this *SelectPopupAction) RunGet(params struct{}) { +func (this *SelectPopupAction) RunGet(params struct { + ViewSize string +}) { // TODO 支持关键词搜索 // TODO 列出常用的证书供用户选择 + if len(params.ViewSize) == 0 { + params.ViewSize = "normal" + } + this.Data["viewSize"] = params.ViewSize + countResp, err := this.RPC().SSLCertRPC().CountSSLCerts(this.AdminContext(), &pb.CountSSLCertRequest{}) if err != nil { this.ErrorPage(err) diff --git a/internal/web/actions/default/settings/index.go b/internal/web/actions/default/settings/index.go index c459abd2..9a3da65f 100644 --- a/internal/web/actions/default/settings/index.go +++ b/internal/web/actions/default/settings/index.go @@ -1,6 +1,8 @@ package settings -import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" +) type IndexAction struct { actionutils.ParentAction @@ -11,5 +13,5 @@ func (this *IndexAction) Init() { } func (this *IndexAction) RunGet(params struct{}) { - this.Show() + this.RedirectURL("/settings/ui") } diff --git a/internal/web/actions/default/settings/init.go b/internal/web/actions/default/settings/init.go index 1e71dd3f..f7935152 100644 --- a/internal/web/actions/default/settings/init.go +++ b/internal/web/actions/default/settings/init.go @@ -1,7 +1,6 @@ package settings import ( - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/settingutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" "github.com/iwind/TeaGo" ) @@ -11,7 +10,6 @@ func init() { server. Helper(helpers.NewUserMustAuth()). Helper(NewHelper()). - Helper(settingutils.NewHelper("console")). Prefix("/settings"). Get("", new(IndexAction)). EndAll() diff --git a/internal/web/actions/default/settings/settingutils/utils.go b/internal/web/actions/default/settings/settingutils/utils.go index d04337e0..ca372ab8 100644 --- a/internal/web/actions/default/settings/settingutils/utils.go +++ b/internal/web/actions/default/settings/settingutils/utils.go @@ -25,7 +25,7 @@ func (this *Helper) BeforeAction(actionPtr actions.ActionWrapper) (goNext bool) // 标签栏 tabbar := actionutils.NewTabbar() - tabbar.Add("管理界面", "", "/settings", "", this.tab == "console") + tabbar.Add("管理界面", "", "/settings", "", this.tab == "ui") tabbar.Add("安全设置", "", "/settings/security", "", this.tab == "security") tabbar.Add("数据库", "", "/settings/database", "", this.tab == "database") tabbar.Add("API节点", "", "/api", "", this.tab == "apiNodes") diff --git a/internal/web/actions/default/settings/ui/index.go b/internal/web/actions/default/settings/ui/index.go new file mode 100644 index 00000000..317fc25c --- /dev/null +++ b/internal/web/actions/default/settings/ui/index.go @@ -0,0 +1,27 @@ +package ui + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" +) + +type IndexAction struct { + actionutils.ParentAction +} + +func (this *IndexAction) Init() { + this.Nav("", "", "") +} + +func (this *IndexAction) RunGet(params struct{}) { + this.Data["serverIsChanged"] = serverConfigIsChanged + + serverConfig, err := loadServerConfig() + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["serverConfig"] = serverConfig + + this.Show() +} diff --git a/internal/web/actions/default/settings/ui/init.go b/internal/web/actions/default/settings/ui/init.go new file mode 100644 index 00000000..e6e533d8 --- /dev/null +++ b/internal/web/actions/default/settings/ui/init.go @@ -0,0 +1,20 @@ +package ui + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/settingutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/helpers" + "github.com/iwind/TeaGo" +) + +func init() { + TeaGo.BeforeStart(func(server *TeaGo.Server) { + server. + Helper(helpers.NewUserMustAuth()). + Helper(settingutils.NewHelper("ui")). + Prefix("/settings/ui"). + Get("", new(IndexAction)). + GetPost("/updateHTTPPopup", new(UpdateHTTPPopupAction)). + GetPost("/updateHTTPSPopup", new(UpdateHTTPSPopupAction)). + EndAll() + }) +} diff --git a/internal/web/actions/default/settings/ui/updateHTTPPopup.go b/internal/web/actions/default/settings/ui/updateHTTPPopup.go new file mode 100644 index 00000000..db1abbe5 --- /dev/null +++ b/internal/web/actions/default/settings/ui/updateHTTPPopup.go @@ -0,0 +1,65 @@ +package ui + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/utils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/iwind/TeaGo/actions" + "net" +) + +type UpdateHTTPPopupAction struct { + actionutils.ParentAction +} + +func (this *UpdateHTTPPopupAction) Init() { + this.Nav("", "", "") +} + +func (this *UpdateHTTPPopupAction) RunGet(params struct{}) { + serverConfig, err := loadServerConfig() + if err != nil { + this.ErrorPage(err) + return + } + this.Data["serverConfig"] = serverConfig + + this.Show() +} + +func (this *UpdateHTTPPopupAction) RunPost(params struct { + IsOn bool + Listens []string + + Must *actions.Must +}) { + if len(params.Listens) == 0 { + this.Fail("请输入绑定地址") + } + + serverConfig, err := loadServerConfig() + if err != nil { + this.Fail("保存失败:" + err.Error()) + } + + serverConfig.Http.On = params.IsOn + + listen := []string{} + for _, addr := range params.Listens { + addr = utils.FormatAddress(addr) + if len(addr) == 0 { + continue + } + if _, _, err := net.SplitHostPort(addr); err != nil { + addr += ":80" + } + listen = append(listen, addr) + } + serverConfig.Http.Listen = listen + + err = writeServerConfig(serverConfig) + if err != nil { + this.Fail("保存失败:" + err.Error()) + } + + this.Success() +} diff --git a/internal/web/actions/default/settings/ui/updateHTTPSPopup.go b/internal/web/actions/default/settings/ui/updateHTTPSPopup.go new file mode 100644 index 00000000..675d2b8f --- /dev/null +++ b/internal/web/actions/default/settings/ui/updateHTTPSPopup.go @@ -0,0 +1,140 @@ +package ui + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/utils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/sslconfigs" + "github.com/iwind/TeaGo/Tea" + "github.com/iwind/TeaGo/actions" + "io/ioutil" + "net" +) + +type UpdateHTTPSPopupAction struct { + actionutils.ParentAction +} + +func (this *UpdateHTTPSPopupAction) Init() { + this.Nav("", "", "") +} + +func (this *UpdateHTTPSPopupAction) RunGet(params struct{}) { + serverConfig, err := loadServerConfig() + if err != nil { + this.ErrorPage(err) + return + } + this.Data["serverConfig"] = serverConfig + + // 证书 + certConfigs := []*sslconfigs.SSLCertConfig{} + if len(serverConfig.Https.Cert) > 0 && len(serverConfig.Https.Key) > 0 { + certData, err := ioutil.ReadFile(Tea.Root + "/" + serverConfig.Https.Cert) + if err != nil { + this.ErrorPage(err) + return + } + keyData, err := ioutil.ReadFile(Tea.Root + "/" + serverConfig.Https.Key) + if err != nil { + this.ErrorPage(err) + return + } + certConfig := &sslconfigs.SSLCertConfig{ + Id: 0, + Name: "-", + CertData: certData, + KeyData: keyData, + } + _ = certConfig.Init() + certConfig.CertData = nil + certConfig.KeyData = nil + certConfigs = append(certConfigs, certConfig) + } + this.Data["certConfigs"] = certConfigs + + this.Show() +} + +func (this *UpdateHTTPSPopupAction) RunPost(params struct { + IsOn bool + Listens []string + CertIdsJSON []byte + + Must *actions.Must +}) { + if len(params.Listens) == 0 { + this.Fail("请输入绑定地址") + } + + serverConfig, err := loadServerConfig() + if err != nil { + this.Fail("保存失败:" + err.Error()) + } + + serverConfig.Https.On = params.IsOn + + listen := []string{} + for _, addr := range params.Listens { + addr = utils.FormatAddress(addr) + if len(addr) == 0 { + continue + } + if _, _, err := net.SplitHostPort(addr); err != nil { + addr += ":80" + } + listen = append(listen, addr) + } + serverConfig.Https.Listen = listen + + // 证书 + certIds := []int64{} + err = json.Unmarshal(params.CertIdsJSON, &certIds) + if err != nil { + this.ErrorPage(err) + return + } + if params.IsOn && len(certIds) == 0 { + this.Fail("要启用HTTPS,需要先选择或上传一个可用的证书") + } + + // 保存证书到本地 + if len(certIds) > 0 && certIds[0] != 0 { + certResp, err := this.RPC().SSLCertRPC().FindEnabledSSLCertConfig(this.AdminContext(), &pb.FindEnabledSSLCertConfigRequest{ + CertId: certIds[0], + }) + if err != nil { + this.ErrorPage(err) + return + } + if len(certResp.CertJSON) == 0 { + this.Fail("选择的证书已失效,请换一个") + } + + certConfig := &sslconfigs.SSLCertConfig{} + err = json.Unmarshal(certResp.CertJSON, certConfig) + if err != nil { + this.ErrorPage(err) + return + } + err = ioutil.WriteFile(Tea.ConfigFile("https.key.pem"), certConfig.KeyData, 0666) + if err != nil { + this.Fail("保存密钥失败:" + err.Error()) + } + err = ioutil.WriteFile(Tea.ConfigFile("https.cert.pem"), certConfig.CertData, 0666) + if err != nil { + this.Fail("保存证书失败:" + err.Error()) + } + + serverConfig.Https.Key = "configs/https.key.pem" + serverConfig.Https.Cert = "configs/https.cert.pem" + } + + err = writeServerConfig(serverConfig) + if err != nil { + this.Fail("保存配置失败:" + err.Error()) + } + + this.Success() +} diff --git a/internal/web/actions/default/settings/ui/utils.go b/internal/web/actions/default/settings/ui/utils.go new file mode 100644 index 00000000..94d1a077 --- /dev/null +++ b/internal/web/actions/default/settings/ui/utils.go @@ -0,0 +1,41 @@ +package ui + +import ( + "github.com/iwind/TeaGo" + "github.com/iwind/TeaGo/Tea" + "gopkg.in/yaml.v3" + "io/ioutil" +) + +var serverConfigIsChanged = false + +// 读取当前服务配置 +func loadServerConfig() (*TeaGo.ServerConfig, error) { + configFile := Tea.ConfigFile("server.yaml") + data, err := ioutil.ReadFile(configFile) + if err != nil { + return nil, err + } + serverConfig := &TeaGo.ServerConfig{} + err = yaml.Unmarshal(data, serverConfig) + if err != nil { + return nil, err + } + return serverConfig, nil +} + +// 保存当前服务配置 +func writeServerConfig(serverConfig *TeaGo.ServerConfig) error { + data, err := yaml.Marshal(serverConfig) + if err != nil { + return err + } + err = ioutil.WriteFile(Tea.ConfigFile("server.yaml"), data, 0666) + if err != nil { + return err + } + + serverConfigIsChanged = true + + return nil +} diff --git a/internal/web/import.go b/internal/web/import.go index f7dc6cd3..95b4eb7f 100644 --- a/internal/web/import.go +++ b/internal/web/import.go @@ -1,6 +1,7 @@ package web import ( + _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/about" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/api" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/api/node" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/clusters" @@ -70,6 +71,7 @@ import ( _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/login" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/profile" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/security" + _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/ui" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/settings/upgrade" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/setup" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/ui" diff --git a/web/public/images/qq-group-qrcode.png b/web/public/images/qq-group-qrcode.png new file mode 100644 index 00000000..a1ba550c Binary files /dev/null and b/web/public/images/qq-group-qrcode.png differ diff --git a/web/public/js/components/server/ssl-certs-box.js b/web/public/js/components/server/ssl-certs-box.js index 079cebd5..49c31d99 100644 --- a/web/public/js/components/server/ssl-certs-box.js +++ b/web/public/js/components/server/ssl-certs-box.js @@ -1,5 +1,5 @@ Vue.component("ssl-certs-box", { - props: ["v-certs", "v-protocol"], + props: ["v-certs", "v-protocol", "v-view-size", "v-single-mode"], data: function () { let certs = this.vCerts if (certs == null) { @@ -26,9 +26,19 @@ Vue.component("ssl-certs-box", { // 选择证书 selectCert: function () { let that = this - teaweb.popup("/servers/components/ssl/selectPopup", { - width: "50em", - height: "30em", + let width = "50em" + let height = "30em" + let viewSize = this.vViewSize + if (viewSize == null) { + viewSize = "normal" + } + if (viewSize == "mini") { + width = "35em" + height = "20em" + } + teaweb.popup("/servers/components/ssl/selectPopup?viewSize=" + viewSize, { + width: width, + height: height, callback: function (resp) { that.certs.push(resp.data.cert) } @@ -51,6 +61,11 @@ Vue.component("ssl-certs-box", { // 格式化时间 formatTime: function (timestamp) { return new Date(timestamp * 1000).format("Y-m-d") + }, + + // 判断是否显示选择|上传按钮 + buttonsVisible: function () { + return this.vSingleMode == null || !this.vSingleMode || this.certs == null || this.certs.length == 0 } }, template: `
@@ -59,13 +74,15 @@ Vue.component("ssl-certs-box", {
{{cert.name}} / {{cert.dnsNames}} / 有效至{{formatTime(cert.timeEndAt)}}  
-
+
选择或上传证书后HTTPSTLS服务才能生效。 -
+
+
+
+   +
-   - ` }) \ No newline at end of file diff --git a/web/views/@default/@layout.css b/web/views/@default/@layout.css index 62e9d00a..a9458bb2 100644 --- a/web/views/@default/@layout.css +++ b/web/views/@default/@layout.css @@ -57,7 +57,7 @@ .right-box { position: fixed; top: 7.5em; - bottom: 0; + bottom: 1.3em; right: 0; left: 18em; padding-right: 2em; diff --git a/web/views/@default/@layout.css.map b/web/views/@default/@layout.css.map index 0a405066..57b91c83 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":"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","file":"@layout.css"} \ No newline at end of file diff --git a/web/views/@default/@layout.html b/web/views/@default/@layout.html index ec185e20..aabb4734 100644 --- a/web/views/@default/@layout.html +++ b/web/views/@default/@layout.html @@ -83,6 +83,17 @@ {$TEA.VIEW} + + + {$echo "footer"} diff --git a/web/views/@default/@layout.js b/web/views/@default/@layout.js index 1dfab97c..a3e44936 100644 --- a/web/views/@default/@layout.js +++ b/web/views/@default/@layout.js @@ -1,6 +1,7 @@ Tea.context(function () { - this.moreOptionsVisible = false; - this.globalChangedClusters = []; + this.moreOptionsVisible = false + this.globalChangedClusters = [] + this.teaDemoEnabled = false if (typeof this.leftMenuItemIsDisabled == "undefined") { this.leftMenuItemIsDisabled = false @@ -8,29 +9,29 @@ Tea.context(function () { this.$delay(function () { if (this.$refs.focus != null) { - this.$refs.focus.focus(); + this.$refs.focus.focus() } // 检查变更 this.checkClusterChanges() - }); + }) /** * 左侧子菜单 */ this.showSubMenu = function (menu) { if (menu.alwaysActive) { - return; + return } if (this.teaSubMenus.menus != null && this.teaSubMenus.menus.length > 0) { this.teaSubMenus.menus.$each(function (k, v) { if (menu.id == v.id) { - return; + return } - v.isActive = false; - }); + v.isActive = false + }) } - menu.isActive = !menu.isActive; + menu.isActive = !menu.isActive }; /** @@ -70,6 +71,16 @@ Tea.context(function () { }) }) }; + + /** + * 底部伸展框 + */ + this.showQQGroupQrcode = function () { + teaweb.popup("/about/qq", { + width: "21em", + height: "24em" + }) + } }); window.NotifySuccess = function (message, url, params) { diff --git a/web/views/@default/@layout_popup.html b/web/views/@default/@layout_popup.html index 75b78990..3e78d08c 100644 --- a/web/views/@default/@layout_popup.html +++ b/web/views/@default/@layout_popup.html @@ -15,6 +15,7 @@ +