From 8735321e34bc93dd2472f2d0231212b63a6db08a Mon Sep 17 00:00:00 2001 From: whyour Date: Sun, 5 Jun 2022 19:26:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=B0=83=E8=AF=95=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E8=BF=90=E8=A1=8C=E9=9C=80=E8=A6=81=E5=85=88=E4=BF=9D?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- back/api/script.ts | 23 ++++++------- back/services/script.ts | 60 +++++++++++++++++----------------- src/pages/script/editModal.tsx | 4 +++ 3 files changed, 46 insertions(+), 41 deletions(-) diff --git a/back/api/script.ts b/back/api/script.ts index 18cb6daf..0a418bf6 100644 --- a/back/api/script.ts +++ b/back/api/script.ts @@ -11,7 +11,7 @@ import { Logger } from 'winston'; import config from '../config'; import * as fs from 'fs'; import { celebrate, Joi } from 'celebrate'; -import path, { join } from 'path'; +import path, { join, parse } from 'path'; import ScriptService from '../services/script'; import multer from 'multer'; const route = Router(); @@ -218,17 +218,18 @@ export default (app: Router) => { celebrate({ body: Joi.object({ filename: Joi.string().required(), + content: Joi.string().optional(), path: Joi.string().optional().allow(''), }), }), async (req: Request, res: Response, next: NextFunction) => { const logger: Logger = Container.get('logger'); try { - let { filename, path } = req.body as { - filename: string; - path: string; - }; - const filePath = join(path, filename); + let { filename, content, path } = req.body; + const { name, ext } = parse(filename); + const filePath = join(path, `${name}.swap${ext}`); + fs.writeFileSync(filePath, content || '', { encoding: 'utf8' }); + const scriptService = Container.get(ScriptService); const result = await scriptService.runScript(filePath); res.send(result); @@ -244,17 +245,17 @@ export default (app: Router) => { celebrate({ body: Joi.object({ filename: Joi.string().required(), + content: Joi.string().optional().allow(''), path: Joi.string().optional().allow(''), }), }), async (req: Request, res: Response, next: NextFunction) => { const logger: Logger = Container.get('logger'); try { - let { filename, path } = req.body as { - filename: string; - path: string; - }; - const filePath = join(path, filename); + let { filename, content, path } = req.body; + const { name, ext } = parse(filename); + const filePath = join(path, `${name}.swap${ext}`); + const scriptService = Container.get(ScriptService); const result = await scriptService.stopScript(filePath); res.send(result); diff --git a/back/services/script.ts b/back/services/script.ts index c44d7530..c40c936b 100644 --- a/back/services/script.ts +++ b/back/services/script.ts @@ -1,8 +1,9 @@ import { Service, Inject } from 'typedi'; import winston from 'winston'; -import { spawn } from 'child_process'; +import { ChildProcessWithoutNullStreams, spawn } from 'child_process'; import SockService from './sock'; import CronService from './cron'; +import ScheduleService, { TaskCallbacks } from './schedule'; @Service() export default class ScriptService { @@ -10,38 +11,37 @@ export default class ScriptService { @Inject('logger') private logger: winston.Logger, private sockService: SockService, private cronService: CronService, + private scheduleService: ScheduleService, ) {} - public async runScript(path: string) { - const cp = spawn(`task -l ${path} now`, { shell: '/bin/bash' }); + private taskCallbacks(): TaskCallbacks { + return { + onEnd: async (cp, endTime, diff) => { + this.sockService.sendMessage({ + type: 'manuallyRunScript', + message: `\n## 执行结束... ${endTime.format( + 'YYYY-MM-DD HH:mm:ss', + )} 耗时 ${diff} 秒`, + }); + }, + onError: async (message: string) => { + this.sockService.sendMessage({ + type: 'manuallyRunScript', + message, + }); + }, + onLog: async (message: string) => { + this.sockService.sendMessage({ + type: 'manuallyRunScript', + message, + }); + }, + }; + } - cp.stdout.on('data', (data) => { - this.sockService.sendMessage({ - type: 'manuallyRunScript', - message: data.toString(), - }); - }); - - cp.stderr.on('data', (data) => { - this.sockService.sendMessage({ - type: 'manuallyRunScript', - message: data.toString(), - }); - }); - - cp.on('error', (err) => { - this.sockService.sendMessage({ - type: 'manuallyRunScript', - message: JSON.stringify(err), - }); - }); - - cp.on('close', (err) => { - this.sockService.sendMessage({ - type: 'manuallyRunScript', - message: `执行结束`, - }); - }); + public async runScript(filePath: string) { + const command = `task -l ${filePath} now`; + this.scheduleService.runTask(command, this.taskCallbacks()); return { code: 200 }; } diff --git a/src/pages/script/editModal.tsx b/src/pages/script/editModal.tsx index 78253338..b1a8b22f 100644 --- a/src/pages/script/editModal.tsx +++ b/src/pages/script/editModal.tsx @@ -74,11 +74,13 @@ const EditModal = ({ const run = () => { setLog(''); + const content = editorRef.current.getValue().replace(/\r\n/g, '\n'); request .put(`${config.apiPrefix}scripts/run`, { data: { filename: cNode.title, path: cNode.parent || '', + content, }, }) .then((data) => { @@ -90,11 +92,13 @@ const EditModal = ({ if (!cNode || !cNode.title) { return; } + const content = editorRef.current.getValue().replace(/\r\n/g, '\n'); request .put(`${config.apiPrefix}scripts/stop`, { data: { filename: cNode.title, path: cNode.parent || '', + content, }, }) .then((data) => {