From adebb27c622629a707100a4ff57b4cee60bf79f0 Mon Sep 17 00:00:00 2001 From: Laan Tungir Date: Sat, 2 May 2026 09:21:19 -0400 Subject: [PATCH] v0.0.2 - spinning out n_signer --- includes/nips | 1 + .../live/0020-enable-services.hook.chroot | 43 +- .../includes.chroot/etc/n-os-tr/services.conf | 9 + .../systemd/system-preset/50-n-os-tr.preset | 16 + iso/config/package-lists/base.list.chroot | 3 + n_os_tr.code-workspace | 13 + plans/iso_architecture.md | 47 +- plans/tui_login.md | 18 +- plans/tui_service_menu.md | 538 ++++++++++++++++ stack/nostr-id-tui/CMakeLists.txt | 2 + .../build-host/CMakeFiles/Makefile2 | 6 +- .../nostr-id-tui.dir/DependInfo.cmake | 2 + .../CMakeFiles/nostr-id-tui.dir/build.make | 36 +- .../nostr-id-tui.dir/cmake_clean.cmake | 4 + .../nostr-id-tui.dir/compiler_depend.internal | 90 ++- .../nostr-id-tui.dir/compiler_depend.make | 528 ++++++++++------ .../CMakeFiles/nostr-id-tui.dir/link.d | 6 + .../CMakeFiles/nostr-id-tui.dir/link.txt | 2 +- .../CMakeFiles/nostr-id-tui.dir/progress.make | 2 + .../CMakeFiles/nostr-id-tui.dir/src/main.c.o | Bin 23592 -> 45688 bytes .../nostr-id-tui.dir/src/main.c.o.d | 8 +- .../nostr-id-tui.dir/src/services_conf.c.o | Bin 0 -> 14400 bytes .../nostr-id-tui.dir/src/services_conf.c.o.d | 29 + .../nostr-id-tui.dir/src/systemd_client.c.o | Bin 0 -> 8528 bytes .../nostr-id-tui.dir/src/systemd_client.c.o.d | 36 ++ .../build-host/CMakeFiles/progress.marks | 2 +- stack/nostr-id-tui/build-host/Makefile | 54 ++ stack/nostr-id-tui/build-host/nostr-id-tui | Bin 145472 -> 170688 bytes .../build-host/test-services-sim.out | 2 + stack/nostr-id-tui/include/n_os_tr_tui.h | 25 +- stack/nostr-id-tui/src/main.c | 596 ++++++++++++++++-- stack/nostr-id-tui/src/services_conf.c | 131 ++++ stack/nostr-id-tui/src/systemd_client.c | 100 +++ stack/nostr-id-tui/tests/test_services_sim.sh | 35 + 34 files changed, 2074 insertions(+), 310 deletions(-) create mode 160000 includes/nips create mode 100644 iso/config/includes.chroot/etc/n-os-tr/services.conf create mode 100644 iso/config/includes.chroot/etc/systemd/system-preset/50-n-os-tr.preset create mode 100644 n_os_tr.code-workspace create mode 100644 plans/tui_service_menu.md create mode 100644 stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o create mode 100644 stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o.d create mode 100644 stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o create mode 100644 stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o.d create mode 100644 stack/nostr-id-tui/build-host/test-services-sim.out create mode 100644 stack/nostr-id-tui/src/services_conf.c create mode 100644 stack/nostr-id-tui/src/systemd_client.c create mode 100755 stack/nostr-id-tui/tests/test_services_sim.sh diff --git a/includes/nips b/includes/nips new file mode 160000 index 00000000..05d3f198 --- /dev/null +++ b/includes/nips @@ -0,0 +1 @@ +Subproject commit 05d3f198c61c2732ccf15ba8005299365dabb8e0 diff --git a/iso/config/hooks/live/0020-enable-services.hook.chroot b/iso/config/hooks/live/0020-enable-services.hook.chroot index a8492406..3ef0860d 100755 --- a/iso/config/hooks/live/0020-enable-services.hook.chroot +++ b/iso/config/hooks/live/0020-enable-services.hook.chroot @@ -1,26 +1,35 @@ #!/bin/sh -# Enable n-OS-tr services so they start automatically on boot. -set -e +# Configure boot-time enable/disable posture for n-OS-tr services. +set -eu # Disable the Debian default site so it doesn't conflict with ours. rm -f /etc/nginx/sites-enabled/default -# Enable our site. +# Enable our site symlink only. Runtime nginx startup is user-selected in TUI. ln -sf /etc/nginx/sites-available/n-os-tr.conf /etc/nginx/sites-enabled/n-os-tr.conf -systemctl enable nginx.service - -# Slice A -systemctl enable ginxsom.service -systemctl enable n-os-tr-firstboot.service - -# Slice B -systemctl enable fips.service || true -systemctl enable fips-dns.service || true - -# Slice C -systemctl enable c-relay.service - -# TUI on tty1 +# TTY handoff: identity TUI owns tty1 before getty. systemctl disable getty@tty1.service || true + +# Always-on boot pipeline. +systemctl enable n-os-tr-firstboot.service +systemctl enable nostr-id.service || true systemctl enable nostr-id-tui.service + +# Explicitly keep optional services disabled at boot. +for unit in \ + c-relay.service \ + ginxsom.service \ + fips.service \ + fips-dns.service \ + nginx.service \ + nostr-config-loader.service \ + nostr-config-writer.service \ + ssh.service \ + tor.service + do + systemctl disable "$unit" 2>/dev/null || true + done + +# Apply preset policy for any additional units. +systemctl preset-all --preset-mode=enable-only 2>/dev/null || true diff --git a/iso/config/includes.chroot/etc/n-os-tr/services.conf b/iso/config/includes.chroot/etc/n-os-tr/services.conf new file mode 100644 index 00000000..6432609c --- /dev/null +++ b/iso/config/includes.chroot/etc/n-os-tr/services.conf @@ -0,0 +1,9 @@ +# key\tunit\tlabel\tdefault\tdeps +r c-relay.service c-relay off nginx.service +g ginxsom.service ginxsom off nginx.service +f fips.service fips off - +n nginx.service nginx off - +l nostr-config-loader.service config-loader off - +w nostr-config-writer.service config-writer off nostr-config-loader.service +s ssh.service ssh off - +t tor.service tor off - diff --git a/iso/config/includes.chroot/etc/systemd/system-preset/50-n-os-tr.preset b/iso/config/includes.chroot/etc/systemd/system-preset/50-n-os-tr.preset new file mode 100644 index 00000000..38adab14 --- /dev/null +++ b/iso/config/includes.chroot/etc/systemd/system-preset/50-n-os-tr.preset @@ -0,0 +1,16 @@ +# n-OS-tr service posture: only identity + firstboot + TUI start automatically. +# Optional services are loaded/installed but disabled by default. + +enable n-os-tr-firstboot.service +enable nostr-id.service +enable nostr-id-tui.service + +disable c-relay.service +disable ginxsom.service +disable fips.service +disable fips-dns.service +disable nginx.service +disable nostr-config-loader.service +disable nostr-config-writer.service +disable ssh.service +disable tor.service diff --git a/iso/config/package-lists/base.list.chroot b/iso/config/package-lists/base.list.chroot index e6b5b6aa..32090112 100644 --- a/iso/config/package-lists/base.list.chroot +++ b/iso/config/package-lists/base.list.chroot @@ -15,3 +15,6 @@ nftables # TUI runtime dependency libncursesw6 + +# Service-menu optional stack +tor diff --git a/n_os_tr.code-workspace b/n_os_tr.code-workspace new file mode 100644 index 00000000..22619dfb --- /dev/null +++ b/n_os_tr.code-workspace @@ -0,0 +1,13 @@ +{ + "folders": [ + { + "path": "." + }, + { + "path": "../aesthetics" + } + ], + "settings": { + "git.ignoreLimitWarning": true + } +} \ No newline at end of file diff --git a/plans/iso_architecture.md b/plans/iso_architecture.md index 5d4f0720..87ee158e 100644 --- a/plans/iso_architecture.md +++ b/plans/iso_architecture.md @@ -7,12 +7,13 @@ survive individual work sessions. ## 1. Big-picture goal A single bootable/installable Debian Live ISO that, the moment it finishes -booting, is running: +booting, has all n-OS-tr services installed and configured, then presents a +boot-time identity + service-selection TUI before login: -- [`fips`](../includes/fips) — Rust mesh-routing daemon, npub-addressed IPv6 overlay -- [`c-relay`](../includes/c-relay) — C Nostr relay with event-based config and embedded admin -- [`ginxsom`](../includes/ginxsom) — C Blossom (blob) server as FastCGI behind nginx -- `nginx` — TLS front door, static blob serving, reverse proxy +- [`fips`](../includes/fips) — Rust mesh-routing daemon, npub-addressed IPv6 overlay (optional start) +- [`c-relay`](../includes/c-relay) — C Nostr relay with event-based config and embedded admin (optional start) +- [`ginxsom`](../includes/ginxsom) — C Blossom (blob) server as FastCGI behind nginx (optional start) +- `nginx` — TLS front door, static blob serving, reverse proxy (optional start) No Docker. No `curl | bash` provisioning. All three apps run as native systemd services directly on the host. @@ -116,28 +117,46 @@ sequenceDiagram participant LB as live-boot / initramfs participant Sd as systemd PID 1 participant Fb as n-os-tr-firstboot.service + participant IA as nostr-id.service + participant TUI as nostr-id-tui.service participant Fp as fips.service participant Cr as c-relay.service participant Gx as ginxsom.service participant Ng as nginx.service + participant GT as getty@tty1.service LB->>Sd: hand off - Sd->>Fb: start oneshot (Before= the app units) + Sd->>Fb: start oneshot (Before= identity + app units) alt First boot Fb->>Fb: mkdir /var/lib/n-os-tr
generate ginxsom key
generate fips key
write EnvironmentFile
touch .provisioned else Already provisioned Fb-->>Sd: exit 0 (ConditionPathExists trip) end Fb-->>Sd: done - par - Sd->>Fp: start (reads /etc/fips/fips.yaml) - and - Sd->>Cr: start (self-provisions admin key to /var/lib/c-relay/) - and - Sd->>Gx: start (spawn-fcgi, reads env file for privkey) - and - Sd->>Ng: start (serves /var/www/blobs, proxies to c-relay and ginxsom) + + Sd->>IA: start identity-agent + IA-->>Sd: active (control socket ready) + + Sd->>TUI: start boot-time identity + services flow on tty1 + TUI->>IA: load_mnemonic / load_bunker / load_amnesia + IA-->>TUI: identity loaded + TUI->>Sd: start/stop selected services via systemctl + + opt User enabled nginx + Sd->>Ng: start end + opt User enabled c-relay + Sd->>Cr: start + end + opt User enabled ginxsom + Sd->>Gx: start + end + opt User enabled fips + Sd->>Fp: start + end + + TUI->>Sd: exit 0 + Sd->>GT: start (after TUI exits) ``` ## 5. Phase 0.A — Gitea artifact fetch diff --git a/plans/tui_login.md b/plans/tui_login.md index 16bc0b98..0c61941f 100644 --- a/plans/tui_login.md +++ b/plans/tui_login.md @@ -185,6 +185,10 @@ stack/nostr-id-tui/ # new subtree │ ├── screen_generate.c # generate + display + 3-position confirm │ ├── screen_import.c # /media/*/mnemonic.txt discovery + wipe │ ├── screen_bunker.c # NIP-46 bunker URL entry +│ ├── screen_services.c # post-identity service selection menu +│ ├── screen_services_confirm.c # commit/apply status + failure handling +│ ├── services_conf.c # /etc/n-os-tr/services.conf parser +│ ├── systemd_client.c # wrapper over /bin/systemctl and journalctl │ ├── screen_error.c # fatal error screen │ ├── curses_helpers.c # small ncurses wrappers (input w/o history) │ ├── agent_client.c # speak nostr-id control socket (see §5) @@ -237,9 +241,12 @@ stateDiagram-v2 Amnesia --> SendAgentAmnesia - SendAgent --> Exit: agent returns ok + SendAgent --> Services: agent returns ok SendAgent --> FatalError: agent returns error - SendAgentAmnesia --> Exit + SendAgentAmnesia --> Services + + Services --> Exit: commit/skip complete + Services --> FatalError: unrecoverable apply error FatalError --> [*] Exit --> [*] @@ -261,7 +268,9 @@ stateDiagram-v2 **Amnesia.** No persistence, no Nostr config projection, ephemeral main key generated via [`nostr_generate_keypair`](../includes/nostr_core_lib/nostr_core/nip006.h:20). Big red banner: "AMNESIA MODE. This identity dies at shutdown." -**FatalError.** A single full-screen error. No recovery — require the user to reboot. This is only reached if ncurses init failed, the agent control socket is unavailable, or memory locking failed (which means the threat-model invariants cannot be enforced). +**Services.** After identity load succeeds, the same TUI presents a service-selection screen (see [`plans/tui_service_menu.md`](tui_service_menu.md)). The user toggles optional services (c-relay, ginxsom, fips, nginx, config-loader, config-writer, ssh, tor) and either commits changes or skips with all services off for that session. + +**FatalError.** A single full-screen error. No recovery — require the user to reboot. This is only reached if ncurses init failed, the agent control socket is unavailable, memory locking failed (which means the threat-model invariants cannot be enforced), or service-apply hits a non-recoverable system state. ### 3.3 Anti-shoulder-surf tradeoffs @@ -408,6 +417,9 @@ sequenceDiagram Note over TUI: user interacts TUI->>IA: load_mnemonic / load_bunker / load_amnesia IA-->>TUI: ok + Note over TUI: service selection menu (same binary) + TUI->>SD: start/stop selected units + SD-->>TUI: unit results TUI->>SD: exit 0 SD->>GT: start (now allowed by ordering) GT->>User: "n-os-tr login:" diff --git a/plans/tui_service_menu.md b/plans/tui_service_menu.md new file mode 100644 index 00000000..de105406 --- /dev/null +++ b/plans/tui_service_menu.md @@ -0,0 +1,538 @@ +# TUI Service Menu — Post-Identity Service Selection + +> **Status:** Design. This document extends [`plans/tui_login.md`](tui_login.md) with a second screen inside the same `nostr-id-tui` binary: after the user has successfully loaded an identity (mnemonic / generated / imported / bunker / amnesia), the TUI presents a menu of **optional services** and lets the user toggle each one on or off **before** `getty@tty1` is allowed to start. +> +> Depends on: [`plans/tui_login.md`](tui_login.md), [`plans/identity_subsystem.md`](identity_subsystem.md), [`plans/iso_architecture.md`](iso_architecture.md), [`plans/nostr_config_projection.md`](nostr_config_projection.md), [`/home/user/lt/aesthetics/TUI.md`](/home/user/lt/aesthetics/TUI.md). + +## 0. Policy + +1. **n-OS-tr always installs and sets up every service.** Binaries, unit files, config templates, data directories — all present on the image. +2. **No service starts automatically at boot except the identity/boot pipeline itself.** Exactly these three are enabled image-wide: [`n-os-tr-firstboot.service`](../iso/config/includes.chroot/etc/systemd/system/n-os-tr-firstboot.service), `nostr-id.service` (identity-agent), [`nostr-id-tui.service`](../iso/config/includes.chroot/etc/systemd/system/nostr-id-tui.service). Everything else ships `disabled` via the live-build preset policy. +3. **The user decides what turns on.** After the user authenticates via `nostr-id-tui`, the TUI presents a service-toggle screen. The user picks what they want running this session. +4. **Selections are session-local in v1.** No persistence across reboots. Every boot starts with the same defaults. A future revision may project selections to a Nostr config slot (§10). +5. **One binary, one ceremony.** The service menu is a new screen inside `nostr-id-tui`, not a separate unit. Rationale discussed in the architect session: the user is already in one authenticated terminal flow; we do not want two back-to-back ceremonies before login. +6. **Default-off by default.** Every toggleable service starts the session in the "off" state. The user must explicitly enable each one they want running. This matches the privacy-forward posture of the project. +7. **Style:** strict adherence to [`/home/user/lt/aesthetics/TUI.md`](/home/user/lt/aesthetics/TUI.md) — single-key actions, terminal-width headers, ANSI underline for hotkeys, canonical menu template (§12 of that doc). + +## 1. Scope + +### 1.1 Services in the menu (v1) + +| Key | Label | systemd unit | Default | What it does | +|-----|-----------------|---------------------------|---------|--------------------------------------------------------| +| `r` | `c-relay` | `c-relay.service` | off | Local Nostr relay (NIP-01/42). Admin key = index 2. | +| `g` | `ginxsom` | `ginxsom.service` | off | Blossom blob server behind nginx. Server key = index 3.| +| `f` | `fips` | `fips.service` | off | Mesh-routing daemon; npub-IPv6 overlay. Key = index 4. | +| `n` | `nginx` | `nginx.service` | off | TLS front door / reverse proxy. Needed by c-relay ws, ginxsom uploads. | +| `l` | `config-loader` | `nostr-config-loader.service` | off | Fetch + materialize user config slots (§ [`nostr_config_projection.md`](nostr_config_projection.md#3-boot-flow)). | +| `w` | `config-writer` | `nostr-config-writer.service` | off | Save tracked home paths back to Nostr on shutdown. | +| `s` | `ssh` | `ssh.service` | off | OpenSSH server. Keys regenerated at firstboot. | +| `t` | `tor` | `tor.service` | off | Tor daemon. Default posture = SOCKS-only (client), not exit/relay. | + +### 1.2 Services explicitly NOT in the menu + +- `nostr-id.service` — identity-agent is always required; it's the thing the TUI talks to. +- `n-os-tr-firstboot.service` — oneshot, runs before the TUI, not user-controlled. +- `nostr-id-tui.service` — the TUI itself. +- `systemd-networkd`/`NetworkManager`/`dbus` — core system plumbing; managed by distro defaults. + +### 1.3 Service dependencies the TUI must respect + +Some services only make sense together. The TUI enforces these dependencies at toggle time (not at the systemd level — systemd's own `Requires=`/`Wants=` handles the actual startup ordering): + +| Service | Implicit deps (auto-enabled when this is turned on) | +|---------------|-------------------------------------------------------------| +| `c-relay` | `nginx` (wss termination and cert) | +| `ginxsom` | `nginx` (serves blobs, proxies uploads) | +| `config-writer` | `config-loader` (must have run at boot to know the slots) | + +If the user toggles `c-relay` on and `nginx` is off, the TUI: +- Shows a one-line prompt: `c-relay needs nginx. Turn nginx on too? [Y/n]`. +- Default `y` on Enter. If `n`, the toggle is cancelled (we do not start a service that won't be reachable). + +Reverse direction (turning `nginx` off while `c-relay` is on): prompt `c-relay will become unreachable without nginx. Stop c-relay too? [Y/n]`. + +## 2. Placement in the existing TUI flow + +### 2.1 Updated state diagram + +```mermaid +stateDiagram-v2 + [*] --> Menu + + Menu --> Enter: 1 / E + Menu --> Generate: 2 / G + Menu --> Import: 3 / I + Menu --> Bunker: 4 / B + Menu --> Amnesia: 5 / A + + Enter --> SendAgent: BIP-39 ok + Generate --> SendAgent: confirm words ok + Import --> SendAgent: file read + wiped + Bunker --> SendAgent: NIP-46 connected + Amnesia --> SendAgent: ephemeral key + + SendAgent --> Services: agent returns ok + SendAgent --> FatalError: agent returns error + + Services --> Services: user toggles + Services --> Confirm: user presses C (commit) + Services --> Services: user presses X (skip, all off) + + Confirm --> Apply: user presses Y + Confirm --> Services: user presses N + + Apply --> Apply: start/stop each selected unit + Apply --> Exit: all units reached terminal state + Apply --> ApplyError: any unit failed + + ApplyError --> Services: user reviews, retries + + FatalError --> [*] + Exit --> [*] +``` + +The only new states are `Services`, `Confirm`, `Apply`, and `ApplyError`. Everything before `SendAgent` is unchanged from [`plans/tui_login.md §3.1`](tui_login.md#31-state-diagram). + +### 2.2 Updated boot sequence + +```mermaid +sequenceDiagram + participant SD as systemd + participant IA as nostr-id.service + participant TUI as nostr-id-tui.service + participant Svc as toggleable services + participant GT as getty@tty1.service + + SD->>IA: start + IA-->>SD: listening on control.sock + SD->>TUI: start (owns tty1) + Note over TUI: identity screens + TUI->>IA: load_mnemonic/bunker/amnesia + IA-->>TUI: ok, main_npub + Note over TUI: service menu + TUI->>TUI: user toggles, presses Commit + TUI->>SD: StartUnit/StopUnit via dbus + SD->>Svc: start selected services + Svc-->>SD: active + SD-->>TUI: job results + TUI->>SD: exit 0 + SD->>GT: start (ordering allows) + GT->>User: n-os-tr login: +``` + +## 3. Screen design + +Strict compliance with [`/home/user/lt/aesthetics/TUI.md`](/home/user/lt/aesthetics/TUI.md). Every screen follows the canonical template in §12 of that doc. + +### 3.1 Main services screen + +```text +===================== SERVICES ===================== + (expands to terminal width) + +Identity: npub1abcd…wxyz (main, index 0) +Session: live (in-memory, no persistence) + + Key Service State Default Depends on + --- ------------- --------- ------- ----------- + R c-relay [ off ] off nginx + G ginxsom [ off ] off nginx + F fips [ off ] off — + N nginx [ off ] off — + L config-loader [ off ] off — + W config-writer [ off ] off config-loader + S ssh [ off ] off — + T tor [ off ] off — + +Actions: + R/G/F/N/L/W/S/T) Toggle service + A) Turn All on + Z) Turn all off (reset) + C) Commit and continue + X) Skip (all off, continue) + +Select action: > +``` + +Formatting rules (all from [TUI.md](/home/user/lt/aesthetics/TUI.md)): + +- Header expands to full terminal width using the `=== SERVICES ===` pattern from [`ui.c:print_centered_header`](/home/user/lt/aesthetics/TUI.md:88). +- Column widths are fixed; when terminal is narrower than 60 cols, drop the "Default" and "Depends on" columns (the state is what matters). +- State column is either `[ off ]` or `[ on ]`. A third transient state `[ ... ]` appears during the Apply phase. +- The first letter of each service name in the Key column is rendered with ANSI underline via `\033[4m\033[0m`, matching [TUI.md §7](/home/user/lt/aesthetics/TUI.md). +- Prompt at bottom is `Select action: >` per the canonical template. + +### 3.2 Confirm screen + +Before actually doing anything, we show what will happen: + +```text +===================== CONFIRM ===================== + +The following changes will be applied: + + START nginx.service + START c-relay.service + START fips.service + + (5 services remain off) + +Proceed? [Y/n] > +``` + +Only services whose session state differs from their default appear. Pure-default sessions (no changes) go straight from the services screen's `C`/`X` directly to `Apply` with an empty plan and exit. + +### 3.3 Apply screen + +Live progress. We iterate the plan serially (not concurrently — systemd handles that anyway, and serial output is easier to read): + +```text +===================== APPLYING ===================== + + [ OK ] nginx.service started in 0.42s + [ OK ] c-relay.service started in 1.14s + [ ... ] fips.service starting... + [ ] (waiting) + +Press Ctrl-C to abort remaining jobs (already-started services stay up). +``` + +Each row shows one of: +- `[ ]` queued +- `[ ... ]` in progress (animated dot after 250 ms; ANSI cursor save/restore to re-render only the affected row) +- `[ OK ]` finished successfully +- `[FAIL ]` finished with an error +- `[SKIP ]` not applied (e.g. dependency refused earlier) + +After all jobs complete: + +- All green → advance to Exit immediately (print `All services started. Handing control to login...` for 1 second, then the TUI exits and getty takes over). +- Any failures → advance to **ApplyError** screen. + +### 3.4 Apply-error screen + +```text +===================== PARTIAL FAILURE ===================== + +Some services did not start cleanly: + + [FAIL ] ginxsom.service + SubState: failed + ExecMainStatus: 1 + Last log line: "/usr/local/bin/ginxsom/ginxsom-fcgi: socket bind failed" + +Actions: + V) View journal for failed services + R) Retry failed services only + B) Back to service menu + I) Ignore and continue to login anyway + +Select action: > +``` + +The journal view (`V`) shells out to `journalctl -u -n 50 --no-pager` via a pipe (we do not embed a log viewer). `less`-style paging is acceptable if available; otherwise we just print and prompt to continue. + +## 4. Service manifest + +The TUI does not hard-code the service list in C. It reads `/etc/n-os-tr/services.conf` at startup. This lets us add/remove services (especially tor, which lands later) without rebuilding the binary. + +### 4.1 File format + +A small line-based format, one record per service, fields tab-separated: + +``` +# key unit label default deps +r c-relay.service c-relay off nginx.service +g ginxsom.service ginxsom off nginx.service +f fips.service fips off - +n nginx.service nginx off - +l nostr-config-loader.service config-loader off - +w nostr-config-writer.service config-writer off nostr-config-loader.service +s ssh.service ssh off - +t tor.service tor off - +``` + +Comments start with `#`. Blank lines ignored. Unknown fields ignored for forward compatibility. Multiple deps separated by `,`. A literal `-` means no deps. + +Parsing happens in `stack/nostr-id-tui/src/services_conf.c`. On parse error the TUI falls back to a hardcoded minimal list (c-relay, ginxsom, fips, nginx) and logs the parse error to stderr (captured by journald, per the service unit's `StandardError=journal`). + +### 4.2 Install location + +Shipped in the chroot at [`iso/config/includes.chroot/etc/n-os-tr/services.conf`](../iso/config/includes.chroot/etc/n-os-tr/services.conf). Mode `0644`, owner `root:root`. + +## 5. Control path: talking to systemd + +### 5.1 Transport choice + +The TUI needs to: +1. Query each unit's current state (`LoadState`, `ActiveState`, `SubState`). +2. Start and stop units. +3. Receive job-completion signals. + +Two realistic options in a static musl C binary with no glibc: + +| Option | Notes | Verdict | +|----------------------------------------------------------------|---------------------------------------------------------------------------------------------|---------------------| +| **Shell out to `systemctl`** via `fork` + `execve` | Simple. Exit codes are well-defined. Parse `show --property=ActiveState=`. No linking. | **v1 default.** | +| **Speak the D-Bus wire protocol directly** to `/run/dbus/system_bus_socket` | Avoids forking. Enables real-time `JobRemoved` signals. Needs a tiny D-Bus marshaller (~1 KLOC) or the vendored cjson-style lib. | Later optimization. | +| **Link `libsystemd.a`** | Would pull in a chunk of systemd source into Alpine build, and libsystemd isn't available as `-static` in Alpine. | Rejected. | + +v1 uses `systemctl`. The binary path is hardcoded to `/bin/systemctl` (present on every Debian live image — `systemctl` itself is part of `systemd` which is in base). The wrapper module is `stack/nostr-id-tui/src/systemd_client.c` and exposes: + +```c +typedef enum { + SVC_INACTIVE = 0, + SVC_ACTIVATING, + SVC_ACTIVE, + SVC_DEACTIVATING, + SVC_FAILED, + SVC_UNKNOWN +} svc_state_t; + +svc_state_t systemd_active_state(const char *unit); /* systemctl show -p ActiveState */ +int systemd_start(const char *unit, int timeout_ms, char *err_out, size_t err_len); +int systemd_stop (const char *unit, int timeout_ms, char *err_out, size_t err_len); +int systemd_journal_tail(const char *unit, int n_lines, FILE *out); /* exec journalctl */ +``` + +Each call spawns `systemctl` / `journalctl` with `posix_spawn` into a pipe, waits with a timeout, captures stdout/stderr, and returns. + +### 5.2 Privilege + +`nostr-id-tui.service` currently runs as root on `tty1` (see the service unit). That gives it direct `systemctl` privilege — no polkit rule needed. This matches the existing threat-model stance in [`plans/tui_login.md §6.1`](tui_login.md#61-etcsystemdsystemnostr-id-tuiservice): the TUI is already privileged because it owns the tty and talks to identity-agent over a root-only socket. + +If we ever demote the TUI to run as the `nostr-id` user, we'll need `/etc/polkit-1/rules.d/50-n-os-tr-services.rules` granting that user the `org.freedesktop.systemd1.manage-units` action **only for the whitelisted units listed in `services.conf`**. That's future work. + +### 5.3 Timeouts and cancellation + +- Per-unit start/stop timeout: 30 s (covers nginx startup, fips mesh ready, etc.). Larger than any real service needs. +- TUI-level overall budget: 2 minutes. If exceeded, Apply falls through to ApplyError with any unfinished jobs marked `[TIME]` and the user is prompted. +- Ctrl-C in the Apply screen sends SIGINT to the current `systemctl` child, marks the remaining jobs `[SKIP ]`, and goes to ApplyError. + +## 6. Source tree changes + +Extending the layout declared in [`plans/tui_login.md §2.2`](tui_login.md#22-code-that-lives-in-this-repo-n_os_tr): + +``` +stack/nostr-id-tui/ +├── src/ +│ ├── main.c # now dispatches identity→services→exit +│ ├── screen_menu.c # unchanged +│ ├── screen_enter.c # unchanged +│ ├── screen_generate.c # unchanged +│ ├── screen_import.c # unchanged +│ ├── screen_bunker.c # unchanged +│ ├── screen_services.c # NEW: main service toggle screen +│ ├── screen_services_confirm.c # NEW: confirm + apply screens +│ ├── services_conf.c # NEW: parser for /etc/n-os-tr/services.conf +│ ├── systemd_client.c # NEW: fork/exec systemctl + journalctl +│ ├── curses_helpers.c # unchanged +│ ├── agent_client.c # unchanged +│ └── memhygiene.c # unchanged +├── include/ +│ └── n_os_tr_tui.h # adds svc_* decls + ui_backend hooks +└── tests/ + ├── test_screen_services.c # NEW: state-machine unit test + ├── test_services_conf.c # NEW: parser fuzz/table tests + ├── test_systemd_client.c # NEW: runs against a fake systemctl shim + └── test_integration.sh # extended to toggle a service in QEMU +``` + +No ncurses API leaks into the new state machines. All rendering goes through the same `ui_backend_t` abstraction established in [`plans/tui_login.md §7`](tui_login.md#7-per-flavor-abstraction). The Pi LCD port will get a stripped service menu for free. + +## 7. Systemd preset policy + +### 7.1 What "installed but not enabled" means + +For each toggleable unit we ship: +- The unit file in `iso/config/includes.chroot/etc/systemd/system/` or (for distro-packaged units like `ssh`, `tor`, `nginx`) in the package itself. +- **No symlink in `multi-user.target.wants/`** — i.e. no `systemctl enable`. +- A preset file that explicitly forbids enabling at image-build time. + +### 7.2 Preset file + +New file: [`iso/config/includes.chroot/etc/systemd/system-preset/50-n-os-tr.preset`](../iso/config/includes.chroot/etc/systemd/system-preset/50-n-os-tr.preset): + +``` +# n-OS-tr service posture: only the identity/boot pipeline auto-starts. +# Everything else is explicitly disabled. The TUI turns them on at the +# user's request after identity load. +enable nostr-id.service +enable nostr-id-tui.service +enable n-os-tr-firstboot.service + +disable c-relay.service +disable ginxsom.service +disable fips.service +disable nginx.service +disable nostr-config-loader.service +disable nostr-config-writer.service +disable ssh.service +disable tor.service +``` + +The `50-` prefix lands before Debian defaults (typically `90-*.preset`), so our `disable` lines override e.g. nginx's upstream preset-enable. + +### 7.3 Rework of the enable-services hook + +Current hook [`iso/config/hooks/live/0020-enable-services.hook.chroot`](../iso/config/hooks/live/0020-enable-services.hook.chroot) enables the services directly. Rework it to be explicit about the new posture: + +```sh +#!/bin/sh +set -eu + +# Enable the always-on trio +systemctl enable n-os-tr-firstboot.service +systemctl enable nostr-id.service +systemctl enable nostr-id-tui.service + +# Explicitly disable everything else in the service manifest. +# Idempotent; safe to re-run. `systemctl disable` is a no-op for units +# that aren't enabled yet, which is what we want. +for unit in \ + c-relay.service \ + ginxsom.service \ + fips.service \ + nginx.service \ + nostr-config-loader.service \ + nostr-config-writer.service \ + ssh.service \ + tor.service ; do + systemctl disable "$unit" 2>/dev/null || true +done + +# Run the preset policy for anything we didn't list above (defensive). +systemctl preset-all --preset-mode=enable-only 2>/dev/null || true +``` + +### 7.4 Package-list additions + +`tor` is new to the image. Add to [`iso/config/package-lists/base.list.chroot`](../iso/config/package-lists/base.list.chroot): + +``` +tor +``` + +No other new packages: nginx, openssh-server, ca-certificates, systemd, etc. are already pulled. + +## 8. Interaction with identity modes + +### 8.1 Normal, Bunker, and Amnesia modes + +- **Normal (mnemonic loaded)**: full menu, full defaults as in §1.1. +- **Bunker mode**: services that require a raw local nsec are **disabled in the menu** (greyed out with `[ n/a ]` in the state column). Those are: + - `c-relay` — admin key comes from identity-agent via NIP-46 signing for event-based config only; for the admin nsec path the service fails. The menu shows `[ n/a ]` with a tooltip line "requires local key; bunker mode cannot provide". + - `ginxsom` — same. Key material is needed at process start (`--server-privkey` in [`ginxsom.service`](../iso/config/includes.chroot/etc/systemd/system/ginxsom.service)). + - `fips` — same. + - `nginx`, `config-loader`, `config-writer`, `ssh`, `tor` — available in bunker mode. +- **Amnesia mode**: all services available, but `config-loader`/`config-writer` are explicitly disabled with label "amnesia session — config not persisted" (we don't pull anything from Nostr for an ephemeral identity). + +The rules live in `services_conf.c` as a small matrix; the file format in §4.1 can be extended later with `modes=normal,bunker,amnesia` but v1 hardcodes the matrix in C. + +### 8.2 Re-entry + +A future option from the Services menu: `Q) Reset identity and return to identity menu`. Deferred — not in v1. For v1 the only path out of Services is `C` (commit) or `X` (skip), both of which lead to Exit. + +## 9. Testing + +### 9.1 Unit (in Alpine/musl builder) + +- `test_services_conf` — feeds valid and malformed manifests, asserts parser produces correct structs and correct fallback on bad input. +- `test_systemd_client` — sets `$PATH` to a directory with a shim `systemctl` that records its argv and emits canned output; asserts our client parses `ActiveState=active|inactive|failed` correctly and times out when the shim sleeps. +- `test_screen_services` — drives the services state machine through a mock `ui_backend_t`; asserts: + - Default state is all-off. + - Toggling `R` then `G` then `R` ends with `G` on and `R` off. + - Toggling `R` prompts for `N` enable; answering `y` enables both. + - `Z` (reset) returns to defaults. + - `X` (skip) goes directly to Apply with an empty plan. + - `C` (commit) goes to Confirm. + +### 9.2 Integration (QEMU) + +Extend [`stack/nostr-id-tui/tests/test_integration.sh`](../stack/nostr-id-tui/tests/test_integration.sh) with a new scripted run: +1. Boot the ISO. +2. At the identity screen, feed the Trezor test-vector mnemonic. +3. At the services screen, press `N` (enable nginx), then `C`, then `Y`. +4. After the TUI exits and getty appears, log in as the default user. +5. Assert `systemctl is-active nginx` = `active` and `systemctl is-active c-relay` = `inactive`. + +### 9.3 Smoketest extensions + +Extend [`iso/config/includes.chroot/usr/local/bin/n-os-tr-smoketest`](../iso/config/includes.chroot/usr/local/bin/n-os-tr-smoketest) to also verify: + +- Preset posture at **image build time**: for each toggleable unit, `systemctl is-enabled ` returns `disabled`. +- The manifest file `/etc/n-os-tr/services.conf` exists and parses (re-invoke the parser from a test helper). +- `/bin/systemctl` is present (the TUI depends on it). + +## 10. Non-persistence and the future Nostr slot + +v1: selections are session-local. Reboot → all services back to off, user re-selects. + +Future: one new entry in the manifest scheme from [`plans/nostr_config_projection.md §2.1`](nostr_config_projection.md#21-slots): + +```json +{ + "name": "n-os-tr/services", + "path": "/run/nostr-id/services.state.json", + "mode": "0600", + "encrypted": true +} +``` + +Content schema (draft): + +```json +{ + "version": 1, + "enabled": ["nginx.service", "c-relay.service", "fips.service"] +} +``` + +When a session starts, if a services slot exists, the TUI pre-loads the toggle state from it. User still has to press `C` to commit — we don't auto-apply without the user seeing the menu. This preserves the "the user decides when to turn them on" rule. + +Out of scope for v1 implementation. + +## 11. Failure modes + +| Failure | Behavior | +|-------------------------------------------------|--------------------------------------------------------------------------| +| `/etc/n-os-tr/services.conf` missing or unparseable | Log to stderr, fall back to hardcoded minimal list (c-relay, ginxsom, fips, nginx). | +| `/bin/systemctl` missing | FatalError (as in [`plans/tui_login.md §9`](tui_login.md#9-failure-modes-summary)). The ISO is malformed. | +| Unit start returns non-zero | Row shows `[FAIL ]`, ApplyError screen is reached after all jobs settle. | +| Unit start hangs past 30 s | Timeout, row shows `[TIME]`, ApplyError. | +| User hits Ctrl-C during Apply | SIGINT to current `systemctl`, remaining jobs `[SKIP ]`, ApplyError. | +| Bunker mode, user tries to toggle `c-relay` | Toggle is ignored; status line shows "requires local key; bunker mode". | +| User toggles all off and presses Commit | Apply plan is empty; TUI prints `No services requested. Handing control to login...` and exits. | +| Identity agent dies during service menu | We're not calling the agent during this phase — selections are in TUI memory only. User is unaffected until they finish service menu and the TUI exits; if the agent is dead when services start, those services will fail on their own dependency chain. | + +## 12. Docs to update + +- [`plans/tui_login.md`](tui_login.md) — add a one-line reference in §3.1 to the new `Services` state after `SendAgent`; add `screen_services.c`, `screen_services_confirm.c`, `services_conf.c`, `systemd_client.c` to the source tree listing in §2.2; update §13 implementation order with the service-menu steps. +- [`plans/iso_architecture.md`](iso_architecture.md) — update §4 boot sequence to show the identity+services TUI phase before the parallel `fips/c-relay/ginxsom/nginx` block, and note that those services are started by the TUI, not auto-started by systemd. +- [`iso/config/includes.chroot/usr/share/doc/n-os-tr/README`](../iso/config/includes.chroot/usr/share/doc/n-os-tr/README) — describe the new login→services flow for end users. +- [`docs/RUNNING.md`](../docs/RUNNING.md) — add a section showing the service menu and how to toggle. + +## 13. Implementation order (Phase 3a.2) + +Small, independently verifiable steps. Each one leaves the repo in a runnable state. + +1. **Land the preset file and rework the enable hook.** After this commit, a fresh ISO boots to a system where only `nostr-id`, `nostr-id-tui`, and `firstboot` are enabled; every other service is present on disk but inactive. Verify with `systemctl list-unit-files --state=disabled` in a QEMU boot. +2. **Add the service manifest file.** Ship `/etc/n-os-tr/services.conf` with the v1 table from §1.1. No TUI change yet; verifies that the file reaches the image. +3. **Add `tor` to the base package list.** Confirm the built ISO includes `tor.service` as a disabled unit. +4. **Implement `services_conf.c` + tests.** Parser plus a 40-line sanity test in the Alpine builder. +5. **Implement `systemd_client.c` + tests.** Fork/exec + pipe capture + shim-based test. +6. **Implement `screen_services.c` state machine + `test_screen_services`.** No rendering yet — verifies transitions against a mock backend. +7. **Render the services screen in `ui_backend_curses.c`.** First visible new screen. +8. **Implement `screen_services_confirm.c` — confirm/apply/apply-error screens.** Wire them to `systemd_client`. +9. **Hook into `main.c`.** After `agent_client` returns from `load_mnemonic`/`load_bunker`/`load_amnesia` with ok, transition to the services screen. Skip the screen entirely if `/etc/n-os-tr/services.conf` is missing *and* fallback is disabled via a `--no-services` flag (useful for tests that want only the identity flow). +10. **Extend the QEMU integration test.** Script a toggle of one service, assert post-login that the chosen service is active and the others are not. +11. **Extend the smoketest.** Add the preset-state check. +12. **Doc passes.** Update [`plans/tui_login.md`](tui_login.md), [`plans/iso_architecture.md`](iso_architecture.md), [`docs/RUNNING.md`](../docs/RUNNING.md), and the in-ISO README. + +## 14. Open questions + +- **`tor.service` posture out of the box.** We ship the distro default `torrc` (SOCKS 9050 only, no relay). Do we want a second unit drop-in that enables the hidden-service onion for nginx when the user turns both on? Probably yes, as a follow-up; keep v1 minimal. +- **GUI flavor.** Image flavor with a GUI will run the TUI on a text VT during early boot. Does it also allow the user to re-run the services menu later from the GUI? Probably yes via a GTK wrapper around the same `systemd_client` module, but that's post-v1. +- **Per-user vs system.** All services here are system-level. "Which user's `ssh/authorized_keys` does `ssh` serve" is answered by the config-loader slot scheme. No per-user service toggles in v1. +- **Should toggling the menu's state affect *default* behavior for future reboots?** Today: no; v1 is stateless. A future Nostr slot (§10) could record the last committed state and let the TUI show it as a "remembered" default, but that's explicit future work. diff --git a/stack/nostr-id-tui/CMakeLists.txt b/stack/nostr-id-tui/CMakeLists.txt index 5040e42b..3d2c61ef 100644 --- a/stack/nostr-id-tui/CMakeLists.txt +++ b/stack/nostr-id-tui/CMakeLists.txt @@ -18,6 +18,8 @@ endif() add_executable(nostr-id-tui src/main.c + src/services_conf.c + src/systemd_client.c ) target_include_directories(nostr-id-tui PRIVATE diff --git a/stack/nostr-id-tui/build-host/CMakeFiles/Makefile2 b/stack/nostr-id-tui/build-host/CMakeFiles/Makefile2 index b47d7281..b92caa74 100644 --- a/stack/nostr-id-tui/build-host/CMakeFiles/Makefile2 +++ b/stack/nostr-id-tui/build-host/CMakeFiles/Makefile2 @@ -85,12 +85,12 @@ clean: CMakeFiles/nostr-id-tui.dir/clean CMakeFiles/nostr-id-tui.dir/all: $(MAKE) $(MAKESILENT) -f CMakeFiles/nostr-id-tui.dir/build.make CMakeFiles/nostr-id-tui.dir/depend $(MAKE) $(MAKESILENT) -f CMakeFiles/nostr-id-tui.dir/build.make CMakeFiles/nostr-id-tui.dir/build - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/user/lt/n_os_tr/stack/nostr-id-tui/build-host/CMakeFiles --progress-num=1,2 "Built target nostr-id-tui" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/user/lt/n_os_tr/stack/nostr-id-tui/build-host/CMakeFiles --progress-num=1,2,3,4 "Built target nostr-id-tui" .PHONY : CMakeFiles/nostr-id-tui.dir/all # Build rule for subdir invocation for target. CMakeFiles/nostr-id-tui.dir/rule: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /home/user/lt/n_os_tr/stack/nostr-id-tui/build-host/CMakeFiles 2 + $(CMAKE_COMMAND) -E cmake_progress_start /home/user/lt/n_os_tr/stack/nostr-id-tui/build-host/CMakeFiles 4 $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/nostr-id-tui.dir/all $(CMAKE_COMMAND) -E cmake_progress_start /home/user/lt/n_os_tr/stack/nostr-id-tui/build-host/CMakeFiles 0 .PHONY : CMakeFiles/nostr-id-tui.dir/rule @@ -102,7 +102,7 @@ nostr-id-tui: CMakeFiles/nostr-id-tui.dir/rule # codegen rule for target. CMakeFiles/nostr-id-tui.dir/codegen: $(MAKE) $(MAKESILENT) -f CMakeFiles/nostr-id-tui.dir/build.make CMakeFiles/nostr-id-tui.dir/codegen - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/user/lt/n_os_tr/stack/nostr-id-tui/build-host/CMakeFiles --progress-num=1,2 "Finished codegen for target nostr-id-tui" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/user/lt/n_os_tr/stack/nostr-id-tui/build-host/CMakeFiles --progress-num=1,2,3,4 "Finished codegen for target nostr-id-tui" .PHONY : CMakeFiles/nostr-id-tui.dir/codegen # clean rule for target. diff --git a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/DependInfo.cmake b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/DependInfo.cmake index 08ff9f6e..30e2f271 100644 --- a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/DependInfo.cmake +++ b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/DependInfo.cmake @@ -9,6 +9,8 @@ set(CMAKE_DEPENDS_LANGUAGES # The set of dependency files which are needed: set(CMAKE_DEPENDS_DEPENDENCY_FILES "/home/user/lt/n_os_tr/stack/nostr-id-tui/src/main.c" "CMakeFiles/nostr-id-tui.dir/src/main.c.o" "gcc" "CMakeFiles/nostr-id-tui.dir/src/main.c.o.d" + "/home/user/lt/n_os_tr/stack/nostr-id-tui/src/services_conf.c" "CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o" "gcc" "CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o.d" + "/home/user/lt/n_os_tr/stack/nostr-id-tui/src/systemd_client.c" "CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o" "gcc" "CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o.d" "" "nostr-id-tui" "gcc" "CMakeFiles/nostr-id-tui.dir/link.d" ) diff --git a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/build.make b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/build.make index 8bc426e5..901e6df6 100644 --- a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/build.make +++ b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/build.make @@ -86,21 +86,53 @@ CMakeFiles/nostr-id-tui.dir/src/main.c.s: cmake_force @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/nostr-id-tui.dir/src/main.c.s" /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/user/lt/n_os_tr/stack/nostr-id-tui/src/main.c -o CMakeFiles/nostr-id-tui.dir/src/main.c.s +CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o: CMakeFiles/nostr-id-tui.dir/flags.make +CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o: /home/user/lt/n_os_tr/stack/nostr-id-tui/src/services_conf.c +CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o: CMakeFiles/nostr-id-tui.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/user/lt/n_os_tr/stack/nostr-id-tui/build-host/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building C object CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o -MF CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o.d -o CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o -c /home/user/lt/n_os_tr/stack/nostr-id-tui/src/services_conf.c + +CMakeFiles/nostr-id-tui.dir/src/services_conf.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/nostr-id-tui.dir/src/services_conf.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/user/lt/n_os_tr/stack/nostr-id-tui/src/services_conf.c > CMakeFiles/nostr-id-tui.dir/src/services_conf.c.i + +CMakeFiles/nostr-id-tui.dir/src/services_conf.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/nostr-id-tui.dir/src/services_conf.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/user/lt/n_os_tr/stack/nostr-id-tui/src/services_conf.c -o CMakeFiles/nostr-id-tui.dir/src/services_conf.c.s + +CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o: CMakeFiles/nostr-id-tui.dir/flags.make +CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o: /home/user/lt/n_os_tr/stack/nostr-id-tui/src/systemd_client.c +CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o: CMakeFiles/nostr-id-tui.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/user/lt/n_os_tr/stack/nostr-id-tui/build-host/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building C object CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -MD -MT CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o -MF CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o.d -o CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o -c /home/user/lt/n_os_tr/stack/nostr-id-tui/src/systemd_client.c + +CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing C source to CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.i" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/user/lt/n_os_tr/stack/nostr-id-tui/src/systemd_client.c > CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.i + +CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling C source to assembly CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.s" + /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/user/lt/n_os_tr/stack/nostr-id-tui/src/systemd_client.c -o CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.s + # Object files for target nostr-id-tui nostr__id__tui_OBJECTS = \ -"CMakeFiles/nostr-id-tui.dir/src/main.c.o" +"CMakeFiles/nostr-id-tui.dir/src/main.c.o" \ +"CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o" \ +"CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o" # External object files for target nostr-id-tui nostr__id__tui_EXTERNAL_OBJECTS = nostr-id-tui: CMakeFiles/nostr-id-tui.dir/src/main.c.o +nostr-id-tui: CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o +nostr-id-tui: CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o nostr-id-tui: CMakeFiles/nostr-id-tui.dir/build.make nostr-id-tui: CMakeFiles/nostr-id-tui.dir/compiler_depend.ts nostr-id-tui: /home/user/lt/n_os_tr/stack/nostr-id-tui/../../includes/nostr_core_lib/libnostr_core_x64.a nostr-id-tui: /usr/lib/x86_64-linux-gnu/libcurses.so nostr-id-tui: /usr/lib/x86_64-linux-gnu/libform.so nostr-id-tui: CMakeFiles/nostr-id-tui.dir/link.txt - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/user/lt/n_os_tr/stack/nostr-id-tui/build-host/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking C executable nostr-id-tui" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/user/lt/n_os_tr/stack/nostr-id-tui/build-host/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Linking C executable nostr-id-tui" $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/nostr-id-tui.dir/link.txt --verbose=$(VERBOSE) # Rule to build all files generated by this target. diff --git a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/cmake_clean.cmake b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/cmake_clean.cmake index 2f33a374..a34ab38d 100644 --- a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/cmake_clean.cmake +++ b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/cmake_clean.cmake @@ -2,6 +2,10 @@ file(REMOVE_RECURSE "CMakeFiles/nostr-id-tui.dir/link.d" "CMakeFiles/nostr-id-tui.dir/src/main.c.o" "CMakeFiles/nostr-id-tui.dir/src/main.c.o.d" + "CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o" + "CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o.d" + "CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o" + "CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o.d" "nostr-id-tui" "nostr-id-tui.pdb" ) diff --git a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/compiler_depend.internal b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/compiler_depend.internal index d9f3dac4..369bea3e 100644 --- a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/compiler_depend.internal +++ b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/compiler_depend.internal @@ -52,12 +52,11 @@ CMakeFiles/nostr-id-tui.dir/src/main.c.o /usr/include/x86_64-linux-gnu/bits/floatn.h /usr/include/x86_64-linux-gnu/bits/libc-header-start.h /usr/include/x86_64-linux-gnu/bits/long-double.h + /usr/include/x86_64-linux-gnu/bits/select.h /usr/include/x86_64-linux-gnu/bits/stdint-intn.h /usr/include/x86_64-linux-gnu/bits/stdint-least.h /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h - /usr/include/x86_64-linux-gnu/bits/stdio.h /usr/include/x86_64-linux-gnu/bits/stdio_lim.h - /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h /usr/include/x86_64-linux-gnu/bits/stdlib-float.h /usr/include/x86_64-linux-gnu/bits/time.h /usr/include/x86_64-linux-gnu/bits/time64.h @@ -68,8 +67,11 @@ CMakeFiles/nostr-id-tui.dir/src/main.c.o /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h /usr/include/x86_64-linux-gnu/bits/types/clock_t.h + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h /usr/include/x86_64-linux-gnu/bits/types/time_t.h /usr/include/x86_64-linux-gnu/bits/typesizes.h @@ -78,11 +80,93 @@ CMakeFiles/nostr-id-tui.dir/src/main.c.o /usr/include/x86_64-linux-gnu/gnu/stubs-64.h /usr/include/x86_64-linux-gnu/gnu/stubs.h /usr/include/x86_64-linux-gnu/sys/cdefs.h + /usr/include/x86_64-linux-gnu/sys/select.h + /usr/include/x86_64-linux-gnu/sys/time.h /usr/lib/gcc/x86_64-linux-gnu/14/include/stdarg.h /usr/lib/gcc/x86_64-linux-gnu/14/include/stdbool.h /usr/lib/gcc/x86_64-linux-gnu/14/include/stddef.h /usr/lib/gcc/x86_64-linux-gnu/14/include/stdint.h +CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o + /home/user/lt/n_os_tr/stack/nostr-id-tui/src/services_conf.c + /home/user/lt/n_os_tr/stack/nostr-id-tui/include/n_os_tr_tui.h + /usr/include/ctype.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/stdc-predef.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/x86_64-linux-gnu/bits/endian.h + /usr/include/x86_64-linux-gnu/bits/endianness.h + /usr/include/x86_64-linux-gnu/bits/floatn-common.h + /usr/include/x86_64-linux-gnu/bits/floatn.h + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h + /usr/include/x86_64-linux-gnu/bits/long-double.h + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h + /usr/include/x86_64-linux-gnu/bits/time64.h + /usr/include/x86_64-linux-gnu/bits/timesize.h + /usr/include/x86_64-linux-gnu/bits/types.h + /usr/include/x86_64-linux-gnu/bits/types/FILE.h + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h + /usr/include/x86_64-linux-gnu/bits/typesizes.h + /usr/include/x86_64-linux-gnu/bits/wordsize.h + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h + /usr/include/x86_64-linux-gnu/gnu/stubs.h + /usr/include/x86_64-linux-gnu/sys/cdefs.h + /usr/lib/gcc/x86_64-linux-gnu/14/include/stdarg.h + /usr/lib/gcc/x86_64-linux-gnu/14/include/stddef.h + +CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o + /home/user/lt/n_os_tr/stack/nostr-id-tui/src/systemd_client.c + /home/user/lt/n_os_tr/stack/nostr-id-tui/include/n_os_tr_tui.h + /usr/include/asm-generic/errno-base.h + /usr/include/asm-generic/errno.h + /usr/include/errno.h + /usr/include/features-time64.h + /usr/include/features.h + /usr/include/linux/errno.h + /usr/include/stdc-predef.h + /usr/include/stdio.h + /usr/include/stdlib.h + /usr/include/string.h + /usr/include/unistd.h + /usr/include/x86_64-linux-gnu/bits/confname.h + /usr/include/x86_64-linux-gnu/bits/errno.h + /usr/include/x86_64-linux-gnu/bits/floatn-common.h + /usr/include/x86_64-linux-gnu/bits/floatn.h + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h + /usr/include/x86_64-linux-gnu/bits/long-double.h + /usr/include/x86_64-linux-gnu/bits/posix_opt.h + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h + /usr/include/x86_64-linux-gnu/bits/time64.h + /usr/include/x86_64-linux-gnu/bits/timesize.h + /usr/include/x86_64-linux-gnu/bits/types.h + /usr/include/x86_64-linux-gnu/bits/types/FILE.h + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h + /usr/include/x86_64-linux-gnu/bits/typesizes.h + /usr/include/x86_64-linux-gnu/bits/unistd_ext.h + /usr/include/x86_64-linux-gnu/bits/waitflags.h + /usr/include/x86_64-linux-gnu/bits/waitstatus.h + /usr/include/x86_64-linux-gnu/bits/wordsize.h + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h + /usr/include/x86_64-linux-gnu/gnu/stubs.h + /usr/include/x86_64-linux-gnu/sys/cdefs.h + /usr/include/x86_64-linux-gnu/sys/wait.h + /usr/lib/gcc/x86_64-linux-gnu/14/include/stdarg.h + /usr/lib/gcc/x86_64-linux-gnu/14/include/stddef.h + /usr/lib/linux/uapi/x86/asm/errno.h + nostr-id-tui /home/user/lt/n_os_tr/includes/nostr_core_lib/libnostr_core_x64.a /lib/x86_64-linux-gnu/libc.so.6 @@ -112,4 +196,6 @@ nostr-id-tui /usr/lib/x86_64-linux-gnu/libc_nonshared.a /usr/lib/x86_64-linux-gnu/libform.so /home/user/lt/n_os_tr/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/main.c.o + /home/user/lt/n_os_tr/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o + /home/user/lt/n_os_tr/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o diff --git a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/compiler_depend.make b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/compiler_depend.make index cfd084e6..dac911f3 100644 --- a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/compiler_depend.make +++ b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/compiler_depend.make @@ -51,12 +51,11 @@ CMakeFiles/nostr-id-tui.dir/src/main.c.o: /home/user/lt/n_os_tr/stack/nostr-id-t /usr/include/x86_64-linux-gnu/bits/floatn.h \ /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ /usr/include/x86_64-linux-gnu/bits/stdint-intn.h \ /usr/include/x86_64-linux-gnu/bits/stdint-least.h \ /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \ - /usr/include/x86_64-linux-gnu/bits/stdio.h \ /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ - /usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h \ /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ /usr/include/x86_64-linux-gnu/bits/time.h \ /usr/include/x86_64-linux-gnu/bits/time64.h \ @@ -67,8 +66,11 @@ CMakeFiles/nostr-id-tui.dir/src/main.c.o: /home/user/lt/n_os_tr/stack/nostr-id-t /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ /usr/include/x86_64-linux-gnu/bits/typesizes.h \ @@ -77,11 +79,91 @@ CMakeFiles/nostr-id-tui.dir/src/main.c.o: /home/user/lt/n_os_tr/stack/nostr-id-t /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ /usr/include/x86_64-linux-gnu/gnu/stubs.h \ /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/sys/time.h \ /usr/lib/gcc/x86_64-linux-gnu/14/include/stdarg.h \ /usr/lib/gcc/x86_64-linux-gnu/14/include/stdbool.h \ /usr/lib/gcc/x86_64-linux-gnu/14/include/stddef.h \ /usr/lib/gcc/x86_64-linux-gnu/14/include/stdint.h +CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o: /home/user/lt/n_os_tr/stack/nostr-id-tui/src/services_conf.c \ + /home/user/lt/n_os_tr/stack/nostr-id-tui/include/n_os_tr_tui.h \ + /usr/include/ctype.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/lib/gcc/x86_64-linux-gnu/14/include/stdarg.h \ + /usr/lib/gcc/x86_64-linux-gnu/14/include/stddef.h + +CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o: /home/user/lt/n_os_tr/stack/nostr-id-tui/src/systemd_client.c \ + /home/user/lt/n_os_tr/stack/nostr-id-tui/include/n_os_tr_tui.h \ + /usr/include/asm-generic/errno-base.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/features.h \ + /usr/include/linux/errno.h \ + /usr/include/stdc-predef.h \ + /usr/include/stdio.h \ + /usr/include/stdlib.h \ + /usr/include/string.h \ + /usr/include/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/confname.h \ + /usr/include/x86_64-linux-gnu/bits/errno.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/bits/posix_opt.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/unistd_ext.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/sys/wait.h \ + /usr/lib/gcc/x86_64-linux-gnu/14/include/stdarg.h \ + /usr/lib/gcc/x86_64-linux-gnu/14/include/stddef.h \ + /usr/lib/linux/uapi/x86/asm/errno.h + nostr-id-tui: /home/user/lt/n_os_tr/includes/nostr_core_lib/libnostr_core_x64.a \ /lib/x86_64-linux-gnu/libc.so.6 \ /lib/x86_64-linux-gnu/libm.so.6 \ @@ -109,219 +191,263 @@ nostr-id-tui: /home/user/lt/n_os_tr/includes/nostr_core_lib/libnostr_core_x64.a /usr/lib/gcc/x86_64-linux-gnu/14/libgcc_s.so \ /usr/lib/x86_64-linux-gnu/libc_nonshared.a \ /usr/lib/x86_64-linux-gnu/libform.so \ - CMakeFiles/nostr-id-tui.dir/src/main.c.o + CMakeFiles/nostr-id-tui.dir/src/main.c.o \ + CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o \ + CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o -/usr/lib/x86_64-linux-gnu/libform.so: - -/usr/lib/x86_64-linux-gnu/libc_nonshared.a: - -/usr/lib/gcc/x86_64-linux-gnu/14/libgcc.a: - -/usr/lib/gcc/x86_64-linux-gnu/14/crtendS.o: - -/usr/lib/x86_64-linux-gnu/libz.so: - -/usr/lib/x86_64-linux-gnu/libtinfo.so: - -/usr/lib/x86_64-linux-gnu/libssl.so: - -/usr/lib/x86_64-linux-gnu/libpthread.a: - -/usr/lib/x86_64-linux-gnu/libncurses.so.6: - -/usr/lib/x86_64-linux-gnu/libdl.a: - -/usr/lib/x86_64-linux-gnu/libcrypto.so: - -/usr/lib/x86_64-linux-gnu/libc.so: - -/usr/lib/x86_64-linux-gnu/crti.o: - -/usr/lib/x86_64-linux-gnu/Scrt1.o: - -/lib/x86_64-linux-gnu/libmvec.so.1: - -/usr/lib/gcc/x86_64-linux-gnu/14/include/stdint.h: - -/usr/lib/gcc/x86_64-linux-gnu/14/include/stdbool.h: - -/usr/include/x86_64-linux-gnu/sys/cdefs.h: - -/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: - -/usr/include/x86_64-linux-gnu/bits/wordsize.h: - -/usr/include/x86_64-linux-gnu/bits/typesizes.h: - -CMakeFiles/nostr-id-tui.dir/src/main.c.o: - -/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: - -/usr/lib/x86_64-linux-gnu/libm.so: - -/lib/x86_64-linux-gnu/libc.so.6: - -/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: - -/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: - -/usr/include/x86_64-linux-gnu/bits/types.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nostr_secure_memory.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nostr_fips_ipv6.h: - -/usr/lib/gcc/x86_64-linux-gnu/14/include/stdarg.h: - -/usr/include/ctype.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nostr_bip39_ui.h: - -/usr/include/curses.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip060.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/cjson/cJSON.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip021.h: - -/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip013.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/request_validator.h: - -/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip004.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nostr_core.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip061.h: - -/usr/include/x86_64-linux-gnu/bits/stdint-least.h: - -/usr/lib/x86_64-linux-gnu/libcurses.so: - -/usr/include/x86_64-linux-gnu/bits/time.h: - -/usr/include/x86_64-linux-gnu/gnu/stubs.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/blossom_client.h: - -/usr/lib/x86_64-linux-gnu/libsecp256k1.so: - -/usr/include/x86_64-linux-gnu/bits/floatn-common.h: - -/usr/include/x86_64-linux-gnu/bits/wchar.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nostr_common.h: - -/home/user/lt/n_os_tr/stack/nostr-id-tui/src/main.c: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nostr_http.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip046.h: - -/lib/x86_64-linux-gnu/libm.so.6: - -/usr/include/x86_64-linux-gnu/bits/types/time_t.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip006.h: - -/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: - -/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/cashu_mint.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip011.h: - -/lib64/ld-linux-x86-64.so.2: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip042.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip005.h: - -/usr/include/x86_64-linux-gnu/bits/long-double.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip019.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip003.h: - -/usr/include/x86_64-linux-gnu/bits/floatn.h: - -/home/user/lt/n_os_tr/stack/nostr-id-tui/include/n_os_tr_tui.h: - -/usr/lib/x86_64-linux-gnu/crtn.o: - -/usr/include/unctrl.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/utils.h: - -/usr/include/x86_64-linux-gnu/bits/time64.h: - -/usr/include/features-time64.h: - -/usr/include/features.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip017.h: - -/usr/include/ncurses_dll.h: - -/usr/lib/gcc/x86_64-linux-gnu/14/libgcc_s.so: - -/usr/include/stdint.h: - -/usr/include/x86_64-linux-gnu/bits/timesize.h: - -/usr/include/stdio.h: - -/usr/include/stdlib.h: - -/usr/lib/x86_64-linux-gnu/libgcc_s.so.1: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nostr_log.h: - -/usr/include/x86_64-linux-gnu/bits/endian.h: - -/usr/include/string.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/libnostr_core_x64.a: - -/usr/lib/gcc/x86_64-linux-gnu/14/include/stddef.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip044.h: - -/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: - -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip001.h: - -/usr/include/time.h: - -/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: - -/usr/include/sqlite3.h: +CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o: /usr/include/x86_64-linux-gnu/bits/endianness.h: +/usr/include/sqlite3.h: + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h: -/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: +/usr/include/x86_64-linux-gnu/bits/types.h: -/usr/include/x86_64-linux-gnu/bits/types/FILE.h: +/usr/include/time.h: -/usr/include/x86_64-linux-gnu/bits/stdio.h: +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip001.h: -/usr/lib/gcc/x86_64-linux-gnu/14/crtbeginS.o: +/usr/lib/gcc/x86_64-linux-gnu/14/include/stddef.h: -/usr/lib/x86_64-linux-gnu/libcurl.so: +/home/user/lt/n_os_tr/includes/nostr_core_lib/libnostr_core_x64.a: -/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip059.h: +/usr/include/string.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nostr_log.h: + +/usr/lib/x86_64-linux-gnu/libgcc_s.so.1: + +/usr/include/x86_64-linux-gnu/bits/timesize.h: + +/usr/include/stdint.h: + +/usr/lib/gcc/x86_64-linux-gnu/14/libgcc_s.so: /usr/include/x86_64-linux-gnu/bits/stdlib-float.h: /usr/include/stdc-predef.h: -/usr/include/x86_64-linux-gnu/bits/stdlib-bsearch.h: +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip059.h: + +/usr/lib/x86_64-linux-gnu/libcurl.so: + +/usr/include/ncurses_dll.h: + +/usr/include/features.h: + +/usr/include/features-time64.h: + +/usr/include/x86_64-linux-gnu/bits/select.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/utils.h: + +/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h: + +/usr/include/unctrl.h: + +/usr/lib/x86_64-linux-gnu/crtn.o: + +/home/user/lt/n_os_tr/stack/nostr-id-tui/include/n_os_tr_tui.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip017.h: + +/usr/include/x86_64-linux-gnu/bits/floatn.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip003.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip019.h: + +/usr/include/x86_64-linux-gnu/bits/long-double.h: + +/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip005.h: + +/usr/include/x86_64-linux-gnu/bits/errno.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip011.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/cashu_mint.h: + +/usr/include/x86_64-linux-gnu/bits/types/__FILE.h: + +/usr/include/x86_64-linux-gnu/bits/types/clock_t.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip006.h: + +/lib64/ld-linux-x86-64.so.2: + +/usr/include/x86_64-linux-gnu/bits/types/time_t.h: + +/lib/x86_64-linux-gnu/libm.so.6: + +/home/user/lt/n_os_tr/stack/nostr-id-tui/src/main.c: + +/usr/include/x86_64-linux-gnu/bits/wchar.h: + +/usr/include/x86_64-linux-gnu/bits/floatn-common.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nostr_http.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/blossom_client.h: + +/usr/include/x86_64-linux-gnu/bits/endian.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs.h: + +/usr/include/x86_64-linux-gnu/bits/time.h: + +/usr/lib/x86_64-linux-gnu/libcurses.so: + +/usr/include/x86_64-linux-gnu/bits/stdint-least.h: + +/usr/include/x86_64-linux-gnu/bits/time64.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip004.h: + +/usr/include/stdio.h: + +/home/user/lt/n_os_tr/stack/nostr-id-tui/src/services_conf.c: + +/usr/include/x86_64-linux-gnu/bits/libc-header-start.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/request_validator.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip013.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip021.h: + +/usr/include/x86_64-linux-gnu/bits/waitstatus.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/cjson/cJSON.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip060.h: + +/usr/include/curses.h: + +/usr/lib/gcc/x86_64-linux-gnu/14/crtbeginS.o: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nostr_bip39_ui.h: + +/usr/include/ctype.h: + +/usr/lib/gcc/x86_64-linux-gnu/14/include/stdarg.h: + +/usr/include/stdlib.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nostr_fips_ipv6.h: + +/home/user/lt/n_os_tr/stack/nostr-id-tui/src/systemd_client.c: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip044.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h: + +/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h: + +/lib/x86_64-linux-gnu/libc.so.6: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nostr_common.h: + +/usr/lib/x86_64-linux-gnu/libm.so: + +/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h: + +/usr/include/x86_64-linux-gnu/sys/cdefs.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip046.h: + +/usr/include/x86_64-linux-gnu/bits/typesizes.h: + +/usr/include/x86_64-linux-gnu/bits/wordsize.h: + +/usr/include/x86_64-linux-gnu/gnu/stubs-64.h: + +/usr/include/x86_64-linux-gnu/sys/time.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip042.h: + +/usr/lib/gcc/x86_64-linux-gnu/14/include/stdbool.h: + +/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h: + +/usr/include/x86_64-linux-gnu/sys/wait.h: + +/usr/lib/gcc/x86_64-linux-gnu/14/include/stdint.h: + +/usr/include/asm-generic/errno-base.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nip061.h: + +/usr/lib/x86_64-linux-gnu/libncurses.so.6: + +/usr/lib/x86_64-linux-gnu/libsecp256k1.so: + +/usr/include/asm-generic/errno.h: + +/usr/include/linux/errno.h: + +/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h: + +/usr/include/x86_64-linux-gnu/sys/select.h: + +/usr/include/unistd.h: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nostr_secure_memory.h: + +/usr/include/x86_64-linux-gnu/bits/confname.h: + +/usr/include/x86_64-linux-gnu/bits/posix_opt.h: + +/usr/include/x86_64-linux-gnu/bits/waitflags.h: + +/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h: + +/usr/lib/linux/uapi/x86/asm/errno.h: + +/lib/x86_64-linux-gnu/libmvec.so.1: + +/usr/lib/x86_64-linux-gnu/Scrt1.o: + +/usr/lib/x86_64-linux-gnu/libc.so: + +CMakeFiles/nostr-id-tui.dir/src/main.c.o: + +/usr/lib/x86_64-linux-gnu/libcrypto.so: + +/usr/lib/x86_64-linux-gnu/libdl.a: + +/usr/lib/x86_64-linux-gnu/libpthread.a: + +/usr/lib/x86_64-linux-gnu/libssl.so: + +/home/user/lt/n_os_tr/includes/nostr_core_lib/nostr_core/nostr_core.h: + +/usr/include/errno.h: + +/usr/lib/x86_64-linux-gnu/libtinfo.so: + +/usr/lib/x86_64-linux-gnu/crti.o: + +/usr/lib/x86_64-linux-gnu/libz.so: + +/usr/include/x86_64-linux-gnu/bits/stdio_lim.h: + +/usr/include/x86_64-linux-gnu/bits/types/FILE.h: + +/usr/lib/gcc/x86_64-linux-gnu/14/crtendS.o: + +/usr/lib/gcc/x86_64-linux-gnu/14/libgcc.a: + +/usr/include/x86_64-linux-gnu/bits/unistd_ext.h: + +/usr/lib/x86_64-linux-gnu/libc_nonshared.a: + +/usr/lib/x86_64-linux-gnu/libform.so: + +CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o: diff --git a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/link.d b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/link.d index 17eaf57c..bd824f80 100644 --- a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/link.d +++ b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/link.d @@ -3,6 +3,8 @@ nostr-id-tui: \ /usr/lib/gcc/x86_64-linux-gnu/14/../../../x86_64-linux-gnu/crti.o \ /usr/lib/gcc/x86_64-linux-gnu/14/crtbeginS.o \ CMakeFiles/nostr-id-tui.dir/src/main.c.o \ + CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o \ + CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o \ /home/user/lt/n_os_tr/stack/nostr-id-tui/../../includes/nostr_core_lib/libnostr_core_x64.a \ /usr/lib/gcc/x86_64-linux-gnu/14/../../../x86_64-linux-gnu/libcurses.so \ /usr/lib/gcc/x86_64-linux-gnu/14/../../../x86_64-linux-gnu/libcurses.so \ @@ -52,6 +54,10 @@ nostr-id-tui: \ CMakeFiles/nostr-id-tui.dir/src/main.c.o: +CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o: + +CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o: + /home/user/lt/n_os_tr/stack/nostr-id-tui/../../includes/nostr_core_lib/libnostr_core_x64.a: /usr/lib/gcc/x86_64-linux-gnu/14/../../../x86_64-linux-gnu/libcurses.so: diff --git a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/link.txt b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/link.txt index 569f51d2..248577d5 100644 --- a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/link.txt +++ b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/link.txt @@ -1 +1 @@ -/usr/bin/cc -g -Wl,--dependency-file=CMakeFiles/nostr-id-tui.dir/link.d "CMakeFiles/nostr-id-tui.dir/src/main.c.o" -o nostr-id-tui /home/user/lt/n_os_tr/stack/nostr-id-tui/../../includes/nostr_core_lib/libnostr_core_x64.a -lcurses /usr/lib/x86_64-linux-gnu/libform.so -lsecp256k1 -lssl -lcrypto -lcurl -lz -lpthread -lm -ldl +/usr/bin/cc -g -Wl,--dependency-file=CMakeFiles/nostr-id-tui.dir/link.d "CMakeFiles/nostr-id-tui.dir/src/main.c.o" "CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o" "CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o" -o nostr-id-tui /home/user/lt/n_os_tr/stack/nostr-id-tui/../../includes/nostr_core_lib/libnostr_core_x64.a -lcurses /usr/lib/x86_64-linux-gnu/libform.so -lsecp256k1 -lssl -lcrypto -lcurl -lz -lpthread -lm -ldl diff --git a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/progress.make b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/progress.make index abadeb0c..a69a57e8 100644 --- a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/progress.make +++ b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/progress.make @@ -1,3 +1,5 @@ CMAKE_PROGRESS_1 = 1 CMAKE_PROGRESS_2 = 2 +CMAKE_PROGRESS_3 = 3 +CMAKE_PROGRESS_4 = 4 diff --git a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/main.c.o b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/main.c.o index 2d119fc96eb4c1bae87cb8106714e6b14c1e16b0..7f3b5af8eda3ad6421988c9109ae22476efb6ffc 100644 GIT binary patch literal 45688 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 literal 23592 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 diff --git a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/main.c.o.d b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/main.c.o.d index 99146bb6..0e77d3a1 100644 --- a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/main.c.o.d +++ b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/main.c.o.d @@ -34,6 +34,13 @@ CMakeFiles/nostr-id-tui.dir/src/main.c.o: \ /usr/lib/gcc/x86_64-linux-gnu/14/include/stdbool.h /usr/include/unctrl.h \ /usr/include/curses.h /usr/include/stdlib.h \ /usr/include/x86_64-linux-gnu/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/sys/time.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ /home/user/lt/n_os_tr/stack/nostr-id-tui/include/n_os_tr_tui.h \ /home/user/lt/n_os_tr/stack/nostr-id-tui/../../includes/nostr_core_lib/nostr_core/nostr_core.h \ /home/user/lt/n_os_tr/stack/nostr-id-tui/../../includes/nostr_core_lib/nostr_core/nostr_common.h \ @@ -44,7 +51,6 @@ CMakeFiles/nostr-id-tui.dir/src/main.c.o: \ /home/user/lt/n_os_tr/stack/nostr-id-tui/../../includes/nostr_core_lib/nostr_core/nip001.h \ /usr/include/time.h /usr/include/x86_64-linux-gnu/bits/time.h \ /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ - /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ /home/user/lt/n_os_tr/stack/nostr-id-tui/../../includes/nostr_core_lib/nostr_core/../cjson/cJSON.h \ /home/user/lt/n_os_tr/stack/nostr-id-tui/../../includes/nostr_core_lib/nostr_core/nip003.h \ diff --git a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o new file mode 100644 index 0000000000000000000000000000000000000000..6519e394e4c343b0ec27e27a8de0156e57824681 GIT binary patch literal 14400 zcmb_i3w)H-mA~K2++-$`WI`T1gu+C5i6#MlJcVEoA`^;$A{MRdFqxSovrJ~vnQsW- z151dIvecxzbg6YIu0LD5s}%RQQtAUz+x1yjRI2p1yK1X#Lz8`oUzvMiyKC6~C_B9SYEyUpT&_3YU2b=(edR`9g zuR?X9o@b6@K7fxwtM|DdtUPe+m5>F0Mhi#t`&C9BLr>)jspo??spi-nuj!6-_uKPE zt+{Bl8c>SEI4DWCzrghLKm+ju7QOydv;q4EJ?m#Q`j zA$zN^vxpq>?jjeqL*r_J$WSP83cCsr4Bn|V`%6%MIeEE;apaG>r|bXk zN?KV-;fzh|kdM z?kUTkMqmC-hX>=}$p=3Ko}Nb!Q+D7WW&3+EbK;PAggrUb^(3+hyAn#sBJ3h4p^V6J zXx>br*-cvYs^}~OA(*NV$Y({M`&SUJDwt=X#Qp%zEZe zum*-%PyGqjU*qV|`rr8M|H?`$%fRr;($m-va&M{SpI5ZKjVJXQ4h!4K^H%K!+!yQ} zAU70R(v3rv84Cogo@zx@WAJTd(zA#L!OJ~Q2TnAeq_9amua=er6e0VUj#;x0&A8?i z)SkJf=ZDLC&h|V#5W$h^Y8O^_kxFOnOw9<);b*inldw%r zg*lwrY@2|eL)+<$fS*HWgfA#s3x$xv@}h@m7cIt8emVjiI!VPSU4)g-2V8onEWIkT z3XoU2Xm1+pk%^Qoq?f27tZ^Nj5Q9vWzcCTZAuH>Khg9IU>7u8Ho?c~w`?YZ)sGopLXFPMg_rgkmu^>G2 z3jYjqMJ)88akz~_%_1Vo6tS3y@rt;Dh@c{t5HV8`ONp4RhN)c(y5G zJ&oj@inung4r+EO;yRM)QpELvmq5W@MciD1`%kYTZW;G8s5z*J@PxO4IIM`xWZi>` zi1@ld=BOf?s|JAWxFVutYQG}l-rqvakJSjt!U+WcPXs~Xxx91?=I*0V??%{Gjo@b^&t}qF7MYkn71B-@Vjs4C|>Ce25_Y zgm>K~cmiSC00^|f7$Rha&j!a)e1o!%m@3v>hI z>f1z;8%kNSlgR72ay?NSnF|0wqf=acAzwl) z)cqEfpj}MI2c}n4297_8D&u1MOr@~RgQm`ygr>UsVx(~9B@{A!n~1uUDb?7liD)VK zoa!#)x{#QP4Ol@61}tLQsxoNwJ#2KV2u@du+mv;*JRr{*hjALH^<>4E@jO1hWIQFx zolZ?dM$1bPi^ZGp0m-`86U*AdJ4uPPk#XLc%1fI)*-TV;>$y|FT_W72SNNCs7yFwk z7Wtt&QZzxZx&y*r?ZuKu3b*%)YD=-W#>2WaRrvkO{BGE@3TA@%Byf2laFveW^3F36 zA0Q(&6^+en9pb^Vnkp=4v$)o}ast^U7yD;SXsTE`0pSt{26KnuQZfQ;4^)Hgbx$HXz_#!Q0ey%0~h7{yTrc*TsLvp39!y%n0~Ip z^2=eF$sps+AEPPxN)~~NV69+(IgSyc8iq<-?6=Thm}2A`;GIgnq!BkAFfG4IcOR5o z4nH*yX>J3hQvNASW0+5d2`+_K{5g~@%lfdi1T$Q8;0J{%6qCq#q2#irxB_$*qh*R7 z)H-N|aC9Ef7e0Z(jDnK9O89uS0LM$Ow_cVCm&avGZ%&rwq%SAsY&pd>twdVW<;2<2 z`-Jo#k-j=P7TBzJqz|)QviNNouw^+Ct7QN)*CplBzxI7uR3|Ink;V10@&-8$D{NUw z^|j@)#J#;mT5f+(UJ9BYR~2@_Ch04vlV0TVZj#lIyH?A|OfG`lvs%t)@(Ym5)gV#~ zBG!%a()rMd_oaMT7JF}$fp1Bc?GKm&e72G5%9+T3RRj#=e|8K=I*W5~3{4n+;3?{f{R7vk{ zveR{l+~+wYr-2OxhvZ_&3J-xPMPP~-yjKN)^$>Z_UA)QrEm{6cS!~Pc0K0aP|6o`H zyP;!`%fQ2!!w^5LkenRjl(24+H;3A^qso9lN6lFyt87_)BTJr> zm5)o`eFVIw#=Bs(3X+Fpk!xy&oa=73WyO^Z4Gr?L6|&fUOHj^2b}tNryQUWdY&_EF zZ;9lR zARkS~;?b?7D3)jijmdPXHAoM<5@i#usdy|1mSjXM4tK(EO9J+sH0WCw&cq`zP#*)C zXe6m5NyyINDI(mGjI@FTww%hfLtD8Fw3p1ar{Eshu{{huBR!4{>0}I@09Ff~v!P+Q z+OAr=F}Py!;^3TlwR3A{2W#5xTq<7Q8c)SDi71efOth_j+oAt{Gx;%>%I62gbpH)^K=1i_o&~8? zOBip}g2p#ELI(EkFls}ivXQNEuq7LZE3z7EJCkS^a7uyUrePPLC%Q$eR>O~hL!&WQ zgxg`nMN4bk&ccYcfRrN$6W^)=4{=mQF}W^$b<>(g(UR^!LzHW>5QF&va(-{Z zEsg$XnFc4(q*^eKyFdX;&U0Le;hRl$WWbshGExl=!r@#hmyO5f ziuQOrh9pinXdkHd^j31^1})MagOVx4;5l7QgNCF+`UiDay%4PL=~av3=3)r}aX+UO@2 z{*(<0=uD}$n+VtQ46oF>=?`;Dr9m|o8|~m7`c$~;Duqd6mKF8IR!4! z5Ol3j5UWj;1a(hvJzZ^``p2lAtIo^tc;^wn|MJ#(7n4I9-|vFHo?vIX=fFtmQ zK$VR^6wxpWzG@VF-6%L-VK1aVHVVE4@N)3m4nAt@3;G_$e@6%O;ny4YjH2i8DEN0q z!M`^Oery!{ylL#5LTC>ic`_P4Iyu_|Z|cqlFk%nlV;b)jBNhzW*oU{m^Xqt91r>O1 z(i=N(VQQ;}E{T=+fP`+wiw}IoqI4~SkkHL|_t*HX2tq;}qe$Zi5QKzy0Dc;O06|EI zbHu>E$o$6*T-*OE1J`=qH}DAS`N+W2j9(WpjjxV;fKQsI;3H^+7RO5T{@O*x~Q{xLJZ3`5g z9T{6Xg%&Y` z#tRu=Y2e>wJ3nvWry0M_!1aD`qk;cB>u)viA2OXZa3;kz1K-H=|7!+5lkvYZ@S}`B zV&E&7K5pQ*Fn!X%?_m0A17FGdUo`OfOrJLJKQjNn7`Tp`Ul{mS_Va*&FJV3J8Myis zC&W1eKg0Bg29D=cOoiNzjtBfoh^f-RUskXaznXtL^Vb^uN0@(!frr`tkb(b#@r?$q z_uXa#?_&P6f&ZTI+YB7Pi(=|A@QWG$x`F?I_1tgZ?To7ryK2ti{Q7&=^Q6H)hFTTk zc?178Yd@>+%|g6y@Vl7Si-P9=IqNTBeHy2)sZe*3flp`t83wM;H}ed< zl-pfy;5pW_*1%t9zkSibpJTkuz>l$heGky~-^F~p4E|Q8?>6v0*8evKK8Eq{8h9Vm zj~MuVw&$k?{$Jc*eXi4Xp3{8Xj>h*e|K$cgoAJd4zJm2!ZQx_so(%?mAM4p{;A5G- z+rZbc{%;z1JL69n_*$l4G4R>UKVaa`vpuDJ&e48&fca+`_&qGY+Q7%Np16V6F#oLv z{vhMuH1HSMZ~tK6JDC5pfuCdke`6d;G+p0E&l&v7*v@J`U+Mn-i1pMP_)f+*F|PIR zV!G4df1LH-W#IMf&%ZKoeO~`t17E{>jv9ED^_(>DYWB|u2L2TDyZIcY?brAC1&o`1 zxYoe0XM1ii^yv2`dklU(Uk(_!o-g`*sN2=^i9&ue@N`qu=ZN&d`JZ zHjL?pIybZpfMB3xrt52T=K@`VG&pWNDfeYsUD)8`X zHu_&a+#)o;t~kX9aJ}xsKXp($dQR*84(BQAio3wb3hh# z=EowCPWx{lk(bQ&aX&OMWd8|wbc@jslXo%jUdVqlr=b@3Ur?M_kkEfPMyCH(17_+3 zNG#+9bDGgHlNZ+q6GQo%%ke3M-iH)*J}<627qY*%PDyBav>)FanD*oPaiRAAg4@5? z7+8}R*QE=!-_PyqdknUZ_ZYMN+qr#hCy@hr=qF%)S3Y4{N+ zT*&_&II$r0s*K`y43xFJp8sf%**1zC#t&nVI=HeD%J|;il*gDdLIe;vFYx-KzpW7n V53~Ph(}m;(Z~XmQkaJW1e*ns^5AXm0 literal 0 HcmV?d00001 diff --git a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o.d b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o.d new file mode 100644 index 00000000..2e51fcc7 --- /dev/null +++ b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o.d @@ -0,0 +1,29 @@ +CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o: \ + /home/user/lt/n_os_tr/stack/nostr-id-tui/src/services_conf.c \ + /usr/include/stdc-predef.h /usr/include/ctype.h /usr/include/features.h \ + /usr/include/features-time64.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-linux-gnu/14/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/14/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h /usr/include/string.h \ + /home/user/lt/n_os_tr/stack/nostr-id-tui/include/n_os_tr_tui.h diff --git a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o new file mode 100644 index 0000000000000000000000000000000000000000..56e3dc8b0dca4bec3c15bcac96654da0ee65a22b GIT binary patch literal 8528 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 L7Ui?{Q1$-{S;y$R literal 0 HcmV?d00001 diff --git a/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o.d b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o.d new file mode 100644 index 00000000..b2a24994 --- /dev/null +++ b/stack/nostr-id-tui/build-host/CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o.d @@ -0,0 +1,36 @@ +CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o: \ + /home/user/lt/n_os_tr/stack/nostr-id-tui/src/systemd_client.c \ + /usr/include/stdc-predef.h /usr/include/errno.h /usr/include/features.h \ + /usr/include/features-time64.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/bits/errno.h /usr/include/linux/errno.h \ + /usr/lib/linux/uapi/x86/asm/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/stdio.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/lib/gcc/x86_64-linux-gnu/14/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/14/include/stdarg.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h /usr/include/stdlib.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h /usr/include/string.h \ + /usr/include/x86_64-linux-gnu/sys/wait.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h /usr/include/unistd.h \ + /usr/include/x86_64-linux-gnu/bits/posix_opt.h \ + /usr/include/x86_64-linux-gnu/bits/confname.h \ + /usr/include/x86_64-linux-gnu/bits/unistd_ext.h \ + /home/user/lt/n_os_tr/stack/nostr-id-tui/include/n_os_tr_tui.h diff --git a/stack/nostr-id-tui/build-host/CMakeFiles/progress.marks b/stack/nostr-id-tui/build-host/CMakeFiles/progress.marks index 0cfbf088..b8626c4c 100644 --- a/stack/nostr-id-tui/build-host/CMakeFiles/progress.marks +++ b/stack/nostr-id-tui/build-host/CMakeFiles/progress.marks @@ -1 +1 @@ -2 +4 diff --git a/stack/nostr-id-tui/build-host/Makefile b/stack/nostr-id-tui/build-host/Makefile index 249f5817..73cb8ca6 100644 --- a/stack/nostr-id-tui/build-host/Makefile +++ b/stack/nostr-id-tui/build-host/Makefile @@ -153,6 +153,54 @@ src/main.c.s: $(MAKE) $(MAKESILENT) -f CMakeFiles/nostr-id-tui.dir/build.make CMakeFiles/nostr-id-tui.dir/src/main.c.s .PHONY : src/main.c.s +src/services_conf.o: src/services_conf.c.o +.PHONY : src/services_conf.o + +# target to build an object file +src/services_conf.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/nostr-id-tui.dir/build.make CMakeFiles/nostr-id-tui.dir/src/services_conf.c.o +.PHONY : src/services_conf.c.o + +src/services_conf.i: src/services_conf.c.i +.PHONY : src/services_conf.i + +# target to preprocess a source file +src/services_conf.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/nostr-id-tui.dir/build.make CMakeFiles/nostr-id-tui.dir/src/services_conf.c.i +.PHONY : src/services_conf.c.i + +src/services_conf.s: src/services_conf.c.s +.PHONY : src/services_conf.s + +# target to generate assembly for a file +src/services_conf.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/nostr-id-tui.dir/build.make CMakeFiles/nostr-id-tui.dir/src/services_conf.c.s +.PHONY : src/services_conf.c.s + +src/systemd_client.o: src/systemd_client.c.o +.PHONY : src/systemd_client.o + +# target to build an object file +src/systemd_client.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/nostr-id-tui.dir/build.make CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.o +.PHONY : src/systemd_client.c.o + +src/systemd_client.i: src/systemd_client.c.i +.PHONY : src/systemd_client.i + +# target to preprocess a source file +src/systemd_client.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/nostr-id-tui.dir/build.make CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.i +.PHONY : src/systemd_client.c.i + +src/systemd_client.s: src/systemd_client.c.s +.PHONY : src/systemd_client.s + +# target to generate assembly for a file +src/systemd_client.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/nostr-id-tui.dir/build.make CMakeFiles/nostr-id-tui.dir/src/systemd_client.c.s +.PHONY : src/systemd_client.c.s + # Help Target help: @echo "The following are some of the valid targets for this Makefile:" @@ -165,6 +213,12 @@ help: @echo "... src/main.o" @echo "... src/main.i" @echo "... src/main.s" + @echo "... src/services_conf.o" + @echo "... src/services_conf.i" + @echo "... src/services_conf.s" + @echo "... src/systemd_client.o" + @echo "... src/systemd_client.i" + @echo "... src/systemd_client.s" .PHONY : help diff --git a/stack/nostr-id-tui/build-host/nostr-id-tui b/stack/nostr-id-tui/build-host/nostr-id-tui index 93e52c3f2a5ad7cd26ad097bab2cd4756ccce741..dd6affcb34f6b393192f358ac453028221194706 100755 GIT binary patch literal 170688 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 literal 145472 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 aamY$quSU_o6feZTwpH = n-OS-tr Identity ==TUI version: 0.2.0^[[4m1^[[0m) Enter existing mnemonic^[[4m2^[[0m) Generate new mnemonicE^[[4mx^[[0mitSelect option: > +Session terminated, killing shell... ...killed. diff --git a/stack/nostr-id-tui/include/n_os_tr_tui.h b/stack/nostr-id-tui/include/n_os_tr_tui.h index 45e932fc..3acec662 100644 --- a/stack/nostr-id-tui/include/n_os_tr_tui.h +++ b/stack/nostr-id-tui/include/n_os_tr_tui.h @@ -1,9 +1,32 @@ #ifndef N_OS_TR_TUI_H #define N_OS_TR_TUI_H -#define N_OS_TR_TUI_VERSION "0.1.0" +#include + +#define N_OS_TR_TUI_VERSION "0.2.0" #define NOSTR_TUI_MAX_MNEMONIC 256 #define NOSTR_TUI_MAX_NPUB 128 +#define N_OS_TR_TUI_MAX_SERVICES 16 + +#define N_OS_TR_TUI_OK 0 +#define N_OS_TR_TUI_ERR 1 + +typedef struct { + char key; + char unit[64]; + char label[64]; + int default_on; + char deps[128]; + int desired_on; +} service_entry_t; + +int services_conf_load(const char* path, service_entry_t* out, size_t max, size_t* out_count); +int services_conf_load_fallback(service_entry_t* out, size_t max, size_t* out_count); + +int systemd_is_simulation_mode(void); +int systemd_unit_is_active(const char* unit, int* is_active); +int systemd_unit_start(const char* unit, char* err_out, size_t err_out_len); +int systemd_unit_stop(const char* unit, char* err_out, size_t err_out_len); #endif /* N_OS_TR_TUI_H */ diff --git a/stack/nostr-id-tui/src/main.c b/stack/nostr-id-tui/src/main.c index f570ee37..4ab0f7a5 100644 --- a/stack/nostr-id-tui/src/main.c +++ b/stack/nostr-id-tui/src/main.c @@ -4,6 +4,8 @@ #include #include +#include + #include "n_os_tr_tui.h" #include "nostr_core/nostr_core.h" @@ -11,29 +13,180 @@ typedef enum { SCREEN_MENU = 0, SCREEN_ENTER = 1, SCREEN_GENERATE = 2, - SCREEN_EXIT = 3 + SCREEN_SERVICES = 3, + SCREEN_EXIT = 4 } screen_t; -static void clear_and_title(const char* title) { - clear(); - mvprintw(0, 2, "n-OS-tr nostr-id-tui v%s", N_OS_TR_TUI_VERSION); - mvprintw(1, 2, "%s", title); - mvhline(2, 1, ACS_HLINE, 76); +typedef struct { + int identity_loaded; + char main_npub[NOSTR_TUI_MAX_NPUB]; + service_entry_t services[N_OS_TR_TUI_MAX_SERVICES]; + size_t service_count; +} app_state_t; + +#define BANNER_HEIGHT 9 +#define BANNER_IN_MS 3000LL +#define BANNER_HOLD_MS 3000LL +#define BANNER_OUT_MS 3000LL +#define BANNER_PAUSE_MS 3000LL +#define BANNER_CYCLE_MS (BANNER_IN_MS + BANNER_HOLD_MS + BANNER_OUT_MS + BANNER_PAUSE_MS) + + + + +static const char* BANNER_ART[BANNER_HEIGHT] = { + "____________________________/\\\\\\\\\\__________/\\\\\\\\\\\\\\\\\\\\\\______________________________________________", + "___________________________/\\\\\\///\\\\\\______/\\\\\\/////////\\\\\\___________________________________________", + "__________________________/\\\\\\/__\\///\\\\\\___\\//\\\\\\______\\///_________________/\\\\\\______________________", + "_/\\\\/\\\\\\\\\\\\_______________/\\\\\\______\\//\\\\\\___\\////\\\\\\_____________________/\\\\\\\\\\\\\\\\\\\\\\__/\\\\/\\\\\\\\\\\\\\___", + "_\\/\\\\\\////\\\\\\_____________\\/\\\\\\_______\\/\\\\\\______\\////\\\\\\_________________\\////\\\\\\////__\\/\\\\\\/////\\\\\\_", + "__\\/\\\\\\__\\//\\\\\\____________\\//\\\\\\______/\\\\\\__________\\////\\\\\\_________________\\/\\\\\\______\\/\\\\\\___\\///_", + "___\\/\\\\\\___\\/\\\\\\_____________\\///\\\\\\__/\\\\\\_____/\\\\\\______\\//\\\\\\________________\\/\\\\\\_/\\\\__\\/\\\\\\_______", + "____\\/\\\\\\___\\/\\\\\\__/\\\\\\\\\\\\\\\\____\\///\\\\\\\\\\/_____\\///\\\\\\\\\\\\\\\\\\\\\\/____/\\\\\\\\\\\\\\\\____\\//\\\\\\\\\\___\\/\\\\\\______", + "_____\\///____\\///__\\////////_______\\/////_________\\///////////_____\\////////______\\/////____\\///______" +}; + +// Unescaped editable banner reference (do not compile directly): +// +// ____________________________/\\\\\__________/\\\\\\\\\\\______________________________________________ +// ___________________________/\\\///\\\______/\\\/////////\\\___________________________________________ +// __________________________/\\\/__\///\\\___\//\\\______\///_________________/\\\______________________ +// _/\\/\\\\\\_______________/\\\______\//\\\___\////\\\_____________________/\\\\\\\\\\\__/\\/\\\\\\\___ +// _\/\\\////\\\_____________\/\\\_______\/\\\______\////\\\_________________\////\\\////__\/\\\/////\\\_ +//___\/\\\__\//\\\____________\//\\\______/\\\__________\////\\\_________________\/\\\______\/\\\___\///_ +// ___\/\\\___\/\\\_____________\///\\\__/\\\_____/\\\______\//\\\________________\/\\\_/\\__\/\\\_______ +// ____\/\\\___\/\\\__/\\\\\\\\____\///\\\\\/_____\///\\\\\\\\\\\/____/\\\\\\\\____\//\\\\\___\/\\\______ +// _____\///____\///__\////////_______\/////_________\///////////_____\////////______\/////____\///______ + + + + + + + + + +static int ui_row(int y) { + return y + BANNER_HEIGHT + 1; +} + +static long long monotonic_ms(void) { + struct timeval tv; + if (gettimeofday(&tv, NULL) != 0) { + return 0; + } + return ((long long)tv.tv_sec * 1000LL) + ((long long)tv.tv_usec / 1000LL); +} + +static int banner_art_width(void) { + int i; + int max_width = 0; + + for (i = 0; i < BANNER_HEIGHT; ++i) { + int w = (int)strlen(BANNER_ART[i]); + if (w > max_width) { + max_width = w; + } + } + + return max_width; +} + +static void render_banner_frame(void) { + int row; + int col; + int screen_w = COLS; + int art_w = banner_art_width(); + int center_x = (screen_w - art_w) / 2; + long long t = monotonic_ms() % BANNER_CYCLE_MS; + int show_art = 1; + int art_x = center_x; + + for (row = 0; row < BANNER_HEIGHT; ++row) { + move(row, 0); + for (col = 0; col < screen_w; ++col) { + addch('_'); + } + } + + if (t < BANNER_IN_MS) { + int delta = center_x + art_w; + art_x = -art_w + (int)((delta * t) / BANNER_IN_MS); + } else if (t < (BANNER_IN_MS + BANNER_HOLD_MS)) { + art_x = center_x; + } else if (t < (BANNER_IN_MS + BANNER_HOLD_MS + BANNER_OUT_MS)) { + long long out_t = t - (BANNER_IN_MS + BANNER_HOLD_MS); + int delta = (screen_w + 1) - center_x; + art_x = center_x + (int)((delta * out_t) / BANNER_OUT_MS); + } else { + show_art = 0; + } + + if (!show_art) { + return; + } + + for (row = 0; row < BANNER_HEIGHT; ++row) { + const char* line = BANNER_ART[row]; + int len = (int)strlen(line); + for (col = 0; col < len; ++col) { + int x = art_x + col; + char ch = line[col]; + if (x < 0 || x >= screen_w) continue; + mvaddch(row, x, ch); + } + } } static void trim_line(char* s) { size_t len; if (!s) return; + len = strlen(s); while (len > 0 && (s[len - 1] == '\n' || s[len - 1] == '\r' || isspace((unsigned char)s[len - 1]))) { s[len - 1] = '\0'; len--; } + while (*s && isspace((unsigned char)*s)) { memmove(s, s + 1, strlen(s)); } } +static void draw_centered_header(const char* title) { + int width = COLS; + int title_len = (int)strlen(title); + int min_required = title_len + 4; + int left_pad, right_pad, i; + int r; + + /* Clear UI body when entering/redrawing a screen to avoid stale text + from previous screens (menu/generate/services overlays). */ + for (r = ui_row(1); r < LINES; ++r) { + move(r, 0); + clrtoeol(); + } + + /* Header line stays independently drawn below the banner. */ + move(ui_row(0), 0); + for (i = 0; i < COLS; ++i) addch(' '); + + if (width < min_required) { + mvprintw(ui_row(0), 0, "=== %s ===", title); + return; + } + + left_pad = (width - title_len - 2) / 2; + right_pad = width - title_len - 2 - left_pad; + + move(ui_row(0), 0); + for (i = 0; i < left_pad; ++i) addch('='); + addch(' '); + addstr(title); + addch(' '); + for (i = 0; i < right_pad; ++i) addch('='); +} + static int read_line_at(int y, int x, char* out, size_t out_size) { int rc; if (!out || out_size < 2) return NOSTR_ERROR_INVALID_INPUT; @@ -52,8 +205,15 @@ static int read_line_at(int y, int x, char* out, size_t out_size) { } static void wait_key(void) { + timeout(60); mvprintw(LINES - 2, 2, "Press any key to continue..."); - getch(); + refresh(); + while (getch() == ERR) { + render_banner_frame(); + mvprintw(LINES - 2, 2, "Press any key to continue..."); + refresh(); + } + timeout(-1); } static int derive_from_mnemonic(const char* mnemonic, char* npub_out, size_t npub_size) { @@ -73,9 +233,7 @@ static int derive_from_mnemonic(const char* mnemonic, char* npub_out, size_t npu memset(priv, 0, sizeof(priv)); memset(pub, 0, sizeof(pub)); - if (rc != NOSTR_SUCCESS) { - return rc; - } + if (rc != NOSTR_SUCCESS) return rc; npub_out[npub_size - 1] = '\0'; return NOSTR_SUCCESS; @@ -91,49 +249,193 @@ static void render_prefix_hint(const char* word_prefix) { return; } - mvprintw(11, 2, "Suggestions for '%s':", word_prefix); + mvprintw(ui_row(11), 2, "Suggestions for '%s':", word_prefix); for (size_t i = 0; i < count && i < 6; ++i) { - mvprintw(12 + (int)i, 4, "- %s", matches[i]); + mvprintw(ui_row(12 + (int)i), 4, "- %s", matches[i]); } } +static void load_services_if_needed(app_state_t* app) { + const char* path; + if (!app || app->service_count > 0) return; + + path = getenv("NOSTR_TUI_SERVICES_CONF"); + if (!path || path[0] == '\0') { + path = "/etc/n-os-tr/services.conf"; + } + + if (services_conf_load(path, app->services, N_OS_TR_TUI_MAX_SERVICES, &app->service_count) != N_OS_TR_TUI_OK) { + (void)services_conf_load_fallback(app->services, N_OS_TR_TUI_MAX_SERVICES, &app->service_count); + } +} + +static void refresh_service_states(app_state_t* app, int* active_states) { + size_t i; + int active = 0; + + for (i = 0; i < app->service_count; ++i) { + if (systemd_unit_is_active(app->services[i].unit, &active) != N_OS_TR_TUI_OK) { + active = 0; + } + active_states[i] = active; + } +} + +static void apply_dependency_rules(app_state_t* app, size_t idx) { + size_t i; + if (!app || idx >= app->service_count) return; + + if (strcmp(app->services[idx].deps, "-") == 0 || app->services[idx].deps[0] == '\0') { + return; + } + + if (!app->services[idx].desired_on) return; + + for (i = 0; i < app->service_count; ++i) { + if (strcmp(app->services[i].unit, app->services[idx].deps) == 0) { + app->services[i].desired_on = 1; + } + } +} + +static int apply_services(app_state_t* app) { + int y = ui_row(9); + size_t i; + int active_states[N_OS_TR_TUI_MAX_SERVICES]; + char err[256] = {0}; + int had_error = 0; + + refresh_service_states(app, active_states); + + mvprintw(ui_row(7), 2, "Applying selection..."); + for (i = 0; i < app->service_count; ++i) { + int rc; + const char* action = NULL; + + if (app->services[i].desired_on && !active_states[i]) { + action = "START"; + rc = systemd_unit_start(app->services[i].unit, err, sizeof(err)); + } else if (!app->services[i].desired_on && active_states[i]) { + action = "STOP "; + rc = systemd_unit_stop(app->services[i].unit, err, sizeof(err)); + } else { + action = "SKIP "; + rc = N_OS_TR_TUI_OK; + } + + if (rc == N_OS_TR_TUI_OK) { + mvprintw(y++, 4, "[ OK ] %s %s", action, app->services[i].unit); + } else { + mvprintw(y++, 4, "[FAIL] %s %s", action, app->services[i].unit); + mvprintw(y++, 6, "%s", err[0] ? err : "systemctl error"); + had_error = 1; + } + + if (y >= LINES - 4) break; + } + + if (had_error) { + mvprintw(LINES - 4, 2, "One or more unit operations failed."); + return N_OS_TR_TUI_ERR; + } + + mvprintw(LINES - 4, 2, "Service selection applied."); + return N_OS_TR_TUI_OK; +} + +static void render_menu_static(void) { + draw_centered_header("n_OS_tr"); + + move(ui_row(4), 2); + attron(A_UNDERLINE); + addch('E'); + attroff(A_UNDERLINE); + addstr("nter existing mnemonic"); + + move(ui_row(5), 2); + attron(A_UNDERLINE); + addch('G'); + attroff(A_UNDERLINE); + addstr("enerate new mnemonic"); + + move(ui_row(6), 2); + addch('E'); + attron(A_UNDERLINE); + addch('x'); + attroff(A_UNDERLINE); + addstr("it"); + + mvprintw(ui_row(8), 2, "Select action: > "); +} + static screen_t screen_menu(void) { int ch; - clear_and_title("Main Menu"); - mvprintw(4, 2, "1) Enter existing mnemonic"); - mvprintw(5, 2, "2) Generate new mnemonic"); - mvprintw(6, 2, "q) Quit"); - mvprintw(8, 2, "Select option: "); + int last_cols = COLS; + int last_lines = LINES; + + render_menu_static(); + render_banner_frame(); refresh(); - ch = getch(); - if (ch == '1') return SCREEN_ENTER; - if (ch == '2') return SCREEN_GENERATE; - if (ch == 'q' || ch == 'Q') return SCREEN_EXIT; - return SCREEN_MENU; + timeout(60); + while (1) { + ch = getch(); + if (ch == ERR) { + if (COLS != last_cols || LINES != last_lines) { + last_cols = COLS; + last_lines = LINES; + render_menu_static(); + } + render_banner_frame(); + refresh(); + continue; + } + + if (ch == KEY_RESIZE) { + last_cols = COLS; + last_lines = LINES; + render_menu_static(); + render_banner_frame(); + refresh(); + continue; + } + + ch = tolower(ch); + if (ch == 'e') { + timeout(-1); + return SCREEN_ENTER; + } + if (ch == 'g') { + timeout(-1); + return SCREEN_GENERATE; + } + if (ch == 'x' || ch == 'q') { + timeout(-1); + return SCREEN_EXIT; + } + } } -static screen_t screen_enter(void) { +static screen_t screen_enter(app_state_t* app) { char line[NOSTR_TUI_MAX_MNEMONIC] = {0}; - char npub[NOSTR_TUI_MAX_NPUB] = {0}; nostr_secure_buf_t secure = {0}; int rc; - clear_and_title("Enter mnemonic"); - mvprintw(4, 2, "Paste your 12/15/18/21/24-word mnemonic and press Enter."); - mvprintw(5, 2, "Mnemonic: "); + draw_centered_header("Enter Mnemonic"); + mvprintw(ui_row(3), 2, "Paste your 12/15/18/21/24-word mnemonic and press Enter."); + mvprintw(ui_row(5), 2, "Mnemonic: "); refresh(); rc = nostr_secure_buf_init(&secure, NOSTR_TUI_MAX_MNEMONIC); if (rc != NOSTR_SUCCESS) { - mvprintw(7, 2, "secure memory init failed: %d", rc); + mvprintw(ui_row(7), 2, "secure memory init failed: %d", rc); wait_key(); return SCREEN_MENU; } - rc = read_line_at(5, 12, line, sizeof(line)); + rc = read_line_at(ui_row(5), 12, line, sizeof(line)); if (rc != NOSTR_SUCCESS) { - mvprintw(7, 2, "input error"); + mvprintw(ui_row(7), 2, "input error"); nostr_secure_buf_destroy(&secure); wait_key(); return SCREEN_MENU; @@ -141,98 +443,261 @@ static screen_t screen_enter(void) { rc = nostr_secure_buf_append(&secure, line, strlen(line)); if (rc != NOSTR_SUCCESS) { - mvprintw(7, 2, "secure buffer append failed: %d", rc); + mvprintw(ui_row(7), 2, "secure buffer append failed: %d", rc); nostr_secure_buf_destroy(&secure); wait_key(); return SCREEN_MENU; } if (nostr_bip39_mnemonic_validate((const char*)secure.bytes) != NOSTR_SUCCESS) { - mvprintw(7, 2, "Invalid mnemonic."); char first_word[32] = {0}; size_t i = 0; + mvprintw(ui_row(7), 2, "Invalid mnemonic."); + while (i < sizeof(first_word) - 1 && line[i] && !isspace((unsigned char)line[i])) { first_word[i] = line[i]; i++; } first_word[i] = '\0'; + render_prefix_hint(first_word); nostr_secure_buf_destroy(&secure); wait_key(); return SCREEN_MENU; } - rc = derive_from_mnemonic((const char*)secure.bytes, npub, sizeof(npub)); - if (rc != NOSTR_SUCCESS) { - mvprintw(7, 2, "Key derivation failed: %d", rc); - nostr_secure_buf_destroy(&secure); - wait_key(); - return SCREEN_MENU; - } - - mvprintw(7, 2, "Mnemonic accepted."); - mvprintw(8, 2, "Derived main npub:"); - mvprintw(9, 2, "%s", npub); - + rc = derive_from_mnemonic((const char*)secure.bytes, app->main_npub, sizeof(app->main_npub)); nostr_secure_buf_destroy(&secure); memset(line, 0, sizeof(line)); - wait_key(); - return SCREEN_MENU; + if (rc != NOSTR_SUCCESS) { + mvprintw(ui_row(7), 2, "Key derivation failed: %d", rc); + wait_key(); + return SCREEN_MENU; + } + + app->identity_loaded = 1; + return SCREEN_SERVICES; } -static screen_t screen_generate(void) { +static screen_t screen_generate(app_state_t* app) { char mnemonic[NOSTR_TUI_MAX_MNEMONIC] = {0}; - char npub[NOSTR_TUI_MAX_NPUB] = {0}; + char main_nsec[NOSTR_TUI_MAX_NPUB] = {0}; unsigned char priv[32] = {0}; unsigned char pub[32] = {0}; - uint8_t picks[NOSTR_BIP39_CONFIRM_PICK_COUNT] = {0}; int rc; - clear_and_title("Generate mnemonic"); + draw_centered_header("Generate Mnemonic"); rc = nostr_generate_mnemonic_and_keys(mnemonic, sizeof(mnemonic), 0, priv, pub); if (rc != NOSTR_SUCCESS) { - mvprintw(4, 2, "Generation failed: %d", rc); + mvprintw(ui_row(4), 2, "Generation failed: %d", rc); wait_key(); return SCREEN_MENU; } - rc = nostr_key_to_bech32(pub, "npub", npub); + rc = nostr_key_to_bech32(pub, "npub", app->main_npub); if (rc != NOSTR_SUCCESS) { - mvprintw(4, 2, "npub conversion failed: %d", rc); + mvprintw(ui_row(4), 2, "npub conversion failed: %d", rc); memset(priv, 0, sizeof(priv)); memset(pub, 0, sizeof(pub)); wait_key(); return SCREEN_MENU; } - rc = nostr_bip39_ui_random_confirm_positions(12, picks); + rc = nostr_key_to_bech32(priv, "nsec", main_nsec); if (rc != NOSTR_SUCCESS) { - mvprintw(4, 2, "confirm-position generation failed: %d", rc); + mvprintw(ui_row(4), 2, "nsec conversion failed: %d", rc); memset(priv, 0, sizeof(priv)); memset(pub, 0, sizeof(pub)); wait_key(); return SCREEN_MENU; } - mvprintw(4, 2, "Write this mnemonic down now:"); - mvprintw(6, 2, "%s", mnemonic); - mvprintw(8, 2, "Derived main npub:"); - mvprintw(9, 2, "%s", npub); - mvprintw(11, 2, "Confirmation check words: #%u, #%u, #%u", - (unsigned)picks[0], (unsigned)picks[1], (unsigned)picks[2]); + mvprintw(ui_row(4), 2, "Write this mnemonic down now:"); + mvprintw(ui_row(5), 2, "Mnemonic (index 0):"); + mvprintw(ui_row(6), 2, "%s", mnemonic); + mvprintw(ui_row(8), 2, "Derived keys (mnemonic index 0):"); + mvprintw(ui_row(9), 2, "npub: %s", app->main_npub); + mvprintw(ui_row(10), 2, "nsec: %s", main_nsec); memset(priv, 0, sizeof(priv)); memset(pub, 0, sizeof(pub)); memset(mnemonic, 0, sizeof(mnemonic)); + app->identity_loaded = 1; wait_key(); - return SCREEN_MENU; + return SCREEN_SERVICES; +} + +static void render_underlined_hotkey_service_row(int y, + const service_entry_t* svc, + int active_state) { + int x = 3; + const char* label; + const char* key_pos; + size_t prefix_len; + + if (!svc) return; + + label = svc->label; + key_pos = strchr(label, (int)tolower((unsigned char)svc->key)); + + if (!key_pos) { + key_pos = strchr(label, (int)toupper((unsigned char)svc->key)); + } + + if (!key_pos) { + mvprintw(y, x, "%-16s [ %s ] [ %s ] %s", + label, + svc->desired_on ? "on " : "off", + active_state ? "on " : "off", + svc->unit); + return; + } + + prefix_len = (size_t)(key_pos - label); + + move(y, x); + addnstr(label, (int)prefix_len); + x += (int)prefix_len; + + move(y, x); + attron(A_UNDERLINE); + addch(*key_pos); + attroff(A_UNDERLINE); + x += 1; + + move(y, x); + addstr(key_pos + 1); + + mvprintw(y, 22, "[ %s ] [ %s ] %s", + svc->desired_on ? "on " : "off", + active_state ? "on " : "off", + svc->unit); +} + +static void render_services_table(app_state_t* app, const int* active_states) { + size_t i; + int y = ui_row(6); + + mvprintw(ui_row(4), 2, "Service Desired Active Unit"); + mvprintw(ui_row(5), 2, "----------------- ------- ------ ------------------------------"); + + for (i = 0; i < app->service_count && y < LINES - 8; ++i) { + render_underlined_hotkey_service_row(y++, &app->services[i], active_states[i]); + } +} + +static screen_t screen_services(app_state_t* app) { + int ch; + int active_states[N_OS_TR_TUI_MAX_SERVICES] = {0}; + size_t i; + int needs_redraw = 1; + int last_cols = COLS; + int last_lines = LINES; + + if (!app || !app->identity_loaded) { + return SCREEN_MENU; + } + + load_services_if_needed(app); + for (i = 0; i < app->service_count; ++i) { + app->services[i].desired_on = app->services[i].default_on; + } + + timeout(60); + while (1) { + if (needs_redraw) { + draw_centered_header("Services"); + refresh_service_states(app, active_states); + + mvprintw(ui_row(2), 2, "Identity: %.22s...", app->main_npub[0] ? app->main_npub : "(unknown)"); + mvprintw(ui_row(3), 2, "Simulation mode: %s", systemd_is_simulation_mode() ? "ON" : "OFF"); + + render_services_table(app, active_states); + + mvprintw(LINES - 6, 2, "Actions:"); + mvprintw(LINES - 5, 2, " R/G/F/N/L/W/S/T toggle | A all on | Z all off"); + mvprintw(LINES - 4, 2, " C commit/apply | X skip (leave unchanged) | Q quit"); + mvprintw(LINES - 2, 2, "Select action: > "); + render_banner_frame(); + refresh(); + needs_redraw = 0; + } + + ch = getch(); + if (ch == ERR) { + if (COLS != last_cols || LINES != last_lines) { + last_cols = COLS; + last_lines = LINES; + needs_redraw = 1; + } + render_banner_frame(); + refresh(); + continue; + } + + if (ch == KEY_RESIZE) { + last_cols = COLS; + last_lines = LINES; + needs_redraw = 1; + continue; + } + + ch = tolower(ch); + if (ch == 'q') { + timeout(-1); + return SCREEN_EXIT; + } + + if (ch == 'x') { + timeout(-1); + return SCREEN_EXIT; + } + + if (ch == 'a') { + for (i = 0; i < app->service_count; ++i) app->services[i].desired_on = 1; + needs_redraw = 1; + continue; + } + + if (ch == 'z') { + for (i = 0; i < app->service_count; ++i) app->services[i].desired_on = 0; + needs_redraw = 1; + continue; + } + + if (ch == 'c') { + draw_centered_header("Applying Services"); + render_banner_frame(); + mvprintw(ui_row(2), 2, "Committing selected service states..."); + if (apply_services(app) != N_OS_TR_TUI_OK) { + wait_key(); + needs_redraw = 1; + continue; + } + wait_key(); + timeout(-1); + return SCREEN_EXIT; + } + + for (i = 0; i < app->service_count; ++i) { + if (ch == tolower((unsigned char)app->services[i].key)) { + app->services[i].desired_on = !app->services[i].desired_on; + apply_dependency_rules(app, i); + needs_redraw = 1; + break; + } + } + } } int main(void) { screen_t screen = SCREEN_MENU; + app_state_t app; + + memset(&app, 0, sizeof(app)); if (nostr_init() != NOSTR_SUCCESS) { fprintf(stderr, "nostr_init failed\n"); @@ -254,10 +719,13 @@ int main(void) { screen = screen_menu(); break; case SCREEN_ENTER: - screen = screen_enter(); + screen = screen_enter(&app); break; case SCREEN_GENERATE: - screen = screen_generate(); + screen = screen_generate(&app); + break; + case SCREEN_SERVICES: + screen = screen_services(&app); break; case SCREEN_EXIT: default: diff --git a/stack/nostr-id-tui/src/services_conf.c b/stack/nostr-id-tui/src/services_conf.c new file mode 100644 index 00000000..8060c7fa --- /dev/null +++ b/stack/nostr-id-tui/src/services_conf.c @@ -0,0 +1,131 @@ +#include +#include +#include +#include + +#include "n_os_tr_tui.h" + +static void copy_str(char* dst, size_t dst_len, const char* src) { + if (!dst || dst_len == 0) return; + if (!src) { + dst[0] = '\0'; + return; + } + snprintf(dst, dst_len, "%s", src); +} + +static void trim(char* s) { + size_t len; + if (!s) return; + + while (*s && isspace((unsigned char)*s)) { + memmove(s, s + 1, strlen(s)); + } + + len = strlen(s); + while (len > 0 && isspace((unsigned char)s[len - 1])) { + s[len - 1] = '\0'; + len--; + } +} + +static int parse_default(const char* v) { + if (!v) return 0; + if (strcmp(v, "on") == 0 || strcmp(v, "1") == 0 || strcmp(v, "true") == 0) return 1; + return 0; +} + +static void set_entry(service_entry_t* e, + char key, + const char* unit, + const char* label, + int default_on, + const char* deps) { + if (!e) return; + memset(e, 0, sizeof(*e)); + e->key = key; + copy_str(e->unit, sizeof(e->unit), unit); + copy_str(e->label, sizeof(e->label), label); + e->default_on = default_on; + copy_str(e->deps, sizeof(e->deps), deps ? deps : "-"); + e->desired_on = default_on; +} + +int services_conf_load_fallback(service_entry_t* out, size_t max, size_t* out_count) { + size_t i = 0; + if (!out || !out_count || max < 8) return N_OS_TR_TUI_ERR; + + set_entry(&out[i++], 'r', "c-relay.service", "c-relay", 0, "nginx.service"); + set_entry(&out[i++], 'g', "ginxsom.service", "ginxsom", 0, "nginx.service"); + set_entry(&out[i++], 'f', "fips.service", "fips", 0, "-"); + set_entry(&out[i++], 'n', "nginx.service", "nginx", 0, "-"); + set_entry(&out[i++], 'l', "nostr-config-loader.service", "config-loader", 0, "-"); + set_entry(&out[i++], 'w', "nostr-config-writer.service", "config-writer", 0, "nostr-config-loader.service"); + set_entry(&out[i++], 's', "ssh.service", "ssh", 0, "-"); + set_entry(&out[i++], 't', "tor.service", "tor", 0, "-"); + + *out_count = i; + return N_OS_TR_TUI_OK; +} + +int services_conf_load(const char* path, service_entry_t* out, size_t max, size_t* out_count) { + FILE* fp; + char line[512]; + size_t n = 0; + + if (!path || !out || !out_count || max == 0) return N_OS_TR_TUI_ERR; + + fp = fopen(path, "r"); + if (!fp) return N_OS_TR_TUI_ERR; + + while (fgets(line, sizeof(line), fp) != NULL) { + char* tok; + char local[512]; + char* key_s; + char* unit_s; + char* label_s; + char* def_s; + char* deps_s; + char key; + + copy_str(local, sizeof(local), line); + trim(local); + if (local[0] == '\0' || local[0] == '#') continue; + + tok = strtok(local, "\t "); + if (!tok) continue; + key_s = tok; + + tok = strtok(NULL, "\t "); + if (!tok) continue; + unit_s = tok; + + tok = strtok(NULL, "\t "); + if (!tok) continue; + label_s = tok; + + tok = strtok(NULL, "\t "); + if (!tok) continue; + def_s = tok; + + tok = strtok(NULL, "\t "); + deps_s = tok ? tok : "-"; + + key = (char)tolower((unsigned char)key_s[0]); + if (!isprint((unsigned char)key)) continue; + + if (n >= max) { + fclose(fp); + return N_OS_TR_TUI_ERR; + } + + set_entry(&out[n], key, unit_s, label_s, parse_default(def_s), deps_s); + n++; + } + + fclose(fp); + + if (n == 0) return N_OS_TR_TUI_ERR; + *out_count = n; + return N_OS_TR_TUI_OK; +} diff --git a/stack/nostr-id-tui/src/systemd_client.c b/stack/nostr-id-tui/src/systemd_client.c new file mode 100644 index 00000000..f9e18edc --- /dev/null +++ b/stack/nostr-id-tui/src/systemd_client.c @@ -0,0 +1,100 @@ +#include +#include +#include +#include +#include +#include + +#include "n_os_tr_tui.h" + +static int run_systemctl(char* const argv[]) { + pid_t pid; + int status = 0; + + if (systemd_is_simulation_mode()) { + return 0; + } + + if (access("/bin/systemctl", X_OK) != 0) { + return -1; + } + + pid = fork(); + if (pid < 0) { + return -1; + } + + if (pid == 0) { + execv("/bin/systemctl", argv); + _exit(127); + } + + if (waitpid(pid, &status, 0) < 0) { + return -1; + } + + if (WIFEXITED(status)) { + return WEXITSTATUS(status); + } + + return -1; +} + +int systemd_is_simulation_mode(void) { + const char* v = getenv("NOSTR_TUI_SIMULATE_SYSTEMCTL"); + return (v && strcmp(v, "1") == 0) ? 1 : 0; +} + +int systemd_unit_is_active(const char* unit, int* is_active) { + char* const argv[] = { + "/bin/systemctl", "is-active", "--quiet", (char*)unit, NULL + }; + int rc; + + if (!unit || !is_active) return N_OS_TR_TUI_ERR; + + if (systemd_is_simulation_mode()) { + *is_active = 0; + return N_OS_TR_TUI_OK; + } + + rc = run_systemctl(argv); + if (rc < 0) return N_OS_TR_TUI_ERR; + + *is_active = (rc == 0) ? 1 : 0; + return N_OS_TR_TUI_OK; +} + +int systemd_unit_start(const char* unit, char* err_out, size_t err_out_len) { + char* const argv[] = { + "/bin/systemctl", "start", (char*)unit, NULL + }; + int rc; + + if (!unit) return N_OS_TR_TUI_ERR; + + rc = run_systemctl(argv); + if (rc == 0) return N_OS_TR_TUI_OK; + + if (err_out && err_out_len > 0) { + snprintf(err_out, err_out_len, "systemctl start failed for %s (rc=%d, errno=%d)", unit, rc, errno); + } + return N_OS_TR_TUI_ERR; +} + +int systemd_unit_stop(const char* unit, char* err_out, size_t err_out_len) { + char* const argv[] = { + "/bin/systemctl", "stop", (char*)unit, NULL + }; + int rc; + + if (!unit) return N_OS_TR_TUI_ERR; + + rc = run_systemctl(argv); + if (rc == 0) return N_OS_TR_TUI_OK; + + if (err_out && err_out_len > 0) { + snprintf(err_out, err_out_len, "systemctl stop failed for %s (rc=%d, errno=%d)", unit, rc, errno); + } + return N_OS_TR_TUI_ERR; +} diff --git a/stack/nostr-id-tui/tests/test_services_sim.sh b/stack/nostr-id-tui/tests/test_services_sim.sh new file mode 100755 index 00000000..d397710e --- /dev/null +++ b/stack/nostr-id-tui/tests/test_services_sim.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)" +BIN="$ROOT_DIR/stack/nostr-id-tui/build-host/nostr-id-tui" +SERVICES_CONF="$ROOT_DIR/iso/config/includes.chroot/etc/n-os-tr/services.conf" + +if [[ ! -x "$BIN" ]]; then + echo "error: missing binary $BIN" + echo "build first: cmake -S stack/nostr-id-tui -B stack/nostr-id-tui/build-host && cmake --build stack/nostr-id-tui/build-host -j" + exit 1 +fi + +if [[ ! -f "$SERVICES_CONF" ]]; then + echo "error: missing services config $SERVICES_CONF" + exit 1 +fi + +OUT="$ROOT_DIR/stack/nostr-id-tui/build-host/test-services-sim.out" + +# Simulated run (no real systemctl operations). We just verify the TUI launches and renders. +timeout 2s env TERM=xterm-256color \ + NOSTR_TUI_SIMULATE_SYSTEMCTL=1 \ + NOSTR_TUI_SERVICES_CONF="$SERVICES_CONF" \ + script -q -c "$BIN" /dev/null > "$OUT" 2>&1 || true + +if grep -q "n-OS-tr Identity" "$OUT"; then + echo "ok: TUI launched and rendered header" +else + echo "error: expected TUI header not found in output" + echo "see $OUT" + exit 1 +fi + +echo "ok: simulated services smoke test passed"