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
|
"""The argument parser: every verb, flag and help line `meshbay-node --help`
prints."""
import argparse
from pathlib import Path
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(description="MeshBay Node daemon")
parser.add_argument("command", nargs="?",
choices=["init", "reset", "status", "gek-init",
"gek", "operator", "member", "group", "root",
"file", "video", "chat", "denylist", "stun",
"transfers",
"reload",
"restart-daemon", "autostart", "service",
"calibrate-argon2"],
help="init: provision config + keystore | reset: erase all "
"node state | status: node state and keys "
"| operator pair: pair a "
"browser with this node | member list|invite|cancel|revoke|unpin "
"| group list|add|remove "
"| root list|add|remove|set|eject|plug "
"| gek init|rotate | file list|rm "
"| video rematch: re-resolve TMDB matches for a group's "
"videos "
"| chat status|rotate|encrypt-history|prune "
"| denylist show|clear "
"| stun list|add|remove|reset "
"| transfers show|set|max-size|per-member: live "
"transfer slots, the node-wide caps, the largest "
"single upload, and how many one member may run "
"at once in a group "
"| reload: re-read node.toml (hot; systemd or the "
"loopback API) | restart-daemon: restart the node "
"(systemd unit, the Windows autostart launcher, or the "
"service task, whichever applies) "
"| autostart install|remove|start|stop|status "
"(Windows: run meshbay-node at each sign-in, no admin) "
"| service install|remove|start|stop|status "
"(Windows: run at boot, before sign-in, needs admin "
"once to install) "
"| calibrate-argon2: benchmark")
parser.add_argument("subcommand", nargs="?",
help="'pair' for operator; list|invite|revoke|unpin for "
"member; list|add|remove for group; "
"list|add|remove|set|eject|plug for root; "
"init|rotate for gek; "
"list|rm for file; rematch for video; show|clear for "
"denylist; list|add|remove|reset for stun; "
"show|set|max-size|per-member for transfers; "
"install|remove|start|stop|status for autostart and "
"for service")
parser.add_argument("target", nargs="?",
help="username for member invite|revoke|unpin (an optional e-mail label "
"with --link, a link id for member cancel); group name "
"for group add; file id for file rm; identifier for "
"denylist clear; download cap for transfers set; "
"size in GB for transfers max-size")
parser.add_argument("value", nargs="?",
help="the second value where a verb takes two: the "
"upload cap for transfers set")
parser.add_argument("--hub-url", default=None,
help="hub URL, for init (e.g. https://meshbay.org)")
parser.add_argument("--username", default=None,
help="hub username, for init")
parser.add_argument("--dir", default=None,
help="shared directory, for group add")
parser.add_argument("--yes", action="store_true",
help="skip the confirmation for destructive commands")
parser.add_argument("--config", type=Path, default=None,
help="Config file path")
parser.add_argument("--group", default=None,
help="group id (optional if only one is configured)")
parser.add_argument("--link", action="store_true",
help="member invite: an invitation link, for someone who "
"may have no account yet (valid 7 days, single use)")
parser.add_argument("--writable", action="store_true", default=None,
dest="writable",
help="root accepts member uploads (root add/set)")
parser.add_argument("--no-writable", action="store_false",
dest="writable",
help="root is read-only (root add/set, group add)")
parser.add_argument("--removable", action="store_true", default=None,
dest="removable",
help="mark root as removable (root set/add)")
parser.add_argument("--no-removable", action="store_false",
dest="removable",
help="mark root as not removable (root set)")
parser.add_argument("--name", default=None,
help="root name (root add; defaults to directory basename)")
parser.add_argument("--log-level", default="INFO",
choices=["DEBUG", "INFO", "WARNING", "ERROR"])
return parser
|