Changeset a4fea5e in Klonkt for scripts


Ignore:
Timestamp:
08/07/2026 04:43:07 PM (5 weeks ago)
Author:
roboburr <roboburr@…>
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)
Message:

De instance-naam is niet de site-slug, en vlagwaarden zijn geen argumenten

Vervolg op 6248497. Het instance-pad werkte, maar export-archive.mjs liz gaf
"onbekende site: liz" -- en liet je vervolgens raden.

## De naam van de instance is niet de slug van de site

De map onder de data-root en de systemd-unit heten liz; de SITE in die database
kan een andere slug hebben. Ze vallen vaak samen en soms niet, en dan stond je met
een foutmelding die niets prijsgaf.

Twee dingen veranderd:

  • de foutmelding zegt nu WAT er wel in die database staat, en als er helemaal geen sites in staan vraagt hij of DATABASE_PATH wel klopt
  • de site-slug is optioneel geworden. Staat er precies een site, dan is de keuze niet dubbelzinnig en hoef je hem niet te weten; hij meldt welke hij nam. Bij meerdere sites stopt hij en noemt ze.

node scripts/export-archive.mjs <instance> [site-slug]

## En een parseerfout die ik er zelf net in had gezet

args.filter(a => !a.startsWith('-')) pikt de WAARDE van een vlag op als
positioneel argument. Met liz --data-root /var/lib/klonkt werd /var/lib/klonkt
de site-slug. Gevonden bij het testen van het bovenstaande, en import-archive.mjs
had hem ook: daar zou het pad naar het archief verschoven zijn.

Nu een gedeelde splitsArgs() die weet welke vlaggen een waarde slikken.

Getoetst met een instance 'liz' waarvan de site 'lizzy' heet -- precies het geval
dat op productie omviel: zonder slug pakt hij lizzy en zegt dat, met de verkeerde
slug noemt hij wat er wel is, en met de juiste plus --out schrijft hij het archief.
Suite 577/577 onder UTC en Europe/Amsterdam.

Location:
scripts
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • scripts/export-archive.mjs

    r6248497 ra4fea5e  
    2424import fs from 'fs';
    2525import path from 'path';
    26 import { kiesInstance, eisOrigin } from './instance-env.mjs';
     26import { kiesInstance, eisOrigin, splitsArgs } from './instance-env.mjs';
    2727
    2828const 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.
     33const { vrij, vlaggen } = splitsArgs(args, ['--data-root', '--env', '--out', '--dir']);
     34const instance = vrij[0];
     35let slug = vrij[1] || null;
     36const vlag = (naam) => vlaggen[naam] ?? null;
    3137
    32 if (!slug) {
    33   console.error('gebruik: node scripts/export-archive.mjs <slug> [--data-root <map>] [--env <pad>] [--dry-run | --out <zip> | --dir <map>]');
     38if (!instance) {
     39  console.error('gebruik: node scripts/export-archive.mjs <instance> [site-slug] [--data-root <map>] [--env <pad>] [--dry-run | --out <zip> | --dir <map>]');
    3440  process.exit(1);
    3541}
     
    3945let gekozen;
    4046try {
    41   gekozen = kiesInstance(slug, {
     47  gekozen = kiesInstance(instance, {
    4248    dataRoot: typeof vlag('--data-root') === 'string' ? vlag('--data-root') : null,
    4349    envPad: typeof vlag('--env') === 'string' ? vlag('--env') : null,
     
    4753
    4854const { buildArchive, zipArchive, writeArchiveDir } = await import('../src/services/ArchiveExportService.js');
     55const { default: db } = await import('../src/config/database.js');
     56
     57// Geen slug gegeven? Dan mag de database het zeggen, mits het antwoord eenduidig is.
     58if (!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}
    4972
    5073let uit;
  • scripts/import-archive.mjs

    r6248497 ra4fea5e  
    1717// en hoort een aparte, bewuste actie te zijn.
    1818
    19 import { kiesInstance, eisOrigin } from './instance-env.mjs';
     19import { kiesInstance, eisOrigin, splitsArgs } from './instance-env.mjs';
    2020
    2121const args = process.argv.slice(2);
    22 const vrij = args.filter((a) => !a.startsWith('-'));
     22const { vrij, vlaggen } = splitsArgs(args, ['--data-root', '--env']);
    2323const [slug, bron] = vrij;
    2424
     
    3131// database bij import. Bij een IMPORT weegt dit zwaarder dan bij een export: in
    3232// 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; };
     33const vlag = (naam) => vlaggen[naam] ?? null;
    3434let gekozen;
    3535try {
  • scripts/instance-env.mjs

    r6248497 ra4fea5e  
    9494  process.exit(1);
    9595}
     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 */
     108export 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}
Note: See TracChangeset for help on using the changeset viewer.