@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,470 @@
|
|
|
1
|
+
import { Paths, log, colors } from '@minecraft-docker/shared';
|
|
2
|
+
import { getContainer } from '../infrastructure/index.js';
|
|
3
|
+
import { isContainerRunning } from '../lib/rcon.js';
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
/**
|
|
7
|
+
* Execute migrate command
|
|
8
|
+
*/
|
|
9
|
+
export async function migrateCommand(options) {
|
|
10
|
+
const paths = new Paths(options.root);
|
|
11
|
+
// Check if initialized
|
|
12
|
+
if (!paths.isInitialized()) {
|
|
13
|
+
log.error('Platform not initialized. Run: mcctl init');
|
|
14
|
+
return 1;
|
|
15
|
+
}
|
|
16
|
+
const subCommand = options.subCommand ?? 'worlds';
|
|
17
|
+
switch (subCommand) {
|
|
18
|
+
case 'worlds':
|
|
19
|
+
return migrateWorlds(paths, options);
|
|
20
|
+
case 'status':
|
|
21
|
+
return migrationStatus(paths, options);
|
|
22
|
+
default:
|
|
23
|
+
log.error(`Unknown migrate subcommand: ${subCommand}`);
|
|
24
|
+
console.log('Usage: mcctl migrate [worlds|status]');
|
|
25
|
+
return 1;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Check migration status for all servers
|
|
30
|
+
*/
|
|
31
|
+
async function migrationStatus(paths, options) {
|
|
32
|
+
const servers = await scanServers(paths);
|
|
33
|
+
if (servers.length === 0) {
|
|
34
|
+
console.log('No servers found.');
|
|
35
|
+
return 0;
|
|
36
|
+
}
|
|
37
|
+
const needsMigration = servers.filter(s => s.needsMigration);
|
|
38
|
+
if (options.json) {
|
|
39
|
+
console.log(JSON.stringify({ servers, needsMigration: needsMigration.length }, null, 2));
|
|
40
|
+
return 0;
|
|
41
|
+
}
|
|
42
|
+
console.log('');
|
|
43
|
+
console.log(colors.bold('Migration Status:'));
|
|
44
|
+
console.log('');
|
|
45
|
+
for (const server of servers) {
|
|
46
|
+
const status = server.needsMigration
|
|
47
|
+
? colors.yellow('needs migration')
|
|
48
|
+
: colors.green('up to date');
|
|
49
|
+
console.log(` ${colors.cyan(server.name)}: ${status}`);
|
|
50
|
+
if (server.needsMigration && server.reason) {
|
|
51
|
+
console.log(` ${colors.dim(server.reason)}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
console.log('');
|
|
55
|
+
if (needsMigration.length > 0) {
|
|
56
|
+
console.log(colors.yellow(`${needsMigration.length} server(s) need migration.`));
|
|
57
|
+
console.log(`Run: ${colors.bold('mcctl migrate worlds')} to migrate.`);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
console.log(colors.green('All servers are up to date.'));
|
|
61
|
+
}
|
|
62
|
+
console.log('');
|
|
63
|
+
return 0;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Migrate worlds to shared worlds/ directory
|
|
67
|
+
*/
|
|
68
|
+
async function migrateWorlds(paths, options) {
|
|
69
|
+
const container = getContainer(options.root);
|
|
70
|
+
const prompt = container.promptPort;
|
|
71
|
+
try {
|
|
72
|
+
const servers = await scanServers(paths);
|
|
73
|
+
const needsMigration = servers.filter(s => s.needsMigration);
|
|
74
|
+
if (needsMigration.length === 0) {
|
|
75
|
+
console.log('');
|
|
76
|
+
console.log(colors.green('✓ All servers are already using the new world directory structure.'));
|
|
77
|
+
console.log('');
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
// Show servers that need migration
|
|
81
|
+
console.log('');
|
|
82
|
+
console.log(colors.bold('Servers requiring migration:'));
|
|
83
|
+
console.log('');
|
|
84
|
+
for (const server of needsMigration) {
|
|
85
|
+
console.log(` ${colors.cyan(server.name)}`);
|
|
86
|
+
console.log(` ${colors.dim(server.reason || 'World stored in server directory')}`);
|
|
87
|
+
if (server.currentWorldPath) {
|
|
88
|
+
console.log(` Current: ${colors.dim(server.currentWorldPath)}`);
|
|
89
|
+
}
|
|
90
|
+
if (server.targetWorldPath) {
|
|
91
|
+
console.log(` Target: ${colors.dim(server.targetWorldPath)}`);
|
|
92
|
+
}
|
|
93
|
+
console.log('');
|
|
94
|
+
}
|
|
95
|
+
// Select servers to migrate
|
|
96
|
+
let serversToMigrate;
|
|
97
|
+
if (options.all) {
|
|
98
|
+
serversToMigrate = needsMigration;
|
|
99
|
+
}
|
|
100
|
+
else if (options.serverName) {
|
|
101
|
+
const server = needsMigration.find(s => s.name === options.serverName);
|
|
102
|
+
if (!server) {
|
|
103
|
+
log.error(`Server '${options.serverName}' not found or doesn't need migration`);
|
|
104
|
+
return 1;
|
|
105
|
+
}
|
|
106
|
+
serversToMigrate = [server];
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// Interactive selection - select one at a time
|
|
110
|
+
const serverOptions = needsMigration.map(s => ({
|
|
111
|
+
value: s.name,
|
|
112
|
+
label: s.name,
|
|
113
|
+
hint: s.reason,
|
|
114
|
+
}));
|
|
115
|
+
// Add "all" option
|
|
116
|
+
serverOptions.unshift({
|
|
117
|
+
value: '__all__',
|
|
118
|
+
label: 'All servers',
|
|
119
|
+
hint: `Migrate all ${needsMigration.length} servers`,
|
|
120
|
+
});
|
|
121
|
+
const selected = await prompt.select({
|
|
122
|
+
message: 'Select server to migrate:',
|
|
123
|
+
options: serverOptions,
|
|
124
|
+
});
|
|
125
|
+
if (prompt.isCancel(selected)) {
|
|
126
|
+
console.log('Migration cancelled.');
|
|
127
|
+
return 0;
|
|
128
|
+
}
|
|
129
|
+
if (selected === '__all__') {
|
|
130
|
+
serversToMigrate = needsMigration;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
const server = needsMigration.find(s => s.name === selected);
|
|
134
|
+
serversToMigrate = server ? [server] : [];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (serversToMigrate.length === 0) {
|
|
138
|
+
console.log('No servers selected for migration.');
|
|
139
|
+
return 0;
|
|
140
|
+
}
|
|
141
|
+
// Dry run mode
|
|
142
|
+
if (options.dryRun) {
|
|
143
|
+
console.log('');
|
|
144
|
+
console.log(colors.yellow('DRY RUN - No changes will be made'));
|
|
145
|
+
console.log('');
|
|
146
|
+
for (const server of serversToMigrate) {
|
|
147
|
+
console.log(colors.bold(`Would migrate: ${server.name}`));
|
|
148
|
+
console.log(` 1. Stop server if running`);
|
|
149
|
+
if (options.backup) {
|
|
150
|
+
console.log(` 2. Backup world data`);
|
|
151
|
+
}
|
|
152
|
+
console.log(` ${options.backup ? '3' : '2'}. Move world: ${server.currentWorldPath} → ${server.targetWorldPath}`);
|
|
153
|
+
console.log(` ${options.backup ? '4' : '3'}. Update config.env:`);
|
|
154
|
+
console.log(` - Add: EXTRA_ARGS=--universe /worlds/`);
|
|
155
|
+
console.log(` - Set: LEVEL=${server.name}`);
|
|
156
|
+
console.log('');
|
|
157
|
+
}
|
|
158
|
+
return 0;
|
|
159
|
+
}
|
|
160
|
+
// Confirm migration
|
|
161
|
+
if (!options.force) {
|
|
162
|
+
const confirm = await prompt.confirm({
|
|
163
|
+
message: `Migrate ${serversToMigrate.length} server(s)? This will move world data.`,
|
|
164
|
+
initialValue: false,
|
|
165
|
+
});
|
|
166
|
+
if (prompt.isCancel(confirm) || !confirm) {
|
|
167
|
+
console.log('Migration cancelled.');
|
|
168
|
+
return 0;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Check if servers are running
|
|
172
|
+
console.log('');
|
|
173
|
+
console.log('Checking server status...');
|
|
174
|
+
const runningServers = [];
|
|
175
|
+
for (const server of serversToMigrate) {
|
|
176
|
+
const containerName = `mc-${server.name}`;
|
|
177
|
+
const running = await isContainerRunning(containerName);
|
|
178
|
+
if (running) {
|
|
179
|
+
runningServers.push(server.name);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (runningServers.length > 0) {
|
|
183
|
+
console.log('');
|
|
184
|
+
console.log(colors.yellow('The following servers are running:'));
|
|
185
|
+
for (const name of runningServers) {
|
|
186
|
+
console.log(` - ${name}`);
|
|
187
|
+
}
|
|
188
|
+
console.log('');
|
|
189
|
+
// Skip confirmation if --force is used
|
|
190
|
+
if (!options.force) {
|
|
191
|
+
const stopConfirm = await prompt.confirm({
|
|
192
|
+
message: 'Stop these servers to proceed with migration?',
|
|
193
|
+
initialValue: true,
|
|
194
|
+
});
|
|
195
|
+
if (prompt.isCancel(stopConfirm) || !stopConfirm) {
|
|
196
|
+
console.log('Migration cancelled. Please stop servers manually first.');
|
|
197
|
+
return 1;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
console.log(colors.dim('--force: Stopping servers automatically...'));
|
|
202
|
+
}
|
|
203
|
+
// Stop running servers
|
|
204
|
+
for (const name of runningServers) {
|
|
205
|
+
console.log(`Stopping ${name}...`);
|
|
206
|
+
await stopContainer(`mc-${name}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Perform migration
|
|
210
|
+
console.log('');
|
|
211
|
+
let successCount = 0;
|
|
212
|
+
let failCount = 0;
|
|
213
|
+
for (const server of serversToMigrate) {
|
|
214
|
+
console.log(colors.bold(`Migrating: ${server.name}`));
|
|
215
|
+
try {
|
|
216
|
+
await migrateServer(paths, server, options.backup ?? false);
|
|
217
|
+
console.log(colors.green(` ✓ Migration complete`));
|
|
218
|
+
successCount++;
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
222
|
+
console.log(colors.red(` ✗ Migration failed: ${message}`));
|
|
223
|
+
failCount++;
|
|
224
|
+
}
|
|
225
|
+
console.log('');
|
|
226
|
+
}
|
|
227
|
+
// Summary
|
|
228
|
+
console.log(colors.bold('Migration Summary:'));
|
|
229
|
+
console.log(` Success: ${colors.green(String(successCount))}`);
|
|
230
|
+
if (failCount > 0) {
|
|
231
|
+
console.log(` Failed: ${colors.red(String(failCount))}`);
|
|
232
|
+
}
|
|
233
|
+
console.log('');
|
|
234
|
+
if (runningServers.length > 0 && successCount > 0) {
|
|
235
|
+
console.log(colors.dim('Servers were stopped for migration.'));
|
|
236
|
+
console.log(colors.dim(`Start them with: mcctl start --all`));
|
|
237
|
+
console.log('');
|
|
238
|
+
}
|
|
239
|
+
return failCount > 0 ? 1 : 0;
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
if (prompt.isCancel(error)) {
|
|
243
|
+
console.log('Migration cancelled.');
|
|
244
|
+
return 0;
|
|
245
|
+
}
|
|
246
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
247
|
+
log.error(message);
|
|
248
|
+
return 1;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Scan servers and check migration status
|
|
253
|
+
*/
|
|
254
|
+
async function scanServers(paths) {
|
|
255
|
+
const serversDir = paths.servers;
|
|
256
|
+
const worldsDir = paths.worlds;
|
|
257
|
+
if (!fs.existsSync(serversDir)) {
|
|
258
|
+
return [];
|
|
259
|
+
}
|
|
260
|
+
const entries = fs.readdirSync(serversDir, { withFileTypes: true });
|
|
261
|
+
const servers = [];
|
|
262
|
+
for (const entry of entries) {
|
|
263
|
+
// Skip template and non-directories
|
|
264
|
+
if (!entry.isDirectory() || entry.name === '_template') {
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
const serverName = entry.name;
|
|
268
|
+
const serverDir = path.join(serversDir, serverName);
|
|
269
|
+
const configPath = path.join(serverDir, 'config.env');
|
|
270
|
+
const dataDir = path.join(serverDir, 'data');
|
|
271
|
+
const worldDir = path.join(dataDir, 'world');
|
|
272
|
+
// Check if config.env exists
|
|
273
|
+
if (!fs.existsSync(configPath)) {
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
// Read config.env
|
|
277
|
+
const configContent = fs.readFileSync(configPath, 'utf-8');
|
|
278
|
+
const hasExtraArgs = configContent.includes('EXTRA_ARGS=') &&
|
|
279
|
+
configContent.includes('--universe');
|
|
280
|
+
// Get LEVEL value
|
|
281
|
+
const levelMatch = configContent.match(/^LEVEL=(.*)$/m);
|
|
282
|
+
const levelValue = levelMatch ? levelMatch[1]?.trim() : 'world';
|
|
283
|
+
// Check if world exists in server's data directory
|
|
284
|
+
const worldExistsInData = fs.existsSync(worldDir) &&
|
|
285
|
+
fs.statSync(worldDir).isDirectory() &&
|
|
286
|
+
!fs.lstatSync(worldDir).isSymbolicLink();
|
|
287
|
+
// Determine if migration is needed
|
|
288
|
+
let needsMigration = false;
|
|
289
|
+
let reason;
|
|
290
|
+
if (!hasExtraArgs) {
|
|
291
|
+
needsMigration = true;
|
|
292
|
+
reason = 'Missing EXTRA_ARGS=--universe /worlds/';
|
|
293
|
+
}
|
|
294
|
+
else if (worldExistsInData) {
|
|
295
|
+
needsMigration = true;
|
|
296
|
+
reason = 'World data still in server directory';
|
|
297
|
+
}
|
|
298
|
+
const targetWorldPath = path.join(worldsDir, serverName);
|
|
299
|
+
servers.push({
|
|
300
|
+
name: serverName,
|
|
301
|
+
needsMigration,
|
|
302
|
+
reason,
|
|
303
|
+
currentWorldPath: worldExistsInData ? worldDir : undefined,
|
|
304
|
+
targetWorldPath,
|
|
305
|
+
hasExtraArgs,
|
|
306
|
+
levelValue,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
return servers;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Migrate a single server
|
|
313
|
+
*/
|
|
314
|
+
async function migrateServer(paths, server, createBackup) {
|
|
315
|
+
const serversDir = paths.servers;
|
|
316
|
+
const worldsDir = paths.worlds;
|
|
317
|
+
const serverDir = path.join(serversDir, server.name);
|
|
318
|
+
const configPath = path.join(serverDir, 'config.env');
|
|
319
|
+
const sourceWorldDir = path.join(serverDir, 'data', 'world');
|
|
320
|
+
const targetWorldDir = path.join(worldsDir, server.name);
|
|
321
|
+
// Ensure worlds directory exists
|
|
322
|
+
if (!fs.existsSync(worldsDir)) {
|
|
323
|
+
fs.mkdirSync(worldsDir, { recursive: true });
|
|
324
|
+
}
|
|
325
|
+
// Step 1: Backup if requested
|
|
326
|
+
if (createBackup && fs.existsSync(sourceWorldDir)) {
|
|
327
|
+
const backupDir = path.join(serverDir, 'data', `world_backup_${Date.now()}`);
|
|
328
|
+
console.log(` Creating backup: ${path.basename(backupDir)}`);
|
|
329
|
+
await copyDirectory(sourceWorldDir, backupDir);
|
|
330
|
+
}
|
|
331
|
+
// Step 2: Move world data if it exists in server directory
|
|
332
|
+
if (fs.existsSync(sourceWorldDir) && fs.statSync(sourceWorldDir).isDirectory()) {
|
|
333
|
+
// Check if it's a symlink
|
|
334
|
+
if (fs.lstatSync(sourceWorldDir).isSymbolicLink()) {
|
|
335
|
+
console.log(` World is already a symlink, removing...`);
|
|
336
|
+
fs.unlinkSync(sourceWorldDir);
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
// Check if target already exists
|
|
340
|
+
if (fs.existsSync(targetWorldDir)) {
|
|
341
|
+
throw new Error(`Target world directory already exists: ${targetWorldDir}`);
|
|
342
|
+
}
|
|
343
|
+
console.log(` Moving world data to worlds/${server.name}`);
|
|
344
|
+
fs.renameSync(sourceWorldDir, targetWorldDir);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
// Also move world_nether and world_the_end if they exist (Vanilla server)
|
|
348
|
+
const dimensionWorlds = ['world_nether', 'world_the_end'];
|
|
349
|
+
for (const dimWorld of dimensionWorlds) {
|
|
350
|
+
const sourceDimDir = path.join(serverDir, 'data', dimWorld);
|
|
351
|
+
const targetDimDir = path.join(worldsDir, `${server.name}_${dimWorld.replace('world_', '')}`);
|
|
352
|
+
if (fs.existsSync(sourceDimDir) &&
|
|
353
|
+
fs.statSync(sourceDimDir).isDirectory() &&
|
|
354
|
+
!fs.lstatSync(sourceDimDir).isSymbolicLink()) {
|
|
355
|
+
console.log(` Moving ${dimWorld} to worlds/`);
|
|
356
|
+
if (!fs.existsSync(targetDimDir)) {
|
|
357
|
+
fs.renameSync(sourceDimDir, targetDimDir);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
// Step 3: Update config.env
|
|
362
|
+
console.log(` Updating config.env`);
|
|
363
|
+
let configContent = fs.readFileSync(configPath, 'utf-8');
|
|
364
|
+
// Add or update EXTRA_ARGS
|
|
365
|
+
if (!configContent.includes('EXTRA_ARGS=')) {
|
|
366
|
+
// Add EXTRA_ARGS after LEVEL line or at end of World section
|
|
367
|
+
const levelLineMatch = configContent.match(/^LEVEL=.*$/m);
|
|
368
|
+
if (levelLineMatch) {
|
|
369
|
+
configContent = configContent.replace(levelLineMatch[0], `${levelLineMatch[0]}\n\n# Store world in shared /worlds/ directory\nEXTRA_ARGS=--universe /worlds/`);
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
configContent += '\n# Store world in shared /worlds/ directory\nEXTRA_ARGS=--universe /worlds/\n';
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
else if (!configContent.includes('--universe')) {
|
|
376
|
+
// EXTRA_ARGS exists but doesn't have --universe
|
|
377
|
+
configContent = configContent.replace(/^(EXTRA_ARGS=.*)$/m, '$1 --universe /worlds/');
|
|
378
|
+
}
|
|
379
|
+
// Determine the correct LEVEL value
|
|
380
|
+
const newLevelValue = findExistingWorldName(worldsDir, server.levelValue, server.name);
|
|
381
|
+
console.log(` Setting LEVEL=${newLevelValue}`);
|
|
382
|
+
// Update LEVEL
|
|
383
|
+
if (configContent.match(/^LEVEL=.*$/m)) {
|
|
384
|
+
configContent = configContent.replace(/^LEVEL=.*$/m, `LEVEL=${newLevelValue}`);
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
configContent += `\nLEVEL=${newLevelValue}\n`;
|
|
388
|
+
}
|
|
389
|
+
fs.writeFileSync(configPath, configContent);
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Find existing world name in worlds directory
|
|
393
|
+
* Checks: current LEVEL value, server name, case-insensitive matches
|
|
394
|
+
*/
|
|
395
|
+
function findExistingWorldName(worldsDir, currentLevel, serverName) {
|
|
396
|
+
if (!fs.existsSync(worldsDir)) {
|
|
397
|
+
return serverName;
|
|
398
|
+
}
|
|
399
|
+
const worldDirs = fs.readdirSync(worldsDir, { withFileTypes: true })
|
|
400
|
+
.filter(d => d.isDirectory() && !d.name.startsWith('.'))
|
|
401
|
+
.map(d => d.name);
|
|
402
|
+
// 1. Check if current LEVEL value exists in worlds/
|
|
403
|
+
if (currentLevel && currentLevel !== 'world') {
|
|
404
|
+
const exactMatch = worldDirs.find(w => w === currentLevel);
|
|
405
|
+
if (exactMatch) {
|
|
406
|
+
return exactMatch;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
// 2. Check if server name exists (exact match)
|
|
410
|
+
const serverMatch = worldDirs.find(w => w === serverName);
|
|
411
|
+
if (serverMatch) {
|
|
412
|
+
return serverMatch;
|
|
413
|
+
}
|
|
414
|
+
// 3. Check case-insensitive match for server name
|
|
415
|
+
const caseInsensitiveMatch = worldDirs.find(w => w.toLowerCase() === serverName.toLowerCase());
|
|
416
|
+
if (caseInsensitiveMatch) {
|
|
417
|
+
return caseInsensitiveMatch;
|
|
418
|
+
}
|
|
419
|
+
// 4. Check case-insensitive match for current LEVEL
|
|
420
|
+
if (currentLevel && currentLevel !== 'world') {
|
|
421
|
+
const levelCaseMatch = worldDirs.find(w => w.toLowerCase() === currentLevel.toLowerCase());
|
|
422
|
+
if (levelCaseMatch) {
|
|
423
|
+
return levelCaseMatch;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
// 5. Default to server name
|
|
427
|
+
return serverName;
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Stop a Docker container
|
|
431
|
+
*/
|
|
432
|
+
async function stopContainer(containerName) {
|
|
433
|
+
const { spawn } = await import('node:child_process');
|
|
434
|
+
return new Promise((resolve, reject) => {
|
|
435
|
+
const child = spawn('docker', ['stop', containerName], {
|
|
436
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
437
|
+
});
|
|
438
|
+
child.on('close', (code) => {
|
|
439
|
+
if (code === 0) {
|
|
440
|
+
resolve();
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
reject(new Error(`Failed to stop container ${containerName}`));
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
child.on('error', (err) => {
|
|
447
|
+
reject(err);
|
|
448
|
+
});
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Copy directory recursively
|
|
453
|
+
*/
|
|
454
|
+
async function copyDirectory(source, target) {
|
|
455
|
+
if (!fs.existsSync(target)) {
|
|
456
|
+
fs.mkdirSync(target, { recursive: true });
|
|
457
|
+
}
|
|
458
|
+
const entries = fs.readdirSync(source, { withFileTypes: true });
|
|
459
|
+
for (const entry of entries) {
|
|
460
|
+
const sourcePath = path.join(source, entry.name);
|
|
461
|
+
const targetPath = path.join(target, entry.name);
|
|
462
|
+
if (entry.isDirectory()) {
|
|
463
|
+
await copyDirectory(sourcePath, targetPath);
|
|
464
|
+
}
|
|
465
|
+
else {
|
|
466
|
+
fs.copyFileSync(sourcePath, targetPath);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import '@minecraft-docker/mod-source-modrinth';
|
|
2
|
+
/**
|
|
3
|
+
* Mod command options
|
|
4
|
+
*/
|
|
5
|
+
export interface ModCommandOptions {
|
|
6
|
+
root?: string;
|
|
7
|
+
subCommand?: string;
|
|
8
|
+
serverName?: string;
|
|
9
|
+
modNames?: string[];
|
|
10
|
+
query?: string;
|
|
11
|
+
source?: 'modrinth' | 'curseforge' | 'spiget' | 'url';
|
|
12
|
+
json?: boolean;
|
|
13
|
+
force?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Execute mod management command
|
|
17
|
+
*/
|
|
18
|
+
export declare function modCommand(options: ModCommandOptions): Promise<number>;
|
|
19
|
+
//# sourceMappingURL=mod.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/commands/mod.ts"],"names":[],"mappings":"AAQA,OAAO,uCAAuC,CAAC;AAK/C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgC5E"}
|