@dotrino/vaultd 0.148.1 → 0.149.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.
package/README.md CHANGED
@@ -148,6 +148,19 @@ sesión**. Para levantarla ya, `systemctl --user start dotrino-vault`; si estaba
148
148
  **actualizando**, el servicio viejo sigue corriendo y hay que reiniciarlo con
149
149
  `systemctl --user restart dotrino-vault`.
150
150
 
151
+ **Fedora / RHEL / openSUSE — `.rpm`:** el mismo instalador, para las distribuciones que
152
+ usan `rpm`. Deja exactamente lo mismo que el `.deb` (binarios en `/usr/bin` y la unidad
153
+ `systemd --user` para todos los usuarios):
154
+
155
+ ```sh
156
+ sudo dnf install ./dotrino-vault-*.x86_64.rpm # Fedora, RHEL y derivadas
157
+ sudo zypper install --allow-unsigned-rpm ./dotrino-vault-*.x86_64.rpm # openSUSE
158
+ ```
159
+
160
+ El `.rpm` no lleva firma GPG (por eso `zypper` pide `--allow-unsigned-rpm`); lo que
161
+ prueba de dónde salió es la atestación de sigstore del release:
162
+ `gh attestation verify dotrino-vault-*.x86_64.rpm --repo imdotrino/dotrino-vault`.
163
+
151
164
  **Otro Linux x64 con systemd — tarball:**
152
165
 
153
166
  ```sh
@@ -160,13 +173,13 @@ Hace lo equivalente en tu `$HOME` (`~/.local/bin` + `~/.config/systemd/user`) y
160
173
  paso más allá: lo **arranca en el acto** y activa `linger`, así el vault corre desde
161
174
  el arranque de la máquina aunque no inicies sesión.
162
175
 
163
- El binario del tarball y el `.deb` son **x64/amd64** y el instalador **necesita
176
+ El binario del tarball, el `.deb` y el `.rpm` son **x64/amd64** y el instalador **necesita
164
177
  systemd** (si no lo encuentra, se detiene y te dice cómo arrancar el daemon a mano).
165
178
  Para ARM —una Raspberry— o para un Linux sin systemd, usa Docker o `npx`.
166
179
 
167
180
  Ambos traen **Node embebido**: no necesitas instalar Node ni dependencias de npm. Lo
168
181
  único que esperan del sistema es `libatomic1`, que casi todas las distribuciones
169
- traen puesta; el `.deb` la declara y la instala sola si falta. Con el tarball, en un
182
+ traen puesta; el `.deb` y el `.rpm` la declaran y se instala sola si falta. Con el tarball, en un
170
183
  sistema muy pelado (un contenedor mínimo), instálala tú: `sudo apt install
171
184
  libatomic1`.
172
185
 
@@ -190,8 +203,8 @@ curl -fsSL https://install.dotrino.com/install.sh | sh -s -- @dotrino/vaultd
190
203
  & ([scriptblock]::Create((irm https://install.dotrino.com/install.ps1))) @dotrino/vaultd
191
204
  ```
192
205
 
193
- **Docker (cualquier sistema, y la única vía *empaquetada* para ARM — el `.deb` y el
194
- tarball son solo x64; `npx` también sirve en una Raspberry):**
206
+ **Docker (cualquier sistema, y la única vía *empaquetada* para ARM — el `.deb`, el `.rpm` y
207
+ el tarball son solo x64; `npx` también sirve en una Raspberry):**
195
208
 
196
209
  ```sh
197
210
  docker volume create dotrino-vault
@@ -615,6 +628,7 @@ npm test # 118 pruebas (node --test, sin dependencia
615
628
 
616
629
  bash packaging/build.sh # binario único SEA + tarball de Linux (dist/)
617
630
  bash packaging/build-deb.sh # el .deb (requiere dpkg-deb; construye el binario si falta)
631
+ bash packaging/build-rpm.sh # el .rpm (requiere rpmbuild: `apt install rpm`; mismo binario)
618
632
  bash packaging/build-win.sh # .exe + .zip de Windows, cruzado desde Linux (sin probar)
619
633
  docker build -t dotrino-vault . # la imagen (la misma que CI publica en GHCR)
620
634
  ```
@@ -628,8 +642,8 @@ hermano en `../dotrino-proxy` (`secrets.e2e`, `multiprofile.e2e`,
628
642
  `pairing-cita.e2e`): no se saltan solos, así que sin ese repo al lado `npm test`
629
643
  falla.
630
644
 
631
- Etiquetar `vaultd-v<ver>` publica la imagen de Docker en GHCR; el `.deb` y el tarball
632
- se suben a la release a mano.
645
+ Etiquetar `vaultd-v<ver>` publica la imagen de Docker en GHCR. Etiquetar `v<ver>` lanza
646
+ `release.yml`, que construye, atestigua y sube a la release el `.deb`, el `.rpm` y el tarball.
633
647
 
634
648
  ### Enrolar y usar desde un dispositivo (Node, para testing)
635
649
 
@@ -76,10 +76,10 @@ if (process.argv.includes('--pair')) {
76
76
  // que pedírsela) en vez de la dirección de la conexión.
77
77
  const { qr, expiresInMs } = await mgr.current().startPairing({ label: 'cli' })
78
78
  const { url, b64 } = pairUrl(qr)
79
- console.log(`\nEmparejá un dispositivo (válido ${expiresInMs / 60000} min):\n`)
79
+ console.log(`\nEmpareja un dispositivo (válido ${expiresInMs / 60000} min):\n`)
80
80
  console.log(qrToString(url))
81
81
  console.log(url)
82
- console.log('\nO pegá este código:\n ' + b64)
82
+ console.log('\nO pega este código:\n ' + b64)
83
83
  }
84
84
 
85
85
  // --tui: la bóveda Y su interfaz en la MISMA ventana. Donde no queda como servicio
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dotrino/vaultd",
3
- "version": "0.148.1",
3
+ "version": "0.149.0",
4
4
  "type": "module",
5
5
  "description": "Certificador personal de Dotrino: daemon headless que custodia la clave maestra y delega capacidades a tus dispositivos por el proxy. Tu CA propia.",
6
6
  "bin": {
package/src/ctl.js CHANGED
@@ -1792,7 +1792,7 @@ async function cmdLogins (rest) {
1792
1792
  * solo: pide permiso a un aparato con `aprueba` (el teléfono, un navegador…) si lo hay y,
1793
1793
  * si no hay ninguno, no hace falta
1794
1794
  * (dueño, 2026-09-24). Esto es lo mismo a mano, sin esperar al aviso del día. Con el
1795
- * `.deb` del sistema el binario es de root y aquí solo se verifica y se dice el `sudo`.
1795
+ * paquete del sistema (`.deb` o `.rpm`) el binario es de root y aquí solo se verifica y se dice el `sudo`.
1796
1796
  *
1797
1797
  * Lo que se baja SE VERIFICA contra la atestación de sigstore antes de tocar el disco, y
1798
1798
  * si no se puede verificar NO SE INSTALA. Que la URL sea la correcta no prueba nada.
@@ -1904,14 +1904,15 @@ async function cmdUpdate (args = []) {
1904
1904
  }
1905
1905
  console.log('firmada por el release de %s ✓', 'imdotrino/dotrino-vault')
1906
1906
 
1907
- if (pick.kind === 'deb') {
1907
+ if (pick.kind === 'deb' || pick.kind === 'rpm') {
1908
+ const cmd = pick.kind === 'deb' ? ['dpkg', '-i'] : ['rpm', '-U']
1908
1909
  if (typeof process.getuid === 'function' && process.getuid() === 0) {
1909
- execFileSync('dpkg', ['-i', file], { stdio: 'inherit' })
1910
+ execFileSync(cmd[0], [cmd[1], file], { stdio: 'inherit' })
1910
1911
  } else {
1911
1912
  // No se pide sudo por dentro: que la contraseña la escriba quien la escribe, en su
1912
1913
  // terminal y viendo qué comando la pide.
1913
1914
  console.log('\nYa verificada. Instálala con:')
1914
- console.log(' %ssudo dpkg -i %s%s', B, file, Z)
1915
+ console.log(' %ssudo %s %s%s', B, cmd.join(' '), file, Z)
1915
1916
  console.log('\nEl servicio se reinicia solo al cambiar el binario.')
1916
1917
  return
1917
1918
  }
package/src/daemon.js CHANGED
@@ -1157,7 +1157,7 @@ export async function runDaemon () {
1157
1157
  }
1158
1158
  const conAvisos = quienAprueba.filter((a) => a.notifiedAt).length
1159
1159
 
1160
- // INSTALADA COMO PAQUETE DEL SISTEMA (.deb en /usr/bin): el binario es de root y este
1160
+ // INSTALADA COMO PAQUETE DEL SISTEMA (.deb o .rpm en /usr/bin): el binario es de root y este
1161
1161
  // proceso no puede tocarlo. Se dice, con las dos salidas, y no se intenta nada.
1162
1162
  if (!isUserInstall()) {
1163
1163
  console.log(`[vault] version ${r.version} is out (this one is ${daemonVersion}) · installed as a system package, so it cannot update itself: \`dotrino-vault update\` (needs sudo), or move to a user install with the tarball's install.sh`)
package/src/update.js CHANGED
@@ -25,15 +25,28 @@ export const latestRelease = (opts = {}) =>
25
25
  latestVersion({ source: 'github', repo: REPO, product: 'dotrino-vault', version: VERSION, ...opts })
26
26
 
27
27
  /**
28
- * Qué archivo le toca a esta máquina. El `.deb` donde hay `dpkg`; en cualquier otro Linux,
29
- * el tarball. Fuera de Linux no se emite binario, y se dice en vez de bajar algo inútil.
28
+ * Con qué instala paquetes esta máquina: `'deb'`, `'rpm'` o `null` (ninguno de los dos).
29
+ * `dpkg` va primero: en Debian y Ubuntu es normal tener además la herramienta `rpm`
30
+ * instalada (para empaquetar), y ahí lo que instala sigue siendo `dpkg`.
30
31
  */
31
- export function assetFor (assets, { platform = process.platform, arch = process.arch, hasDpkg = null } = {}) {
32
+ export function systemPackager (exists = fs.existsSync) {
33
+ if (exists('/usr/bin/dpkg')) return 'deb'
34
+ if (exists('/usr/bin/rpm')) return 'rpm'
35
+ return null
36
+ }
37
+
38
+ /**
39
+ * Qué archivo le toca a esta máquina. El `.deb` donde se instala con `dpkg`, el `.rpm`
40
+ * donde se instala con `rpm` (Fedora, RHEL, openSUSE); en cualquier otro Linux, el tarball.
41
+ * Fuera de Linux no se emite binario, y se dice en vez de bajar algo inútil.
42
+ */
43
+ export function assetFor (assets, { platform = process.platform, arch = process.arch, packager = undefined } = {}) {
32
44
  if (platform !== 'linux') return { ok: false, reason: `there is no binary for ${platform}: update with npm (npx @dotrino/vaultd)` }
33
45
  if (arch !== 'x64') return { ok: false, reason: `there is no binary for ${arch}` }
34
- const deb = hasDpkg === null ? fs.existsSync('/usr/bin/dpkg') : hasDpkg
46
+ const pk = packager === undefined ? systemPackager() : packager
35
47
  return pickAsset(assets, [
36
- { kind: 'deb', re: /_amd64\.deb$/, when: () => deb },
48
+ { kind: 'deb', re: /_amd64\.deb$/, when: () => pk === 'deb' },
49
+ { kind: 'rpm', re: /\.x86_64\.rpm$/, when: () => pk === 'rpm' },
37
50
  { kind: 'tar', re: /-linux-x64\.tar\.gz$/ }
38
51
  ])
39
52
  }