38 lines
1.1 KiB
JavaScript
38 lines
1.1 KiB
JavaScript
import { Router } from 'express';
|
|
import { runRestic } from '../executor.js';
|
|
import { assertSnapshotIdShape, listSnapshotsForVm, validateSnapshotForVm } from '../validators.js';
|
|
|
|
export const snapshotsRouter = Router();
|
|
|
|
snapshotsRouter.get('/:vmName', async (req, res, next) => {
|
|
try {
|
|
res.json(await listSnapshotsForVm(req.params.vmName));
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
});
|
|
|
|
snapshotsRouter.get('/:vmName/:snapshotId/files', async (req, res, next) => {
|
|
try {
|
|
const snapshot = await validateSnapshotForVm(req.params.vmName, req.params.snapshotId);
|
|
assertSnapshotIdShape(snapshot.id);
|
|
const result = await runRestic(['ls', '--json', snapshot.id]);
|
|
const entries = result.stdout
|
|
.split('\n')
|
|
.filter(Boolean)
|
|
.map((line) => JSON.parse(line))
|
|
.filter((entry) => entry.struct_type === 'node')
|
|
.map((entry) => ({
|
|
name: entry.name,
|
|
path: entry.path,
|
|
type: entry.type,
|
|
size: entry.size || 0,
|
|
mode: entry.mode || '',
|
|
mtime: entry.mtime || null,
|
|
}));
|
|
res.json(entries);
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
});
|