@minecraft-docker/mcctl 1.5.0 → 1.6.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/application/index.d.ts +2 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +5 -0
- package/dist/application/index.js.map +1 -0
- package/dist/commands/backup.d.ts +16 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +182 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/ban.d.ts +14 -0
- package/dist/commands/ban.d.ts.map +1 -0
- package/dist/commands/ban.js +418 -0
- package/dist/commands/ban.js.map +1 -0
- package/dist/commands/config.d.ts +18 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +106 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/create.d.ts +22 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +83 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/delete.d.ts +17 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +71 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/exec.d.ts +10 -0
- package/dist/commands/exec.d.ts.map +1 -0
- package/dist/commands/exec.js +29 -0
- package/dist/commands/exec.js.map +1 -0
- package/dist/commands/index.d.ts +18 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +18 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +186 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/kick.d.ts +12 -0
- package/dist/commands/kick.d.ts.map +1 -0
- package/dist/commands/kick.js +71 -0
- package/dist/commands/kick.js.map +1 -0
- package/dist/commands/migrate.d.ts +18 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +470 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/op.d.ts +12 -0
- package/dist/commands/op.d.ts.map +1 -0
- package/dist/commands/op.js +220 -0
- package/dist/commands/op.js.map +1 -0
- package/dist/commands/player-online.d.ts +11 -0
- package/dist/commands/player-online.d.ts.map +1 -0
- package/dist/commands/player-online.js +151 -0
- package/dist/commands/player-online.js.map +1 -0
- package/dist/commands/player.d.ts +18 -0
- package/dist/commands/player.d.ts.map +1 -0
- package/dist/commands/player.js +352 -0
- package/dist/commands/player.js.map +1 -0
- package/dist/commands/server-backup.d.ts +36 -0
- package/dist/commands/server-backup.d.ts.map +1 -0
- package/dist/commands/server-backup.js +320 -0
- package/dist/commands/server-backup.js.map +1 -0
- package/dist/commands/server-restore.d.ts +13 -0
- package/dist/commands/server-restore.d.ts.map +1 -0
- package/dist/commands/server-restore.js +294 -0
- package/dist/commands/server-restore.js.map +1 -0
- package/dist/commands/status.d.ts +13 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +325 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/whitelist.d.ts +12 -0
- package/dist/commands/whitelist.d.ts.map +1 -0
- package/dist/commands/whitelist.js +316 -0
- package/dist/commands/whitelist.js.map +1 -0
- package/dist/commands/world.d.ts +16 -0
- package/dist/commands/world.d.ts.map +1 -0
- package/dist/commands/world.js +135 -0
- package/dist/commands/world.js.map +1 -0
- package/dist/domain/index.d.ts +2 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +7 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +609 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts +29 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.js +419 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/index.d.ts +3 -0
- package/dist/infrastructure/adapters/index.d.ts.map +1 -0
- package/dist/infrastructure/adapters/index.js +5 -0
- package/dist/infrastructure/adapters/index.js.map +1 -0
- package/dist/infrastructure/di/container.d.ts +47 -0
- package/dist/infrastructure/di/container.d.ts.map +1 -0
- package/dist/infrastructure/di/container.js +140 -0
- package/dist/infrastructure/di/container.js.map +1 -0
- package/dist/infrastructure/di/index.d.ts +2 -0
- package/dist/infrastructure/di/index.d.ts.map +1 -0
- package/dist/infrastructure/di/index.js +2 -0
- package/dist/infrastructure/di/index.js.map +1 -0
- package/dist/infrastructure/index.d.ts +4 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +7 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/lib/mojang-api.d.ts +51 -0
- package/dist/lib/mojang-api.d.ts.map +1 -0
- package/dist/lib/mojang-api.js +136 -0
- package/dist/lib/mojang-api.js.map +1 -0
- package/dist/lib/player-cache.d.ts +79 -0
- package/dist/lib/player-cache.d.ts.map +1 -0
- package/dist/lib/player-cache.js +302 -0
- package/dist/lib/player-cache.js.map +1 -0
- package/dist/lib/player-json.d.ts +69 -0
- package/dist/lib/player-json.d.ts.map +1 -0
- package/dist/lib/player-json.js +96 -0
- package/dist/lib/player-json.js.map +1 -0
- package/dist/lib/prompts/action-select.d.ts +23 -0
- package/dist/lib/prompts/action-select.d.ts.map +1 -0
- package/dist/lib/prompts/action-select.js +124 -0
- package/dist/lib/prompts/action-select.js.map +1 -0
- package/dist/lib/prompts/index.d.ts +7 -0
- package/dist/lib/prompts/index.d.ts.map +1 -0
- package/dist/lib/prompts/index.js +7 -0
- package/dist/lib/prompts/index.js.map +1 -0
- package/dist/lib/prompts/player-select.d.ts +25 -0
- package/dist/lib/prompts/player-select.d.ts.map +1 -0
- package/dist/lib/prompts/player-select.js +122 -0
- package/dist/lib/prompts/player-select.js.map +1 -0
- package/dist/lib/prompts/server-select.d.ts +26 -0
- package/dist/lib/prompts/server-select.d.ts.map +1 -0
- package/dist/lib/prompts/server-select.js +99 -0
- package/dist/lib/prompts/server-select.js.map +1 -0
- package/dist/lib/rcon.d.ts +53 -0
- package/dist/lib/rcon.d.ts.map +1 -0
- package/dist/lib/rcon.js +131 -0
- package/dist/lib/rcon.js.map +1 -0
- package/dist/lib/shell.d.ts +109 -0
- package/dist/lib/shell.d.ts.map +1 -0
- package/dist/lib/shell.js +318 -0
- package/dist/lib/shell.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result of an RCON command execution
|
|
3
|
+
*/
|
|
4
|
+
export interface RconResult {
|
|
5
|
+
code: number;
|
|
6
|
+
output: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Check if a Docker container is running
|
|
10
|
+
*/
|
|
11
|
+
export declare function isContainerRunning(containerName: string): Promise<boolean>;
|
|
12
|
+
/**
|
|
13
|
+
* Execute RCON command and capture output
|
|
14
|
+
*/
|
|
15
|
+
export declare function execRconWithOutput(containerName: string, command: string[]): Promise<RconResult>;
|
|
16
|
+
/**
|
|
17
|
+
* Get container name from server name
|
|
18
|
+
* Ensures the container name has the 'mc-' prefix
|
|
19
|
+
*/
|
|
20
|
+
export declare function getContainerName(serverName: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Online players result
|
|
23
|
+
*/
|
|
24
|
+
export interface OnlinePlayersResult {
|
|
25
|
+
count: number;
|
|
26
|
+
maxPlayers: number;
|
|
27
|
+
players: string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get online players from a server
|
|
31
|
+
*/
|
|
32
|
+
export declare function getOnlinePlayers(containerName: string): Promise<OnlinePlayersResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Get online player count (shortcut)
|
|
35
|
+
*/
|
|
36
|
+
export declare function getOnlinePlayerCount(containerName: string): Promise<number>;
|
|
37
|
+
/**
|
|
38
|
+
* Check if a player is online on a specific server
|
|
39
|
+
*/
|
|
40
|
+
export declare function isPlayerOnline(containerName: string, playerName: string): Promise<boolean>;
|
|
41
|
+
/**
|
|
42
|
+
* Check if player is whitelisted
|
|
43
|
+
*/
|
|
44
|
+
export declare function isPlayerWhitelisted(containerName: string, playerName: string): Promise<boolean>;
|
|
45
|
+
/**
|
|
46
|
+
* Check if player is an operator
|
|
47
|
+
*/
|
|
48
|
+
export declare function isPlayerOperator(containerName: string, playerName: string): Promise<boolean>;
|
|
49
|
+
/**
|
|
50
|
+
* Check if player is banned
|
|
51
|
+
*/
|
|
52
|
+
export declare function isPlayerBanned(containerName: string, playerName: string): Promise<boolean>;
|
|
53
|
+
//# sourceMappingURL=rcon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rcon.d.ts","sourceRoot":"","sources":["../../src/lib/rcon.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBhF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,UAAU,CAAC,CAyBrB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA0B1F;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGjF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGhG;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAerG;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAWlG;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAShG"}
|
package/dist/lib/rcon.js
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Check if a Docker container is running
|
|
4
|
+
*/
|
|
5
|
+
export async function isContainerRunning(containerName) {
|
|
6
|
+
return new Promise((resolve) => {
|
|
7
|
+
const child = spawn('docker', ['inspect', '-f', '{{.State.Running}}', containerName], {
|
|
8
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
9
|
+
});
|
|
10
|
+
let output = '';
|
|
11
|
+
child.stdout.on('data', (data) => {
|
|
12
|
+
output += data.toString();
|
|
13
|
+
});
|
|
14
|
+
child.on('close', (code) => {
|
|
15
|
+
resolve(code === 0 && output.trim() === 'true');
|
|
16
|
+
});
|
|
17
|
+
child.on('error', () => {
|
|
18
|
+
resolve(false);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Execute RCON command and capture output
|
|
24
|
+
*/
|
|
25
|
+
export async function execRconWithOutput(containerName, command) {
|
|
26
|
+
return new Promise((resolve) => {
|
|
27
|
+
const child = spawn('docker', ['exec', containerName, 'rcon-cli', ...command], {
|
|
28
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
29
|
+
});
|
|
30
|
+
let output = '';
|
|
31
|
+
let errorOutput = '';
|
|
32
|
+
child.stdout.on('data', (data) => {
|
|
33
|
+
output += data.toString();
|
|
34
|
+
});
|
|
35
|
+
child.stderr.on('data', (data) => {
|
|
36
|
+
errorOutput += data.toString();
|
|
37
|
+
});
|
|
38
|
+
child.on('close', (code) => {
|
|
39
|
+
resolve({ code: code ?? 1, output: output || errorOutput });
|
|
40
|
+
});
|
|
41
|
+
child.on('error', (err) => {
|
|
42
|
+
resolve({ code: 1, output: err.message });
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get container name from server name
|
|
48
|
+
* Ensures the container name has the 'mc-' prefix
|
|
49
|
+
*/
|
|
50
|
+
export function getContainerName(serverName) {
|
|
51
|
+
return serverName.startsWith('mc-') ? serverName : `mc-${serverName}`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get online players from a server
|
|
55
|
+
*/
|
|
56
|
+
export async function getOnlinePlayers(containerName) {
|
|
57
|
+
const result = await execRconWithOutput(containerName, ['list']);
|
|
58
|
+
if (result.code !== 0) {
|
|
59
|
+
return { count: 0, maxPlayers: 0, players: [] };
|
|
60
|
+
}
|
|
61
|
+
// Parse output: "There are X of a max Y players online: player1, player2, player3"
|
|
62
|
+
// or "There are 0 of a max Y players online:"
|
|
63
|
+
const match = result.output.match(/There are (\d+) of a max (\d+) players online:?\s*(.*)?/i);
|
|
64
|
+
if (!match) {
|
|
65
|
+
return { count: 0, maxPlayers: 0, players: [] };
|
|
66
|
+
}
|
|
67
|
+
const countStr = match[1];
|
|
68
|
+
const maxStr = match[2];
|
|
69
|
+
const count = countStr ? parseInt(countStr, 10) : 0;
|
|
70
|
+
const maxPlayers = maxStr ? parseInt(maxStr, 10) : 0;
|
|
71
|
+
const playerList = match[3]?.trim();
|
|
72
|
+
const players = playerList
|
|
73
|
+
? playerList.split(',').map(p => p.trim()).filter(Boolean)
|
|
74
|
+
: [];
|
|
75
|
+
return { count, maxPlayers, players };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get online player count (shortcut)
|
|
79
|
+
*/
|
|
80
|
+
export async function getOnlinePlayerCount(containerName) {
|
|
81
|
+
const result = await getOnlinePlayers(containerName);
|
|
82
|
+
return result.count;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Check if a player is online on a specific server
|
|
86
|
+
*/
|
|
87
|
+
export async function isPlayerOnline(containerName, playerName) {
|
|
88
|
+
const result = await getOnlinePlayers(containerName);
|
|
89
|
+
return result.players.some(p => p.toLowerCase() === playerName.toLowerCase());
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Check if player is whitelisted
|
|
93
|
+
*/
|
|
94
|
+
export async function isPlayerWhitelisted(containerName, playerName) {
|
|
95
|
+
const result = await execRconWithOutput(containerName, ['whitelist', 'list']);
|
|
96
|
+
if (result.code !== 0) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
// Parse output: "There are X whitelisted players: player1, player2"
|
|
100
|
+
const players = result.output
|
|
101
|
+
.split(':')[1]
|
|
102
|
+
?.split(',')
|
|
103
|
+
.map(p => p.trim().toLowerCase())
|
|
104
|
+
.filter(Boolean) ?? [];
|
|
105
|
+
return players.includes(playerName.toLowerCase());
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Check if player is an operator
|
|
109
|
+
*/
|
|
110
|
+
export async function isPlayerOperator(containerName, playerName) {
|
|
111
|
+
const result = await execRconWithOutput(containerName, ['op', 'list']);
|
|
112
|
+
if (result.code !== 0) {
|
|
113
|
+
// Try alternative: read ops.json parsing would need file access
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
// Parse output varies by server, try common format
|
|
117
|
+
const output = result.output.toLowerCase();
|
|
118
|
+
return output.includes(playerName.toLowerCase());
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Check if player is banned
|
|
122
|
+
*/
|
|
123
|
+
export async function isPlayerBanned(containerName, playerName) {
|
|
124
|
+
const result = await execRconWithOutput(containerName, ['banlist', 'players']);
|
|
125
|
+
if (result.code !== 0) {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
const output = result.output.toLowerCase();
|
|
129
|
+
return output.includes(playerName.toLowerCase());
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=rcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rcon.js","sourceRoot":"","sources":["../../src/lib/rcon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Paths } from '@minecraft-docker/shared';
|
|
2
|
+
export interface ShellExecutorOptions {
|
|
3
|
+
paths?: Paths;
|
|
4
|
+
sudoPassword?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Shell script executor with environment variable injection
|
|
8
|
+
*/
|
|
9
|
+
export declare class ShellExecutor {
|
|
10
|
+
private readonly paths;
|
|
11
|
+
private readonly env;
|
|
12
|
+
private readonly sudoPassword?;
|
|
13
|
+
constructor(pathsOrOptions?: Paths | ShellExecutorOptions);
|
|
14
|
+
private buildEnv;
|
|
15
|
+
/**
|
|
16
|
+
* Get script path and validate existence
|
|
17
|
+
*/
|
|
18
|
+
private getScriptPath;
|
|
19
|
+
/**
|
|
20
|
+
* Execute a script and return the result
|
|
21
|
+
*/
|
|
22
|
+
exec(script: string, args?: string[]): Promise<number>;
|
|
23
|
+
/**
|
|
24
|
+
* Execute a script interactively (with inherited stdio)
|
|
25
|
+
*/
|
|
26
|
+
execInteractive(script: string, args?: string[]): Promise<number>;
|
|
27
|
+
/**
|
|
28
|
+
* Execute mcctl.sh with arguments
|
|
29
|
+
*/
|
|
30
|
+
mcctl(args: string[]): Promise<number>;
|
|
31
|
+
/**
|
|
32
|
+
* Create a new server
|
|
33
|
+
*/
|
|
34
|
+
createServer(name: string, options?: string[]): Promise<number>;
|
|
35
|
+
/**
|
|
36
|
+
* Delete a server
|
|
37
|
+
*/
|
|
38
|
+
deleteServer(name: string, options?: string[]): Promise<number>;
|
|
39
|
+
/**
|
|
40
|
+
* View logs
|
|
41
|
+
*/
|
|
42
|
+
logs(server: string, options?: string[]): Promise<number>;
|
|
43
|
+
/**
|
|
44
|
+
* Lock operations
|
|
45
|
+
*/
|
|
46
|
+
lock(args: string[]): Promise<number>;
|
|
47
|
+
/**
|
|
48
|
+
* Player lookup
|
|
49
|
+
*/
|
|
50
|
+
player(args: string[]): Promise<number>;
|
|
51
|
+
/**
|
|
52
|
+
* Backup operations
|
|
53
|
+
*/
|
|
54
|
+
backup(args: string[]): Promise<number>;
|
|
55
|
+
/**
|
|
56
|
+
* Run init.sh (for Docker/network setup)
|
|
57
|
+
*/
|
|
58
|
+
initPlatform(options?: string[]): Promise<number>;
|
|
59
|
+
/**
|
|
60
|
+
* Execute docker compose command
|
|
61
|
+
*/
|
|
62
|
+
dockerCompose(args: string[]): Promise<number>;
|
|
63
|
+
/**
|
|
64
|
+
* Get server config.env path
|
|
65
|
+
*/
|
|
66
|
+
getConfigPath(server: string): string;
|
|
67
|
+
/**
|
|
68
|
+
* Read server config.env as key-value pairs
|
|
69
|
+
*/
|
|
70
|
+
readConfig(server: string): Record<string, string> | null;
|
|
71
|
+
/**
|
|
72
|
+
* Write a config value to server's config.env
|
|
73
|
+
* Preserves comments and formatting
|
|
74
|
+
*/
|
|
75
|
+
writeConfigValue(server: string, key: string, value: string): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Execute RCON command on a server
|
|
78
|
+
*/
|
|
79
|
+
execRcon(server: string, command: string[]): Promise<number>;
|
|
80
|
+
/**
|
|
81
|
+
* Start all infrastructure (router + all servers)
|
|
82
|
+
*/
|
|
83
|
+
up(): Promise<number>;
|
|
84
|
+
/**
|
|
85
|
+
* Stop all infrastructure
|
|
86
|
+
*/
|
|
87
|
+
down(): Promise<number>;
|
|
88
|
+
/**
|
|
89
|
+
* Start all Minecraft servers (not router)
|
|
90
|
+
*/
|
|
91
|
+
startAll(): Promise<number>;
|
|
92
|
+
/**
|
|
93
|
+
* Stop all Minecraft servers (not router)
|
|
94
|
+
*/
|
|
95
|
+
stopAll(): Promise<number>;
|
|
96
|
+
/**
|
|
97
|
+
* Start mc-router only
|
|
98
|
+
*/
|
|
99
|
+
routerStart(): Promise<number>;
|
|
100
|
+
/**
|
|
101
|
+
* Stop mc-router only
|
|
102
|
+
*/
|
|
103
|
+
routerStop(): Promise<number>;
|
|
104
|
+
/**
|
|
105
|
+
* Restart mc-router
|
|
106
|
+
*/
|
|
107
|
+
routerRestart(): Promise<number>;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/lib/shell.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAA0C,MAAM,0BAA0B,CAAC;AAEzF,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyB;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;gBAE3B,cAAc,CAAC,EAAE,KAAK,GAAG,oBAAoB;IAczD,OAAO,CAAC,QAAQ;IAkBhB;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAQhE;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAO3E;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5C;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAIzE;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAIzE;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAInE;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3C;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7C;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7C;;OAEG;IACG,YAAY,CAAC,OAAO,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBpD;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAKrC;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IA0BzD;;;OAGG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAiCrE;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBlE;;OAEG;IACG,EAAE,IAAI,OAAO,CAAC,MAAM,CAAC;IAK3B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAkB7B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAuBjC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAuBhC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAKpC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAKnC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;CAIvC"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
|
+
import { Paths, execScript, execScriptInteractive, log } from '@minecraft-docker/shared';
|
|
5
|
+
/**
|
|
6
|
+
* Shell script executor with environment variable injection
|
|
7
|
+
*/
|
|
8
|
+
export class ShellExecutor {
|
|
9
|
+
paths;
|
|
10
|
+
env;
|
|
11
|
+
sudoPassword;
|
|
12
|
+
constructor(pathsOrOptions) {
|
|
13
|
+
if (pathsOrOptions instanceof Paths) {
|
|
14
|
+
this.paths = pathsOrOptions;
|
|
15
|
+
this.sudoPassword = undefined;
|
|
16
|
+
}
|
|
17
|
+
else if (pathsOrOptions) {
|
|
18
|
+
this.paths = pathsOrOptions.paths ?? new Paths();
|
|
19
|
+
this.sudoPassword = pathsOrOptions.sudoPassword;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
this.paths = new Paths();
|
|
23
|
+
this.sudoPassword = undefined;
|
|
24
|
+
}
|
|
25
|
+
this.env = this.buildEnv();
|
|
26
|
+
}
|
|
27
|
+
buildEnv() {
|
|
28
|
+
const env = {
|
|
29
|
+
MCCTL_ROOT: this.paths.root,
|
|
30
|
+
MCCTL_TEMPLATES: this.paths.templates,
|
|
31
|
+
MCCTL_SCRIPTS: this.paths.scripts,
|
|
32
|
+
};
|
|
33
|
+
// Support MCCTL_SUDO_PASSWORD from:
|
|
34
|
+
// 1. Constructor option (--sudo-password CLI flag)
|
|
35
|
+
// 2. Environment variable (for automation)
|
|
36
|
+
const sudoPassword = this.sudoPassword ?? process.env.MCCTL_SUDO_PASSWORD;
|
|
37
|
+
if (sudoPassword) {
|
|
38
|
+
env.MCCTL_SUDO_PASSWORD = sudoPassword;
|
|
39
|
+
}
|
|
40
|
+
return env;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get script path and validate existence
|
|
44
|
+
*/
|
|
45
|
+
getScriptPath(script) {
|
|
46
|
+
const scriptPath = join(this.paths.scripts, script);
|
|
47
|
+
if (!existsSync(scriptPath)) {
|
|
48
|
+
log.error(`Script not found: ${scriptPath}`);
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return scriptPath;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Execute a script and return the result
|
|
55
|
+
*/
|
|
56
|
+
async exec(script, args = []) {
|
|
57
|
+
const scriptPath = this.getScriptPath(script);
|
|
58
|
+
if (!scriptPath)
|
|
59
|
+
return 1;
|
|
60
|
+
const result = await execScript(scriptPath, args, this.env);
|
|
61
|
+
return result.code;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Execute a script interactively (with inherited stdio)
|
|
65
|
+
*/
|
|
66
|
+
async execInteractive(script, args = []) {
|
|
67
|
+
const scriptPath = this.getScriptPath(script);
|
|
68
|
+
if (!scriptPath)
|
|
69
|
+
return 1;
|
|
70
|
+
return execScriptInteractive(scriptPath, args, this.env);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Execute mcctl.sh with arguments
|
|
74
|
+
*/
|
|
75
|
+
async mcctl(args) {
|
|
76
|
+
return this.execInteractive('mcctl.sh', args);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create a new server
|
|
80
|
+
*/
|
|
81
|
+
async createServer(name, options = []) {
|
|
82
|
+
return this.execInteractive('create-server.sh', [name, ...options]);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Delete a server
|
|
86
|
+
*/
|
|
87
|
+
async deleteServer(name, options = []) {
|
|
88
|
+
return this.execInteractive('delete-server.sh', [name, ...options]);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* View logs
|
|
92
|
+
*/
|
|
93
|
+
async logs(server, options = []) {
|
|
94
|
+
return this.execInteractive('logs.sh', [server, ...options]);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Lock operations
|
|
98
|
+
*/
|
|
99
|
+
async lock(args) {
|
|
100
|
+
return this.execInteractive('lock.sh', args);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Player lookup
|
|
104
|
+
*/
|
|
105
|
+
async player(args) {
|
|
106
|
+
return this.execInteractive('player.sh', args);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Backup operations
|
|
110
|
+
*/
|
|
111
|
+
async backup(args) {
|
|
112
|
+
return this.execInteractive('backup.sh', args);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Run init.sh (for Docker/network setup)
|
|
116
|
+
*/
|
|
117
|
+
async initPlatform(options = []) {
|
|
118
|
+
return this.execInteractive('init.sh', options);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Execute docker compose command
|
|
122
|
+
*/
|
|
123
|
+
async dockerCompose(args) {
|
|
124
|
+
return new Promise((resolve) => {
|
|
125
|
+
const child = spawn('docker', ['compose', ...args], {
|
|
126
|
+
cwd: this.paths.root,
|
|
127
|
+
stdio: 'inherit',
|
|
128
|
+
env: { ...process.env, ...this.env },
|
|
129
|
+
});
|
|
130
|
+
child.on('close', (code) => {
|
|
131
|
+
resolve(code ?? 0);
|
|
132
|
+
});
|
|
133
|
+
child.on('error', (err) => {
|
|
134
|
+
log.error(`Failed to execute docker compose: ${err.message}`);
|
|
135
|
+
resolve(1);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get server config.env path
|
|
141
|
+
*/
|
|
142
|
+
getConfigPath(server) {
|
|
143
|
+
const serverName = server.startsWith('mc-') ? server.slice(3) : server;
|
|
144
|
+
return join(this.paths.servers, serverName, 'config.env');
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Read server config.env as key-value pairs
|
|
148
|
+
*/
|
|
149
|
+
readConfig(server) {
|
|
150
|
+
const configPath = this.getConfigPath(server);
|
|
151
|
+
if (!existsSync(configPath)) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
155
|
+
const config = {};
|
|
156
|
+
for (const line of content.split('\n')) {
|
|
157
|
+
const trimmed = line.trim();
|
|
158
|
+
// Skip empty lines and comments
|
|
159
|
+
if (!trimmed || trimmed.startsWith('#')) {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/);
|
|
163
|
+
if (match) {
|
|
164
|
+
const [, key, value] = match;
|
|
165
|
+
// Remove surrounding quotes if present
|
|
166
|
+
config[key] = value.replace(/^["']|["']$/g, '');
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return config;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Write a config value to server's config.env
|
|
173
|
+
* Preserves comments and formatting
|
|
174
|
+
*/
|
|
175
|
+
writeConfigValue(server, key, value) {
|
|
176
|
+
const configPath = this.getConfigPath(server);
|
|
177
|
+
if (!existsSync(configPath)) {
|
|
178
|
+
log.error(`Config file not found: ${configPath}`);
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
182
|
+
const lines = content.split('\n');
|
|
183
|
+
let found = false;
|
|
184
|
+
const updatedLines = lines.map((line) => {
|
|
185
|
+
const trimmed = line.trim();
|
|
186
|
+
if (trimmed.startsWith('#') || !trimmed) {
|
|
187
|
+
return line;
|
|
188
|
+
}
|
|
189
|
+
const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)=/);
|
|
190
|
+
if (match && match[1] === key) {
|
|
191
|
+
found = true;
|
|
192
|
+
return `${key}=${value}`;
|
|
193
|
+
}
|
|
194
|
+
return line;
|
|
195
|
+
});
|
|
196
|
+
// If key not found, add it at the end
|
|
197
|
+
if (!found) {
|
|
198
|
+
updatedLines.push(`${key}=${value}`);
|
|
199
|
+
}
|
|
200
|
+
writeFileSync(configPath, updatedLines.join('\n'));
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Execute RCON command on a server
|
|
205
|
+
*/
|
|
206
|
+
async execRcon(server, command) {
|
|
207
|
+
const containerName = server.startsWith('mc-') ? server : `mc-${server}`;
|
|
208
|
+
return new Promise((resolve) => {
|
|
209
|
+
const child = spawn('docker', ['exec', containerName, 'rcon-cli', ...command], {
|
|
210
|
+
cwd: this.paths.root,
|
|
211
|
+
stdio: 'inherit',
|
|
212
|
+
env: { ...process.env, ...this.env },
|
|
213
|
+
});
|
|
214
|
+
child.on('close', (code) => {
|
|
215
|
+
resolve(code ?? 0);
|
|
216
|
+
});
|
|
217
|
+
child.on('error', (err) => {
|
|
218
|
+
log.error(`Failed to execute RCON command: ${err.message}`);
|
|
219
|
+
resolve(1);
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Start all infrastructure (router + all servers)
|
|
225
|
+
*/
|
|
226
|
+
async up() {
|
|
227
|
+
log.info('Starting all infrastructure...');
|
|
228
|
+
return this.dockerCompose(['up', '-d']);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Stop all infrastructure
|
|
232
|
+
*/
|
|
233
|
+
async down() {
|
|
234
|
+
log.info('Stopping all infrastructure...');
|
|
235
|
+
// First stop all mc-* containers (including those from included compose files)
|
|
236
|
+
await new Promise((resolve) => {
|
|
237
|
+
const child = spawn('sh', ['-c',
|
|
238
|
+
'docker ps --filter "name=mc-" --format "{{.Names}}" | xargs -r docker stop'
|
|
239
|
+
], {
|
|
240
|
+
cwd: this.paths.root,
|
|
241
|
+
stdio: 'inherit',
|
|
242
|
+
env: { ...process.env, ...this.env },
|
|
243
|
+
});
|
|
244
|
+
child.on('close', () => resolve());
|
|
245
|
+
child.on('error', () => resolve());
|
|
246
|
+
});
|
|
247
|
+
// Then run docker compose down to clean up network
|
|
248
|
+
return this.dockerCompose(['down']);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Start all Minecraft servers (not router)
|
|
252
|
+
*/
|
|
253
|
+
async startAll() {
|
|
254
|
+
log.info('Starting all Minecraft servers...');
|
|
255
|
+
// Start all mc-* containers except mc-router
|
|
256
|
+
return new Promise((resolve) => {
|
|
257
|
+
const child = spawn('sh', ['-c',
|
|
258
|
+
'docker ps -a --filter "name=mc-" --filter "status=exited" --format "{{.Names}}" | grep -v mc-router | xargs -r docker start'
|
|
259
|
+
], {
|
|
260
|
+
cwd: this.paths.root,
|
|
261
|
+
stdio: 'inherit',
|
|
262
|
+
env: { ...process.env, ...this.env },
|
|
263
|
+
});
|
|
264
|
+
child.on('close', (code) => {
|
|
265
|
+
resolve(code ?? 0);
|
|
266
|
+
});
|
|
267
|
+
child.on('error', (err) => {
|
|
268
|
+
log.error(`Failed to start servers: ${err.message}`);
|
|
269
|
+
resolve(1);
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Stop all Minecraft servers (not router)
|
|
275
|
+
*/
|
|
276
|
+
async stopAll() {
|
|
277
|
+
log.info('Stopping all Minecraft servers...');
|
|
278
|
+
// Stop all mc-* containers except mc-router
|
|
279
|
+
return new Promise((resolve) => {
|
|
280
|
+
const child = spawn('sh', ['-c',
|
|
281
|
+
'docker ps --filter "name=mc-" --format "{{.Names}}" | grep -v mc-router | xargs -r docker stop'
|
|
282
|
+
], {
|
|
283
|
+
cwd: this.paths.root,
|
|
284
|
+
stdio: 'inherit',
|
|
285
|
+
env: { ...process.env, ...this.env },
|
|
286
|
+
});
|
|
287
|
+
child.on('close', (code) => {
|
|
288
|
+
resolve(code ?? 0);
|
|
289
|
+
});
|
|
290
|
+
child.on('error', (err) => {
|
|
291
|
+
log.error(`Failed to stop servers: ${err.message}`);
|
|
292
|
+
resolve(1);
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Start mc-router only
|
|
298
|
+
*/
|
|
299
|
+
async routerStart() {
|
|
300
|
+
log.info('Starting mc-router...');
|
|
301
|
+
return this.dockerCompose(['up', '-d', 'router']);
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Stop mc-router only
|
|
305
|
+
*/
|
|
306
|
+
async routerStop() {
|
|
307
|
+
log.info('Stopping mc-router...');
|
|
308
|
+
return this.dockerCompose(['stop', 'router']);
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Restart mc-router
|
|
312
|
+
*/
|
|
313
|
+
async routerRestart() {
|
|
314
|
+
log.info('Restarting mc-router...');
|
|
315
|
+
return this.dockerCompose(['restart', 'router']);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/lib/shell.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@minecraft-docker/mcctl",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.1",
|
|
4
4
|
"description": "CLI tool for managing Docker Minecraft servers with mc-router",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
],
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"@clack/prompts": "^0.8.0",
|
|
51
|
-
"@minecraft-docker/shared": "^1.
|
|
51
|
+
"@minecraft-docker/shared": "^1.6.1",
|
|
52
52
|
"picocolors": "^1.1.0",
|
|
53
53
|
"tar": "^7.5.4"
|
|
54
54
|
},
|