@minecraft-docker/mcctl 1.6.0 → 1.6.2
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/console/api.d.ts +19 -0
- package/dist/commands/console/api.d.ts.map +1 -0
- package/dist/commands/console/api.js +399 -0
- package/dist/commands/console/api.js.map +1 -0
- package/dist/commands/console/index.d.ts +10 -0
- package/dist/commands/console/index.d.ts.map +1 -0
- package/dist/commands/console/index.js +12 -0
- package/dist/commands/console/index.js.map +1 -0
- package/dist/commands/console/init.d.ts +47 -0
- package/dist/commands/console/init.d.ts.map +1 -0
- package/dist/commands/console/init.js +491 -0
- package/dist/commands/console/init.js.map +1 -0
- package/dist/commands/console/remove.d.ts +25 -0
- package/dist/commands/console/remove.d.ts.map +1 -0
- package/dist/commands/console/remove.js +189 -0
- package/dist/commands/console/remove.js.map +1 -0
- package/dist/commands/console/service.d.ts +40 -0
- package/dist/commands/console/service.d.ts.map +1 -0
- package/dist/commands/console/service.js +321 -0
- package/dist/commands/console/service.js.map +1 -0
- package/dist/commands/console/user.d.ts +17 -0
- package/dist/commands/console/user.d.ts.map +1 -0
- package/dist/commands/console/user.js +431 -0
- package/dist/commands/console/user.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 +86 -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 +74 -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 +21 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +23 -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 +218 -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/mod.d.ts +19 -0
- package/dist/commands/mod.d.ts.map +1 -0
- package/dist/commands/mod.js +441 -0
- package/dist/commands/mod.js.map +1 -0
- package/dist/commands/msg.d.ts +12 -0
- package/dist/commands/msg.d.ts.map +1 -0
- package/dist/commands/msg.js +273 -0
- package/dist/commands/msg.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 +153 -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 +18 -0
- package/dist/commands/world.d.ts.map +1 -0
- package/dist/commands/world.js +238 -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 +766 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts +30 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.js +430 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.d.ts +78 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.js +391 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/index.d.ts +4 -0
- package/dist/infrastructure/adapters/index.d.ts.map +1 -0
- package/dist/infrastructure/adapters/index.js +6 -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 +5 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +8 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/lib/admin-config.d.ts +66 -0
- package/dist/lib/admin-config.d.ts.map +1 -0
- package/dist/lib/admin-config.js +130 -0
- package/dist/lib/admin-config.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/pm2-utils.d.ts +71 -0
- package/dist/lib/pm2-utils.d.ts.map +1 -0
- package/dist/lib/pm2-utils.js +155 -0
- package/dist/lib/pm2-utils.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/ip-select.d.ts +25 -0
- package/dist/lib/prompts/ip-select.d.ts.map +1 -0
- package/dist/lib/prompts/ip-select.js +255 -0
- package/dist/lib/prompts/ip-select.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 +111 -0
- package/dist/lib/shell.d.ts.map +1 -0
- package/dist/lib/shell.js +321 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/sudo-utils.d.ts +14 -0
- package/dist/lib/sudo-utils.d.ts.map +1 -0
- package/dist/lib/sudo-utils.js +53 -0
- package/dist/lib/sudo-utils.js.map +1 -0
- package/package.json +8 -2
|
@@ -0,0 +1,321 @@
|
|
|
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
|
+
* Uses docker compose up to create containers if they don't exist
|
|
253
|
+
*/
|
|
254
|
+
async startAll() {
|
|
255
|
+
log.info('Starting all Minecraft servers...');
|
|
256
|
+
// Get all mc-* services from compose config and start them
|
|
257
|
+
// This works even if containers haven't been created yet
|
|
258
|
+
return new Promise((resolve) => {
|
|
259
|
+
const child = spawn('sh', ['-c',
|
|
260
|
+
'docker compose config --services | grep "^mc-" | xargs -r docker compose up -d'
|
|
261
|
+
], {
|
|
262
|
+
cwd: this.paths.root,
|
|
263
|
+
stdio: 'inherit',
|
|
264
|
+
env: { ...process.env, ...this.env },
|
|
265
|
+
});
|
|
266
|
+
child.on('close', (code) => {
|
|
267
|
+
resolve(code ?? 0);
|
|
268
|
+
});
|
|
269
|
+
child.on('error', (err) => {
|
|
270
|
+
log.error(`Failed to start servers: ${err.message}`);
|
|
271
|
+
resolve(1);
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Stop all Minecraft servers (not router)
|
|
277
|
+
* Uses docker compose stop for consistency
|
|
278
|
+
*/
|
|
279
|
+
async stopAll() {
|
|
280
|
+
log.info('Stopping all Minecraft servers...');
|
|
281
|
+
// Get all mc-* services from compose config and stop them
|
|
282
|
+
return new Promise((resolve) => {
|
|
283
|
+
const child = spawn('sh', ['-c',
|
|
284
|
+
'docker compose config --services | grep "^mc-" | xargs -r docker compose stop'
|
|
285
|
+
], {
|
|
286
|
+
cwd: this.paths.root,
|
|
287
|
+
stdio: 'inherit',
|
|
288
|
+
env: { ...process.env, ...this.env },
|
|
289
|
+
});
|
|
290
|
+
child.on('close', (code) => {
|
|
291
|
+
resolve(code ?? 0);
|
|
292
|
+
});
|
|
293
|
+
child.on('error', (err) => {
|
|
294
|
+
log.error(`Failed to stop servers: ${err.message}`);
|
|
295
|
+
resolve(1);
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Start mc-router only
|
|
301
|
+
*/
|
|
302
|
+
async routerStart() {
|
|
303
|
+
log.info('Starting mc-router...');
|
|
304
|
+
return this.dockerCompose(['up', '-d', 'router']);
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Stop mc-router only
|
|
308
|
+
*/
|
|
309
|
+
async routerStop() {
|
|
310
|
+
log.info('Stopping mc-router...');
|
|
311
|
+
return this.dockerCompose(['stop', 'router']);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Restart mc-router
|
|
315
|
+
*/
|
|
316
|
+
async routerRestart() {
|
|
317
|
+
log.info('Restarting mc-router...');
|
|
318
|
+
return this.dockerCompose(['restart', 'router']);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
//# 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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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if avahi-daemon is installed and configured
|
|
3
|
+
*/
|
|
4
|
+
export declare function isAvahiInstalled(): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Check if sudo password is available (from env or provided)
|
|
7
|
+
*/
|
|
8
|
+
export declare function hasSudoPassword(sudoPassword?: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Prompt for sudo password if avahi is installed and password not provided
|
|
11
|
+
* Returns the password (from prompt, option, or env) or undefined if not needed
|
|
12
|
+
*/
|
|
13
|
+
export declare function promptSudoPasswordIfNeeded(sudoPassword?: string): Promise<string | undefined>;
|
|
14
|
+
//# sourceMappingURL=sudo-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sudo-utils.d.ts","sourceRoot":"","sources":["../../src/lib/sudo-utils.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAwC7B"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import * as p from '@clack/prompts';
|
|
3
|
+
const AVAHI_HOSTS_FILE = '/etc/avahi/hosts';
|
|
4
|
+
/**
|
|
5
|
+
* Check if avahi-daemon is installed and configured
|
|
6
|
+
*/
|
|
7
|
+
export function isAvahiInstalled() {
|
|
8
|
+
return existsSync(AVAHI_HOSTS_FILE);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Check if sudo password is available (from env or provided)
|
|
12
|
+
*/
|
|
13
|
+
export function hasSudoPassword(sudoPassword) {
|
|
14
|
+
return !!(sudoPassword || process.env.MCCTL_SUDO_PASSWORD);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Prompt for sudo password if avahi is installed and password not provided
|
|
18
|
+
* Returns the password (from prompt, option, or env) or undefined if not needed
|
|
19
|
+
*/
|
|
20
|
+
export async function promptSudoPasswordIfNeeded(sudoPassword) {
|
|
21
|
+
// If password already provided, use it
|
|
22
|
+
if (sudoPassword) {
|
|
23
|
+
return sudoPassword;
|
|
24
|
+
}
|
|
25
|
+
// Check environment variable
|
|
26
|
+
if (process.env.MCCTL_SUDO_PASSWORD) {
|
|
27
|
+
return process.env.MCCTL_SUDO_PASSWORD;
|
|
28
|
+
}
|
|
29
|
+
// Check if avahi is installed
|
|
30
|
+
if (!isAvahiInstalled()) {
|
|
31
|
+
// avahi not installed, sudo not needed
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
// avahi is installed but no password provided - prompt user
|
|
35
|
+
p.log.info('avahi-daemon detected. Sudo password needed for mDNS hostname registration.');
|
|
36
|
+
const password = await p.password({
|
|
37
|
+
message: 'Enter sudo password (or press Enter to skip mDNS):',
|
|
38
|
+
mask: '*',
|
|
39
|
+
});
|
|
40
|
+
if (p.isCancel(password)) {
|
|
41
|
+
// User cancelled - proceed without sudo
|
|
42
|
+
p.log.warn('Skipped. mDNS hostname will not be registered.');
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
const passwordStr = password;
|
|
46
|
+
// Empty password means skip
|
|
47
|
+
if (!passwordStr.trim()) {
|
|
48
|
+
p.log.warn('Skipped. mDNS hostname will not be registered.');
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
return passwordStr;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=sudo-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sudo-utils.js","sourceRoot":"","sources":["../../src/lib/sudo-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAEpC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AAE5C;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,YAAqB;IACnD,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,YAAqB;IAErB,uCAAuC;IACvC,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,6BAA6B;IAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QACpC,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACzC,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;QACxB,uCAAuC;QACvC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,4DAA4D;IAC5D,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;IAE1F,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC;QAChC,OAAO,EAAE,oDAAoD;QAC7D,IAAI,EAAE,GAAG;KACV,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,wCAAwC;QACxC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC7D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,WAAW,GAAG,QAAkB,CAAC;IAEvC,4BAA4B;IAC5B,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QACxB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC7D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@minecraft-docker/mcctl",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.2",
|
|
4
4
|
"description": "CLI tool for managing Docker Minecraft servers with mc-router",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -48,13 +48,19 @@
|
|
|
48
48
|
],
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"@clack/prompts": "^0.8.0",
|
|
51
|
-
"@minecraft-docker/
|
|
51
|
+
"@minecraft-docker/mod-source-modrinth": "workspace:*",
|
|
52
|
+
"@minecraft-docker/shared": "^1.6.2",
|
|
53
|
+
"commander": "^12.0.0",
|
|
54
|
+
"js-yaml": "^4.1.0",
|
|
52
55
|
"picocolors": "^1.1.0",
|
|
56
|
+
"pm2": "^6.0.14",
|
|
53
57
|
"tar": "^7.5.4"
|
|
54
58
|
},
|
|
55
59
|
"devDependencies": {
|
|
60
|
+
"@types/js-yaml": "^4.0.9",
|
|
56
61
|
"@types/node": "^20.10.0",
|
|
57
62
|
"@types/tar": "^6.1.13",
|
|
63
|
+
"tsx": "^4.7.0",
|
|
58
64
|
"typescript": "^5.3.0"
|
|
59
65
|
}
|
|
60
66
|
}
|