Assessor_2.0/server/compliance/update-bsi-assets.mjs

26 lines
1.8 KiB
JavaScript

import { readFile, writeFile } from 'node:fs/promises';
import { createHash } from 'node:crypto';
import { bsiIsoCrosswalk, bsiKernelCatalog } from '../../src/compliance/bsi-grundschutz.ts';
// Regenerates the pinned BSI snapshots from official files downloaded from these exact commit URLs.
const commit = process.argv[4];
const [catalogPath, crosswalkPath] = process.argv.slice(2);
if (!catalogPath || !crosswalkPath || !/^[0-9a-f]{40}$/.test(commit ?? '')) {
throw new Error('Usage: node --experimental-strip-types server/compliance/update-bsi-assets.mjs <Grundschutz++-resolved_catalog.json> <ISO27001-AnnexA-to-GS++-mapping_collection.json> <BSI commit sha>');
}
const base = `https://raw.githubusercontent.com/BSI-Bund/Stand-der-Technik-Bibliothek/${commit}/control_layer`;
const sha256 = bytes => createHash('sha256').update(bytes).digest('hex');
const catalogBytes = await readFile(catalogPath);
const catalog = bsiKernelCatalog(JSON.parse(catalogBytes.toString('utf8')), `${base}/Grundschutz++/Grundschutz++-resolved_catalog.json`, sha256(catalogBytes));
const catalogOutput = `server/compliance/data/bsi-grundschutz-kernel-${catalog.version.slice(0, 10)}.json`;
await writeFile(catalogOutput, JSON.stringify(catalog) + '\n');
console.log(`${catalogOutput}: ${catalog.requirements.length} requirements`);
const crosswalkBytes = await readFile(crosswalkPath);
const crosswalk = bsiIsoCrosswalk(JSON.parse(crosswalkBytes.toString('utf8')),
`${base}/Mappings/ISO-27001-zu-GSpp/ISO27001-AnnexA-to-GS++-mapping_collection.json`, sha256(crosswalkBytes));
const crosswalkOutput = `server/compliance/data/bsi-iso27001-crosswalk-${crosswalk.version}.json`;
await writeFile(crosswalkOutput, JSON.stringify(crosswalk) + '\n');
console.log(`${crosswalkOutput}: ${crosswalk.entries.length} entries`);