gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1572Shell 203Rust 109Markdown 993728 Sutichaykuna

⎇ main recipes/ntpd-rs.toml TOML · 106 siq'ikuna · 6.6 KB Ñawpa willay ch'uya

paso 5: la hora la da ntpd-rs, en Rust — y el git del corpus SÍ traía los helpers ed4518ac9 · Sergio ·

1# ntpd-rs 1.9.0 — el reloj, en Rust. Reemplaza a `chrony` como raíz del perfil `servidor`.
2#
3# ── POR QUÉ SE CAMBIA, Y LO QUE NO SE GANA ──────────────────────────────────────────────────────
4# `chrony` es una hoja: 0 consumidores, declarada sólo en `servidor`. Eso la hace la pieza C vital
5# más baratа de cambiar del corpus — tocarla no invalida a nadie. Lo que se gana es que el demonio
6# que **ajusta el reloj del sistema como root** deje de ser C: ntpd-rs es de Trifecta Tech /
7# Tweede Golf, está en Debian y Fedora, y se escribió para este nicho exacto.
8#
9# ⚠ **Lo que NO se gana hoy, dicho antes de que alguien lo lea al revés: NTS sigue apagado.**
10# `recipes/chrony.toml` lo apaga porque NTS necesita nettle o gnutls y ninguna está en el corpus. Acá
11# el muro es el mismo un piso más arriba: el TLS de NTS lo hace `rustls`, y rustls necesita un
12# *proveedor* de criptografía compilado —`aws-lc-rs` o `ring`—, **y los dos son C** (`aws-lc-sys`
13# arrastra cmake + asm; medido en el `Cargo.lock` del tag: `aws-lc-sys` ← `aws-lc-rs` ← `rustls`).
14# Por eso este build va con `--no-default-features --features rustcrypto`: la criptografía del
15# protocolo NTP (AES-SIV, MD5) sí queda pura-Rust —`ntp-proto` la declara como proveedor de primera
16# clase y aborta con `compile_error!` si no hay ninguno— pero el NTS-KE queda sin proveedor de TLS.
17# ⇒ **NTP clásico, igual que chrony hoy.** Subir NTS es su propia unidad de trabajo y lo que pide es
18# un proveedor de rustls, no esta receta.
19#
20# ── EL BUILD: DOS BINARIOS, Y POR ESO LA FASE `compile` ES PROPIA ───────────────────────────────
21# El camino por defecto del lab es `cargo rustc -- <flags>`, que exige UN solo target; `ntpd` produce
22# tres (`ntp-daemon`, `ntp-ctl`, `ntp-metrics-exporter`). Se itera, igual que `recipes/cargo-edit.toml`
23# —de donde sale este bloque verbatim— y por la misma razón: `+crt-static` NO puede ir en RUSTFLAGS
24# porque alcanza a los proc-macros (`serde_derive`, `tokio-macros`, `tracing-attributes`) y rustc
25# aborta con «cannot produce proc-macro». Tras `cargo rustc --` sólo toca el binario final.
26#
27# Se construyen DOS de los tres: el demonio y `ntp-ctl`, que es el equivalente de `chronyc` —sin él la
28# caja no se puede inspeccionar y eso sería una regresión frente a chrony—. El exportador de
29# Prometheus queda fuera: nadie lo pide y es un binario más.
30#
31# `NTPD_RS_GIT_REV` se fija al commit PINEADO a propósito: el `build.rs` de ntpd pregunta a `git` por
32# la revisión y, si el árbol de fuentes trae `.git`, el string de versión del binario cambiaría con
33# él. Fijarlo lo vuelve función de la receta —que sí entra en `hash_inputs`— y no del árbol.
34#
35# MSRV 1.88; el lab trae rust 1.97.0 (`docs/state/lab-toolchain.lock`). Cargo.lock commiteado
36# upstream ⇒ `--locked` + vendoreo dan un build reproducible (ADR 0006).
37name    = "ntpd-rs"
38version = "1.9.0"
39license = "Apache-2.0 OR MIT"
40
41[source]
42repo   = "https://github.com/pendulum-project/ntpd-rs"
43# tag v1.9.0. El commit es el identificador inmutable (ADR 0006), no el tag.
44commit = "46ec9bb4d5b6cb24f814f5543d85b9138afb4cba"
45
46[build]
47compiler = "zig-cc"
48target   = "x86_64-linux-musl"
49link     = "static"
50strip_debug = true
51flags    = []
52
53[build.phases]
54compile = '''
55printf '%s\n' '#!/bin/sh' 'for a do' 'case "$a" in --target=*) a=--target=x86_64-linux-musl ;; esac' 'set -- "$@" "$a"' 'shift' 'done' 'exec zig cc -mcpu=baseline "$@"' > "$PWD/.hammer-zig-cc"
56chmod +x "$PWD/.hammer-zig-cc"
57RF="-C linker=$PWD/.hammer-zig-cc"
58rustc -vV | grep -q 'host: .*-alpine-' || RF="$RF -C link-self-contained=no"
59for b in ntp-daemon ntp-ctl; do
60  NTPD_RS_GIT_REV=46ec9bb4d5b6cb24f814f5543d85b9138afb4cba \
61  CC="$PWD/.hammer-zig-cc" RUSTFLAGS="$RF" \
62  cargo rustc --release --locked -p ntpd --bin "$b" --no-default-features --features rustcrypto \
63    -- -C target-feature=+crt-static -C relocation-model=static
64done
65'''
66# El install es propio porque además de los binarios viaja el EJEMPLO de config. No se instala como
67# `/etc/ntpd-rs/ntp.toml` —eso lo hace el .deb de upstream— porque a qué servidores NTP se pregunta
68# es decisión del SITIO: ver el `[[service]]` de abajo, que sale 78 nombrando el fichero.
69install = '''
70mkdir -p /out/usr/bin /out/usr/share/doc/ntpd-rs
71cp target/release/ntp-daemon /out/usr/bin/ntp-daemon
72cp target/release/ntp-ctl    /out/usr/bin/ntp-ctl
73cp docs/examples/conf/ntp.toml.default /out/usr/share/doc/ntpd-rs/ntp.toml.default
74'''
75
76[deps]
77build = ["binutils"]
78
79# ── EL SERVICIO QUE ESTE PAQUETE TRAE (SDD 30) ──────────────────────────────────────────────────
80# Fuera de `hash_inputs`: declararlo NO re-hashea nada.
81#
82# El porqué es el de `recipes/chrony.toml` y no cambia: **sin hora no hay TLS ni firmas**, y el
83# síntoma no se parece a la causa — los certificados salen «not yet valid» o «expired», el ACME falla,
84# y todo apunta al servidor web. Una caja de Hetzner arranca con la hora del reloj virtual y sin nadie
85# que la corrija: `netup` pone la red y ahí termina su trabajo.
86#
87# Corre como root porque ajusta el reloj del sistema (`clock_settime`/`adjtimex`), que es capability
88# de root. Bajar de privilegio necesita una cuenta de servicio, y esa decisión va con la del setuid
89# (ver `crates/takana-core/src/setuid.rs`), no antes.
90#
91# ⚠ La CONFIG es del sitio y el servicio sale **78** nombrando el fichero en vez de inventarse un
92# pool: una caja que se sincroniza contra un servidor que nadie eligió es peor que una sin hora,
93# porque nadie lo mira. El ejemplo viaja en `/usr/share/doc/ntpd-rs/ntp.toml.default`.
94#
95# ⚠ `exec = "/bin/busybox"` es el patrón de TODAS las cards de hoy (chrony, gitea, pacha…): el `sh`
96# sale del `product-rootfs`, que lo trae por `STAGE1_COMPONENTS`. Cuando el frente C de busybox se
97# cierre, las cards se mueven juntas — no es deuda de esta receta.
98[[service]]
99label      = "ntpd-rs"
100id         = "01M2EKDA00NTPDRS7K2X4M9V40"
101exec       = "/bin/busybox"
102argv = ["sh", "-c", "test -f /etc/ntpd-rs/ntp.toml || { echo 'ntpd-rs: falta /etc/ntpd-rs/ntp.toml — a qué servidores NTP se pregunta es decisión del sitio, no del paquete (ejemplo en /usr/share/doc/ntpd-rs/ntp.toml.default)' >&2; exit 78; }; mkdir -p /var/run/ntpd-rs; exec /usr/bin/ntp-daemon -c /etc/ntpd-rs/ntp.toml"]
103envp       = [["PATH", "/usr/sbin:/usr/bin:/sbin:/bin"], ["HOME", "/root"], ["USER", "root"]]
104networking = "full"
105cgroup     = "arje.slice/ntpd-rs"
106restart    = { initial_ms = 1000, max_ms = 30000 }