diff --git a/internal/setup/utils.go b/internal/setup/utils.go index b3bad525..60e4805b 100644 --- a/internal/setup/utils.go +++ b/internal/setup/utils.go @@ -2,6 +2,8 @@ package setup import ( "github.com/TeaOSLab/EdgeAdmin/internal/configs" + teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const" + "os" ) var isConfigured bool @@ -16,3 +18,16 @@ func IsConfigured() bool { isConfigured = err == nil return isConfigured } + +// IsNewInstalled IsNew 检查是否新安装 +func IsNewInstalled() bool { + homeDir, err := os.UserHomeDir() + if err != nil { + return false + } + _, err = os.Stat(homeDir + "/." + teaconst.ProcessName + "/api.yaml") + if err != nil { + return true + } + return false +} diff --git a/internal/web/actions/default/index/index.go b/internal/web/actions/default/index/index.go index e36ca17d..3bdfc8a5 100644 --- a/internal/web/actions/default/index/index.go +++ b/internal/web/actions/default/index/index.go @@ -43,6 +43,12 @@ func (this *IndexAction) RunGet(params struct { return } + //// 是否新安装 + if setup.IsNewInstalled() { + this.RedirectURL("/setup/confirm") + return + } + // 已登录跳转到dashboard if params.Auth.IsUser() { this.RedirectURL("/dashboard") diff --git a/internal/web/actions/default/setup/confirm/helper.go b/internal/web/actions/default/setup/confirm/helper.go new file mode 100644 index 00000000..114c34de --- /dev/null +++ b/internal/web/actions/default/setup/confirm/helper.go @@ -0,0 +1,17 @@ +package confirm + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/setup" + "github.com/iwind/TeaGo/actions" +) + +type Helper struct { +} + +func (this *Helper) BeforeAction(actionPtr actions.ActionWrapper) (goNext bool) { + if !setup.IsNewInstalled() { + actionPtr.Object().RedirectURL("/") + return false + } + return true +} diff --git a/internal/web/actions/default/setup/confirm/index.go b/internal/web/actions/default/setup/confirm/index.go new file mode 100644 index 00000000..c546f154 --- /dev/null +++ b/internal/web/actions/default/setup/confirm/index.go @@ -0,0 +1,126 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package confirm + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/configs" + "github.com/TeaOSLab/EdgeAdmin/internal/rpc" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/Tea" + "github.com/iwind/TeaGo/actions" + "net/url" +) + +type IndexAction struct { + actionutils.ParentAction +} + +func (this *IndexAction) Init() { + this.Nav("", "", "") +} + +func (this *IndexAction) RunGet(params struct{}) { + var endpoints = []string{} + + config, err := configs.LoadAPIConfig() + if err == nil { + endpoints = config.RPC.Endpoints + } + + this.Data["nodeId"] = config.NodeId + this.Data["secret"] = config.Secret + + if len(endpoints) == 0 { + endpoints = []string{""} // 初始化一个空的 + } + + this.Data["endpoints"] = endpoints + + this.Show() +} + +func (this *IndexAction) RunPost(params struct { + Endpoints []string + NodeId string + Secret string + + Must *actions.Must +}) { + var endpoints = []string{} + for _, endpoint := range params.Endpoints { + if len(endpoint) > 0 { + u, err := url.Parse(endpoint) + if err != nil { + this.Fail("API节点地址'" + endpoint + "'格式错误") + } + endpoint = u.Scheme + "://" + u.Host + if u.Scheme != "http" && u.Scheme != "https" { + this.Fail("API节点地址'" + endpoint + "'中的协议错误,目前只支持http或者https") + } + switch u.Scheme { + case "http": + if len(u.Port()) == 0 { + endpoint += ":80" + } + case "https": + if len(u.Port()) == 0 { + endpoint += ":443" + } + } + + // 检测是否连接 + var config = &configs.APIConfig{} + config.NodeId = params.NodeId + config.Secret = params.Secret + config.RPC.Endpoints = []string{endpoint} + client, err := rpc.NewRPCClient(config, false) + if err != nil { + this.Fail("无法连接到API节点地址'" + endpoint + "':" + err.Error()) + } + _, err = client.APINodeRPC().FindCurrentAPINodeVersion(client.Context(0), &pb.FindCurrentAPINodeVersionRequest{}) + if err != nil { + _ = client.Close() + this.Fail("无法连接到API节点地址'" + endpoint + "':" + err.Error()) + } + _ = client.Close() + + endpoints = append(endpoints, endpoint) + } + } + + if len(endpoints) == 0 { + this.Fail("请输入至少一个API节点地址") + } + + if len(params.NodeId) == 0 { + this.Fail("请输入NodeId") + } + if len(params.Secret) == 0 { + this.Fail("请输入Secret") + } + + // 创建配置文件 + config, err := configs.LoadAPIConfig() + if err != nil { + config = &configs.APIConfig{} + } + config.NodeId = params.NodeId + config.Secret = params.Secret + config.RPC.Endpoints = endpoints + err = config.WriteFile(Tea.ConfigFile("api.yaml")) + if err != nil { + this.Fail("配置保存失败:" + err.Error()) + } + + rpcClient, err := rpc.SharedRPC() + if err != nil { + this.Fail("RPC配置无法读取:" + err.Error()) + } + err = rpcClient.UpdateConfig(config) + if err != nil { + this.Fail("重载RPC配置失败:" + err.Error()) + } + + this.Success() +} diff --git a/internal/web/actions/default/setup/confirm/init.go b/internal/web/actions/default/setup/confirm/init.go new file mode 100644 index 00000000..f481b02b --- /dev/null +++ b/internal/web/actions/default/setup/confirm/init.go @@ -0,0 +1,13 @@ +package confirm + +import "github.com/iwind/TeaGo" + +func init() { + TeaGo.BeforeStart(func(server *TeaGo.Server) { + server. + Helper(new(Helper)). + Prefix("/setup/confirm"). + GetPost("", new(IndexAction)). + EndAll() + }) +} diff --git a/internal/web/import.go b/internal/web/import.go index 23be79ad..d94bdc4d 100644 --- a/internal/web/import.go +++ b/internal/web/import.go @@ -127,6 +127,7 @@ import ( // 安装 _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/setup" + _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/setup/confirm" // 平台用户 _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/users" diff --git a/web/views/@default/setup/confirm/index.css b/web/views/@default/setup/confirm/index.css new file mode 100644 index 00000000..13155e76 --- /dev/null +++ b/web/views/@default/setup/confirm/index.css @@ -0,0 +1,69 @@ +.install-box { + width: 50em; + position: fixed; + left: 50%; + margin-left: -25em; + top: 1em; + bottom: 1em; + overflow-y: auto; +} +.install-box .button.margin { + margin-top: 1em; +} +.install-box .button.primary { + float: right; +} +.install-box .button.disabled { + float: right; +} +.install-box table td.title { + width: 10em; +} +.install-box .radio { + margin-right: 1em; +} +.install-box .radio label { + cursor: pointer !important; + font-size: 0.9em !important; +} +.install-box h4 { + font-weight: normal; +} +.install-box .content-box { + overflow-y: auto; + position: fixed; + top: 5em; + bottom: 5em; + left: 50%; + width: 50em; + padding-right: 1em; + margin-left: -25em; + z-index: 1; +} +.install-box .content-box::-webkit-scrollbar { + width: 4px; +} +.install-box .button-group { + position: fixed; + left: 50%; + margin-left: -25em; + z-index: 1; + width: 50em; + bottom: 1em; +} +.install-box .button-group button { + z-index: 10; +} +.install-box .button-group .status-box { + position: absolute; + top: 3em; + left: 15em; + right: 15em; + bottom: 0; + text-align: center; + z-index: 0; +} +.install-box::-webkit-scrollbar { + width: 4px; +} +/*# sourceMappingURL=index.css.map */ \ No newline at end of file diff --git a/web/views/@default/setup/confirm/index.css.map b/web/views/@default/setup/confirm/index.css.map new file mode 100644 index 00000000..6258e403 --- /dev/null +++ b/web/views/@default/setup/confirm/index.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["index.less"],"names":[],"mappings":"AAAA;EAGC,WAAA;EACA,eAAA;EACA,SAAA;EACA,kBAAA;EACA,QAAA;EACA,WAAA;EACA,gBAAA;;AATD,YAWC,QAAO;EACN,eAAA;;AAZF,YAeC,QAAO;EACN,YAAA;;AAhBF,YAmBC,QAAO;EACN,YAAA;;AApBF,YAuBC,MACC,GAAE;EACD,WAAA;;AAzBH,YA6BC;EACC,iBAAA;;AA9BF,YA6BC,OAGC;EACC,0BAAA;EACA,2BAAA;;AAlCH,YAsCC;EACC,mBAAA;;AAvCF,YA0CC;EACC,gBAAA;EACA,eAAA;EACA,QAAA;EACA,WAAA;EACA,SAAA;EACA,WAAA;EACA,kBAAA;EACA,kBAAA;EACA,UAAA;;AAnDF,YAsDC,aAAY;EACX,UAAA;;AAvDF,YA0DC;EACC,eAAA;EACA,SAAA;EACA,kBAAA;EACA,UAAA;EACA,WAAA;EACA,WAAA;;AAhEF,YA0DC,cAQC;EACC,WAAA;;AAnEH,YA0DC,cAYC;EACC,kBAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EACA,SAAA;EACA,kBAAA;EACA,UAAA;;AAKH,YAAY;EACX,UAAA","file":"index.css"} \ No newline at end of file diff --git a/web/views/@default/setup/confirm/index.html b/web/views/@default/setup/confirm/index.html new file mode 100644 index 00000000..7e4c5a10 --- /dev/null +++ b/web/views/@default/setup/confirm/index.html @@ -0,0 +1,56 @@ + + +
+ + +