@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,431 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import * as p from '@clack/prompts';
|
|
3
|
+
import { User, Username, Role, RoleEnum, YamlUserRepository, Paths, colors, } from '@minecraft-docker/shared';
|
|
4
|
+
import { resolve } from 'node:path';
|
|
5
|
+
/**
|
|
6
|
+
* Get the user repository instance
|
|
7
|
+
*/
|
|
8
|
+
function getUserRepository() {
|
|
9
|
+
const paths = new Paths();
|
|
10
|
+
const usersFile = resolve(paths.platform, 'users.yaml');
|
|
11
|
+
return new YamlUserRepository(usersFile);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* List all users
|
|
15
|
+
*/
|
|
16
|
+
async function listUsers(options) {
|
|
17
|
+
const repo = getUserRepository();
|
|
18
|
+
const users = await repo.findAll();
|
|
19
|
+
if (options.json) {
|
|
20
|
+
console.log(JSON.stringify(users.map((u) => u.toJSON()), null, 2));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (users.length === 0) {
|
|
24
|
+
console.log(colors.yellow('No users found.'));
|
|
25
|
+
console.log(`Run ${colors.cyan('mcctl console init')} to create an admin user.`);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
console.log();
|
|
29
|
+
console.log(colors.bold('Users:'));
|
|
30
|
+
console.log();
|
|
31
|
+
// Table header
|
|
32
|
+
const header = `${colors.dim('Username'.padEnd(20))}${colors.dim('Role'.padEnd(12))}${colors.dim('Created')}`;
|
|
33
|
+
console.log(header);
|
|
34
|
+
console.log(colors.dim('-'.repeat(50)));
|
|
35
|
+
// Table rows
|
|
36
|
+
for (const user of users) {
|
|
37
|
+
const roleColor = user.role.isAdmin ? colors.red : colors.blue;
|
|
38
|
+
const row = `${user.username.value.padEnd(20)}${roleColor(user.role.value.padEnd(12))}${user.createdAt.toISOString().split('T')[0]}`;
|
|
39
|
+
console.log(row);
|
|
40
|
+
}
|
|
41
|
+
console.log();
|
|
42
|
+
console.log(`Total: ${colors.cyan(users.length.toString())} user(s)`);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Add a new user
|
|
46
|
+
*/
|
|
47
|
+
async function addUser(usernameArg, options) {
|
|
48
|
+
const repo = getUserRepository();
|
|
49
|
+
let username;
|
|
50
|
+
let role;
|
|
51
|
+
let password;
|
|
52
|
+
if (usernameArg && options.role && options.password) {
|
|
53
|
+
// CLI mode
|
|
54
|
+
username = usernameArg;
|
|
55
|
+
role = options.role.toLowerCase();
|
|
56
|
+
password = options.password;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Interactive mode
|
|
60
|
+
p.intro(colors.cyan('Add New User'));
|
|
61
|
+
const result = await p.group({
|
|
62
|
+
username: () => p.text({
|
|
63
|
+
message: 'Username:',
|
|
64
|
+
placeholder: 'operator1',
|
|
65
|
+
validate: (value) => {
|
|
66
|
+
if (!value || value.trim().length === 0) {
|
|
67
|
+
return 'Username is required';
|
|
68
|
+
}
|
|
69
|
+
if (value.length < 3) {
|
|
70
|
+
return 'Username must be at least 3 characters';
|
|
71
|
+
}
|
|
72
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(value)) {
|
|
73
|
+
return 'Username can only contain letters, numbers, underscores, and hyphens';
|
|
74
|
+
}
|
|
75
|
+
return undefined;
|
|
76
|
+
},
|
|
77
|
+
}),
|
|
78
|
+
role: () => p.select({
|
|
79
|
+
message: 'Role:',
|
|
80
|
+
options: [
|
|
81
|
+
{ value: RoleEnum.ADMIN, label: 'Admin - Full access' },
|
|
82
|
+
{ value: RoleEnum.VIEWER, label: 'Viewer - Read-only access' },
|
|
83
|
+
],
|
|
84
|
+
}),
|
|
85
|
+
password: () => p.password({
|
|
86
|
+
message: 'Password:',
|
|
87
|
+
validate: (value) => {
|
|
88
|
+
if (!value || value.length < 8) {
|
|
89
|
+
return 'Password must be at least 8 characters';
|
|
90
|
+
}
|
|
91
|
+
return undefined;
|
|
92
|
+
},
|
|
93
|
+
}),
|
|
94
|
+
confirmPassword: () => p.password({
|
|
95
|
+
message: 'Confirm password:',
|
|
96
|
+
}),
|
|
97
|
+
}, {
|
|
98
|
+
onCancel: () => {
|
|
99
|
+
p.cancel('Operation cancelled.');
|
|
100
|
+
process.exit(0);
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
if (result.password !== result.confirmPassword) {
|
|
104
|
+
p.cancel('Passwords do not match.');
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
username = result.username;
|
|
108
|
+
role = result.role;
|
|
109
|
+
password = result.password;
|
|
110
|
+
}
|
|
111
|
+
// Check if user already exists
|
|
112
|
+
try {
|
|
113
|
+
const existingUser = await repo.findByUsername(Username.create(username));
|
|
114
|
+
if (existingUser) {
|
|
115
|
+
console.error(colors.red(`User '${username}' already exists.`));
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Username validation failed
|
|
121
|
+
console.error(colors.red(`Invalid username: ${username}`));
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
// Create user
|
|
125
|
+
const passwordHash = await repo.hashPassword(password);
|
|
126
|
+
const user = User.create({
|
|
127
|
+
username: Username.create(username),
|
|
128
|
+
passwordHash,
|
|
129
|
+
role: Role.create(role),
|
|
130
|
+
});
|
|
131
|
+
await repo.save(user);
|
|
132
|
+
if (usernameArg) {
|
|
133
|
+
console.log(JSON.stringify({ success: true, username: user.username.value }));
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
p.outro(colors.green(`User '${username}' created successfully!`));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Remove a user
|
|
141
|
+
*/
|
|
142
|
+
async function removeUser(usernameArg, options) {
|
|
143
|
+
const repo = getUserRepository();
|
|
144
|
+
let username;
|
|
145
|
+
if (usernameArg) {
|
|
146
|
+
username = usernameArg;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
// Interactive mode
|
|
150
|
+
const users = await repo.findAll();
|
|
151
|
+
if (users.length === 0) {
|
|
152
|
+
console.error(colors.red('No users found.'));
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
const result = await p.select({
|
|
156
|
+
message: 'Select user to remove:',
|
|
157
|
+
options: users.map((u) => ({
|
|
158
|
+
value: u.username.value,
|
|
159
|
+
label: `${u.username.value} (${u.role.value})`,
|
|
160
|
+
})),
|
|
161
|
+
});
|
|
162
|
+
if (p.isCancel(result)) {
|
|
163
|
+
p.cancel('Operation cancelled.');
|
|
164
|
+
process.exit(0);
|
|
165
|
+
}
|
|
166
|
+
username = result;
|
|
167
|
+
}
|
|
168
|
+
// Find user
|
|
169
|
+
const user = await repo.findByUsername(Username.create(username));
|
|
170
|
+
if (!user) {
|
|
171
|
+
console.error(colors.red(`User '${username}' not found.`));
|
|
172
|
+
process.exit(1);
|
|
173
|
+
}
|
|
174
|
+
// Check if this is the last admin
|
|
175
|
+
if (user.isAdmin) {
|
|
176
|
+
const allUsers = await repo.findAll();
|
|
177
|
+
const adminCount = allUsers.filter((u) => u.isAdmin).length;
|
|
178
|
+
if (adminCount <= 1) {
|
|
179
|
+
console.error(colors.red('Cannot delete the last admin user.'));
|
|
180
|
+
process.exit(1);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Confirm deletion
|
|
184
|
+
if (!options.force) {
|
|
185
|
+
const confirmed = await p.confirm({
|
|
186
|
+
message: `Are you sure you want to delete user '${username}'?`,
|
|
187
|
+
});
|
|
188
|
+
if (p.isCancel(confirmed) || !confirmed) {
|
|
189
|
+
p.cancel('Operation cancelled.');
|
|
190
|
+
process.exit(0);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
await repo.delete(user.id);
|
|
194
|
+
console.log(colors.green(`User '${username}' deleted successfully.`));
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Update a user
|
|
198
|
+
*/
|
|
199
|
+
async function updateUser(usernameArg, options) {
|
|
200
|
+
const repo = getUserRepository();
|
|
201
|
+
let username;
|
|
202
|
+
if (usernameArg) {
|
|
203
|
+
username = usernameArg;
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
// Interactive mode
|
|
207
|
+
const users = await repo.findAll();
|
|
208
|
+
if (users.length === 0) {
|
|
209
|
+
console.error(colors.red('No users found.'));
|
|
210
|
+
process.exit(1);
|
|
211
|
+
}
|
|
212
|
+
const result = await p.select({
|
|
213
|
+
message: 'Select user to update:',
|
|
214
|
+
options: users.map((u) => ({
|
|
215
|
+
value: u.username.value,
|
|
216
|
+
label: `${u.username.value} (${u.role.value})`,
|
|
217
|
+
})),
|
|
218
|
+
});
|
|
219
|
+
if (p.isCancel(result)) {
|
|
220
|
+
p.cancel('Operation cancelled.');
|
|
221
|
+
process.exit(0);
|
|
222
|
+
}
|
|
223
|
+
username = result;
|
|
224
|
+
}
|
|
225
|
+
// Find user
|
|
226
|
+
const user = await repo.findByUsername(Username.create(username));
|
|
227
|
+
if (!user) {
|
|
228
|
+
console.error(colors.red(`User '${username}' not found.`));
|
|
229
|
+
process.exit(1);
|
|
230
|
+
}
|
|
231
|
+
// Update role
|
|
232
|
+
let newRole;
|
|
233
|
+
if (options.role) {
|
|
234
|
+
newRole = options.role.toLowerCase();
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
const result = await p.select({
|
|
238
|
+
message: 'New role:',
|
|
239
|
+
initialValue: user.role.value,
|
|
240
|
+
options: [
|
|
241
|
+
{ value: RoleEnum.ADMIN, label: 'Admin - Full access' },
|
|
242
|
+
{ value: RoleEnum.VIEWER, label: 'Viewer - Read-only access' },
|
|
243
|
+
],
|
|
244
|
+
});
|
|
245
|
+
if (p.isCancel(result)) {
|
|
246
|
+
p.cancel('Operation cancelled.');
|
|
247
|
+
process.exit(0);
|
|
248
|
+
}
|
|
249
|
+
newRole = result;
|
|
250
|
+
}
|
|
251
|
+
// Check if this would remove the last admin
|
|
252
|
+
if (user.isAdmin && newRole !== RoleEnum.ADMIN) {
|
|
253
|
+
const allUsers = await repo.findAll();
|
|
254
|
+
const adminCount = allUsers.filter((u) => u.isAdmin).length;
|
|
255
|
+
if (adminCount <= 1) {
|
|
256
|
+
console.error(colors.red('Cannot change role of the last admin user.'));
|
|
257
|
+
process.exit(1);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
user.updateRole(Role.create(newRole));
|
|
261
|
+
await repo.save(user);
|
|
262
|
+
console.log(colors.green(`User '${username}' updated to role '${newRole}'.`));
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Reset a user's password
|
|
266
|
+
*/
|
|
267
|
+
async function resetPassword(usernameArg, options) {
|
|
268
|
+
const repo = getUserRepository();
|
|
269
|
+
let username;
|
|
270
|
+
if (usernameArg) {
|
|
271
|
+
username = usernameArg;
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
// Interactive mode
|
|
275
|
+
const users = await repo.findAll();
|
|
276
|
+
if (users.length === 0) {
|
|
277
|
+
console.error(colors.red('No users found.'));
|
|
278
|
+
process.exit(1);
|
|
279
|
+
}
|
|
280
|
+
const result = await p.select({
|
|
281
|
+
message: 'Select user to reset password:',
|
|
282
|
+
options: users.map((u) => ({
|
|
283
|
+
value: u.username.value,
|
|
284
|
+
label: `${u.username.value} (${u.role.value})`,
|
|
285
|
+
})),
|
|
286
|
+
});
|
|
287
|
+
if (p.isCancel(result)) {
|
|
288
|
+
p.cancel('Operation cancelled.');
|
|
289
|
+
process.exit(0);
|
|
290
|
+
}
|
|
291
|
+
username = result;
|
|
292
|
+
}
|
|
293
|
+
// Find user
|
|
294
|
+
const user = await repo.findByUsername(Username.create(username));
|
|
295
|
+
if (!user) {
|
|
296
|
+
console.error(colors.red(`User '${username}' not found.`));
|
|
297
|
+
process.exit(1);
|
|
298
|
+
}
|
|
299
|
+
// Get new password
|
|
300
|
+
let newPassword;
|
|
301
|
+
if (options.password) {
|
|
302
|
+
newPassword = options.password;
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
const result = await p.group({
|
|
306
|
+
password: () => p.password({
|
|
307
|
+
message: 'New password:',
|
|
308
|
+
validate: (value) => {
|
|
309
|
+
if (!value || value.length < 8) {
|
|
310
|
+
return 'Password must be at least 8 characters';
|
|
311
|
+
}
|
|
312
|
+
return undefined;
|
|
313
|
+
},
|
|
314
|
+
}),
|
|
315
|
+
confirmPassword: () => p.password({
|
|
316
|
+
message: 'Confirm password:',
|
|
317
|
+
}),
|
|
318
|
+
}, {
|
|
319
|
+
onCancel: () => {
|
|
320
|
+
p.cancel('Operation cancelled.');
|
|
321
|
+
process.exit(0);
|
|
322
|
+
},
|
|
323
|
+
});
|
|
324
|
+
if (result.password !== result.confirmPassword) {
|
|
325
|
+
p.cancel('Passwords do not match.');
|
|
326
|
+
process.exit(1);
|
|
327
|
+
}
|
|
328
|
+
newPassword = result.password;
|
|
329
|
+
}
|
|
330
|
+
// Update password
|
|
331
|
+
const passwordHash = await repo.hashPassword(newPassword);
|
|
332
|
+
user.updatePasswordHash(passwordHash);
|
|
333
|
+
await repo.save(user);
|
|
334
|
+
console.log(colors.green(`Password for '${username}' has been reset.`));
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Create console user command
|
|
338
|
+
*/
|
|
339
|
+
export function consoleUserCommand() {
|
|
340
|
+
const cmd = new Command('user')
|
|
341
|
+
.description('Manage console users')
|
|
342
|
+
.addHelpText('after', `
|
|
343
|
+
Examples:
|
|
344
|
+
$ mcctl console user list List all users
|
|
345
|
+
$ mcctl console user list --json List users in JSON format
|
|
346
|
+
$ mcctl console user add Add user (interactive)
|
|
347
|
+
$ mcctl console user add operator1 --role viewer --password "secret"
|
|
348
|
+
$ mcctl console user remove Remove user (interactive)
|
|
349
|
+
$ mcctl console user remove operator1 Remove user directly
|
|
350
|
+
$ mcctl console user remove operator1 --force Remove without confirmation
|
|
351
|
+
$ mcctl console user update Update user (interactive)
|
|
352
|
+
$ mcctl console user update operator1 --role admin
|
|
353
|
+
$ mcctl console user reset-password Reset password (interactive)
|
|
354
|
+
$ mcctl console user reset-password operator1
|
|
355
|
+
`);
|
|
356
|
+
// list subcommand
|
|
357
|
+
cmd
|
|
358
|
+
.command('list')
|
|
359
|
+
.description('List all users')
|
|
360
|
+
.option('--json', 'Output in JSON format')
|
|
361
|
+
.action(async (options) => {
|
|
362
|
+
try {
|
|
363
|
+
await listUsers(options);
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
console.error(colors.red(`Error: ${error.message}`));
|
|
367
|
+
process.exit(1);
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
// add subcommand
|
|
371
|
+
cmd
|
|
372
|
+
.command('add [username]')
|
|
373
|
+
.description('Add a new user')
|
|
374
|
+
.option('--role <role>', 'User role (admin, viewer)')
|
|
375
|
+
.option('--password <password>', 'User password')
|
|
376
|
+
.action(async (username, options) => {
|
|
377
|
+
try {
|
|
378
|
+
await addUser(username, options);
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
console.error(colors.red(`Error: ${error.message}`));
|
|
382
|
+
process.exit(1);
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
// remove subcommand
|
|
386
|
+
cmd
|
|
387
|
+
.command('remove [username]')
|
|
388
|
+
.description('Remove a user')
|
|
389
|
+
.option('--force', 'Skip confirmation')
|
|
390
|
+
.action(async (username, options) => {
|
|
391
|
+
try {
|
|
392
|
+
await removeUser(username, options);
|
|
393
|
+
}
|
|
394
|
+
catch (error) {
|
|
395
|
+
console.error(colors.red(`Error: ${error.message}`));
|
|
396
|
+
process.exit(1);
|
|
397
|
+
}
|
|
398
|
+
});
|
|
399
|
+
// update subcommand
|
|
400
|
+
cmd
|
|
401
|
+
.command('update [username]')
|
|
402
|
+
.description('Update a user')
|
|
403
|
+
.option('--role <role>', 'New role (admin, viewer)')
|
|
404
|
+
.action(async (username, options) => {
|
|
405
|
+
try {
|
|
406
|
+
await updateUser(username, options);
|
|
407
|
+
}
|
|
408
|
+
catch (error) {
|
|
409
|
+
console.error(colors.red(`Error: ${error.message}`));
|
|
410
|
+
process.exit(1);
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
// reset-password subcommand
|
|
414
|
+
cmd
|
|
415
|
+
.command('reset-password [username]')
|
|
416
|
+
.description('Reset a user password')
|
|
417
|
+
.option('--password <password>', 'New password (for non-interactive use)')
|
|
418
|
+
.action(async (username, options) => {
|
|
419
|
+
try {
|
|
420
|
+
await resetPassword(username, options);
|
|
421
|
+
}
|
|
422
|
+
catch (error) {
|
|
423
|
+
console.error(colors.red(`Error: ${error.message}`));
|
|
424
|
+
process.exit(1);
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
return cmd;
|
|
428
|
+
}
|
|
429
|
+
// Backward compatibility alias
|
|
430
|
+
export const adminUserCommand = consoleUserCommand;
|
|
431
|
+
//# sourceMappingURL=user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../../src/commands/console/user.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create command options from CLI arguments
|
|
3
|
+
*/
|
|
4
|
+
export interface CreateCommandOptions {
|
|
5
|
+
root?: string;
|
|
6
|
+
name?: string;
|
|
7
|
+
type?: string;
|
|
8
|
+
version?: string;
|
|
9
|
+
seed?: string;
|
|
10
|
+
worldUrl?: string;
|
|
11
|
+
worldName?: string;
|
|
12
|
+
noStart?: boolean;
|
|
13
|
+
sudoPassword?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Execute create server command
|
|
17
|
+
*
|
|
18
|
+
* If name is provided, runs in CLI mode with arguments.
|
|
19
|
+
* If name is not provided, runs in interactive mode.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createCommand(options: CreateCommandOptions): Promise<number>;
|
|
22
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBlF"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Paths, log, colors } from '@minecraft-docker/shared';
|
|
2
|
+
import { getContainer } from '../infrastructure/index.js';
|
|
3
|
+
import { promptSudoPasswordIfNeeded } from '../lib/sudo-utils.js';
|
|
4
|
+
/**
|
|
5
|
+
* Execute create server command
|
|
6
|
+
*
|
|
7
|
+
* If name is provided, runs in CLI mode with arguments.
|
|
8
|
+
* If name is not provided, runs in interactive mode.
|
|
9
|
+
*/
|
|
10
|
+
export async function createCommand(options) {
|
|
11
|
+
const paths = new Paths(options.root);
|
|
12
|
+
// Check if initialized
|
|
13
|
+
if (!paths.isInitialized()) {
|
|
14
|
+
log.error('Platform not initialized. Run: mcctl init');
|
|
15
|
+
return 1;
|
|
16
|
+
}
|
|
17
|
+
// Prompt for sudo password if needed (avahi installed but no password provided)
|
|
18
|
+
const sudoPassword = await promptSudoPasswordIfNeeded(options.sudoPassword);
|
|
19
|
+
const container = getContainer({
|
|
20
|
+
rootDir: options.root,
|
|
21
|
+
sudoPassword,
|
|
22
|
+
});
|
|
23
|
+
// Determine execution mode
|
|
24
|
+
if (options.name) {
|
|
25
|
+
// CLI argument mode - use executeWithConfig
|
|
26
|
+
return createWithArguments(container, options);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
// Interactive mode - use execute
|
|
30
|
+
return createInteractive(container);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Create server with CLI arguments (non-interactive)
|
|
35
|
+
*/
|
|
36
|
+
async function createWithArguments(container, options) {
|
|
37
|
+
const useCase = container.createServerUseCase;
|
|
38
|
+
const prompt = container.promptPort;
|
|
39
|
+
try {
|
|
40
|
+
const server = await useCase.executeWithConfig({
|
|
41
|
+
name: options.name,
|
|
42
|
+
type: options.type,
|
|
43
|
+
version: options.version,
|
|
44
|
+
seed: options.seed,
|
|
45
|
+
worldUrl: options.worldUrl,
|
|
46
|
+
worldName: options.worldName,
|
|
47
|
+
autoStart: !options.noStart,
|
|
48
|
+
});
|
|
49
|
+
console.log('');
|
|
50
|
+
console.log(colors.green(`✓ Server '${server.name.value}' created successfully!`));
|
|
51
|
+
console.log(` Container: ${colors.cyan(server.containerName)}`);
|
|
52
|
+
console.log(` Type: ${server.type.label}`);
|
|
53
|
+
console.log(` Version: ${server.version.value}`);
|
|
54
|
+
console.log(` Memory: ${server.memory.value}`);
|
|
55
|
+
console.log('');
|
|
56
|
+
console.log(` Connect via: ${colors.cyan(server.name.hostname + ':25565')}`);
|
|
57
|
+
console.log('');
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
62
|
+
log.error(message);
|
|
63
|
+
return 1;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Create server interactively (with prompts)
|
|
68
|
+
*/
|
|
69
|
+
async function createInteractive(container) {
|
|
70
|
+
const useCase = container.createServerUseCase;
|
|
71
|
+
try {
|
|
72
|
+
await useCase.execute();
|
|
73
|
+
return 0;
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
// Check if user cancelled
|
|
77
|
+
const prompt = container.promptPort;
|
|
78
|
+
if (prompt.isCancel(error)) {
|
|
79
|
+
return 0; // User cancellation is not an error
|
|
80
|
+
}
|
|
81
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
82
|
+
log.error(message);
|
|
83
|
+
return 1;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delete command options from CLI arguments
|
|
3
|
+
*/
|
|
4
|
+
export interface DeleteCommandOptions {
|
|
5
|
+
root?: string;
|
|
6
|
+
name?: string;
|
|
7
|
+
force?: boolean;
|
|
8
|
+
sudoPassword?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Execute delete server command
|
|
12
|
+
*
|
|
13
|
+
* If name is provided, runs in CLI mode with direct deletion.
|
|
14
|
+
* If name is not provided, runs in interactive mode with selection.
|
|
15
|
+
*/
|
|
16
|
+
export declare function deleteCommand(options: DeleteCommandOptions): Promise<number>;
|
|
17
|
+
//# sourceMappingURL=delete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBlF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Paths, log, colors } from '@minecraft-docker/shared';
|
|
2
|
+
import { getContainer } from '../infrastructure/index.js';
|
|
3
|
+
import { promptSudoPasswordIfNeeded } from '../lib/sudo-utils.js';
|
|
4
|
+
/**
|
|
5
|
+
* Execute delete server command
|
|
6
|
+
*
|
|
7
|
+
* If name is provided, runs in CLI mode with direct deletion.
|
|
8
|
+
* If name is not provided, runs in interactive mode with selection.
|
|
9
|
+
*/
|
|
10
|
+
export async function deleteCommand(options) {
|
|
11
|
+
const paths = new Paths(options.root);
|
|
12
|
+
// Check if initialized
|
|
13
|
+
if (!paths.isInitialized()) {
|
|
14
|
+
log.error('Platform not initialized. Run: mcctl init');
|
|
15
|
+
return 1;
|
|
16
|
+
}
|
|
17
|
+
// Prompt for sudo password if needed (avahi installed but no password provided)
|
|
18
|
+
const sudoPassword = await promptSudoPasswordIfNeeded(options.sudoPassword);
|
|
19
|
+
const container = getContainer({
|
|
20
|
+
rootDir: options.root,
|
|
21
|
+
sudoPassword,
|
|
22
|
+
});
|
|
23
|
+
// Determine execution mode
|
|
24
|
+
if (options.name) {
|
|
25
|
+
// CLI argument mode - use executeWithName
|
|
26
|
+
return deleteWithArguments(container, options);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
// Interactive mode - use execute
|
|
30
|
+
return deleteInteractive(container);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Delete server with CLI arguments (non-interactive)
|
|
35
|
+
*/
|
|
36
|
+
async function deleteWithArguments(container, options) {
|
|
37
|
+
const useCase = container.deleteServerUseCase;
|
|
38
|
+
try {
|
|
39
|
+
const deleted = await useCase.executeWithName(options.name, options.force ?? false);
|
|
40
|
+
if (deleted) {
|
|
41
|
+
console.log('');
|
|
42
|
+
console.log(colors.green(`✓ Server '${options.name}' deleted successfully!`));
|
|
43
|
+
console.log(colors.dim(' World data has been preserved in worlds/ directory.'));
|
|
44
|
+
console.log('');
|
|
45
|
+
}
|
|
46
|
+
return deleted ? 0 : 1;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
50
|
+
log.error(message);
|
|
51
|
+
return 1;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Delete server interactively (with prompts)
|
|
56
|
+
*/
|
|
57
|
+
async function deleteInteractive(container) {
|
|
58
|
+
const useCase = container.deleteServerUseCase;
|
|
59
|
+
try {
|
|
60
|
+
const deleted = await useCase.execute();
|
|
61
|
+
return deleted ? 0 : 1;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
// Check if user cancelled
|
|
65
|
+
const prompt = container.promptPort;
|
|
66
|
+
if (prompt.isCancel(error)) {
|
|
67
|
+
return 0; // User cancellation is not an error
|
|
68
|
+
}
|
|
69
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
70
|
+
log.error(message);
|
|
71
|
+
return 1;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"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"}
|