docs: add automation examples
This commit is contained in:
parent
12e6815f8d
commit
f7f12480d0
3 changed files with 136 additions and 5 deletions
|
|
@ -443,6 +443,9 @@ not reachable. It checks config parsing, local daemon socket health,
|
||||||
validity, and representative peer grants when local metadata is available. Use
|
validity, and representative peer grants when local metadata is available. Use
|
||||||
`--json` for scripts.
|
`--json` for scripts.
|
||||||
|
|
||||||
|
See `docs/automation-examples.md` for shell, Python JSON, and user-service
|
||||||
|
automation examples.
|
||||||
|
|
||||||
## Owner And Node Management
|
## Owner And Node Management
|
||||||
|
|
||||||
The intended owner setup is SSH-admin-rooted:
|
The intended owner setup is SSH-admin-rooted:
|
||||||
|
|
|
||||||
128
docs/automation-examples.md
Normal file
128
docs/automation-examples.md
Normal file
|
|
@ -0,0 +1,128 @@
|
||||||
|
# Automation Examples
|
||||||
|
|
||||||
|
These examples are intended as starting points for local scripts and
|
||||||
|
infrastructure automation. They assume the single `geth` executable is on
|
||||||
|
`PATH`.
|
||||||
|
|
||||||
|
## Shell
|
||||||
|
|
||||||
|
Initialize a home, start the daemon in a user-owned process, wait for control,
|
||||||
|
and read stable JSON status:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
#!/usr/bin/env sh
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
export GETH_HOME="${GETH_HOME:-$HOME/.local/share/geth/geth}"
|
||||||
|
|
||||||
|
geth init
|
||||||
|
geth daemon run >"$GETH_HOME/daemon.log" 2>&1 &
|
||||||
|
daemon_pid=$!
|
||||||
|
|
||||||
|
geth wait daemon --timeout-ms 30000
|
||||||
|
geth doctor --json
|
||||||
|
geth status --json
|
||||||
|
|
||||||
|
trap 'kill "$daemon_pid" 2>/dev/null || true' EXIT
|
||||||
|
```
|
||||||
|
|
||||||
|
Create a backup into a separate directory and validate that it can restore to a
|
||||||
|
new home:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
#!/usr/bin/env sh
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
backup_dir="${1:?backup dir required}"
|
||||||
|
restore_home="$(mktemp -d)"
|
||||||
|
|
||||||
|
geth backup create --out "$backup_dir"
|
||||||
|
geth backup restore "$backup_dir" --target-home "$restore_home"
|
||||||
|
GETH_HOME="$restore_home" geth doctor --json || true
|
||||||
|
```
|
||||||
|
|
||||||
|
## Python JSON
|
||||||
|
|
||||||
|
Use CLI JSON output without parsing human text:
|
||||||
|
|
||||||
|
```python
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def geth(*args, check=True):
|
||||||
|
proc = subprocess.run(
|
||||||
|
["geth", "--json", *args],
|
||||||
|
check=False,
|
||||||
|
text=True,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.PIPE,
|
||||||
|
env=os.environ.copy(),
|
||||||
|
)
|
||||||
|
if check and proc.returncode != 0:
|
||||||
|
raise RuntimeError(proc.stderr or proc.stdout)
|
||||||
|
return json.loads(proc.stdout)
|
||||||
|
|
||||||
|
|
||||||
|
doctor = geth("doctor", check=False)
|
||||||
|
for check in doctor["checks"]:
|
||||||
|
print(check["status"], check["code"], check["message"])
|
||||||
|
|
||||||
|
status = geth("status")
|
||||||
|
print(status["node_id"], status.get("endpoint_id"))
|
||||||
|
```
|
||||||
|
|
||||||
|
Wait for a known peer before pulling sync status:
|
||||||
|
|
||||||
|
```python
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
import json
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
node = sys.argv[1]
|
||||||
|
|
||||||
|
wait = subprocess.run(
|
||||||
|
["geth", "--json", "wait", "peer", node, "--timeout-ms", "30000"],
|
||||||
|
text=True,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
)
|
||||||
|
report = json.loads(wait.stdout)
|
||||||
|
if not report["ready"]:
|
||||||
|
raise SystemExit(report["reason"])
|
||||||
|
|
||||||
|
sync = subprocess.check_output(["geth", "--json", "sync", "status"], text=True)
|
||||||
|
print(sync)
|
||||||
|
```
|
||||||
|
|
||||||
|
## User Service
|
||||||
|
|
||||||
|
Install and operate the daemon through the current user's service manager. These
|
||||||
|
commands do not install a system service and do not require privileged service
|
||||||
|
manager mutation:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
geth daemon service print
|
||||||
|
geth daemon service install --start
|
||||||
|
geth wait daemon --timeout-ms 30000
|
||||||
|
geth daemon service status
|
||||||
|
geth daemon service stop
|
||||||
|
geth daemon service uninstall
|
||||||
|
```
|
||||||
|
|
||||||
|
Admin SSH keys remain outside geth state. Automation should pass public admin
|
||||||
|
keys with `--admin-key` and use the matching private key only as an argument to
|
||||||
|
the explicit signing command when an admin operation is intended:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
geth init \
|
||||||
|
--admin-key "$HOME/.ssh/id_ed25519.pub" \
|
||||||
|
--signing-key "$HOME/.ssh/id_ed25519" \
|
||||||
|
--node-name "$(hostname)"
|
||||||
|
```
|
||||||
|
|
||||||
|
Do not copy private SSH admin keys into `GETH_HOME`, backups, service
|
||||||
|
definitions, or shared project repositories.
|
||||||
|
|
@ -258,12 +258,12 @@ Goal: make `geth` ergonomic and stable as a base layer for custom automation.
|
||||||
- `[ ]` Grant creation supports deterministic caller-provided IDs.
|
- `[ ]` Grant creation supports deterministic caller-provided IDs.
|
||||||
- `[ ]` Repeated sync and import commands report no-op state clearly.
|
- `[ ]` Repeated sync and import commands report no-op state clearly.
|
||||||
|
|
||||||
- `[ ]` Publish automation examples.
|
- `[x]` Publish automation examples.
|
||||||
Acceptance criteria:
|
Acceptance criteria:
|
||||||
- `[ ]` Docs include shell examples.
|
- `[x]` Docs include shell examples.
|
||||||
- `[ ]` Docs include Python examples using CLI JSON.
|
- `[x]` Docs include Python examples using CLI JSON.
|
||||||
- `[ ]` Docs include user-service automation examples.
|
- `[x]` Docs include user-service automation examples.
|
||||||
- `[ ]` Examples avoid private-key copying and privileged service mutation.
|
- `[x]` Examples avoid private-key copying and privileged service mutation.
|
||||||
|
|
||||||
## Phase 8: Observability And Operations
|
## Phase 8: Observability And Operations
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue