summaryrefslogtreecommitdiff
path: root/svc/doc/todo.md
blob: 5598ae31a64c219ee66716f16985f12dd9d514ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# TODO

State as of the end of the second session. Ordered by what unblocks what,
not by size.

## Do first: kill the serial dependency

Everything else is cheaper once this is done. The serial shell wedged three
times in one session and is lossy, non-interactive, and hostile to quoting.

- [ ] `/adm/keys` and a user: `auth/keyfs`, then `auth/changeuser glenda`
- [ ] service files for `keyfs`, `authsrv` (listener on 567), `listen` (rcpu
      on 17019). This is literally `svc enable keyfs authsrv` from the man page
- [ ] add a 567 hostfwd to `run.sh` next to the existing 17019 one
- [ ] client: build conterm (github.com/0intro/conterm, text-only, drivable
      over a pipe) or use the already-installed drawterm interactively

`tcp17019` runs `tlssrv -a /bin/rc -c server`, so it authenticates through
factotum and needs the auth server to validate. `rc/bin/service.auth/` already
ships `tcp567`. `run.sh` already forwards 17019.

## Unblocked, mechanical

- [ ] drop `svc=`; the filename is the service name
- [ ] `.ndb` extension on service files, stripped to get the name
- [ ] migrate more services per `inventory.md``plumber`, `webfs`,
      `webcookies`, `kbdfs`, `usbd`, `realemu`
- [ ] doc drift: `/log``/sys/log` in `design.md` and `man/init`, with the
      reason (root is mounted without create permission)
- [ ] doc drift: ctl permissions are `0644`, not `0600` — reads must be open
      or ctl cannot document itself
- [ ] record the session's gotchas in `CLAUDE.md`: non-interactive rc dies on
      a syntax error and takes the serial with it; `pkill -f` kills the calling
      shell even with the bracket trick; rc treats double quotes as literal
      characters, so `|` inside them becomes a pipe

## Needs a decision before code

- [ ] **`stop` does not work for detaching services.** `Ksrv` services have no
      pid init can signal, so `stopsvc` is a no-op and a later `restart` fails
      with "another instance is running". Proposed: for `Ksrv` with no `stop=`,
      remove the `/srv` entry, which hangs up the channel and a well-behaved
      server exits. Untested.
- [ ] **Dynamic `/srv` names.** `plumber` posts `plumb.glenda.502`, `rio` posts
      `rio.glenda.1483` — user and pid in the name. `ready=srv:` cannot express
      it and it is a pattern, not an exception. Needs a glob, a new `ready=`
      form, or accepting `ready=exec` and losing liveness.
- [ ] **Namespace profiles.** Ship `/lib/ns/{net,disk,draw,full}`, require
      every service to name one, no default. Blocked on the item below.
- [ ] **The provider circularity.** A service that provides a namespace to
      others (an `import` of a remote `/net`, say) must be able to mount *and*
      must post to `/srv` so dependents can reach it — so it is simultaneously
      the exception to "do not bind `#s`" and to freezing the namespace. Not
      resolved. Profiles built before this is settled get built twice.

## Unimplemented attributes and features

Parsed and ignored today: `ns`, `user`, `stop`, `adopt`.

- [ ] `ns=` inline lines and `nsfile=`, via `newns`
- [ ] `user=` via the capability device — note `#¤` must still be in the
      namespace at the moment privilege is dropped
- [ ] `stop=``note:`, `write:file:word`, `exec:` forms
- [ ] `adopt=yes` for services init can stop but never started (the root file
      server, `factotum`, `paqfs`)
- [ ] `halt`, `reboot`, `reset` ctl verbs and commands
- [ ] `reexec`
- [ ] rescue console when services will not come up
- [ ] base namespace construction by init, replacing the device-bind loop in
      termrc

## Environment

- [ ] **The bootargs prompt needs a manual Enter every boot.** Listed as
      unresolved in `CLAUDE.md`; it now blocks unattended testing, which makes
      it worth actually fixing.
- [ ] sshfs has to be remounted by hand after every reboot — a candidate for
      being a service itself, gated on a `sshkey` oneshot
- [ ] `9front-base.qcow2` is stale relative to `9front.qcow2`; overlays made by
      `newvm.sh` lack the supervised serial shell and the rio change

## Verification debts

Claims the design rests on that have not been tested:

- [ ] does `RFNOMNT` survive `exec`? That is the last step before a service
      runs, and the plausible place for a flag to be cleared
- [ ] does binding a single `/srv` entry (`bind #s/cs /srv/cs`) work as cleanly
      as binding the directory? The fine-grained capability story depends on it
- [ ] does `import` have a flag to post to `/srv`, or is `srvfs` needed?
- [ ] does `bootrc` honour `init=` in `plan9.ini`? That is the escape hatch if
      we ever make init the boot program and get it wrong

## Deferred deliberately

- The filesystem hierarchy rework. Until then, do not churn `/lib/svc``/lib/services`; every path in init is a flag, so it is a one-line change
  whenever the hierarchy lands.
- `timesync` reaching an external NTP server. It fails on DNS resolution in a
  NAT'd VM and is not worth chasing; the dependency machinery around it is
  already proven.