Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
4808f6e218 | ||
|
9bd1cca518 | ||
|
64d5db8c56 | ||
|
37e1b891d3 | ||
|
50ed2a8569 | ||
|
84b5f1beb6 | ||
|
5f0e6e9ecc |
@ -1,3 +1,11 @@
|
|||||||
|
## [3.0.3](https://github.com/chaos-zhu/easynode/releases) (2024-12-22)
|
||||||
|
|
||||||
|
* 支持keyboard-interactive服务器验证(serv00验证通过)
|
||||||
|
* 支持TG Bot通知方式
|
||||||
|
* 添加web端Plus授权功能
|
||||||
|
* 修复一些UI问题
|
||||||
|
* 修复MFA2登录验证码为0开头无法输入的bug
|
||||||
|
|
||||||
## [3.0.2](https://github.com/chaos-zhu/easynode/releases) (2024-11-20)
|
## [3.0.2](https://github.com/chaos-zhu/easynode/releases) (2024-11-20)
|
||||||
|
|
||||||
* 修复添加实例错误禁用的bug
|
* 修复添加实例错误禁用的bug
|
||||||
|
@ -79,16 +79,16 @@ docker run -d -p 8082:8082 --restart=always -v /root/easynode/db:/easynode/app/d
|
|||||||
|
|
||||||
```shell
|
```shell
|
||||||
# 使用默认端口22022安装
|
# 使用默认端口22022安装
|
||||||
curl -o- https://ghp.ci/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash
|
curl -o- https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash
|
||||||
|
|
||||||
# 使用自定义端口安装, 例如54321
|
# 使用自定义端口安装, 例如54321
|
||||||
curl -o- https://ghp.ci/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash -s -- 54321
|
curl -o- https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash -s -- 54321
|
||||||
```
|
```
|
||||||
|
|
||||||
> 卸载
|
> 卸载
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
curl -o- https://ghp.ci/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-uninstall.sh | bash
|
curl -o- https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-uninstall.sh | bash
|
||||||
```
|
```
|
||||||
|
|
||||||
> 查看监控服务状态:`systemctl status easynode-client`
|
> 查看监控服务状态:`systemctl status easynode-client`
|
||||||
|
@ -10,7 +10,7 @@ SERVER_NAME=easynode-client
|
|||||||
FILE_PATH=/root/local/easynode-client
|
FILE_PATH=/root/local/easynode-client
|
||||||
SERVICE_PATH=/etc/systemd/system
|
SERVICE_PATH=/etc/systemd/system
|
||||||
CLIENT_VERSION=client-2024-10-13 # 目前监控客户端版本发布需手动更改为最新版本号
|
CLIENT_VERSION=client-2024-10-13 # 目前监控客户端版本发布需手动更改为最新版本号
|
||||||
SERVER_PROXY="https://ghp.ci/"
|
SERVER_PROXY="https://git.221022.xyz/"
|
||||||
|
|
||||||
if [ ! -z "$1" ]; then
|
if [ ! -z "$1" ]; then
|
||||||
clientPort=$1
|
clientPort=$1
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"name": "easynode监控服务安装",
|
"name": "easynode监控服务安装",
|
||||||
"command": "curl -o- https://ghp.ci/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash",
|
"command": "curl -o- https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash",
|
||||||
"description": "easynode-监控服务-安装脚本"
|
"description": "easynode-监控服务-安装脚本"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "easynode监控服务卸载",
|
"name": "easynode监控服务卸载",
|
||||||
"command": "curl -o- https://ghp.ci/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-uninstall.sh | bash",
|
"command": "curl -o- https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-uninstall.sh | bash",
|
||||||
"description": "easynode-监控服务-卸载脚本"
|
"description": "easynode-监控服务-卸载脚本"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -25,7 +25,7 @@ async function updateNotifyConfig({ res, request }) {
|
|||||||
case 'tg':
|
case 'tg':
|
||||||
let { sendTg } = await decryptAndExecuteAsync(path.join(__dirname, '../utils/plus.js')) || {}
|
let { sendTg } = await decryptAndExecuteAsync(path.join(__dirname, '../utils/plus.js')) || {}
|
||||||
console.log('sendTg: ', sendTg)
|
console.log('sendTg: ', sendTg)
|
||||||
if (!sendTg) return res.fail({ msg: 'Plus功能解析失败' })
|
if (!sendTg) return res.fail({ msg: 'Plus专属功能点,请激活Plus' })
|
||||||
await sendTg(noticeConfig[type], 'EasyNode通知测试', '这是一条测试通知')
|
await sendTg(noticeConfig[type], 'EasyNode通知测试', '这是一条测试通知')
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
const schedule = require('node-schedule')
|
|
||||||
const { getLocalNetIP } = require('./tools')
|
const { getLocalNetIP } = require('./tools')
|
||||||
const { AESEncryptAsync } = require('./encrypt')
|
const { AESEncryptAsync } = require('./encrypt')
|
||||||
const version = require('../../package.json').version
|
const version = require('../../package.json').version
|
||||||
@ -91,10 +90,4 @@ async function getLicenseInfo(key = '') {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const randomHour = Math.floor(Math.random() * 24)
|
|
||||||
const randomMinute = Math.floor(Math.random() * 60)
|
|
||||||
const randomDay = Math.floor(Math.random() * 7)
|
|
||||||
const cronExpression = `${ randomMinute } ${ randomHour } * * ${ randomDay }`
|
|
||||||
schedule.scheduleJob(cronExpression, getLicenseInfo)
|
|
||||||
|
|
||||||
module.exports = getLicenseInfo
|
module.exports = getLicenseInfo
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
size="small"
|
size="small"
|
||||||
type="primary"
|
type="primary"
|
||||||
link
|
link
|
||||||
@click="handlePlusSupport"
|
@click="gotoPlusPage"
|
||||||
>
|
>
|
||||||
去激活
|
去激活
|
||||||
</el-button>
|
</el-button>
|
||||||
@ -22,13 +22,15 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { computed, getCurrentInstance } from 'vue'
|
import { computed, getCurrentInstance } from 'vue'
|
||||||
|
import { useRouter } from 'vue-router'
|
||||||
|
|
||||||
const { proxy: { $store } } = getCurrentInstance()
|
const { proxy: { $store } } = getCurrentInstance()
|
||||||
|
const router = useRouter()
|
||||||
|
|
||||||
const isPlusActive = computed(() => $store.isPlusActive)
|
const isPlusActive = computed(() => $store.isPlusActive)
|
||||||
|
|
||||||
const handlePlusSupport = () => {
|
const gotoPlusPage = () => {
|
||||||
window.open('https://en.221022.xyz/buy-plus', '_blank')
|
router.push('/setting?tabKey=plus')
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@
|
|||||||
<strong>EasyNode</strong>最初是一个简单的Web终端工具,随着用户群的不断扩大,功能需求也日益增长,为了实现大家的功能需求,我投入了大量的业余时间进行开发和维护。
|
<strong>EasyNode</strong>最初是一个简单的Web终端工具,随着用户群的不断扩大,功能需求也日益增长,为了实现大家的功能需求,我投入了大量的业余时间进行开发和维护。
|
||||||
一直在为爱发电,渐渐的也没了开发的动力。
|
一直在为爱发电,渐渐的也没了开发的动力。
|
||||||
<br>
|
<br>
|
||||||
为了项目的可持续发展,<strong>后续</strong>版本开始推出<strong>PLUS</strong>版本,具体特性鼠标悬浮右上角PLUS图标查看,后续特性功能开发也会优先在<strong>PLUS</strong>版本中实现,但即使不升级到<strong>PLUS</strong>,也不会影响到<strong>EasyNode</strong>的基础功能使用【注意:
|
为了项目的可持续发展,<strong>后续</strong>版本开始推出<strong>PLUS</strong>版本,后续特性功能开发也会优先在<strong>PLUS</strong>版本中实现,但即使不升级到<strong>PLUS</strong>,也不会影响到<strong>EasyNode</strong>的基础功能使用【注意:
|
||||||
暂不支持纯内网用户激活PLUS功能】。
|
暂不支持纯内网用户激活PLUS功能】。
|
||||||
<br>
|
<br>
|
||||||
<span style="text-decoration: underline;">
|
<span style="text-decoration: underline;">
|
||||||
|
@ -426,7 +426,7 @@ onActivated(async () => {
|
|||||||
const { hostIds, execClientInstallScript } = route.query
|
const { hostIds, execClientInstallScript } = route.query
|
||||||
if (!hostIds) return
|
if (!hostIds) return
|
||||||
if (execClientInstallScript === 'true') {
|
if (execClientInstallScript === 'true') {
|
||||||
let clientInstallScript = 'curl -o- https://ghp.ci/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash\n'
|
let clientInstallScript = 'curl -o- https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash\n'
|
||||||
console.log(hostIds.split(','))
|
console.log(hostIds.split(','))
|
||||||
createExecShell(hostIds.split(','), clientInstallScript, 300)
|
createExecShell(hostIds.split(','), clientInstallScript, 300)
|
||||||
// $messageBox.confirm(`准备安装客户端服务监控应用:${ host }`, 'Warning', {
|
// $messageBox.confirm(`准备安装客户端服务监控应用:${ host }`, 'Warning', {
|
||||||
@ -435,7 +435,7 @@ onActivated(async () => {
|
|||||||
// type: 'warning'
|
// type: 'warning'
|
||||||
// })
|
// })
|
||||||
// .then(async () => {
|
// .then(async () => {
|
||||||
// let clientInstallScript = 'curl -o- https://ghp.ci/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash\n'
|
// let clientInstallScript = 'curl -o- https://git.221022.xyz/https://raw.githubusercontent.com/chaos-zhu/easynode/main/client/easynode-client-install.sh | bash\n'
|
||||||
// createExecShell([host,], clientInstallScript, 300)
|
// createExecShell([host,], clientInstallScript, 300)
|
||||||
// })
|
// })
|
||||||
}
|
}
|
||||||
|
@ -93,30 +93,19 @@
|
|||||||
</template>
|
</template>
|
||||||
<el-form-item label="" class="form_item">
|
<el-form-item label="" class="form_item">
|
||||||
<el-button
|
<el-button
|
||||||
v-if="noticeConfig.type !== 'tg'"
|
|
||||||
type="primary"
|
type="primary"
|
||||||
:loading="loading"
|
:loading="loading"
|
||||||
@click="handleSave"
|
@click="handleSave"
|
||||||
>
|
>
|
||||||
测试并保存
|
测试并保存
|
||||||
</el-button>
|
</el-button>
|
||||||
<PlusSupportTip>
|
|
||||||
<el-button
|
|
||||||
type="primary"
|
|
||||||
:disabled="!isPlusActive"
|
|
||||||
:loading="loading"
|
|
||||||
@click="handleSave"
|
|
||||||
>
|
|
||||||
测试并保存
|
|
||||||
</el-button>
|
|
||||||
</PlusSupportTip>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, reactive, onMounted, getCurrentInstance, computed } from 'vue'
|
import { ref, reactive, onMounted, getCurrentInstance, computed } from 'vue'
|
||||||
import PlusSupportTip from '@/components/common/PlusSupportTip.vue'
|
// import PlusSupportTip from '@/components/common/PlusSupportTip.vue'
|
||||||
|
|
||||||
const { proxy: { $api, $notification, $store } } = getCurrentInstance()
|
const { proxy: { $api, $notification, $store } } = getCurrentInstance()
|
||||||
|
|
||||||
|
@ -211,7 +211,7 @@ const connectIO = () => {
|
|||||||
curStatus.value = CONNECT_FAIL
|
curStatus.value = CONNECT_FAIL
|
||||||
term.value.write('\r\n\x1b[91mError: 连接失败,请检查EasyNode服务端是否正常, 回车重新发起连接\x1b[0m \r\n')
|
term.value.write('\r\n\x1b[91mError: 连接失败,请检查EasyNode服务端是否正常, 回车重新发起连接\x1b[0m \r\n')
|
||||||
$notification({
|
$notification({
|
||||||
title: '连接失败',
|
title: '服务端连接失败',
|
||||||
message: '请检查EasyNode服务端是否正常',
|
message: '请检查EasyNode服务端是否正常',
|
||||||
type: 'error'
|
type: 'error'
|
||||||
})
|
})
|
||||||
@ -222,7 +222,6 @@ const reconnectTerminal = (isCommonTips = false, tips) => {
|
|||||||
socket.value.removeAllListeners()
|
socket.value.removeAllListeners()
|
||||||
socket.value.close()
|
socket.value.close()
|
||||||
socket.value = null
|
socket.value = null
|
||||||
curStatus.value = CONNECT_FAIL
|
|
||||||
socketConnected.value = false
|
socketConnected.value = false
|
||||||
if (isCommonTips) {
|
if (isCommonTips) {
|
||||||
if (isPlusActive.value && autoReconnect.value) {
|
if (isPlusActive.value && autoReconnect.value) {
|
||||||
@ -354,12 +353,11 @@ function extractLastCdPath(text) {
|
|||||||
|
|
||||||
const onData = () => {
|
const onData = () => {
|
||||||
term.value.onData((key) => {
|
term.value.onData((key) => {
|
||||||
if (!socket.value || !socketConnected.value) return
|
|
||||||
|
|
||||||
if ('\r' === key && curStatus.value === CONNECT_FAIL) {
|
if ('\r' === key && curStatus.value === CONNECT_FAIL) {
|
||||||
reconnectTerminal(false, '重新连接中...')
|
reconnectTerminal(false, '重新连接中...')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if (!socket.value || !socketConnected.value) return
|
||||||
|
|
||||||
if (isLongPressCtrl.value || isLongPressAlt.value) {
|
if (isLongPressCtrl.value || isLongPressAlt.value) {
|
||||||
const keyCode = key.toUpperCase().charCodeAt(0)
|
const keyCode = key.toUpperCase().charCodeAt(0)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user