# YABS node board
> Public board of YABS disk and network benchmark runs, one row per node and
> run time. Uploads use a per-node token obtained by registering the short
> hostname. Numbers are unsigned labels, not proof of hardware.
> Each run also carries the kernel's IO stall (PSI) during the run and the disk
> media (virtio, HDD, SSD or NVMe); the disk averages weigh a congested run less.
Board: https://05877bc1b477317f.mcx.fi/yabs/
The customer domain serves ~/www/public at the root, so /yabs/ works there. Do
not use the panel path (/public-vasilves/...): it names the account.
## Install
- [README](https://05877bc1b477317f.mcx.fi/yabs/README.md): full instructions, API, status codes, limits.
- [racks](https://05877bc1b477317f.mcx.fi/yabs/racks): 3D view, one hall per hostname family, hover for numbers. Read-only, no JSON.
- [history](https://05877bc1b477317f.mcx.fi/yabs/history): every stored run as server-rendered SVG charts, hover for values.
- [source](https://05877bc1b477317f.mcx.fi/yabs/source): every served file as text, with sha256 per file. `?f=probe.sh&raw=1` downloads it for a local `sha256sum` diff.
```sh
curl -fsSLO https://05877bc1b477317f.mcx.fi/yabs/probe.sh
sh probe.sh # register + monthly cron, keeps the token if re-run
sh probe.sh daily # same, benchmark cron at that rate (daily|weekly|monthly)
sh probe.sh install daily hourly # benchmark daily + hourly self-update
sh probe.sh install weekly off # benchmark weekly, no self-update line
sh probe.sh update # fetch the newest probe.sh and re-install it; cron untouched
sh probe.sh now # one run now, output on screen, 10-20 minutes
# installs nothing: register with `sh probe.sh` first
sh probe.sh status # running or not, elapsed, last log line
```
Files: `~/.yabs-probe/{conf,probe.sh,run.sh,yabs.sh,last.log,progress}`.
## API
- `POST ?do=register` body `{"name":"<hostname -s>","gpu":"renderD128"}` returns
`{"ok":true,"token":"..."}` once.
- `POST /` with `X-Upload-Token` and raw `yabs.sh -j` JSON stores the run;
`?node=NAME` names it, `?gpu=NAME` records the GPU. Optional, all from the
probe: `?psi_some=&psi_full=` = 0-100, share of the run stalled on IO;
`?rota=0|1`, `?tran=nvme|sata|...` and `?virt=1` = the disk behind `$HOME`;
`virt=1` wins, because a virtio disk's rotational flag is only a default.
- `GET ?do=api` returns hardware, media and stall-weighted averages per node.
- `GET ?do=list` returns the 500 newest runs, raw numbers and stall.
Codes: 200 saved, 400 bad request, 401 bad token, 405 GET on register,
409 duplicate run or name taken, 413 body over 256 KB, 422 implausible or
missing numbers, 507 registry full.
## Agent checklist
1. Run `hostname -s` and register that exact name.
2. `sh probe.sh` then `sh probe.sh now`, wait for completion.
3. Verify with `GET ?do=api` that the node has a new run.
4. Never post a run from a machine other than the one named in `?node=`.