mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 13:10:26 +08:00 
			
		
		
		
	可以批量远程安装和升级节点
This commit is contained in:
		@@ -24,7 +24,7 @@
 | 
			
		||||
				<td>
 | 
			
		||||
					<input type="hidden" name="dnsDomainId" :value="dnsDomainId"/>
 | 
			
		||||
					<dns-route-selector :v-all-routes="dnsRoutes"></dns-route-selector>
 | 
			
		||||
					<p class="comment">可用线路是根据集群设置的域名获取的,注意DNS服务商可能对这些线路有所限制。</p>
 | 
			
		||||
					<p class="comment">当前节点对应的DNS线路,可用线路是根据集群设置的域名获取的,注意DNS服务商可能对这些线路有其他限制。</p>
 | 
			
		||||
				</td>
 | 
			
		||||
			</tr>
 | 
			
		||||
            <tr>
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@
 | 
			
		||||
					<p class="comment">点击可已选中要使用的分组。</p>
 | 
			
		||||
				</div>
 | 
			
		||||
				<div v-else>
 | 
			
		||||
					<p class="comment">暂时还没有可以使用的分组。</p>
 | 
			
		||||
					<p class="comment">当前集群下暂时还没有可以使用的分组。</p>
 | 
			
		||||
				</div>
 | 
			
		||||
			</td>
 | 
			
		||||
		</tr>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,4 +4,12 @@
 | 
			
		||||
.right-box {
 | 
			
		||||
  top: 10em;
 | 
			
		||||
}
 | 
			
		||||
h3 {
 | 
			
		||||
  position: relative;
 | 
			
		||||
}
 | 
			
		||||
h3 button {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  right: 1em;
 | 
			
		||||
  top: -0.2em;
 | 
			
		||||
}
 | 
			
		||||
/*# sourceMappingURL=installRemote.css.map */
 | 
			
		||||
@@ -1 +1 @@
 | 
			
		||||
{"version":3,"sources":["installRemote.less"],"names":[],"mappings":"AAAA;EACC,SAAA;;AAGD;EACC,SAAA","file":"installRemote.css"}
 | 
			
		||||
{"version":3,"sources":["installRemote.less"],"names":[],"mappings":"AAAA;EACC,SAAA;;AAGD;EACC,SAAA;;AAGD;EACC,kBAAA;;AAGD,EAAG;EACF,kBAAA;EACA,UAAA;EACA,WAAA","file":"installRemote.css"}
 | 
			
		||||
@@ -6,10 +6,15 @@
 | 
			
		||||
	<p class="comment" v-if="nodes.length == 0">暂时没有需要远程安装的节点。</p>
 | 
			
		||||
 | 
			
		||||
	<div v-if="nodes.length > 0">
 | 
			
		||||
		<h3>所有未安装节点</h3>
 | 
			
		||||
		<h3>所有未安装节点
 | 
			
		||||
            <button class="ui button primary tiny" v-if="countCheckedNodes() > 0" @click.prevent="installBatch()">批量安装({{countCheckedNodes()}})</button>
 | 
			
		||||
        </h3>
 | 
			
		||||
		<table class="ui table selectable celled">
 | 
			
		||||
			<thead>
 | 
			
		||||
				<tr>
 | 
			
		||||
                    <th style="width:3em">
 | 
			
		||||
                        <checkbox @input="checkNodes"></checkbox>
 | 
			
		||||
                    </th>
 | 
			
		||||
					<th>节点名</th>
 | 
			
		||||
					<th>访问IP</th>
 | 
			
		||||
					<th>SSH地址</th>
 | 
			
		||||
@@ -18,8 +23,11 @@
 | 
			
		||||
				</tr>
 | 
			
		||||
			</thead>
 | 
			
		||||
			<tr v-for="node in nodes">
 | 
			
		||||
                <td>
 | 
			
		||||
                    <checkbox v-model="node.isChecked" v-if="node.installStatus == null || !node.installStatus.isOk"></checkbox>
 | 
			
		||||
                </td>
 | 
			
		||||
				<td>
 | 
			
		||||
					<a :href="'/clusters/cluster/node?clusterId=' + clusterId + '&nodeId=' + node.id">{{node.name}}</a>
 | 
			
		||||
					<link-icon :href="'/clusters/cluster/node?clusterId=' + clusterId + '&nodeId=' + node.id">{{node.name}}</link-icon>
 | 
			
		||||
				</td>
 | 
			
		||||
				<td>
 | 
			
		||||
					<span v-for="addr in node.addresses" v-if="addr.canAccess" class="ui label tiny">{{addr.ip}}</span>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,87 +1,160 @@
 | 
			
		||||
Tea.context(function () {
 | 
			
		||||
	this.isInstalling = false
 | 
			
		||||
	let installingNode = null
 | 
			
		||||
    this.isInstalling = false
 | 
			
		||||
    this.isBatch = false
 | 
			
		||||
    let installingNode = null
 | 
			
		||||
 | 
			
		||||
	this.$delay(function () {
 | 
			
		||||
		this.reload()
 | 
			
		||||
	})
 | 
			
		||||
    this.nodes.forEach(function (v) {
 | 
			
		||||
        v.isChecked = false
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
	this.installNode = function (node) {
 | 
			
		||||
		let that = this
 | 
			
		||||
		teaweb.confirm("确定要开始安装此节点吗?", function () {
 | 
			
		||||
			installingNode = node
 | 
			
		||||
			that.isInstalling = true
 | 
			
		||||
			node.isInstalling = true
 | 
			
		||||
    this.$delay(function () {
 | 
			
		||||
        this.reload()
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
			that.$post("$")
 | 
			
		||||
				.params({
 | 
			
		||||
					nodeId: node.id
 | 
			
		||||
				})
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
    let that = this
 | 
			
		||||
 | 
			
		||||
	this.reload = function () {
 | 
			
		||||
		let that = this
 | 
			
		||||
		if (installingNode != null) {
 | 
			
		||||
			this.$post("/clusters/cluster/installStatus")
 | 
			
		||||
				.params({
 | 
			
		||||
					nodeId: installingNode.id
 | 
			
		||||
				})
 | 
			
		||||
				.success(function (resp) {
 | 
			
		||||
					if (resp.data.status != null) {
 | 
			
		||||
						installingNode.installStatus = resp.data.status
 | 
			
		||||
						if (installingNode.installStatus.isFinished) {
 | 
			
		||||
							if (installingNode.installStatus.isOk) {
 | 
			
		||||
								installingNode = null
 | 
			
		||||
								teaweb.success("安装成功", function () {
 | 
			
		||||
									window.location.reload()
 | 
			
		||||
								})
 | 
			
		||||
							} else {
 | 
			
		||||
								let nodeId = installingNode.id
 | 
			
		||||
								let errMsg = installingNode.installStatus.error
 | 
			
		||||
								that.isInstalling = false
 | 
			
		||||
								installingNode.isInstalling = false
 | 
			
		||||
								installingNode = null
 | 
			
		||||
    this.checkNodes = function (isChecked) {
 | 
			
		||||
        this.nodes.forEach(function (v) {
 | 
			
		||||
            v.isChecked = isChecked
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
								switch (resp.data.status.errorCode) {
 | 
			
		||||
									case "EMPTY_LOGIN":
 | 
			
		||||
									case "EMPTY_SSH_HOST":
 | 
			
		||||
									case "EMPTY_SSH_PORT":
 | 
			
		||||
									case "EMPTY_GRANT":
 | 
			
		||||
										teaweb.warn("需要填写SSH登录信息", function () {
 | 
			
		||||
											teaweb.popup("/clusters/cluster/updateNodeSSH?nodeId=" + nodeId, {
 | 
			
		||||
												callback: function () {
 | 
			
		||||
													teaweb.reload()
 | 
			
		||||
												}
 | 
			
		||||
											})
 | 
			
		||||
										})
 | 
			
		||||
										return
 | 
			
		||||
									case "CREATE_ROOT_DIRECTORY_FAILED":
 | 
			
		||||
										teaweb.warn("创建根目录失败,请检查目录权限或者手工创建:" + errMsg)
 | 
			
		||||
										return
 | 
			
		||||
									case "INSTALL_HELPER_FAILED":
 | 
			
		||||
										teaweb.warn("安装助手失败:" + errMsg)
 | 
			
		||||
										return
 | 
			
		||||
									case "TEST_FAILED":
 | 
			
		||||
										teaweb.warn("环境测试失败:" + errMsg)
 | 
			
		||||
										return
 | 
			
		||||
									case "RPC_TEST_FAILED":
 | 
			
		||||
										teaweb.confirm("html:要安装的节点到API服务之间的RPC通讯测试失败,具体错误:" + errMsg + ",<br/>现在修改API信息?", function () {
 | 
			
		||||
											window.location = "/api"
 | 
			
		||||
										})
 | 
			
		||||
										return
 | 
			
		||||
									default:
 | 
			
		||||
										teaweb.warn("安装失败:" + errMsg)
 | 
			
		||||
								}
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				})
 | 
			
		||||
				.done(function () {
 | 
			
		||||
					setTimeout(this.reload, 3000)
 | 
			
		||||
				})
 | 
			
		||||
		} else {
 | 
			
		||||
			setTimeout(this.reload, 3000)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
    this.countCheckedNodes = function () {
 | 
			
		||||
        return that.nodes.$count(function (k, v) {
 | 
			
		||||
            return v.isChecked
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.installNode = function (node) {
 | 
			
		||||
        let that = this
 | 
			
		||||
        if (this.isBatch) {
 | 
			
		||||
            installingNode = node
 | 
			
		||||
            that.isInstalling = true
 | 
			
		||||
            node.isInstalling = true
 | 
			
		||||
 | 
			
		||||
            that.$post("$")
 | 
			
		||||
                .params({
 | 
			
		||||
                    nodeId: node.id
 | 
			
		||||
                })
 | 
			
		||||
        } else {
 | 
			
		||||
            teaweb.confirm("确定要开始安装此节点吗?", function () {
 | 
			
		||||
                installingNode = node
 | 
			
		||||
                that.isInstalling = true
 | 
			
		||||
                node.isInstalling = true
 | 
			
		||||
 | 
			
		||||
                that.$post("$")
 | 
			
		||||
                    .params({
 | 
			
		||||
                        nodeId: node.id
 | 
			
		||||
                    })
 | 
			
		||||
            })
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.installBatch = function () {
 | 
			
		||||
        let that = this
 | 
			
		||||
        this.isBatch = true
 | 
			
		||||
        teaweb.confirm("确定要批量安装选中的节点吗?", function () {
 | 
			
		||||
            that.installNext()
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 安装下一个
 | 
			
		||||
     */
 | 
			
		||||
    this.installNext = function () {
 | 
			
		||||
        let nextNode = this.nodes.$find(function (k, v) {
 | 
			
		||||
            return v.isChecked
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        if (nextNode == null) {
 | 
			
		||||
            teaweb.success("全部安装成功", function () {
 | 
			
		||||
                teaweb.reload()
 | 
			
		||||
            })
 | 
			
		||||
        } else {
 | 
			
		||||
            this.installNode(nextNode)
 | 
			
		||||
        }
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 重新加载状态
 | 
			
		||||
     */
 | 
			
		||||
    this.reload = function () {
 | 
			
		||||
        let that = this
 | 
			
		||||
        if (installingNode != null) {
 | 
			
		||||
            this.$post("/clusters/cluster/installStatus")
 | 
			
		||||
                .params({
 | 
			
		||||
                    nodeId: installingNode.id
 | 
			
		||||
                })
 | 
			
		||||
                .success(function (resp) {
 | 
			
		||||
                    if (resp.data.status != null) {
 | 
			
		||||
                        installingNode.installStatus = resp.data.status
 | 
			
		||||
                        if (installingNode.installStatus.isFinished) {
 | 
			
		||||
                            if (installingNode.installStatus.isOk) {
 | 
			
		||||
                                installingNode.isChecked = false // 取消选中
 | 
			
		||||
                                installingNode = null
 | 
			
		||||
                                if (that.isBatch) {
 | 
			
		||||
                                    that.installNext()
 | 
			
		||||
                                } else {
 | 
			
		||||
                                    teaweb.success("安装成功", function () {
 | 
			
		||||
                                        teaweb.reload()
 | 
			
		||||
                                    })
 | 
			
		||||
                                }
 | 
			
		||||
                            } else {
 | 
			
		||||
                                let nodeId = installingNode.id
 | 
			
		||||
                                let errMsg = installingNode.installStatus.error
 | 
			
		||||
                                that.isInstalling = false
 | 
			
		||||
                                installingNode.isInstalling = false
 | 
			
		||||
                                installingNode = null
 | 
			
		||||
 | 
			
		||||
                                switch (resp.data.status.errorCode) {
 | 
			
		||||
                                    case "EMPTY_LOGIN":
 | 
			
		||||
                                    case "EMPTY_SSH_HOST":
 | 
			
		||||
                                    case "EMPTY_SSH_PORT":
 | 
			
		||||
                                    case "EMPTY_GRANT":
 | 
			
		||||
                                        teaweb.warn("需要填写SSH登录信息", function () {
 | 
			
		||||
                                            teaweb.popup("/clusters/cluster/updateNodeSSH?nodeId=" + nodeId, {
 | 
			
		||||
                                                callback: function () {
 | 
			
		||||
                                                    teaweb.reload()
 | 
			
		||||
                                                }
 | 
			
		||||
                                            })
 | 
			
		||||
                                        })
 | 
			
		||||
                                        return
 | 
			
		||||
                                    case "SSH登录失败,请检查设置":
 | 
			
		||||
                                        teaweb.warn("需要填写SSH登录信息", function () {
 | 
			
		||||
                                            teaweb.popup("/clusters/cluster/updateNodeSSH?nodeId=" + nodeId, {
 | 
			
		||||
                                                callback: function () {
 | 
			
		||||
                                                    teaweb.reload()
 | 
			
		||||
                                                }
 | 
			
		||||
                                            })
 | 
			
		||||
                                        })
 | 
			
		||||
                                        return
 | 
			
		||||
                                    case "CREATE_ROOT_DIRECTORY_FAILED":
 | 
			
		||||
                                        teaweb.warn("创建根目录失败,请检查目录权限或者手工创建:" + errMsg)
 | 
			
		||||
                                        return
 | 
			
		||||
                                    case "INSTALL_HELPER_FAILED":
 | 
			
		||||
                                        teaweb.warn("安装助手失败:" + errMsg)
 | 
			
		||||
                                        return
 | 
			
		||||
                                    case "TEST_FAILED":
 | 
			
		||||
                                        teaweb.warn("环境测试失败:" + errMsg)
 | 
			
		||||
                                        return
 | 
			
		||||
                                    case "RPC_TEST_FAILED":
 | 
			
		||||
                                        teaweb.confirm("html:要安装的节点到API服务之间的RPC通讯测试失败,具体错误:" + errMsg + ",<br/>现在修改API信息?", function () {
 | 
			
		||||
                                            window.location = "/api"
 | 
			
		||||
                                        })
 | 
			
		||||
                                        return
 | 
			
		||||
                                    default:
 | 
			
		||||
                                        teaweb.warn("安装失败:" + errMsg)
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                })
 | 
			
		||||
                .done(function () {
 | 
			
		||||
                    setTimeout(this.reload, 3000)
 | 
			
		||||
                })
 | 
			
		||||
        } else {
 | 
			
		||||
            setTimeout(this.reload, 3000)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
})
 | 
			
		||||
@@ -4,4 +4,14 @@
 | 
			
		||||
 | 
			
		||||
.right-box {
 | 
			
		||||
	top: 10em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h3 {
 | 
			
		||||
	position: relative;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h3 button {
 | 
			
		||||
	position: absolute;
 | 
			
		||||
	right: 1em;
 | 
			
		||||
	top: -0.2em;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,45 +1,103 @@
 | 
			
		||||
Tea.context(function () {
 | 
			
		||||
	this.$delay(function () {
 | 
			
		||||
		this.reloadStatus(this.nodeId)
 | 
			
		||||
	})
 | 
			
		||||
    let isInstalling = false
 | 
			
		||||
 | 
			
		||||
	// 开始安装
 | 
			
		||||
	this.install = function () {
 | 
			
		||||
		this.$post("$")
 | 
			
		||||
			.params({
 | 
			
		||||
				nodeId: this.nodeId
 | 
			
		||||
			})
 | 
			
		||||
			.success(function () {
 | 
			
		||||
    this.$delay(function () {
 | 
			
		||||
        this.reloadStatus(this.nodeId)
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
			})
 | 
			
		||||
	}
 | 
			
		||||
    // 开始安装
 | 
			
		||||
    this.install = function () {
 | 
			
		||||
        isInstalling = true
 | 
			
		||||
 | 
			
		||||
	// 设置节点安装状态
 | 
			
		||||
	this.updateNodeIsInstalled = function (isInstalled) {
 | 
			
		||||
		teaweb.confirm("确定要将当前节点修改为未安装状态?", function () {
 | 
			
		||||
			this.$post("/clusters/cluster/node/updateInstallStatus")
 | 
			
		||||
				.params({
 | 
			
		||||
					nodeId: this.nodeId,
 | 
			
		||||
					isInstalled: isInstalled ? 1 : 0
 | 
			
		||||
				})
 | 
			
		||||
				.refresh()
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
        this.$post("$")
 | 
			
		||||
            .params({
 | 
			
		||||
                nodeId: this.nodeId
 | 
			
		||||
            })
 | 
			
		||||
            .success(function () {
 | 
			
		||||
 | 
			
		||||
	// 刷新状态
 | 
			
		||||
	this.reloadStatus = function (nodeId) {
 | 
			
		||||
		this.$post("/clusters/cluster/node/status")
 | 
			
		||||
			.params({
 | 
			
		||||
				nodeId: nodeId
 | 
			
		||||
			})
 | 
			
		||||
			.success(function (resp) {
 | 
			
		||||
				this.installStatus = resp.data.installStatus
 | 
			
		||||
				this.node.isInstalled = resp.data.isInstalled
 | 
			
		||||
			})
 | 
			
		||||
			.done(function () {
 | 
			
		||||
				this.$delay(function () {
 | 
			
		||||
					this.reloadStatus(nodeId)
 | 
			
		||||
				}, 1000)
 | 
			
		||||
			});
 | 
			
		||||
	}
 | 
			
		||||
            })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 设置节点安装状态
 | 
			
		||||
    this.updateNodeIsInstalled = function (isInstalled) {
 | 
			
		||||
        teaweb.confirm("确定要将当前节点修改为未安装状态?", function () {
 | 
			
		||||
            this.$post("/clusters/cluster/node/updateInstallStatus")
 | 
			
		||||
                .params({
 | 
			
		||||
                    nodeId: this.nodeId,
 | 
			
		||||
                    isInstalled: isInstalled ? 1 : 0
 | 
			
		||||
                })
 | 
			
		||||
                .refresh()
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 刷新状态
 | 
			
		||||
    this.reloadStatus = function (nodeId) {
 | 
			
		||||
        let that = this
 | 
			
		||||
 | 
			
		||||
        this.$post("/clusters/cluster/node/status")
 | 
			
		||||
            .params({
 | 
			
		||||
                nodeId: nodeId
 | 
			
		||||
            })
 | 
			
		||||
            .success(function (resp) {
 | 
			
		||||
                this.installStatus = resp.data.installStatus
 | 
			
		||||
                this.node.isInstalled = resp.data.isInstalled
 | 
			
		||||
 | 
			
		||||
                if (!isInstalling) {
 | 
			
		||||
                    return
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                let nodeId = this.node.id
 | 
			
		||||
                let errMsg = this.installStatus.error
 | 
			
		||||
 | 
			
		||||
                if (this.installStatus.errorCode.length > 0) {
 | 
			
		||||
                    isInstalling = false
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                switch (this.installStatus.errorCode) {
 | 
			
		||||
                    case "EMPTY_LOGIN":
 | 
			
		||||
                    case "EMPTY_SSH_HOST":
 | 
			
		||||
                    case "EMPTY_SSH_PORT":
 | 
			
		||||
                    case "EMPTY_GRANT":
 | 
			
		||||
                        teaweb.warn("需要填写SSH登录信息", function () {
 | 
			
		||||
                            teaweb.popup("/clusters/cluster/updateNodeSSH?nodeId=" + nodeId, {
 | 
			
		||||
                                callback: function () {
 | 
			
		||||
                                    that.install()
 | 
			
		||||
                                }
 | 
			
		||||
                            })
 | 
			
		||||
                        })
 | 
			
		||||
                        return
 | 
			
		||||
                    case "SSH_LOGIN_FAILED":
 | 
			
		||||
                        teaweb.warn("SSH登录失败,请检查设置", function () {
 | 
			
		||||
                            teaweb.popup("/clusters/cluster/updateNodeSSH?nodeId=" + nodeId, {
 | 
			
		||||
                                callback: function () {
 | 
			
		||||
                                    that.install()
 | 
			
		||||
                                }
 | 
			
		||||
                            })
 | 
			
		||||
                        })
 | 
			
		||||
                        return
 | 
			
		||||
                    case "CREATE_ROOT_DIRECTORY_FAILED":
 | 
			
		||||
                        teaweb.warn("创建根目录失败,请检查目录权限或者手工创建:" + errMsg)
 | 
			
		||||
                        return
 | 
			
		||||
                    case "INSTALL_HELPER_FAILED":
 | 
			
		||||
                        teaweb.warn("安装助手失败:" + errMsg)
 | 
			
		||||
                        return
 | 
			
		||||
                    case "TEST_FAILED":
 | 
			
		||||
                        teaweb.warn("环境测试失败:" + errMsg)
 | 
			
		||||
                        return
 | 
			
		||||
                    case "RPC_TEST_FAILED":
 | 
			
		||||
                        teaweb.confirm("html:要安装的节点到API服务之间的RPC通讯测试失败,具体错误:" + errMsg + ",<br/>现在修改API信息?", function () {
 | 
			
		||||
                            window.location = "/api"
 | 
			
		||||
                        })
 | 
			
		||||
                        return
 | 
			
		||||
                    default:
 | 
			
		||||
                        shouldReload = true
 | 
			
		||||
                    //teaweb.warn("安装失败:" + errMsg)
 | 
			
		||||
                }
 | 
			
		||||
            })
 | 
			
		||||
            .done(function () {
 | 
			
		||||
                this.$delay(function () {
 | 
			
		||||
                    this.reloadStatus(nodeId)
 | 
			
		||||
                }, 1000)
 | 
			
		||||
            });
 | 
			
		||||
    }
 | 
			
		||||
})
 | 
			
		||||
@@ -25,6 +25,7 @@
 | 
			
		||||
				<td>
 | 
			
		||||
					<input type="hidden" name="dnsDomainId" :value="dnsDomainId"/>
 | 
			
		||||
					<dns-route-selector :v-all-routes="allDNSRoutes" :v-routes="dnsRoutes"></dns-route-selector>
 | 
			
		||||
                    <p class="comment">当前节点对应的DNS线路,可用线路是根据集群设置的域名获取的,注意DNS服务商可能对这些线路有其他限制。</p>
 | 
			
		||||
				</td>
 | 
			
		||||
			</tr>
 | 
			
		||||
			<tr>
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
			</td>
 | 
			
		||||
		</tr>
 | 
			
		||||
		<tr>
 | 
			
		||||
			<td>SSH主机端口 &</td>
 | 
			
		||||
			<td>SSH主机端口 *</td>
 | 
			
		||||
			<td>
 | 
			
		||||
				<input type="text" name="sshPort" maxlength="5" v-model="params.port" style="width:6em"/>
 | 
			
		||||
				<p class="comment">比如22。</p>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,4 +4,12 @@
 | 
			
		||||
.right-box {
 | 
			
		||||
  top: 10em;
 | 
			
		||||
}
 | 
			
		||||
h3 {
 | 
			
		||||
  position: relative;
 | 
			
		||||
}
 | 
			
		||||
h3 button {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  right: 1em;
 | 
			
		||||
  top: -0.2em;
 | 
			
		||||
}
 | 
			
		||||
/*# sourceMappingURL=upgradeRemote.css.map */
 | 
			
		||||
@@ -1 +1 @@
 | 
			
		||||
{"version":3,"sources":["upgradeRemote.less"],"names":[],"mappings":"AAAA;EACC,SAAA;;AAGD;EACC,SAAA","file":"upgradeRemote.css"}
 | 
			
		||||
{"version":3,"sources":["upgradeRemote.less"],"names":[],"mappings":"AAAA;EACC,SAAA;;AAGD;EACC,SAAA;;AAGD;EACC,kBAAA;;AAGD,EAAG;EACF,kBAAA;EACA,UAAA;EACA,WAAA","file":"upgradeRemote.css"}
 | 
			
		||||
@@ -6,10 +6,15 @@
 | 
			
		||||
	<p class="comment" v-if="nodes.length == 0">暂时没有需要升级的节点。</p>
 | 
			
		||||
 | 
			
		||||
	<div v-if="nodes.length > 0">
 | 
			
		||||
		<h3>所有需要升级的节点</h3>
 | 
			
		||||
		<h3>所有需要升级的节点
 | 
			
		||||
            <button class="ui button primary tiny" v-if="countCheckedNodes() > 0" @click.prevent="installBatch()">批量安装({{countCheckedNodes()}})</button>
 | 
			
		||||
        </h3>
 | 
			
		||||
		<table class="ui table selectable celled">
 | 
			
		||||
			<thead>
 | 
			
		||||
				<tr>
 | 
			
		||||
                    <th style="width:3em">
 | 
			
		||||
                        <checkbox @input="checkNodes"></checkbox>
 | 
			
		||||
                    </th>
 | 
			
		||||
					<th>节点名</th>
 | 
			
		||||
					<th>访问IP</th>
 | 
			
		||||
					<th>SSH地址</th>
 | 
			
		||||
@@ -19,6 +24,9 @@
 | 
			
		||||
				</tr>
 | 
			
		||||
			</thead>
 | 
			
		||||
			<tr v-for="node in nodes">
 | 
			
		||||
                <td>
 | 
			
		||||
                    <checkbox v-model="node.isChecked" v-if="node.installStatus == null || !node.installStatus.isOk"></checkbox>
 | 
			
		||||
                </td>
 | 
			
		||||
				<td>
 | 
			
		||||
					<link-icon :href="'/clusters/cluster/node?clusterId=' + clusterId + '&nodeId=' + node.id">{{node.name}}</link-icon>
 | 
			
		||||
				</td>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,87 +1,151 @@
 | 
			
		||||
Tea.context(function () {
 | 
			
		||||
	this.isInstalling = false
 | 
			
		||||
	let installingNode = null
 | 
			
		||||
    this.isInstalling = false
 | 
			
		||||
    this.isBatch = false
 | 
			
		||||
    let installingNode = null
 | 
			
		||||
 | 
			
		||||
	this.$delay(function () {
 | 
			
		||||
		this.reload()
 | 
			
		||||
	})
 | 
			
		||||
    this.nodes.forEach(function (v) {
 | 
			
		||||
        v.isChecked = false
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
	this.installNode = function (node) {
 | 
			
		||||
		let that = this
 | 
			
		||||
		teaweb.confirm("确定要开始升级此节点吗?", function () {
 | 
			
		||||
			installingNode = node
 | 
			
		||||
			that.isInstalling = true
 | 
			
		||||
			node.isInstalling = true
 | 
			
		||||
    this.$delay(function () {
 | 
			
		||||
        this.reload()
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
			that.$post("$")
 | 
			
		||||
				.params({
 | 
			
		||||
					nodeId: node.id
 | 
			
		||||
				})
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
    let that = this
 | 
			
		||||
 | 
			
		||||
	this.reload = function () {
 | 
			
		||||
		let that = this
 | 
			
		||||
		if (installingNode != null) {
 | 
			
		||||
			this.$post("/clusters/cluster/upgradeStatus")
 | 
			
		||||
				.params({
 | 
			
		||||
					nodeId: installingNode.id
 | 
			
		||||
				})
 | 
			
		||||
				.success(function (resp) {
 | 
			
		||||
					if (resp.data.status != null) {
 | 
			
		||||
						installingNode.installStatus = resp.data.status
 | 
			
		||||
						if (installingNode.installStatus.isFinished) {
 | 
			
		||||
							if (installingNode.installStatus.isOk) {
 | 
			
		||||
								installingNode = null
 | 
			
		||||
								teaweb.success("升级成功", function () {
 | 
			
		||||
									window.location.reload()
 | 
			
		||||
								})
 | 
			
		||||
							} else {
 | 
			
		||||
								let nodeId = installingNode.id
 | 
			
		||||
								let errMsg = installingNode.installStatus.error
 | 
			
		||||
								that.isInstalling = false
 | 
			
		||||
								installingNode.isInstalling = false
 | 
			
		||||
								installingNode = null
 | 
			
		||||
    this.checkNodes = function (isChecked) {
 | 
			
		||||
        this.nodes.forEach(function (v) {
 | 
			
		||||
            v.isChecked = isChecked
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
								switch (resp.data.status.errorCode) {
 | 
			
		||||
									case "EMPTY_LOGIN":
 | 
			
		||||
									case "EMPTY_SSH_HOST":
 | 
			
		||||
									case "EMPTY_SSH_PORT":
 | 
			
		||||
									case "EMPTY_GRANT":
 | 
			
		||||
										teaweb.warn("需要填写SSH登录信息", function () {
 | 
			
		||||
											teaweb.popup("/clusters/cluster/updateNodeSSH?nodeId=" + nodeId, {
 | 
			
		||||
												callback: function () {
 | 
			
		||||
													teaweb.reload()
 | 
			
		||||
												}
 | 
			
		||||
											})
 | 
			
		||||
										})
 | 
			
		||||
										return
 | 
			
		||||
									case "CREATE_ROOT_DIRECTORY_FAILED":
 | 
			
		||||
										teaweb.warn("创建根目录失败,请检查目录权限或者手工创建:" + errMsg)
 | 
			
		||||
										return
 | 
			
		||||
									case "INSTALL_HELPER_FAILED":
 | 
			
		||||
										teaweb.warn("安装助手失败:" + errMsg)
 | 
			
		||||
										return
 | 
			
		||||
									case "TEST_FAILED":
 | 
			
		||||
										teaweb.warn("环境测试失败:" + errMsg)
 | 
			
		||||
										return
 | 
			
		||||
									case "RPC_TEST_FAILED":
 | 
			
		||||
										teaweb.confirm("html:要升级的节点到API服务之间的RPC通讯测试失败,具体错误:" + errMsg + ",<br/>现在修改API信息?", function () {
 | 
			
		||||
											window.location = "/api"
 | 
			
		||||
										})
 | 
			
		||||
										return
 | 
			
		||||
									default:
 | 
			
		||||
										teaweb.warn("升级失败:" + errMsg)
 | 
			
		||||
								}
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				})
 | 
			
		||||
				.done(function () {
 | 
			
		||||
					setTimeout(this.reload, 3000)
 | 
			
		||||
				})
 | 
			
		||||
		} else {
 | 
			
		||||
			setTimeout(this.reload, 3000)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
    this.countCheckedNodes = function () {
 | 
			
		||||
        return that.nodes.$count(function (k, v) {
 | 
			
		||||
            return v.isChecked
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.installNode = function (node) {
 | 
			
		||||
        let that = this
 | 
			
		||||
        if (this.isBatch) {
 | 
			
		||||
            installingNode = node
 | 
			
		||||
            that.isInstalling = true
 | 
			
		||||
            node.isInstalling = true
 | 
			
		||||
 | 
			
		||||
            that.$post("$")
 | 
			
		||||
                .params({
 | 
			
		||||
                    nodeId: node.id
 | 
			
		||||
                })
 | 
			
		||||
        } else {
 | 
			
		||||
            teaweb.confirm("确定要开始升级此节点吗?", function () {
 | 
			
		||||
                installingNode = node
 | 
			
		||||
                that.isInstalling = true
 | 
			
		||||
                node.isInstalling = true
 | 
			
		||||
 | 
			
		||||
                that.$post("$")
 | 
			
		||||
                    .params({
 | 
			
		||||
                        nodeId: node.id
 | 
			
		||||
                    })
 | 
			
		||||
            })
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.installBatch = function () {
 | 
			
		||||
        let that = this
 | 
			
		||||
        this.isBatch = true
 | 
			
		||||
        teaweb.confirm("确定要批量升级选中的节点吗?", function () {
 | 
			
		||||
            that.installNext()
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 安装下一个
 | 
			
		||||
     */
 | 
			
		||||
    this.installNext = function () {
 | 
			
		||||
        let nextNode = this.nodes.$find(function (k, v) {
 | 
			
		||||
            return v.isChecked
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        if (nextNode == null) {
 | 
			
		||||
            teaweb.success("全部升级成功", function () {
 | 
			
		||||
                teaweb.reload()
 | 
			
		||||
            })
 | 
			
		||||
        } else {
 | 
			
		||||
            this.installNode(nextNode)
 | 
			
		||||
        }
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 重新加载状态
 | 
			
		||||
     */
 | 
			
		||||
    this.reload = function () {
 | 
			
		||||
        let that = this
 | 
			
		||||
        if (installingNode != null) {
 | 
			
		||||
            this.$post("/clusters/cluster/upgradeStatus")
 | 
			
		||||
                .params({
 | 
			
		||||
                    nodeId: installingNode.id
 | 
			
		||||
                })
 | 
			
		||||
                .success(function (resp) {
 | 
			
		||||
                    if (resp.data.status != null) {
 | 
			
		||||
                        installingNode.installStatus = resp.data.status
 | 
			
		||||
                        if (installingNode.installStatus.isFinished) {
 | 
			
		||||
                            if (installingNode.installStatus.isOk) {
 | 
			
		||||
                                installingNode.isChecked = false // 取消选中
 | 
			
		||||
                                installingNode = null
 | 
			
		||||
                                if (that.isBatch) {
 | 
			
		||||
                                    that.installNext()
 | 
			
		||||
                                } else {
 | 
			
		||||
                                    teaweb.success("升级成功", function () {
 | 
			
		||||
                                        teaweb.reload()
 | 
			
		||||
                                    })
 | 
			
		||||
                                }
 | 
			
		||||
                            } else {
 | 
			
		||||
                                let nodeId = installingNode.id
 | 
			
		||||
                                let errMsg = installingNode.installStatus.error
 | 
			
		||||
                                that.isInstalling = false
 | 
			
		||||
                                installingNode.isInstalling = false
 | 
			
		||||
                                installingNode = null
 | 
			
		||||
 | 
			
		||||
                                switch (resp.data.status.errorCode) {
 | 
			
		||||
                                    case "EMPTY_LOGIN":
 | 
			
		||||
                                    case "EMPTY_SSH_HOST":
 | 
			
		||||
                                    case "EMPTY_SSH_PORT":
 | 
			
		||||
                                    case "EMPTY_GRANT":
 | 
			
		||||
                                        teaweb.warn("需要填写SSH登录信息", function () {
 | 
			
		||||
                                            teaweb.popup("/clusters/cluster/updateNodeSSH?nodeId=" + nodeId, {
 | 
			
		||||
                                                callback: function () {
 | 
			
		||||
                                                    teaweb.reload()
 | 
			
		||||
                                                }
 | 
			
		||||
                                            })
 | 
			
		||||
                                        })
 | 
			
		||||
                                        return
 | 
			
		||||
                                    case "CREATE_ROOT_DIRECTORY_FAILED":
 | 
			
		||||
                                        teaweb.warn("创建根目录失败,请检查目录权限或者手工创建:" + errMsg)
 | 
			
		||||
                                        return
 | 
			
		||||
                                    case "INSTALL_HELPER_FAILED":
 | 
			
		||||
                                        teaweb.warn("安装助手失败:" + errMsg)
 | 
			
		||||
                                        return
 | 
			
		||||
                                    case "TEST_FAILED":
 | 
			
		||||
                                        teaweb.warn("环境测试失败:" + errMsg)
 | 
			
		||||
                                        return
 | 
			
		||||
                                    case "RPC_TEST_FAILED":
 | 
			
		||||
                                        teaweb.confirm("html:要升级的节点到API服务之间的RPC通讯测试失败,具体错误:" + errMsg + ",<br/>现在修改API信息?", function () {
 | 
			
		||||
                                            window.location = "/api"
 | 
			
		||||
                                        })
 | 
			
		||||
                                        return
 | 
			
		||||
                                    default:
 | 
			
		||||
                                        teaweb.warn("升级失败:" + errMsg)
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                })
 | 
			
		||||
                .done(function () {
 | 
			
		||||
                    setTimeout(this.reload, 3000)
 | 
			
		||||
                })
 | 
			
		||||
        } else {
 | 
			
		||||
            setTimeout(this.reload, 3000)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
})
 | 
			
		||||
@@ -4,4 +4,14 @@
 | 
			
		||||
 | 
			
		||||
.right-box {
 | 
			
		||||
	top: 10em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h3 {
 | 
			
		||||
	position: relative;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h3 button {
 | 
			
		||||
	position: absolute;
 | 
			
		||||
	right: 1em;
 | 
			
		||||
	top: -0.2em;
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user