From beffd9739685f2d98ed44e66797e07bc4b3fae49 Mon Sep 17 00:00:00 2001 From: chaos-zhu Date: Sun, 18 Aug 2024 15:02:31 +0800 Subject: [PATCH] =?UTF-8?q?:recycle:=20=E8=B0=83=E6=95=B4utils=E5=BC=95?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 + server/app/controller/group.js | 2 +- server/app/controller/host.js | 3 +- server/app/controller/notify.js | 2 +- server/app/controller/onekey.js | 2 +- server/app/controller/scripts.js | 3 +- server/app/controller/ssh.js | 3 +- server/app/controller/user.js | 4 +- server/app/init.js | 20 +------ server/app/middlewares/auth.js | 2 +- server/app/schedule/expired-notify.js | 3 +- server/app/server.js | 2 +- server/app/socket/clients.js | 4 +- server/app/socket/host-status.js | 2 +- server/app/socket/onekey.js | 5 +- server/app/socket/sftp.js | 11 ++-- server/app/socket/terminal.js | 4 +- server/app/utils/index.js | 57 ------------------ server/app/utils/notify.js | 2 +- server/app/utils/os-data.js | 84 --------------------------- server/app/utils/test-connect.js | 47 --------------- server/app/utils/tools.js | 8 ++- server/app/utils/verify-auth.js | 8 +-- 23 files changed, 46 insertions(+), 234 deletions(-) delete mode 100644 server/app/utils/index.js delete mode 100644 server/app/utils/os-data.js delete mode 100644 server/app/utils/test-connect.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 37ba5ad..9ec3900 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ ### Features * 支持暗黑主题切换 ✔ +* 批量脚本下发执行结果通知重复的bug ✔ +* 修复交换内存占比的bug ✔ ## [2.2.0](https://github.com/chaos-zhu/easynode/releases) (2024-08-17) diff --git a/server/app/controller/group.js b/server/app/controller/group.js index bcd9b66..fabc709 100644 --- a/server/app/controller/group.js +++ b/server/app/controller/group.js @@ -1,4 +1,4 @@ -const { readGroupList, writeGroupList, readHostList, writeHostList, randomStr } = require('../utils') +const { readGroupList, writeGroupList, readHostList, writeHostList } = require('../utils/storage') async function getGroupList({ res }) { let data = await readGroupList() diff --git a/server/app/controller/host.js b/server/app/controller/host.js index ccf8f8f..65ce8c6 100644 --- a/server/app/controller/host.js +++ b/server/app/controller/host.js @@ -1,4 +1,5 @@ -const { readHostList, writeHostList, RSADecryptSync, AESEncryptSync, AESDecryptSync } = require('../utils') +const { readHostList, writeHostList } = require('../utils/storage') +const { RSADecryptSync, AESEncryptSync, AESDecryptSync } = require('../utils/encrypt') async function getHostList({ res }) { // console.log('get-host-list') diff --git a/server/app/controller/notify.js b/server/app/controller/notify.js index 925b765..fdadece 100644 --- a/server/app/controller/notify.js +++ b/server/app/controller/notify.js @@ -1,4 +1,4 @@ -const { readNotifyConfig, writeNotifyConfig, readNotifyList, writeNotifyList } = require('../utils') +const { readNotifyConfig, writeNotifyConfig, readNotifyList, writeNotifyList } = require('../utils/storage') const { sendServerChan, sendEmail } = require('../utils/notify') // const commonTemp = require('../template/commonTemp') diff --git a/server/app/controller/onekey.js b/server/app/controller/onekey.js index 1599221..8fa378a 100644 --- a/server/app/controller/onekey.js +++ b/server/app/controller/onekey.js @@ -1,4 +1,4 @@ -const { readOneKeyRecord, deleteOneKeyRecord } = require('../utils') +const { readOneKeyRecord, deleteOneKeyRecord } = require('../utils/storage') async function getOnekeyRecord({ res }) { let data = await readOneKeyRecord() diff --git a/server/app/controller/scripts.js b/server/app/controller/scripts.js index 11693e7..c35619c 100644 --- a/server/app/controller/scripts.js +++ b/server/app/controller/scripts.js @@ -1,5 +1,6 @@ const localShellJson = require('../config/shell.json') -const { readScriptList, writeScriptList, randomStr } = require('../utils') +const { readScriptList, writeScriptList } = require('../utils/storage') +const { randomStr } = require('../utils/tools') let localShell = JSON.parse(JSON.stringify(localShellJson)).map((item) => { return { ...item, id: randomStr(10), index: '--', description: item.description + '|内置脚本' } diff --git a/server/app/controller/ssh.js b/server/app/controller/ssh.js index 79f57ff..71c01ad 100644 --- a/server/app/controller/ssh.js +++ b/server/app/controller/ssh.js @@ -1,4 +1,5 @@ -const { readSSHRecord, writeSSHRecord, readHostList, writeHostList, RSADecryptSync, AESEncryptSync, AESDecryptSync } = require('../utils') +const { readSSHRecord, writeSSHRecord, readHostList, writeHostList } = require('../utils/storage') +const { RSADecryptSync, AESEncryptSync, AESDecryptSync } = require('../utils/encrypt') async function getSSHList({ res }) { // console.log('get-host-list') diff --git a/server/app/controller/user.js b/server/app/controller/user.js index 7b9cc57..9cf0fcb 100644 --- a/server/app/controller/user.js +++ b/server/app/controller/user.js @@ -1,7 +1,9 @@ const jwt = require('jsonwebtoken') const axios = require('axios') -const { getNetIPInfo, readKey, writeKey, RSADecryptSync, AESEncryptSync, SHA1Encrypt } = require('../utils') const { asyncSendNotice } = require('../utils/notify') +const { readKey, writeKey } = require('../utils/storage') +const { RSADecryptSync, AESEncryptSync, SHA1Encrypt } = require('../utils/encrypt') +const { getNetIPInfo } = require('../utils/tools') const getpublicKey = async ({ res }) => { let { publicKey: data } = await readKey() diff --git a/server/app/init.js b/server/app/init.js index 7c33bda..4d315e6 100644 --- a/server/app/init.js +++ b/server/app/init.js @@ -1,20 +1,7 @@ const NodeRSA = require('node-rsa') -const { getNetIPInfo, readHostList, writeHostList, readKey, writeKey, randomStr, isProd, AESEncryptSync } = require('./utils') - -const isDev = !isProd() - -// 存储本机IP, 供host列表接口调用 -// eslint-disable-next-line no-unused-vars -async function initLocalIp() { - if(isDev) return consola.info('非生产环境不初始化保存本地IP') - const localNetIPInfo = await getNetIPInfo() - let vpsList = await readHostList() - let { ip: localNetIP } = localNetIPInfo - if(vpsList.some(({ host }) => host === localNetIP)) return consola.info('本机IP已储存: ', localNetIP) - vpsList.unshift({ name: 'server-side-host', host: localNetIP, group: 'default' }) - writeHostList(vpsList) - consola.info('Task: 生产环境首次启动储存本机IP: ', localNetIP) -} +const { readKey, writeKey } = require('./utils/storage') +const { randomStr } = require('./utils/tools') +const { AESEncryptSync } = require('./utils/encrypt') // 初始化公私钥, 供登录、保存ssh密钥/密码等加解密 async function initRsa() { @@ -43,7 +30,6 @@ async function randomJWTSecret() { module.exports = async () => { await randomJWTSecret() // 全局密钥 await initRsa() // 全局公钥密钥 - // initLocalIp() // :TODO: 默认添加服务端vps // 用于记录客户端登录IP的列表 global.loginRecord = [] } diff --git a/server/app/middlewares/auth.js b/server/app/middlewares/auth.js index 9d7a66a..b12f0c8 100644 --- a/server/app/middlewares/auth.js +++ b/server/app/middlewares/auth.js @@ -1,5 +1,5 @@ -const { verifyAuthSync } = require('../utils') const { apiPrefix } = require('../config') +const { verifyAuthSync } = require('../utils/verify-auth') let whitePath = [ '/login', diff --git a/server/app/schedule/expired-notify.js b/server/app/schedule/expired-notify.js index 61b2504..67499e6 100644 --- a/server/app/schedule/expired-notify.js +++ b/server/app/schedule/expired-notify.js @@ -1,6 +1,7 @@ const schedule = require('node-schedule') -const { readHostList, formatTimestamp } = require('../utils') const { asyncSendNotice } = require('../utils/notify') +const { readHostList } = require('../utils/storage') +const { formatTimestamp } = require('../utils/tools') const expiredNotifyJob = async () => { consola.info('=====开始检测服务器到期时间=====', new Date()) diff --git a/server/app/server.js b/server/app/server.js index 2309d9d..2789e90 100644 --- a/server/app/server.js +++ b/server/app/server.js @@ -8,7 +8,7 @@ const wsSftp = require('./socket/sftp') // const wsHostStatus = require('./socket/host-status') const wsClientInfo = require('./socket/clients') const wsOnekey = require('./socket/onekey') -const { throwError } = require('./utils') +const { throwError } = require('./utils/tools') const httpServer = () => { const app = new Koa() diff --git a/server/app/socket/clients.js b/server/app/socket/clients.js index 63fc8be..643d226 100644 --- a/server/app/socket/clients.js +++ b/server/app/socket/clients.js @@ -1,8 +1,8 @@ const { Server: ServerIO } = require('socket.io') const { io: ClientIO } = require('socket.io-client') -const { readHostList } = require('../utils') +const { readHostList } = require('../utils/storage') const { clientPort } = require('../config') -const { verifyAuthSync } = require('../utils') +const { verifyAuthSync } = require('../utils/verify-auth') let clientSockets = [] let clientsData = {} diff --git a/server/app/socket/host-status.js b/server/app/socket/host-status.js index 38a900d..6122b69 100644 --- a/server/app/socket/host-status.js +++ b/server/app/socket/host-status.js @@ -1,7 +1,7 @@ const { Server: ServerIO } = require('socket.io') const { io: ClientIO } = require('socket.io-client') const { clientPort } = require('../config') -const { verifyAuthSync } = require('../utils') +const { verifyAuthSync } = require('../utils/verify-auth') let hostSockets = {} diff --git a/server/app/socket/onekey.js b/server/app/socket/onekey.js index 514c7a9..82d8e5b 100644 --- a/server/app/socket/onekey.js +++ b/server/app/socket/onekey.js @@ -1,7 +1,10 @@ const { Server } = require('socket.io') const { Client: SSHClient } = require('ssh2') -const { readHostList, readSSHRecord, verifyAuthSync, AESDecryptSync, writeOneKeyRecord, shellThrottle } = require('../utils') const { asyncSendNotice } = require('../utils/notify') +const { readSSHRecord, readHostList, writeOneKeyRecord } = require('../utils/storage') +const { verifyAuthSync } = require('../utils/verify-auth') +const { shellThrottle } = require('../utils/tools') +const { AESDecryptSync } = require('../utils/encrypt') const execStatusEnum = { connecting: '连接中', diff --git a/server/app/socket/sftp.js b/server/app/socket/sftp.js index 2a9bb57..8c94ac4 100644 --- a/server/app/socket/sftp.js +++ b/server/app/socket/sftp.js @@ -1,11 +1,12 @@ -const { Server } = require('socket.io') -const SFTPClient = require('ssh2-sftp-client') const rawPath = require('path') const fs = require('fs-extra') - -const { readHostList, readSSHRecord, verifyAuthSync, AESDecryptSync } = require('../utils') -const { sftpCacheDir } = require('../config') +const SFTPClient = require('ssh2-sftp-client') const CryptoJS = require('crypto-js') +const { Server } = require('socket.io') +const { sftpCacheDir } = require('../config') +const { verifyAuthSync } = require('../utils/verify-auth') +const { AESDecryptSync } = require('../utils/encrypt') +const { readSSHRecord, readHostList } = require('../utils/storage') // 读取切片 const pipeStream = (path, writeStream) => { diff --git a/server/app/socket/terminal.js b/server/app/socket/terminal.js index 225add6..4c6fd91 100644 --- a/server/app/socket/terminal.js +++ b/server/app/socket/terminal.js @@ -1,6 +1,8 @@ const { Server } = require('socket.io') const { Client: SSHClient } = require('ssh2') -const { readHostList, readSSHRecord, verifyAuthSync, AESDecryptSync } = require('../utils') +const { verifyAuthSync } = require('../utils/verify-auth') +const { AESDecryptSync } = require('../utils/encrypt') +const { readSSHRecord, readHostList } = require('../utils/storage') const { asyncSendNotice } = require('../utils/notify') function createInteractiveShell(socket, sshClient) { diff --git a/server/app/utils/index.js b/server/app/utils/index.js deleted file mode 100644 index 8f8693c..0000000 --- a/server/app/utils/index.js +++ /dev/null @@ -1,57 +0,0 @@ -const { - readSSHRecord, - writeSSHRecord, - readHostList, - writeHostList, - readKey, - writeKey, - readGroupList, - writeGroupList, - readScriptList, - writeScriptList, - readOneKeyRecord, - writeOneKeyRecord, - deleteOneKeyRecord, - readNotifyConfig, - writeNotifyConfig, - getNotifySwByType, - readNotifyList, - writeNotifyList -} = require('./storage') -const { RSADecryptSync, AESEncryptSync, AESDecryptSync, SHA1Encrypt } = require('./encrypt') -const { verifyAuthSync, isProd } = require('./verify-auth') -const { getNetIPInfo, throwError, isIP, randomStr, getUTCDate, formatTimestamp, shellThrottle } = require('./tools') - -module.exports = { - getNetIPInfo, - throwError, - isIP, - randomStr, - getUTCDate, - formatTimestamp, - shellThrottle, - verifyAuthSync, - isProd, - RSADecryptSync, - AESEncryptSync, - AESDecryptSync, - SHA1Encrypt, - readSSHRecord, - writeSSHRecord, - readHostList, - writeHostList, - readKey, - writeKey, - readGroupList, - writeGroupList, - readScriptList, - writeScriptList, - readOneKeyRecord, - writeOneKeyRecord, - deleteOneKeyRecord, - readNotifyConfig, - writeNotifyConfig, - getNotifySwByType, - readNotifyList, - writeNotifyList -} diff --git a/server/app/utils/notify.js b/server/app/utils/notify.js index 79b7180..6feda84 100644 --- a/server/app/utils/notify.js +++ b/server/app/utils/notify.js @@ -1,6 +1,6 @@ const nodemailer = require('nodemailer') const axios = require('axios') -const { getNotifySwByType, readNotifyConfig } = require('../utils') +const { getNotifySwByType, readNotifyConfig } = require('../utils/storage') const commonTemp = require('../template/commonTemp') function sendServerChan(sendKey, title, content) { diff --git a/server/app/utils/os-data.js b/server/app/utils/os-data.js deleted file mode 100644 index b270946..0000000 --- a/server/app/utils/os-data.js +++ /dev/null @@ -1,84 +0,0 @@ -const osu = require('node-os-utils') -const os = require('os') - -let cpu = osu.cpu -let mem = osu.mem -let drive = osu.drive -let netstat = osu.netstat -let osuOs = osu.os -let users = osu.users - -async function cpuInfo() { - let cpuUsage = await cpu.usage(200) - let cpuCount = cpu.count() - let cpuModel = cpu.model() - return { - cpuUsage, - cpuCount, - cpuModel - } -} - -async function memInfo() { - let memInfo = await mem.info() - return { - ...memInfo - } -} - -async function driveInfo() { - let driveInfo = {} - try { - driveInfo = await drive.info() - } catch { - // console.log(driveInfo) - } - return driveInfo -} - -async function netstatInfo() { - let netstatInfo = await netstat.inOut() - return netstatInfo === 'not supported' ? {} : netstatInfo -} - -async function osInfo() { - let type = os.type() - let platform = os.platform() - let release = os.release() - let uptime = osuOs.uptime() - let ip = osuOs.ip() - let hostname = osuOs.hostname() - let arch = osuOs.arch() - return { - type, - platform, - release, - ip, - hostname, - arch, - uptime - } -} - -async function openedCount() { - let openedCount = await users.openedCount() - return openedCount === 'not supported' ? 0 : openedCount -} - -module.exports = async () => { - let data = {} - try { - data = { - cpuInfo: await cpuInfo(), - memInfo: await memInfo(), - driveInfo: await driveInfo(), - netstatInfo: await netstatInfo(), - osInfo: await osInfo(), - openedCount: await openedCount() - } - return data - } catch(err){ - console.error('获取系统信息出错:', err) - return err.toString() - } -} diff --git a/server/app/utils/test-connect.js b/server/app/utils/test-connect.js deleted file mode 100644 index 6bbf935..0000000 --- a/server/app/utils/test-connect.js +++ /dev/null @@ -1,47 +0,0 @@ -// based off of https://github.com/apaszke/tcp-ping -// rewritten with modern es6 syntax & promises -const { io: ClientIO } = require('socket.io-client') - -const testConnectAsync = (options) => { - let connectTimes = 0 - options = Object.assign({ retryTimes: 3, timeout: 5000, host: 'http://localhost', port: '80' }, options) - const { retryTimes, host, port, timeout } = options - // eslint-disable-next-line - return new Promise(async (resolve, reject) => { - while (connectTimes < retryTimes) { - try { - connectTimes++ - await connect({ host, port, timeout }) - break - } catch (error) { - // 重连次数达到限制仍未连接成功 - if(connectTimes === retryTimes) { - reject({ message: error.message, host, port, connectTimes }) - return - } - } - } - resolve({ status: 'connect_success', host, port, connectTimes }) - }) -} - -const connect = (options) => { - const { host, port, timeout } = options - return new Promise((resolve, reject) => { - let io = ClientIO(`${ host }:${ port }`, { - path: '/client/os-info', - forceNew: false, - timeout, - reconnection: false - }) - .on('connect', () => { - resolve() - io.disconnect() - }) - .on('connect_error', (error) => { - reject(error) - }) - }) -} - -module.exports = testConnectAsync \ No newline at end of file diff --git a/server/app/utils/tools.js b/server/app/utils/tools.js index ad60dae..a817ad8 100644 --- a/server/app/utils/tools.js +++ b/server/app/utils/tools.js @@ -226,6 +226,11 @@ let shellThrottle = (fn, delay = 1000) => { return throttled } +const isProd = () => { + const EXEC_ENV = process.env.EXEC_ENV || 'production' + return EXEC_ENV === 'production' +} + module.exports = { getNetIPInfo, throwError, @@ -234,5 +239,6 @@ module.exports = { getUTCDate, formatTimestamp, resolvePath, - shellThrottle + shellThrottle, + isProd } \ No newline at end of file diff --git a/server/app/utils/verify-auth.js b/server/app/utils/verify-auth.js index 6304400..0ae3522 100644 --- a/server/app/utils/verify-auth.js +++ b/server/app/utils/verify-auth.js @@ -23,12 +23,6 @@ const verifyAuthSync = async (token, clientIp) => { } } -const isProd = () => { - const EXEC_ENV = process.env.EXEC_ENV || 'production' - return EXEC_ENV === 'production' -} - module.exports = { - verifyAuthSync, - isProd + verifyAuthSync } \ No newline at end of file