Changeset a4fea5e in Klonkt
- Timestamp:
- 08/07/2026 04:43:07 PM (5 weeks ago)
- Branches:
- main
- Children:
- ed5e7ab
- Parents:
- 6248497
- git-author:
- roboburr <roboburr@…> (08/07/2026 04:43:06 PM)
- git-committer:
- roboburr <roboburr@…> (08/07/2026 04:43:07 PM)
- Files:
-
- 5 edited
-
scripts/export-archive.mjs (modified) (3 diffs)
-
scripts/import-archive.mjs (modified) (2 diffs)
-
scripts/instance-env.mjs (modified) (1 diff)
-
src/services/ArchiveExportService.js (modified) (1 diff)
-
src/services/ArchiveImportService.js (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
scripts/export-archive.mjs
r6248497 ra4fea5e 24 24 import fs from 'fs'; 25 25 import path from 'path'; 26 import { kiesInstance, eisOrigin } from './instance-env.mjs';26 import { kiesInstance, eisOrigin, splitsArgs } from './instance-env.mjs'; 27 27 28 28 const args = process.argv.slice(2); 29 const slug = args.find((a) => !a.startsWith('-')); 30 const vlag = (naam) => { const i = args.indexOf(naam); return i >= 0 ? (args[i + 1] || true) : null; }; 29 // Twee namen, en ze zijn niet hetzelfde. De eerste is de INSTANCE (de map onder 30 // de data-root, de systemd-unit); de tweede, optioneel, is de slug van de SITE in 31 // die database. Laat je hem weg en er staat er precies een, dan is de keuze niet 32 // dubbelzinnig en hoef je hem niet te weten. 33 const { vrij, vlaggen } = splitsArgs(args, ['--data-root', '--env', '--out', '--dir']); 34 const instance = vrij[0]; 35 let slug = vrij[1] || null; 36 const vlag = (naam) => vlaggen[naam] ?? null; 31 37 32 if (! slug) {33 console.error('gebruik: node scripts/export-archive.mjs < slug>[--data-root <map>] [--env <pad>] [--dry-run | --out <zip> | --dir <map>]');38 if (!instance) { 39 console.error('gebruik: node scripts/export-archive.mjs <instance> [site-slug] [--data-root <map>] [--env <pad>] [--dry-run | --out <zip> | --dir <map>]'); 34 40 process.exit(1); 35 41 } … … 39 45 let gekozen; 40 46 try { 41 gekozen = kiesInstance( slug, {47 gekozen = kiesInstance(instance, { 42 48 dataRoot: typeof vlag('--data-root') === 'string' ? vlag('--data-root') : null, 43 49 envPad: typeof vlag('--env') === 'string' ? vlag('--env') : null, … … 47 53 48 54 const { buildArchive, zipArchive, writeArchiveDir } = await import('../src/services/ArchiveExportService.js'); 55 const { default: db } = await import('../src/config/database.js'); 56 57 // Geen slug gegeven? Dan mag de database het zeggen, mits het antwoord eenduidig is. 58 if (!slug) { 59 let sites = []; 60 try { sites = db.prepare('SELECT slug FROM sites ORDER BY rowid').all().map((r) => r.slug); } catch { /* geen tabel */ } 61 if (sites.length === 1) { 62 [slug] = sites; 63 console.log(`site niet opgegeven, en er staat er precies een: ${slug}`); 64 } else if (sites.length === 0) { 65 console.error(`in ${process.env.DATABASE_PATH || 'deze database'} staat geen enkele site.`); 66 process.exit(1); 67 } else { 68 console.error(`meerdere sites in deze database: ${sites.join(', ')}\nGeef er een op: node scripts/export-archive.mjs ${instance} <site-slug>`); 69 process.exit(1); 70 } 71 } 49 72 50 73 let uit; -
scripts/import-archive.mjs
r6248497 ra4fea5e 17 17 // en hoort een aparte, bewuste actie te zijn. 18 18 19 import { kiesInstance, eisOrigin } from './instance-env.mjs';19 import { kiesInstance, eisOrigin, splitsArgs } from './instance-env.mjs'; 20 20 21 21 const args = process.argv.slice(2); 22 const vrij = args.filter((a) => !a.startsWith('-'));22 const { vrij, vlaggen } = splitsArgs(args, ['--data-root', '--env']); 23 23 const [slug, bron] = vrij; 24 24 … … 31 31 // database bij import. Bij een IMPORT weegt dit zwaarder dan bij een export: in 32 32 // de verkeerde database schrijven is niet terug te draaien. 33 const vlag = (naam) => { const i = args.indexOf(naam); return i >= 0 ? (args[i + 1] || null) : null; };33 const vlag = (naam) => vlaggen[naam] ?? null; 34 34 let gekozen; 35 35 try { -
scripts/instance-env.mjs
r6248497 ra4fea5e 94 94 process.exit(1); 95 95 } 96 97 /** 98 * Argumenten splitsen in vrije woorden en vlaggen. 99 * 100 * Nodig omdat de naieve versie -- alles wat niet met een streepje begint is 101 * positioneel -- de WAARDE van een vlag als positioneel argument oppikt. Met 102 * `export-archive.mjs liz --data-root /var/lib/klonkt` werd /var/lib/klonkt de 103 * site-slug. Precies zo'n fout die pas opvalt als iemand hem gebruikt. 104 * 105 * @param {string[]} args 106 * @param {string[]} metWaarde vlaggen die een waarde slikken 107 */ 108 export function splitsArgs(args, metWaarde) { 109 const vrij = []; 110 const vlaggen = {}; 111 for (let i = 0; i < args.length; i += 1) { 112 const a = args[i]; 113 if (!a.startsWith('-')) { vrij.push(a); continue; } 114 if (metWaarde.includes(a)) { vlaggen[a] = args[i + 1] ?? null; i += 1; continue; } 115 vlaggen[a] = true; 116 } 117 return { vrij, vlaggen }; 118 } -
src/services/ArchiveExportService.js
r6248497 ra4fea5e 247 247 const origin = (opts.origin || process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, ''); 248 248 const site = db.prepare('SELECT * FROM sites WHERE slug = ?').get(slug); 249 if (!site) throw new Error(`onbekende site: ${slug}`); 249 if (!site) { 250 // De naam van de INSTANCE (de map, de unit) en de slug van de SITE in zijn 251 // database zijn twee dingen. Ze vallen vaak samen en soms niet, en dan zat je 252 // met een foutmelding die je liet raden. Zeg dus wat er wel in staat. 253 let bestaand = []; 254 try { bestaand = db.prepare('SELECT slug FROM sites ORDER BY rowid').all().map((r) => r.slug); } catch { /* geen sites-tabel */ } 255 const wat = slug ? `onbekende site: ${slug}` : 'geen site opgegeven'; 256 throw new Error(bestaand.length 257 ? `${wat}. In deze database staat: ${bestaand.join(', ')}` 258 : `${wat}. In deze database staat geen enkele site -- wijst DATABASE_PATH naar de juiste?`); 259 } 250 260 251 261 const bestanden = new Map(); // pad -> Buffer -
src/services/ArchiveImportService.js
r6248497 ra4fea5e 143 143 144 144 const site = db.prepare('SELECT * FROM sites WHERE slug = ?').get(opts.slug); 145 if (!site) throw new Error(`onbekende site: ${opts.slug}`); 145 if (!site) { 146 // De naam van de INSTANCE (de map, de unit) en de slug van de SITE in zijn 147 // database zijn twee dingen. Ze vallen vaak samen en soms niet, en dan zat je 148 // met een foutmelding die je liet raden. Zeg dus wat er wel in staat. 149 let bestaand = []; 150 try { bestaand = db.prepare('SELECT slug FROM sites ORDER BY rowid').all().map((r) => r.slug); } catch { /* geen sites-tabel */ } 151 const wat = opts.slug ? `onbekende site: ${opts.slug}` : 'geen site opgegeven'; 152 throw new Error(bestaand.length 153 ? `${wat}. In deze database staat: ${bestaand.join(', ')}` 154 : `${wat}. In deze database staat geen enkele site -- wijst DATABASE_PATH naar de juiste?`); 155 } 146 156 const eigenOrigin = (opts.origin || process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, ''); 147 157 rapport.origin = manifest.origin || null;
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)