@minecraft-docker/mcctl-api 1.9.0 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,247 @@
1
+ import { readFileSync, writeFileSync, existsSync } from 'fs';
2
+ import { join } from 'path';
3
+ /**
4
+ * Mapping between API field names and config.env variable names
5
+ */
6
+ const CONFIG_FIELD_MAP = {
7
+ motd: 'MOTD',
8
+ maxPlayers: 'MAX_PLAYERS',
9
+ difficulty: 'DIFFICULTY',
10
+ gameMode: 'GAMEMODE',
11
+ pvp: 'PVP',
12
+ viewDistance: 'VIEW_DISTANCE',
13
+ spawnProtection: 'SPAWN_PROTECTION',
14
+ memory: 'MEMORY',
15
+ useAikarFlags: 'USE_AIKAR_FLAGS',
16
+ };
17
+ /**
18
+ * Fields that require a server restart to take effect
19
+ */
20
+ const RESTART_REQUIRED_FIELDS = [
21
+ 'memory',
22
+ 'useAikarFlags',
23
+ ];
24
+ /**
25
+ * Parse config.env file content into key-value pairs
26
+ */
27
+ function parseEnvFile(content) {
28
+ const result = new Map();
29
+ const lines = content.split('\n');
30
+ for (const line of lines) {
31
+ // Skip empty lines and comments
32
+ const trimmed = line.trim();
33
+ if (!trimmed || trimmed.startsWith('#')) {
34
+ continue;
35
+ }
36
+ // Parse KEY=VALUE
37
+ const eqIndex = line.indexOf('=');
38
+ if (eqIndex > 0) {
39
+ const key = line.substring(0, eqIndex).trim();
40
+ const value = line.substring(eqIndex + 1).trim();
41
+ result.set(key, value);
42
+ }
43
+ }
44
+ return result;
45
+ }
46
+ /**
47
+ * Convert env value to appropriate type for API response
48
+ */
49
+ function parseEnvValue(key, value) {
50
+ if (value === undefined) {
51
+ return undefined;
52
+ }
53
+ switch (key) {
54
+ case 'maxPlayers':
55
+ case 'viewDistance':
56
+ case 'spawnProtection':
57
+ const num = parseInt(value, 10);
58
+ return isNaN(num) ? undefined : num;
59
+ case 'pvp':
60
+ case 'useAikarFlags':
61
+ return value.toLowerCase() === 'true';
62
+ case 'difficulty':
63
+ const lowerDiff = value.toLowerCase();
64
+ if (['peaceful', 'easy', 'normal', 'hard'].includes(lowerDiff)) {
65
+ return lowerDiff;
66
+ }
67
+ return undefined;
68
+ case 'gameMode':
69
+ const lowerMode = value.toLowerCase();
70
+ if (['survival', 'creative', 'adventure', 'spectator'].includes(lowerMode)) {
71
+ return lowerMode;
72
+ }
73
+ return undefined;
74
+ case 'motd':
75
+ case 'memory':
76
+ return value;
77
+ default:
78
+ return value;
79
+ }
80
+ }
81
+ /**
82
+ * Convert API value to env file format
83
+ */
84
+ function formatEnvValue(key, value) {
85
+ if (value === undefined || value === null) {
86
+ return '';
87
+ }
88
+ switch (key) {
89
+ case 'pvp':
90
+ case 'useAikarFlags':
91
+ return value ? 'true' : 'false';
92
+ case 'difficulty':
93
+ case 'gameMode':
94
+ return String(value).toLowerCase();
95
+ default:
96
+ return String(value);
97
+ }
98
+ }
99
+ /**
100
+ * Update config.env file while preserving comments and structure
101
+ */
102
+ function updateEnvFile(content, updates) {
103
+ const lines = content.split('\n');
104
+ const result = [];
105
+ const updatedKeys = new Set();
106
+ for (const line of lines) {
107
+ const trimmed = line.trim();
108
+ // Preserve empty lines and comments
109
+ if (!trimmed || trimmed.startsWith('#')) {
110
+ result.push(line);
111
+ continue;
112
+ }
113
+ // Check if this line has a key we want to update
114
+ const eqIndex = line.indexOf('=');
115
+ if (eqIndex > 0) {
116
+ const key = line.substring(0, eqIndex).trim();
117
+ if (updates.has(key)) {
118
+ const newValue = updates.get(key);
119
+ result.push(`${key}=${newValue}`);
120
+ updatedKeys.add(key);
121
+ }
122
+ else {
123
+ result.push(line);
124
+ }
125
+ }
126
+ else {
127
+ result.push(line);
128
+ }
129
+ }
130
+ // Add any new keys that weren't in the original file
131
+ for (const [key, value] of updates) {
132
+ if (!updatedKeys.has(key)) {
133
+ // Find appropriate section or add at end
134
+ result.push(`${key}=${value}`);
135
+ }
136
+ }
137
+ return result.join('\n');
138
+ }
139
+ /**
140
+ * ConfigService - Manages server configuration files
141
+ */
142
+ export class ConfigService {
143
+ platformPath;
144
+ constructor(platformPath) {
145
+ this.platformPath = platformPath;
146
+ }
147
+ /**
148
+ * Get the path to a server's config.env file
149
+ */
150
+ getConfigPath(serverName) {
151
+ return join(this.platformPath, 'servers', serverName, 'config.env');
152
+ }
153
+ /**
154
+ * Check if a server's configuration exists
155
+ */
156
+ configExists(serverName) {
157
+ return existsSync(this.getConfigPath(serverName));
158
+ }
159
+ /**
160
+ * Read server configuration from config.env
161
+ */
162
+ getConfig(serverName) {
163
+ const configPath = this.getConfigPath(serverName);
164
+ if (!existsSync(configPath)) {
165
+ throw new Error(`Server configuration not found: ${serverName}`);
166
+ }
167
+ const content = readFileSync(configPath, 'utf-8');
168
+ const envMap = parseEnvFile(content);
169
+ const config = {};
170
+ for (const [apiKey, envKey] of Object.entries(CONFIG_FIELD_MAP)) {
171
+ const value = envMap.get(envKey);
172
+ const parsedValue = parseEnvValue(apiKey, value);
173
+ if (parsedValue !== undefined) {
174
+ config[apiKey] = parsedValue;
175
+ }
176
+ }
177
+ return config;
178
+ }
179
+ /**
180
+ * Update server configuration in config.env
181
+ * Returns information about what was changed
182
+ */
183
+ updateConfig(serverName, updates) {
184
+ const configPath = this.getConfigPath(serverName);
185
+ if (!existsSync(configPath)) {
186
+ throw new Error(`Server configuration not found: ${serverName}`);
187
+ }
188
+ // Read current configuration
189
+ const content = readFileSync(configPath, 'utf-8');
190
+ const currentConfig = this.getConfig(serverName);
191
+ // Prepare updates
192
+ const envUpdates = new Map();
193
+ const changedFields = [];
194
+ let restartRequired = false;
195
+ for (const [apiKey, value] of Object.entries(updates)) {
196
+ if (value === undefined) {
197
+ continue;
198
+ }
199
+ const typedKey = apiKey;
200
+ const envKey = CONFIG_FIELD_MAP[typedKey];
201
+ if (!envKey) {
202
+ continue;
203
+ }
204
+ // Check if value actually changed
205
+ const currentValue = currentConfig[typedKey];
206
+ if (currentValue !== value) {
207
+ changedFields.push(apiKey);
208
+ envUpdates.set(envKey, formatEnvValue(typedKey, value));
209
+ // Check if this field requires restart
210
+ if (RESTART_REQUIRED_FIELDS.includes(typedKey)) {
211
+ restartRequired = true;
212
+ }
213
+ }
214
+ }
215
+ // Only write if there are changes
216
+ if (changedFields.length > 0) {
217
+ const updatedContent = updateEnvFile(content, envUpdates);
218
+ writeFileSync(configPath, updatedContent, 'utf-8');
219
+ }
220
+ // Read back the updated configuration
221
+ const newConfig = this.getConfig(serverName);
222
+ return {
223
+ config: newConfig,
224
+ changedFields,
225
+ restartRequired,
226
+ };
227
+ }
228
+ /**
229
+ * Get the world name from server configuration
230
+ */
231
+ getWorldName(serverName) {
232
+ const configPath = this.getConfigPath(serverName);
233
+ if (!existsSync(configPath)) {
234
+ return 'world'; // Default world name
235
+ }
236
+ const content = readFileSync(configPath, 'utf-8');
237
+ const envMap = parseEnvFile(content);
238
+ return envMap.get('LEVEL') || 'world';
239
+ }
240
+ }
241
+ /**
242
+ * Create a ConfigService instance
243
+ */
244
+ export function createConfigService(platformPath) {
245
+ return new ConfigService(platformPath);
246
+ }
247
+ //# sourceMappingURL=ConfigService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigService.js","sourceRoot":"","sources":["../../src/services/ConfigService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { SqliteAuditLogRepository } from '@minecraft-docker/shared';
2
+ import type { AuditLogEntry, AuditLogListQuery, AuditLogListResponse, AuditLogStatsResponse, AuditLogDetailResponse, AuditLogPurgeResponse } from '../schemas/audit-log.js';
3
+ /**
4
+ * Event listeners for new audit log entries (SSE support)
5
+ */
6
+ type AuditLogListener = (log: AuditLogEntry) => void;
7
+ /**
8
+ * Get or create the audit log repository singleton
9
+ */
10
+ export declare function getAuditLogRepository(): SqliteAuditLogRepository;
11
+ /**
12
+ * Get audit logs list with filtering and pagination
13
+ */
14
+ export declare function getAuditLogs(query: AuditLogListQuery): Promise<AuditLogListResponse>;
15
+ /**
16
+ * Get audit log statistics
17
+ */
18
+ export declare function getAuditLogStats(): Promise<AuditLogStatsResponse>;
19
+ /**
20
+ * Get single audit log with related logs
21
+ */
22
+ export declare function getAuditLogById(id: string): Promise<AuditLogDetailResponse | null>;
23
+ /**
24
+ * Purge audit logs older than a given date
25
+ */
26
+ export declare function purgeAuditLogs(before: string, dryRun?: boolean): Promise<AuditLogPurgeResponse>;
27
+ /**
28
+ * Subscribe to new audit log events
29
+ */
30
+ export declare function subscribeAuditLogs(listener: AuditLogListener): () => void;
31
+ /**
32
+ * Notify all listeners of a new audit log entry
33
+ * Called by routes that create audit log entries
34
+ */
35
+ export declare function notifyNewAuditLog(entry: AuditLogEntry): void;
36
+ /**
37
+ * Close the repository (for graceful shutdown)
38
+ */
39
+ export declare function closeAuditLogRepository(): void;
40
+ export {};
41
+ //# sourceMappingURL=audit-log-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-log-service.d.ts","sourceRoot":"","sources":["../../src/services/audit-log-service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EAKzB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EACV,aAAa,EAEb,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,yBAAyB,CAAC;AAOjC;;GAEG;AACH,KAAK,gBAAgB,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;AAGrD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,wBAAwB,CAMhE;AAyFD;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA6B1F;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAoDvE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CA8BxF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC,qBAAqB,CAAC,CAsBhC;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,IAAI,CAKzE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAQ5D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAK9C"}
@@ -0,0 +1,259 @@
1
+ import { join } from 'path';
2
+ import { SqliteAuditLogRepository, AuditActionEnum, } from '@minecraft-docker/shared';
3
+ import { config } from '../config/index.js';
4
+ /**
5
+ * Singleton instance of the audit log repository
6
+ */
7
+ let repository = null;
8
+ const listeners = new Set();
9
+ /**
10
+ * Get or create the audit log repository singleton
11
+ */
12
+ export function getAuditLogRepository() {
13
+ if (!repository) {
14
+ const dbPath = join(config.mcctlRoot, 'audit.db');
15
+ repository = new SqliteAuditLogRepository(dbPath);
16
+ }
17
+ return repository;
18
+ }
19
+ /**
20
+ * Convert AuditLog entity to API response entry
21
+ */
22
+ function toEntry(log) {
23
+ const json = log.toJSON();
24
+ return {
25
+ id: json.id,
26
+ action: json.action,
27
+ actor: json.actor,
28
+ targetType: json.targetType,
29
+ targetName: json.targetName,
30
+ details: json.details,
31
+ status: json.status,
32
+ errorMessage: json.errorMessage ?? null,
33
+ timestamp: json.timestamp,
34
+ };
35
+ }
36
+ /**
37
+ * Convert AuditLog entity to brief entry
38
+ */
39
+ function toBrief(log) {
40
+ const json = log.toJSON();
41
+ return {
42
+ id: json.id,
43
+ action: json.action,
44
+ targetName: json.targetName,
45
+ timestamp: json.timestamp,
46
+ };
47
+ }
48
+ /**
49
+ * Parse sort parameter
50
+ */
51
+ function parseSortOrder(sort) {
52
+ if (sort === 'timestamp:asc')
53
+ return 'asc';
54
+ return 'desc';
55
+ }
56
+ /**
57
+ * Build query options from request query parameters
58
+ */
59
+ function buildQueryOptions(query) {
60
+ const options = {};
61
+ if (query.action) {
62
+ // Take first action for now (port interface only supports single action)
63
+ const firstAction = query.action.split(',')[0]?.trim();
64
+ if (firstAction && Object.values(AuditActionEnum).includes(firstAction)) {
65
+ options.action = firstAction;
66
+ }
67
+ }
68
+ if (query.actor) {
69
+ options.actor = query.actor;
70
+ }
71
+ if (query.targetType) {
72
+ options.targetType = query.targetType;
73
+ }
74
+ if (query.targetName) {
75
+ options.targetName = query.targetName;
76
+ }
77
+ if (query.status === 'success' || query.status === 'failure') {
78
+ options.status = query.status;
79
+ }
80
+ if (query.from) {
81
+ options.from = new Date(query.from);
82
+ }
83
+ if (query.to) {
84
+ options.to = new Date(query.to);
85
+ }
86
+ options.limit = query.limit ?? 50;
87
+ options.offset = query.offset ?? 0;
88
+ return options;
89
+ }
90
+ // ============================================================
91
+ // Service Functions
92
+ // ============================================================
93
+ /**
94
+ * Get audit logs list with filtering and pagination
95
+ */
96
+ export async function getAuditLogs(query) {
97
+ const repo = getAuditLogRepository();
98
+ const options = buildQueryOptions(query);
99
+ // Get logs and total count
100
+ const [logs, total] = await Promise.all([
101
+ repo.findAll(options),
102
+ repo.count(options),
103
+ ]);
104
+ // If sort is ascending, reverse the default DESC results
105
+ const sortOrder = parseSortOrder(query.sort);
106
+ const sortedLogs = sortOrder === 'asc' ? [...logs].reverse() : logs;
107
+ return {
108
+ logs: sortedLogs.map(toEntry),
109
+ total,
110
+ limit: options.limit ?? 50,
111
+ offset: options.offset ?? 0,
112
+ filters: {
113
+ action: query.action ?? null,
114
+ actor: query.actor ?? null,
115
+ targetType: query.targetType ?? null,
116
+ targetName: query.targetName ?? null,
117
+ status: query.status ?? null,
118
+ from: query.from ?? null,
119
+ to: query.to ?? null,
120
+ },
121
+ };
122
+ }
123
+ /**
124
+ * Get audit log statistics
125
+ */
126
+ export async function getAuditLogStats() {
127
+ const repo = getAuditLogRepository();
128
+ // Get total count
129
+ const total = await repo.count();
130
+ // Get counts by action
131
+ const byAction = {};
132
+ for (const action of Object.values(AuditActionEnum)) {
133
+ const count = await repo.count({ action });
134
+ if (count > 0) {
135
+ byAction[action] = count;
136
+ }
137
+ }
138
+ // Get counts by status
139
+ const [successCount, failureCount] = await Promise.all([
140
+ repo.count({ status: 'success' }),
141
+ repo.count({ status: 'failure' }),
142
+ ]);
143
+ // Get all logs for actor aggregation (limited to recent)
144
+ const recentLogs = await repo.findAll({ limit: 1000 });
145
+ // Aggregate by actor
146
+ const byActor = {};
147
+ for (const log of recentLogs) {
148
+ const actor = log.actor;
149
+ byActor[actor] = (byActor[actor] ?? 0) + 1;
150
+ }
151
+ // Get recent activity (last 10)
152
+ const recentActivity = await repo.findAll({ limit: 10 });
153
+ // Get oldest and newest entries
154
+ const allLogs = await repo.findAll({ limit: 1 });
155
+ const oldestLogs = await repo.findAll({});
156
+ const newestEntry = allLogs.length > 0 ? allLogs[0].timestamp.toISOString() : null;
157
+ const oldestEntry = oldestLogs.length > 0 ? oldestLogs[oldestLogs.length - 1].timestamp.toISOString() : null;
158
+ return {
159
+ total,
160
+ byAction,
161
+ byStatus: {
162
+ success: successCount,
163
+ failure: failureCount,
164
+ },
165
+ byActor,
166
+ recentActivity: recentActivity.map(toEntry),
167
+ oldestEntry,
168
+ newestEntry,
169
+ };
170
+ }
171
+ /**
172
+ * Get single audit log with related logs
173
+ */
174
+ export async function getAuditLogById(id) {
175
+ const repo = getAuditLogRepository();
176
+ // Find the log by ID
177
+ const allLogs = await repo.findAll({});
178
+ const log = allLogs.find(l => l.id === id);
179
+ if (!log) {
180
+ return null;
181
+ }
182
+ // Get related logs (same target, same actor)
183
+ const [sameTarget, sameActor] = await Promise.all([
184
+ repo.findByTarget(log.targetType, log.targetName),
185
+ repo.findByActor(log.actor),
186
+ ]);
187
+ return {
188
+ log: toEntry(log),
189
+ relatedLogs: {
190
+ sameTarget: sameTarget
191
+ .filter(l => l.id !== id)
192
+ .slice(0, 10)
193
+ .map(toBrief),
194
+ sameActor: sameActor
195
+ .filter(l => l.id !== id)
196
+ .slice(0, 10)
197
+ .map(toBrief),
198
+ },
199
+ };
200
+ }
201
+ /**
202
+ * Purge audit logs older than a given date
203
+ */
204
+ export async function purgeAuditLogs(before, dryRun = false) {
205
+ const repo = getAuditLogRepository();
206
+ const beforeDate = new Date(before);
207
+ if (dryRun) {
208
+ // Count logs that would be deleted
209
+ const count = await repo.count({ to: beforeDate });
210
+ return {
211
+ deleted: count,
212
+ dryRun: true,
213
+ message: `${count} audit log entries would be deleted before ${before}`,
214
+ };
215
+ }
216
+ // Actually delete
217
+ const deleted = await repo.deleteOlderThan(beforeDate);
218
+ return {
219
+ deleted,
220
+ dryRun: false,
221
+ message: `${deleted} audit log entries deleted before ${before}`,
222
+ };
223
+ }
224
+ // ============================================================
225
+ // SSE Support
226
+ // ============================================================
227
+ /**
228
+ * Subscribe to new audit log events
229
+ */
230
+ export function subscribeAuditLogs(listener) {
231
+ listeners.add(listener);
232
+ return () => {
233
+ listeners.delete(listener);
234
+ };
235
+ }
236
+ /**
237
+ * Notify all listeners of a new audit log entry
238
+ * Called by routes that create audit log entries
239
+ */
240
+ export function notifyNewAuditLog(entry) {
241
+ for (const listener of listeners) {
242
+ try {
243
+ listener(entry);
244
+ }
245
+ catch {
246
+ // Ignore listener errors
247
+ }
248
+ }
249
+ }
250
+ /**
251
+ * Close the repository (for graceful shutdown)
252
+ */
253
+ export function closeAuditLogRepository() {
254
+ if (repository) {
255
+ repository.close();
256
+ repository = null;
257
+ }
258
+ }
259
+ //# sourceMappingURL=audit-log-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-log-service.js","sourceRoot":"","sources":["../../src/services/audit-log-service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minecraft-docker/mcctl-api",
3
- "version": "1.9.0",
3
+ "version": "1.11.0",
4
4
  "description": "REST API server for managing Docker Minecraft servers",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -51,7 +51,7 @@
51
51
  "@fastify/helmet": "^12.0.1",
52
52
  "@fastify/swagger": "^9.6.1",
53
53
  "@fastify/swagger-ui": "^5.2.4",
54
- "@minecraft-docker/shared": "^1.9.0",
54
+ "@minecraft-docker/shared": "^1.11.0",
55
55
  "@sinclair/typebox": "^0.34.48",
56
56
  "bcrypt": "^6.0.0",
57
57
  "dotenv": "^16.4.7",