coolbox 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions.js +7 -3
- package/dist/actions.js.map +1 -1
- package/dist/confirm.js +12 -14
- package/dist/confirm.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/menu.js +84 -92
- package/dist/menu.js.map +1 -1
- package/dist/runner.js +36 -1
- package/dist/runner.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/package.json +1 -1
package/dist/actions.js
CHANGED
|
@@ -11,6 +11,7 @@ export const actions = [
|
|
|
11
11
|
command: 'bash <(wget -qO- --no-check-certificate {url}) {os-name}',
|
|
12
12
|
group: 'system',
|
|
13
13
|
dangerous: true,
|
|
14
|
+
needRoot: true,
|
|
14
15
|
params: [
|
|
15
16
|
{ name: 'os-name', message: '请输入要安装的系统(如 alpine-3.23, debian-13, ubuntu-26.04)' },
|
|
16
17
|
],
|
|
@@ -23,21 +24,24 @@ export const actions = [
|
|
|
23
24
|
name: '设置 Swap',
|
|
24
25
|
description: '通过 spiritLHLS/addswap 一键设置交换空间',
|
|
25
26
|
type: 'remote',
|
|
26
|
-
command: '
|
|
27
|
+
command: 'bash <(wget -qO- --no-check-certificate https://cdn.spiritlhl.net/https://raw.githubusercontent.com/spiritLHLS/addswap/main/addswap.sh)',
|
|
28
|
+
needRoot: true,
|
|
27
29
|
group: 'system',
|
|
28
30
|
},
|
|
29
31
|
{
|
|
30
32
|
name: '设置系统国内镜像源',
|
|
31
33
|
description: '通过 LinuxMirrors 一键更换系统软件源',
|
|
32
34
|
type: 'remote',
|
|
33
|
-
command: '
|
|
35
|
+
command: 'bash <(curl -sSL https://linuxmirrors.cn/main.sh)',
|
|
36
|
+
needRoot: true,
|
|
34
37
|
group: 'system',
|
|
35
38
|
},
|
|
36
39
|
{
|
|
37
40
|
name: '安装 Docker 并设置国内镜像源',
|
|
38
41
|
description: '通过 LinuxMirrors 一键安装 Docker 并配置国内镜像加速',
|
|
39
42
|
type: 'remote',
|
|
40
|
-
command: '
|
|
43
|
+
command: 'bash <(curl -sSL https://linuxmirrors.cn/docker.sh)',
|
|
44
|
+
needRoot: true,
|
|
41
45
|
group: 'container',
|
|
42
46
|
},
|
|
43
47
|
{
|
package/dist/actions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAkB;IACnC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;IACpC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE;IACrC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;CACpC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAa;IAC/B;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,0CAA0C;QACvD,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,0DAA0D;QACnE,KAAK,EAAE,QAAQ;QACf,SAAS,EAAE,IAAI;QACf,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,mDAAmD,EAAE;SAClF;QACD,IAAI,EAAE;YACJ,QAAQ,EAAE,kEAAkE;YAC5E,aAAa,EAAE,yEAAyE;SACzF;KACF;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,gCAAgC;QAC7C,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAkB;IACnC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;IACpC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE;IACrC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;CACpC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAa;IAC/B;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,0CAA0C;QACvD,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,0DAA0D;QACnE,KAAK,EAAE,QAAQ;QACf,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,mDAAmD,EAAE;SAClF;QACD,IAAI,EAAE;YACJ,QAAQ,EAAE,kEAAkE;YAC5E,aAAa,EAAE,yEAAyE;SACzF;KACF;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,gCAAgC;QAC7C,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,yIAAyI;QAClJ,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,2BAA2B;QACxC,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,mDAAmD;QAC5D,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,uCAAuC;QACpD,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,qDAAqD;QAC9D,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,WAAW;KACnB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,wBAAwB;QACrC,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,eAAe;QACxB,KAAK,EAAE,SAAS;KACjB;CACF,CAAC"}
|
package/dist/confirm.js
CHANGED
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
import { confirm } from '@inquirer/prompts';
|
|
2
2
|
const WARNING_BANNER = `
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️
|
|
16
|
-
⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️
|
|
3
|
+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
4
|
+
! !
|
|
5
|
+
! ██████╗ ██╗ ██╗███████╗██████╗ ███████╗ !
|
|
6
|
+
! ██╔═══██╗██║ ██║██╔════╝██╔══██╗██╔════╝ !
|
|
7
|
+
! ██║ ██║██║ ██║█████╗ ██████╔╝███████╗ !
|
|
8
|
+
! ██║▄▄ ██║██║ ██║██╔══╝ ██╔══██╗╚════██║ !
|
|
9
|
+
! ╚██████╔╝╚██████╔╝███████╗██║ ██║███████║ !
|
|
10
|
+
! ╚══▀▀═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚══════╝ !
|
|
11
|
+
! !
|
|
12
|
+
! 该操作不可逆转,执行后数据将无法恢复! !
|
|
13
|
+
! !
|
|
14
|
+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
17
15
|
`;
|
|
18
16
|
export async function confirmDangerous(actionName) {
|
|
19
17
|
console.clear();
|
package/dist/confirm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirm.js","sourceRoot":"","sources":["../src/confirm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,MAAM,cAAc,GAAG
|
|
1
|
+
{"version":3,"file":"confirm.js","sourceRoot":"","sources":["../src/confirm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,MAAM,cAAc,GAAG;;;;;;;;;;;;;CAatB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAkB;IACvD,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,IAAI,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;QAC3B,OAAO,EAAE,yBAAyB;QAClC,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { showMenu } from './menu.js';
|
|
3
|
-
const VERSION = '0.
|
|
3
|
+
const VERSION = '0.2.0';
|
|
4
4
|
const BANNER = `
|
|
5
5
|
╔═══════════════════════════════════╗
|
|
6
|
-
║ ⚡ CoolBox (快工具箱) v${VERSION}
|
|
6
|
+
║ ⚡ CoolBox (快工具箱) v${VERSION} ║
|
|
7
7
|
║ Linux 服务器运维工具箱 ║
|
|
8
8
|
╚═══════════════════════════════════╝
|
|
9
9
|
`;
|
package/dist/menu.js
CHANGED
|
@@ -2,28 +2,6 @@ import { select, input, confirm } from '@inquirer/prompts';
|
|
|
2
2
|
import { actions, groups } from './actions.js';
|
|
3
3
|
import { runAction } from './runner.js';
|
|
4
4
|
import { confirmDangerous } from './confirm.js';
|
|
5
|
-
function buildMenuItems() {
|
|
6
|
-
const items = [];
|
|
7
|
-
for (const group of groups) {
|
|
8
|
-
items.push({
|
|
9
|
-
name: `── ${group.label} ──`,
|
|
10
|
-
value: `__group__${group.name}`,
|
|
11
|
-
});
|
|
12
|
-
const groupActions = actions.filter((a) => a.group === group.name);
|
|
13
|
-
for (const action of groupActions) {
|
|
14
|
-
items.push({
|
|
15
|
-
name: ` ${action.name}`,
|
|
16
|
-
value: action.name,
|
|
17
|
-
description: action.description,
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
items.push({
|
|
22
|
-
name: '退出',
|
|
23
|
-
value: '__exit__',
|
|
24
|
-
});
|
|
25
|
-
return items;
|
|
26
|
-
}
|
|
27
5
|
async function collectParams(action) {
|
|
28
6
|
const values = {};
|
|
29
7
|
if (!action.params)
|
|
@@ -36,84 +14,98 @@ async function collectParams(action) {
|
|
|
36
14
|
}
|
|
37
15
|
return values;
|
|
38
16
|
}
|
|
17
|
+
async function executeAction(action) {
|
|
18
|
+
// 危险操作二次确认
|
|
19
|
+
if (action.dangerous) {
|
|
20
|
+
const confirmed = await confirmDangerous(action.name);
|
|
21
|
+
if (!confirmed) {
|
|
22
|
+
console.log('\n已取消操作。\n');
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// 收集参数
|
|
27
|
+
const paramValues = await collectParams(action);
|
|
28
|
+
// 准备提示
|
|
29
|
+
console.log('');
|
|
30
|
+
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
31
|
+
console.log(` 📋 即将执行: ${action.name}`);
|
|
32
|
+
if (action.description) {
|
|
33
|
+
console.log(` ${action.description}`);
|
|
34
|
+
}
|
|
35
|
+
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
36
|
+
console.log('');
|
|
37
|
+
const ready = await confirm({
|
|
38
|
+
message: '确认开始执行?',
|
|
39
|
+
default: true,
|
|
40
|
+
});
|
|
41
|
+
if (!ready) {
|
|
42
|
+
console.log('\n已取消操作。\n');
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// 执行
|
|
46
|
+
console.log('');
|
|
47
|
+
const result = await runAction(action, paramValues);
|
|
48
|
+
// 显示结果
|
|
49
|
+
console.log('');
|
|
50
|
+
if (result.exitCode === 0) {
|
|
51
|
+
console.log('✅ 操作执行成功。');
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
console.log(`❌ 操作执行失败(退出码: ${result.exitCode ?? 'unknown'})。`);
|
|
55
|
+
}
|
|
56
|
+
// 返回菜单或退出
|
|
57
|
+
const next = await select({
|
|
58
|
+
message: '接下来:',
|
|
59
|
+
choices: [
|
|
60
|
+
{ name: '返回主菜单', value: 'menu' },
|
|
61
|
+
{ name: '退出', value: 'exit' },
|
|
62
|
+
],
|
|
63
|
+
default: 'menu',
|
|
64
|
+
});
|
|
65
|
+
if (next === 'exit') {
|
|
66
|
+
process.exit(0);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async function showGroupActions(groupName, groupLabel) {
|
|
70
|
+
const groupActions = actions.filter((a) => a.group === groupName);
|
|
71
|
+
while (true) {
|
|
72
|
+
const choices = groupActions.map((action) => ({
|
|
73
|
+
name: action.name,
|
|
74
|
+
value: action.name,
|
|
75
|
+
description: action.description,
|
|
76
|
+
}));
|
|
77
|
+
choices.push({ name: '返回主菜单', value: '__back__', description: '' });
|
|
78
|
+
const selected = await select({
|
|
79
|
+
message: `${groupLabel} — 请选择操作:`,
|
|
80
|
+
choices,
|
|
81
|
+
});
|
|
82
|
+
if (selected === '__back__') {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const action = groupActions.find((a) => a.name === selected);
|
|
86
|
+
if (!action)
|
|
87
|
+
return;
|
|
88
|
+
await executeAction(action);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
39
91
|
export async function showMenu() {
|
|
40
|
-
const menuItems = buildMenuItems();
|
|
41
|
-
let lastSelected = menuItems.find((i) => !i.value.startsWith('__'))?.value ?? menuItems[0]?.value;
|
|
42
92
|
while (true) {
|
|
93
|
+
const choices = groups.map((g) => ({
|
|
94
|
+
name: g.label,
|
|
95
|
+
value: g.name,
|
|
96
|
+
}));
|
|
97
|
+
choices.push({ name: '退出', value: '__exit__' });
|
|
43
98
|
const selected = await select({
|
|
44
|
-
message: '
|
|
45
|
-
choices
|
|
46
|
-
name: item.name,
|
|
47
|
-
value: item.value,
|
|
48
|
-
description: item.description,
|
|
49
|
-
})),
|
|
50
|
-
default: lastSelected,
|
|
99
|
+
message: '请选择功能分类:',
|
|
100
|
+
choices,
|
|
51
101
|
});
|
|
52
102
|
if (selected === '__exit__') {
|
|
53
103
|
process.exit(0);
|
|
54
104
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
continue;
|
|
58
|
-
}
|
|
59
|
-
const action = actions.find((a) => a.name === selected);
|
|
60
|
-
if (!action) {
|
|
61
|
-
lastSelected = selected;
|
|
62
|
-
continue;
|
|
63
|
-
}
|
|
64
|
-
// 危险操作二次确认
|
|
65
|
-
if (action.dangerous) {
|
|
66
|
-
const confirmed = await confirmDangerous(action.name);
|
|
67
|
-
if (!confirmed) {
|
|
68
|
-
console.log('\n已取消操作。\n');
|
|
69
|
-
lastSelected = selected;
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
// 收集参数
|
|
74
|
-
const paramValues = await collectParams(action);
|
|
75
|
-
// 准备提示
|
|
76
|
-
console.log('');
|
|
77
|
-
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
78
|
-
console.log(` 📋 即将执行: ${action.name}`);
|
|
79
|
-
if (action.description) {
|
|
80
|
-
console.log(` ${action.description}`);
|
|
81
|
-
}
|
|
82
|
-
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
83
|
-
console.log('');
|
|
84
|
-
const ready = await confirm({
|
|
85
|
-
message: '确认开始执行?',
|
|
86
|
-
default: true,
|
|
87
|
-
});
|
|
88
|
-
if (!ready) {
|
|
89
|
-
console.log('\n已取消操作。\n');
|
|
90
|
-
lastSelected = selected;
|
|
105
|
+
const group = groups.find((g) => g.name === selected);
|
|
106
|
+
if (!group)
|
|
91
107
|
continue;
|
|
92
|
-
|
|
93
|
-
// 执行
|
|
94
|
-
console.log('');
|
|
95
|
-
const result = await runAction(action, paramValues);
|
|
96
|
-
// 显示结果
|
|
97
|
-
console.log('');
|
|
98
|
-
if (result.exitCode === 0) {
|
|
99
|
-
console.log('✅ 操作执行成功。');
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
console.log(`❌ 操作执行失败(退出码: ${result.exitCode ?? 'unknown'})。`);
|
|
103
|
-
}
|
|
104
|
-
// 返回菜单或退出
|
|
105
|
-
const next = await select({
|
|
106
|
-
message: '接下来:',
|
|
107
|
-
choices: [
|
|
108
|
-
{ name: '返回菜单', value: 'menu' },
|
|
109
|
-
{ name: '退出', value: 'exit' },
|
|
110
|
-
],
|
|
111
|
-
default: 'menu',
|
|
112
|
-
});
|
|
113
|
-
if (next === 'exit') {
|
|
114
|
-
process.exit(0);
|
|
115
|
-
}
|
|
116
|
-
lastSelected = selected;
|
|
108
|
+
await showGroupActions(group.name, group.label);
|
|
117
109
|
}
|
|
118
110
|
}
|
|
119
111
|
//# sourceMappingURL=menu.js.map
|
package/dist/menu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../src/menu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../src/menu.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.js
CHANGED
|
@@ -1,9 +1,37 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
2
3
|
import { fileURLToPath } from 'node:url';
|
|
3
4
|
import { dirname, join } from 'node:path';
|
|
4
5
|
import { detectNetwork } from './network.js';
|
|
5
6
|
const __filename = fileURLToPath(import.meta.url);
|
|
6
7
|
const __dirname = dirname(__filename);
|
|
8
|
+
/**
|
|
9
|
+
* 检查当前是否为 root 用户
|
|
10
|
+
*/
|
|
11
|
+
function isRoot() {
|
|
12
|
+
return process.getuid?.() === 0;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 检查系统中是否存在 sudo 命令
|
|
16
|
+
*/
|
|
17
|
+
function hasSudo() {
|
|
18
|
+
return existsSync('/usr/bin/sudo') || existsSync('/bin/sudo');
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 获取 sudo 前缀:
|
|
22
|
+
* - 已是 root → 不需要前缀
|
|
23
|
+
* - 非 root 但有 sudo → 返回 "sudo"
|
|
24
|
+
* - 非 root 且没有 sudo → 抛出错误,提示安装
|
|
25
|
+
*/
|
|
26
|
+
function requireSudo() {
|
|
27
|
+
if (isRoot())
|
|
28
|
+
return '';
|
|
29
|
+
if (hasSudo())
|
|
30
|
+
return 'sudo';
|
|
31
|
+
console.error('\n❌ 该操作需要 root 权限,但系统中未找到 sudo 命令。');
|
|
32
|
+
console.error(' 请先安装 sudo: apt install sudo / yum install sudo\n');
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
7
35
|
function resolveCommand(action, paramValues) {
|
|
8
36
|
let cmd = action.command;
|
|
9
37
|
if (action.type === 'remote' && action.urls) {
|
|
@@ -13,11 +41,18 @@ function resolveCommand(action, paramValues) {
|
|
|
13
41
|
}
|
|
14
42
|
if (action.type === 'local') {
|
|
15
43
|
const scriptPath = join(__dirname, 'scripts', action.command);
|
|
16
|
-
cmd = `
|
|
44
|
+
cmd = `bash "${scriptPath}"`;
|
|
17
45
|
}
|
|
18
46
|
for (const [key, value] of Object.entries(paramValues)) {
|
|
19
47
|
cmd = cmd.replace(`{${key}}`, value);
|
|
20
48
|
}
|
|
49
|
+
// 需要 root 权限的操作,自动加 sudo 前缀
|
|
50
|
+
if (action.needRoot) {
|
|
51
|
+
const sudo = requireSudo();
|
|
52
|
+
if (sudo) {
|
|
53
|
+
cmd = `${sudo} ${cmd}`;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
21
56
|
return cmd;
|
|
22
57
|
}
|
|
23
58
|
export function runAction(action, paramValues = {}) {
|
package/dist/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,SAAS,cAAc,CAAC,MAAc,EAAE,WAAmC;IACzE,IAAI,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;IAEzB,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;QAClF,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9D,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED