@dotrino/vaultd 0.148.1 → 0.150.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
@@ -141,13 +141,32 @@ clic, o en la terminal:
141
141
  sudo apt install ./dotrino-vault_*.deb
142
142
  ```
143
143
 
144
- Deja los binarios en `/usr/bin` e instala la unidad `systemd --user` en
145
- `/usr/lib/systemd/user`, habilitada para **todos** los usuarios de la máquina (cada
146
- uno con su propia bóveda en su `$HOME`): te arranca sola en tu **próximo inicio de
147
- sesión**. Para levantarla ya, `systemctl --user start dotrino-vault`; si estabas
144
+ Instala la unidad `systemd --user` en `/usr/lib/systemd/user`, habilitada para
145
+ **todos** los usuarios de la máquina (cada uno con su propia bóveda en su `$HOME`): te
146
+ arranca sola en tu **próximo inicio de sesión**.
147
+
148
+ **El paquete no deja la bóveda en `/usr/bin`: deja un lanzador** (desde la 0.150.0,
149
+ `packaging/pkg-launcher.sh`). El binario viene en `/usr/lib/dotrino-vault` y el lanzador lo
150
+ copia a `~/.local/share/dotrino/bin` de cada usuario la primera vez, y lo corre desde ahí.
151
+ Es la misma instalación de usuario del tarball, así que **se actualiza sola, sin `sudo`**
152
+ (CONVENCIONES §15). Un paquete más nuevo repone esa copia; uno más viejo que la copia no la
153
+ toca. Quitar el paquete no borra ni esa copia ni tus datos. Para levantarla ya, `systemctl --user start dotrino-vault`; si estabas
148
154
  **actualizando**, el servicio viejo sigue corriendo y hay que reiniciarlo con
149
155
  `systemctl --user restart dotrino-vault`.
150
156
 
157
+ **Fedora / RHEL / openSUSE — `.rpm`:** el mismo instalador, para las distribuciones que
158
+ usan `rpm`. Deja exactamente lo mismo que el `.deb` (el lanzador, la copia en tu carpeta
159
+ que se actualiza sola, y la unidad `systemd --user` para todos los usuarios):
160
+
161
+ ```sh
162
+ sudo dnf install ./dotrino-vault-*.x86_64.rpm # Fedora, RHEL y derivadas
163
+ sudo zypper install --allow-unsigned-rpm ./dotrino-vault-*.x86_64.rpm # openSUSE
164
+ ```
165
+
166
+ El `.rpm` no lleva firma GPG (por eso `zypper` pide `--allow-unsigned-rpm`); lo que
167
+ prueba de dónde salió es la atestación de sigstore del release:
168
+ `gh attestation verify dotrino-vault-*.x86_64.rpm --repo imdotrino/dotrino-vault`.
169
+
151
170
  **Otro Linux x64 con systemd — tarball:**
152
171
 
153
172
  ```sh
@@ -160,13 +179,13 @@ Hace lo equivalente en tu `$HOME` (`~/.local/bin` + `~/.config/systemd/user`) y
160
179
  paso más allá: lo **arranca en el acto** y activa `linger`, así el vault corre desde
161
180
  el arranque de la máquina aunque no inicies sesión.
162
181
 
163
- El binario del tarball y el `.deb` son **x64/amd64** y el instalador **necesita
182
+ El binario del tarball, el `.deb` y el `.rpm` son **x64/amd64** y el instalador **necesita
164
183
  systemd** (si no lo encuentra, se detiene y te dice cómo arrancar el daemon a mano).
165
184
  Para ARM —una Raspberry— o para un Linux sin systemd, usa Docker o `npx`.
166
185
 
167
186
  Ambos traen **Node embebido**: no necesitas instalar Node ni dependencias de npm. Lo
168
187
  ú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
188
+ traen puesta; el `.deb` y el `.rpm` la declaran y se instala sola si falta. Con el tarball, en un
170
189
  sistema muy pelado (un contenedor mínimo), instálala tú: `sudo apt install
171
190
  libatomic1`.
172
191
 
@@ -190,8 +209,8 @@ curl -fsSL https://install.dotrino.com/install.sh | sh -s -- @dotrino/vaultd
190
209
  & ([scriptblock]::Create((irm https://install.dotrino.com/install.ps1))) @dotrino/vaultd
191
210
  ```
192
211
 
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):**
212
+ **Docker (cualquier sistema, y la única vía *empaquetada* para ARM — el `.deb`, el `.rpm` y
213
+ el tarball son solo x64; `npx` también sirve en una Raspberry):**
195
214
 
196
215
  ```sh
197
216
  docker volume create dotrino-vault
@@ -615,6 +634,7 @@ npm test # 118 pruebas (node --test, sin dependencia
615
634
 
616
635
  bash packaging/build.sh # binario único SEA + tarball de Linux (dist/)
617
636
  bash packaging/build-deb.sh # el .deb (requiere dpkg-deb; construye el binario si falta)
637
+ bash packaging/build-rpm.sh # el .rpm (requiere rpmbuild: `apt install rpm`; mismo binario)
618
638
  bash packaging/build-win.sh # .exe + .zip de Windows, cruzado desde Linux (sin probar)
619
639
  docker build -t dotrino-vault . # la imagen (la misma que CI publica en GHCR)
620
640
  ```
@@ -628,8 +648,8 @@ hermano en `../dotrino-proxy` (`secrets.e2e`, `multiprofile.e2e`,
628
648
  `pairing-cita.e2e`): no se saltan solos, así que sin ese repo al lado `npm test`
629
649
  falla.
630
650
 
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.
651
+ Etiquetar `vaultd-v<ver>` publica la imagen de Docker en GHCR. Etiquetar `v<ver>` lanza
652
+ `release.yml`, que construye, atestigua y sube a la release el `.deb`, el `.rpm` y el tarball.
633
653
 
634
654
  ### Enrolar y usar desde un dispositivo (Node, para testing)
635
655
 
@@ -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.150.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
  }