Files
certd/packages/core/basic/src/utils/util.sp.ts
T

147 lines
3.2 KiB
TypeScript
Raw Normal View History

2024-07-18 21:10:13 +08:00
//转换为import
2025-09-30 18:01:49 +00:00
//@ts-ignore
2025-09-30 23:27:31 +08:00
import childProcess from "child_process";
import { safePromise } from "./util.promise.js";
import { ILogger, logger } from "./util.log.js";
2025-09-30 18:01:49 +00:00
//@ts-ignore
2025-09-30 23:27:31 +08:00
import iconv from "iconv-lite";
2024-07-18 21:10:13 +08:00
export type ExecOption = {
cmd: string | string[];
env: any;
logger?: ILogger;
options?: any;
};
async function exec(opts: ExecOption): Promise<string> {
2025-09-30 23:27:31 +08:00
let cmd = "";
2024-07-18 21:10:13 +08:00
const log = opts.logger || logger;
if (opts.cmd instanceof Array) {
for (const item of opts.cmd) {
if (cmd) {
2025-09-30 23:27:31 +08:00
cmd += " && " + item;
2024-07-18 21:10:13 +08:00
} else {
cmd = item;
}
}
}
log.info(`执行命令: ${cmd}`);
return safePromise((resolve, reject) => {
childProcess.exec(
cmd,
{
env: {
2025-09-30 18:01:49 +00:00
//@ts-ignore
2024-07-18 21:10:13 +08:00
...process.env,
...opts.env,
},
...opts.options,
},
2025-09-30 18:01:49 +00:00
(error: any, stdout: { toString: (arg0: string) => any }, stderr: any) => {
2024-07-18 21:10:13 +08:00
if (error) {
log.error(`exec error: ${error}`);
reject(error);
} else {
2025-09-30 23:27:31 +08:00
const res = stdout.toString("utf-8");
2024-07-18 21:10:13 +08:00
log.info(`stdout: ${res}`);
resolve(res);
}
}
);
});
}
export type SpawnOption = {
cmd: string | string[];
onStdout?: (data: string) => void;
onStderr?: (data: string) => void;
2024-09-05 15:36:35 +08:00
env?: any;
2024-07-18 21:10:13 +08:00
logger?: ILogger;
options?: any;
};
2024-10-30 01:44:02 +08:00
function isWindows() {
2025-09-30 18:01:49 +00:00
// @ts-ignore
2025-09-30 23:27:31 +08:00
return process.platform === "win32";
2024-10-30 01:44:02 +08:00
}
function convert(buffer: any) {
if (isWindows()) {
2025-09-30 23:27:31 +08:00
const decoded = iconv.decode(buffer, "GBK");
2024-10-30 01:44:02 +08:00
// 检查是否有有效字符
return decoded && decoded.trim().length > 0 ? decoded : buffer.toString();
} else {
return buffer;
}
}
// function convert(buffer: any) {
// return buffer;
// }
2024-07-18 21:10:13 +08:00
async function spawn(opts: SpawnOption): Promise<string> {
2025-09-30 23:27:31 +08:00
let cmd = "";
2024-07-18 21:10:13 +08:00
const log = opts.logger || logger;
if (opts.cmd instanceof Array) {
for (const item of opts.cmd) {
if (cmd) {
2025-09-30 23:27:31 +08:00
cmd += " && " + item;
2024-07-18 21:10:13 +08:00
} else {
cmd = item;
}
}
2024-09-06 00:13:21 +08:00
} else {
cmd = opts.cmd;
2024-07-18 21:10:13 +08:00
}
log.info(`执行命令: ${cmd}`);
2025-09-30 23:27:31 +08:00
let stdout = "";
let stderr = "";
2024-07-18 21:10:13 +08:00
return safePromise((resolve, reject) => {
const ls = childProcess.spawn(cmd, {
2024-08-23 13:15:06 +08:00
shell: true,
2024-07-18 21:10:13 +08:00
env: {
2025-09-30 18:01:49 +00:00
//@ts-ignore
2024-07-18 21:10:13 +08:00
...process.env,
...opts.env,
},
...opts.options,
});
2025-09-30 18:01:49 +00:00
ls.stdout.on("data", (data: string) => {
2024-10-30 01:44:02 +08:00
data = convert(data);
2024-07-18 21:10:13 +08:00
log.info(`stdout: ${data}`);
stdout += data;
});
2025-09-30 18:01:49 +00:00
ls.stderr.on("data", (data: string) => {
2024-10-30 01:44:02 +08:00
data = convert(data);
log.warn(`stderr: ${data}`);
2024-07-18 21:10:13 +08:00
stderr += data;
});
2025-09-30 18:01:49 +00:00
ls.on("error", (error: any) => {
2024-07-18 21:10:13 +08:00
log.error(`child process error: ${error}`);
2025-09-30 18:01:49 +00:00
//@ts-ignore
error.stderr = stderr;
//@ts-ignore
error.stdout = stdout;
2024-07-18 21:10:13 +08:00
reject(error);
});
2025-09-30 23:27:31 +08:00
ls.on("close", (code: number) => {
2024-07-18 21:10:13 +08:00
if (code !== 0) {
log.error(`child process exited with code ${code}`);
2025-09-30 18:01:49 +00:00
const e = new Error(stderr || "return " + code);
//@ts-ignore
2025-09-30 18:03:16 +00:00
e.stderr = stderr;
2025-09-30 18:01:49 +00:00
//@ts-ignore
2025-09-30 18:03:16 +00:00
e.stdout = stdout;
2025-09-30 18:01:49 +00:00
reject(e);
2024-07-18 21:10:13 +08:00
} else {
resolve(stdout);
}
});
});
}
export const sp = {
spawn,
exec,
};