coolbox 0.1.0

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.
@@ -0,0 +1,3 @@
1
+ import type { Action, ActionGroup } from './types.js';
2
+ export declare const groups: ActionGroup[];
3
+ export declare const actions: Action[];
@@ -0,0 +1,51 @@
1
+ export const groups = [
2
+ { label: '🔧 įŗģįģŸįŽĄį†', name: 'system' },
3
+ { label: 'đŸŗ 厚器', name: 'container' },
4
+ { label: '🌐 įŊ‘įģœ', name: 'network' },
5
+ ];
6
+ export const actions = [
7
+ {
8
+ name: 'é‡čŖ… Linux įŗģįģŸ',
9
+ description: '通čŋ‡ bin456789/reinstall ä¸€é”Žé‡čŖ…æ“äŊœįŗģįģŸīŧˆå°†æ¸…įŠē所有数捎īŧ‰',
10
+ type: 'remote',
11
+ command: 'bash <(wget -qO- --no-check-certificate {url}) {os-name}',
12
+ group: 'system',
13
+ dangerous: true,
14
+ params: [
15
+ { name: 'os-name', message: 'č¯ˇčž“å…ĨčĻåŽ‰čŖ…įš„įŗģįģŸīŧˆåĻ‚ alpine-3.23, debian-13, ubuntu-26.04īŧ‰' },
16
+ ],
17
+ urls: {
18
+ domestic: 'https://cnb.cool/bin456789/reinstall/-/git/raw/main/reinstall.sh',
19
+ international: 'https://raw.githubusercontent.com/bin456789/reinstall/main/reinstall.sh',
20
+ },
21
+ },
22
+ {
23
+ name: '莞įŊŽ Swap',
24
+ description: '通čŋ‡ spiritLHLS/addswap 一键设įŊŽä礿ĸįŠē间',
25
+ type: 'remote',
26
+ command: 'sudo bash <(wget -qO- --no-check-certificate https://cdn.spiritlhl.net/https://raw.githubusercontent.com/spiritLHLS/addswap/main/addswap.sh)',
27
+ group: 'system',
28
+ },
29
+ {
30
+ name: '莞įŊŽįŗģįģŸå›Ŋ内镜像æē',
31
+ description: '通čŋ‡ LinuxMirrors 一锎更æĸįŗģįģŸčŊ¯äģļæē',
32
+ type: 'remote',
33
+ command: 'sudo bash <(curl -sSL https://linuxmirrors.cn/main.sh)',
34
+ group: 'system',
35
+ },
36
+ {
37
+ name: 'åŽ‰čŖ… Docker åšļ莞įŊŽå›Ŋ内镜像æē',
38
+ description: '通čŋ‡ LinuxMirrors ä¸€é”ŽåŽ‰čŖ… Docker åšļ配įŊŽå›Ŋ内镜像加速',
39
+ type: 'remote',
40
+ command: 'sudo bash <(curl -sSL https://linuxmirrors.cn/docker.sh)',
41
+ group: 'container',
42
+ },
43
+ {
44
+ name: 'åŧ€å¯ BBR',
45
+ description: 'åŧ€å¯ BBR æ‹ĨåĄžæŽ§åˆļįŽ—æŗ•äģĨ提升įŊ‘įģœäŧ čž“性čƒŊ',
46
+ type: 'local',
47
+ command: 'enable-bbr.sh',
48
+ group: 'network',
49
+ },
50
+ ];
51
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +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,8IAA8I;QACvJ,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,2BAA2B;QACxC,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,wDAAwD;QACjE,KAAK,EAAE,QAAQ;KAChB;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,uCAAuC;QACpD,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,0DAA0D;QACnE,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"}
@@ -0,0 +1 @@
1
+ export declare function confirmDangerous(actionName: string): Promise<boolean>;
@@ -0,0 +1,28 @@
1
+ import { confirm } from '@inquirer/prompts';
2
+ const WARNING_BANNER = `
3
+ âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸
4
+ âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸
5
+ âš ī¸ âš ī¸
6
+ âš ī¸ ██████╗ ██╗ ██╗███████╗██████╗ ███████╗ âš ī¸
7
+ âš ī¸ ██╔═══██╗██║ ██║██╔════╝██╔══██╗██╔════╝ âš ī¸
8
+ âš ī¸ ██║ ██║██║ ██║█████╗ ██████╔╝███████╗ âš ī¸
9
+ âš ī¸ ██║▄▄ ██║██║ ██║██╔══╝ ██╔══██╗╚════██║ âš ī¸
10
+ âš ī¸ ╚██████╔╝╚██████╔╝███████╗██║ ██║███████║ âš ī¸
11
+ âš ī¸ ╚══▀▀═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚══════╝ âš ī¸
12
+ âš ī¸ âš ī¸
13
+ âš ī¸ č¯Ĩ操äŊœä¸å¯é€†čŊŦīŧŒæ‰§čĄŒåŽæ•°æŽå°†æ— æŗ•æĸ复īŧ âš ī¸
14
+ âš ī¸ âš ī¸
15
+ âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸
16
+ âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸âš ī¸
17
+ `;
18
+ export async function confirmDangerous(actionName) {
19
+ console.clear();
20
+ console.log(WARNING_BANNER);
21
+ console.log(` åŗå°†æ‰§čĄŒ: ${actionName}\n`);
22
+ const answer = await confirm({
23
+ message: 'įĄŽčŽ¤æ‰§čĄŒæ­¤æ“äŊœå—īŧŸīŧˆčž“å…Ĩ y įĄŽčŽ¤īŧŒn 取æļˆīŧ‰',
24
+ default: false,
25
+ });
26
+ return answer;
27
+ }
28
+ //# sourceMappingURL=confirm.js.map
@@ -0,0 +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;;;;;;;;;;;;;;;CAetB,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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ import { showMenu } from './menu.js';
3
+ const VERSION = '0.1.0';
4
+ const BANNER = `
5
+ ╔═══════════════════════════════════╗
6
+ ║ ⚡ CoolBox (åŋĢåˇĨå…ˇįŽą) v${VERSION} ║
7
+ ║ Linux æœåŠĄå™¨čŋįģ´åˇĨå…ˇįŽą ║
8
+ ╚═══════════════════════════════════╝
9
+ `;
10
+ console.log(BANNER);
11
+ showMenu().catch((err) => {
12
+ console.error('å‘į”Ÿé”™č¯¯:', err);
13
+ process.exit(1);
14
+ });
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,MAAM,GAAG;;0BAEW,OAAO;;;CAGhC,CAAC;AAEF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAEpB,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACvB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/dist/menu.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare function showMenu(): Promise<void>;
package/dist/menu.js ADDED
@@ -0,0 +1,101 @@
1
+ import { select, input } from '@inquirer/prompts';
2
+ import { actions, groups } from './actions.js';
3
+ import { runAction } from './runner.js';
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
+ async function collectParams(action) {
28
+ const values = {};
29
+ if (!action.params)
30
+ return values;
31
+ for (const param of action.params) {
32
+ const value = await input({
33
+ message: param.message,
34
+ });
35
+ values[param.name] = value.trim();
36
+ }
37
+ return values;
38
+ }
39
+ export async function showMenu() {
40
+ const menuItems = buildMenuItems();
41
+ let lastSelected = menuItems.find((i) => !i.value.startsWith('__'))?.value ?? menuItems[0]?.value;
42
+ while (true) {
43
+ const selected = await select({
44
+ message: 'č¯ˇé€‰æ‹Šæ“äŊœ:',
45
+ choices: menuItems.map((item) => ({
46
+ name: item.name,
47
+ value: item.value,
48
+ description: item.description,
49
+ })),
50
+ default: lastSelected,
51
+ });
52
+ if (selected === '__exit__') {
53
+ process.exit(0);
54
+ }
55
+ if (selected.startsWith('__group__')) {
56
+ lastSelected = selected;
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
+ const result = await runAction(action, paramValues);
78
+ // 昞į¤ēį쓿žœ
79
+ console.log('');
80
+ if (result.exitCode === 0) {
81
+ console.log('✅ 操äŊœæ‰§čĄŒæˆåŠŸã€‚');
82
+ }
83
+ else {
84
+ console.log(`❌ 操äŊœæ‰§čĄŒå¤ąč´Ĩīŧˆé€€å‡ē᠁: ${result.exitCode ?? 'unknown'}īŧ‰ã€‚`);
85
+ }
86
+ // čŋ”å›žčœå•æˆ–é€€å‡ē
87
+ const next = await select({
88
+ message: 'æŽĨ下æĨ:',
89
+ choices: [
90
+ { name: 'čŋ”å›žčœå•', value: 'menu' },
91
+ { name: '退å‡ē', value: 'exit' },
92
+ ],
93
+ default: 'menu',
94
+ });
95
+ if (next === 'exit') {
96
+ process.exit(0);
97
+ }
98
+ lastSelected = selected;
99
+ }
100
+ }
101
+ //# sourceMappingURL=menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.js","sourceRoot":"","sources":["../src/menu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { NetworkEnv } from './types.js';
2
+ export declare function detectNetwork(): NetworkEnv;
@@ -0,0 +1,17 @@
1
+ import { execSync } from 'node:child_process';
2
+ let cachedEnv = null;
3
+ export function detectNetwork() {
4
+ if (cachedEnv)
5
+ return cachedEnv;
6
+ try {
7
+ execSync('curl -s --connect-timeout 3 https://www.google.com > /dev/null 2>&1', {
8
+ timeout: 5000,
9
+ });
10
+ cachedEnv = 'international';
11
+ }
12
+ catch {
13
+ cachedEnv = 'domestic';
14
+ }
15
+ return cachedEnv;
16
+ }
17
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,IAAI,SAAS,GAAsB,IAAI,CAAC;AAExC,MAAM,UAAU,aAAa;IAC3B,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAEhC,IAAI,CAAC;QACH,QAAQ,CAAC,qEAAqE,EAAE;YAC9E,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,SAAS,GAAG,eAAe,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,GAAG,UAAU,CAAC;IACzB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Action, RunResult } from './types.js';
2
+ export declare function runAction(action: Action, paramValues?: Record<string, string>): Promise<RunResult>;
package/dist/runner.js ADDED
@@ -0,0 +1,38 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { dirname, join } from 'node:path';
4
+ import { detectNetwork } from './network.js';
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = dirname(__filename);
7
+ function resolveCommand(action, paramValues) {
8
+ let cmd = action.command;
9
+ if (action.type === 'remote' && action.urls) {
10
+ const env = detectNetwork();
11
+ const url = env === 'domestic' ? action.urls.domestic : action.urls.international;
12
+ cmd = cmd.replace('{url}', url);
13
+ }
14
+ if (action.type === 'local') {
15
+ const scriptPath = join(__dirname, 'scripts', action.command);
16
+ cmd = `sudo bash "${scriptPath}"`;
17
+ }
18
+ for (const [key, value] of Object.entries(paramValues)) {
19
+ cmd = cmd.replace(`{${key}}`, value);
20
+ }
21
+ return cmd;
22
+ }
23
+ export function runAction(action, paramValues = {}) {
24
+ const cmd = resolveCommand(action, paramValues);
25
+ return new Promise((resolve) => {
26
+ const child = spawn('bash', ['-c', cmd], {
27
+ stdio: 'inherit',
28
+ });
29
+ child.on('close', (code, signal) => {
30
+ resolve({ exitCode: code, signal });
31
+ });
32
+ child.on('error', (err) => {
33
+ console.error(`\næ‰§čĄŒå¤ąč´Ĩ: ${err.message}`);
34
+ resolve({ exitCode: 1, signal: null });
35
+ });
36
+ });
37
+ }
38
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +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,cAAc,UAAU,GAAG,CAAC;IACpC,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACvD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,MAAc,EACd,cAAsC,EAAE;IAExC,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEhD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;YACvC,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACjC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,54 @@
1
+ #!/bin/bash
2
+ # åŧ€å¯ BBR æ‹ĨåĄžæŽ§åˆļįŽ—æŗ•
3
+
4
+ set -e
5
+
6
+ # æŖ€æŸĨ是åĻä¸ē root
7
+ if [ "$EUID" -ne 0 ]; then
8
+ echo "蝎äŊŋᔍ sudo čŋčĄŒæ­¤č„šæœŦ"
9
+ exit 1
10
+ fi
11
+
12
+ # æŖ€æŸĨå†…æ ¸į‰ˆæœŦ
13
+ kernel_version=$(uname -r | cut -d. -f1-2)
14
+ kernel_major=$(echo "$kernel_version" | cut -d. -f1)
15
+ kernel_minor=$(echo "$kernel_version" | cut -d. -f2)
16
+
17
+ if [ "$kernel_major" -lt 4 ] || { [ "$kernel_major" -eq 4 ] && [ "$kernel_minor" -lt 9 ]; }; then
18
+ echo "错蝝: BBR 需čĻå†…æ ¸į‰ˆæœŦ >= 4.9īŧŒåŊ“前内核: $(uname -r)"
19
+ exit 1
20
+ fi
21
+
22
+ # æŖ€æŸĨ是åĻ厞åŧ€å¯
23
+ current_cc=$(sysctl -n net.ipv4.tcp_congestion_control 2>/dev/null || echo "")
24
+ if [ "$current_cc" = "bbr" ]; then
25
+ echo "BBR 厞įģåŧ€å¯īŧŒæ— éœ€é‡å¤æ“äŊœã€‚"
26
+ exit 0
27
+ fi
28
+
29
+ echo "æ­Ŗåœ¨åŧ€å¯ BBR..."
30
+
31
+ # 加čŊŊ BBR æ¨Ąå—
32
+ echo "tcp_bbr" >> /etc/modules 2>/dev/null || true
33
+ modprobe tcp_bbr 2>/dev/null || true
34
+
35
+ # 写å…Ĩ sysctl 配įŊŽ
36
+ grep -q "net.ipv4.tcp_congestion_control=bbr" /etc/sysctl.conf 2>/dev/null || \
37
+ echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
38
+
39
+ grep -q "net.core.default_qdisc=fq" /etc/sysctl.conf 2>/dev/null || \
40
+ echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
41
+
42
+ # åē”į”¨é…įŊŽ
43
+ sysctl -p > /dev/null 2>&1 || sysctl --system > /dev/null 2>&1
44
+
45
+ # énj蝁
46
+ new_cc=$(sysctl -n net.ipv4.tcp_congestion_control 2>/dev/null || echo "")
47
+ if [ "$new_cc" = "bbr" ]; then
48
+ echo "✅ BBR åˇ˛æˆåŠŸåŧ€å¯īŧ"
49
+ echo " åŊ“前æ‹ĨåĄžæŽ§åˆļįŽ—æŗ•: $(sysctl -n net.ipv4.tcp_congestion_control)"
50
+ echo " åŊ“å‰é˜Ÿåˆ—č°ƒåēĻįŽ—æŗ•: $(sysctl -n net.core.default_qdisc)"
51
+ else
52
+ echo "❌ BBR åŧ€å¯å¯čƒŊæœĒ成功īŧŒč¯ˇæ‰‹åŠ¨æŖ€æŸĨ。"
53
+ echo " åŊ“前æ‹ĨåĄžæŽ§åˆļįŽ—æŗ•: $new_cc"
54
+ fi
@@ -0,0 +1,28 @@
1
+ export interface ActionParam {
2
+ name: string;
3
+ message: string;
4
+ }
5
+ export interface ActionUrls {
6
+ domestic: string;
7
+ international: string;
8
+ }
9
+ export interface Action {
10
+ name: string;
11
+ description: string;
12
+ type: 'remote' | 'local';
13
+ /** remote: shell å‘Ŋä줿¨Ąæŋ; local: 脚æœŦ文äģļ名 */
14
+ command: string;
15
+ group: string;
16
+ dangerous?: boolean;
17
+ params?: ActionParam[];
18
+ urls?: ActionUrls;
19
+ }
20
+ export interface ActionGroup {
21
+ label: string;
22
+ name: string;
23
+ }
24
+ export type NetworkEnv = 'domestic' | 'international';
25
+ export interface RunResult {
26
+ exitCode: number | null;
27
+ signal: string | null;
28
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/index.mjs ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import('./dist/index.js');
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "coolbox",
3
+ "version": "0.1.0",
4
+ "description": "Quick Tool Box - Linux æœåŠĄå™¨čŋįģ´åˇĨå…ˇįŽą",
5
+ "type": "module",
6
+ "bin": {
7
+ "coolbox": "index.mjs"
8
+ },
9
+ "files": [
10
+ "dist/",
11
+ "index.mjs"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc && mkdir -p dist/scripts && cp scripts/* dist/scripts/",
15
+ "prepublishOnly": "npm run build"
16
+ },
17
+ "keywords": [
18
+ "linux",
19
+ "vps",
20
+ "server",
21
+ "toolkit",
22
+ "operations",
23
+ "docker",
24
+ "bbr",
25
+ "swap",
26
+ "mirror"
27
+ ],
28
+ "author": "",
29
+ "license": "MIT",
30
+ "dependencies": {
31
+ "@inquirer/prompts": "^7.0.0"
32
+ },
33
+ "devDependencies": {
34
+ "@types/node": "^22.0.0",
35
+ "typescript": "^5.7.0"
36
+ },
37
+ "engines": {
38
+ "node": ">=14.0.0"
39
+ }
40
+ }