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.
57 lines
2.4 KiB
Go
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
|
|
}
|