Files
mesh-catalog/modules/mounts/cmd/mounts/tools.go
T
jochen 2b1b9b0235 Let mounts write each share's mount and automount, so no node depends on a hand-written fstab line (hq ADR 0263)
A machine mounts what its assignment names: a node's share from the
provision nfs-share, whose path it reads from nfs-server's state on the
bus, and occasional sources (an SMB device, a disk) whose absence is a
state, not a fault. apply writes and arms the unit pairs as root; watch
tries each source and judges the health; the operator's fstab lines are
taken over only through adopt, on their word, once the replacement is
armed. SMB logins are an outside party's secret, given with secret accept.
2026-10-08 18:36:01 +02:00

57 lines
2.4 KiB
Go

package main
import (
"strings"
stdio "git.novox.be/novox/mesh-sdk/go"
)
// Tools is the module's tools over one machine: the two that read what the machine has, the seat's verbs
// and the health check (verbs.go).
func Tools(m *Machine) []stdio.Tool {
return append([]stdio.Tool{
{
Name: "mounts_list",
Description: "This machine's mounts as fstab and the service manager know them, joined by mount point: each /etc/fstab line " +
"(source, type, options, dump and pass), its mount and automount units (state, result, timeout, and whether generated " +
"from fstab or a unit file), and whether it is mounted now (from /proc/self/mountinfo, never by touching the mount point, " +
"so a server that is away cannot hang the call). Network filesystems (NFS, SMB, sshfs) are marked, and a network mount " +
"without automount or nofail is said. Credentials in options are never answered. Each mount is said in a line under " +
"`said`. Replaces cat /etc/fstab, findmnt and systemctl list-units --type=mount. (r)",
Input: map[string]any{
"network": map[string]any{"type": "boolean", "description": "only network filesystems (default false)"},
"match": map[string]any{"type": "string", "description": "only mounts whose mount point or source contains this"},
},
Run: func(args map[string]any) (any, error) {
return m.List(flag(args, "network"), text(args, "match")), nil
},
},
{
Name: "mounts_exports",
Description: "What this machine shares over the network: every NFS export in /etc/exports and /etc/exports.d (path, client, " +
"options, file), the kernel's live export table, the ZFS sharenfs and sharesmb properties where ZFS is present, the " +
"Samba shares in smb.conf (path, valid users, read only or writable, force user — never a password), and whether " +
"nfs-server and smb are active. An export that is declared and not live, or live and declared nowhere, is said. " +
"Replaces cat /etc/exports, exportfs -v, zfs get sharenfs and testparm -s. (r)",
Run: func(map[string]any) (any, error) {
return m.Exports(), nil
},
},
}, Verbs(m)...)
}
func text(args map[string]any, key string) string {
s, _ := args[key].(string)
return strings.TrimSpace(s)
}
func flag(args map[string]any, key string) bool {
switch v := args[key].(type) {
case bool:
return v
case string:
return v == "true"
}
return false
}