openrazer (the official driver, daemon and library), polychromatic (the AUR tray, kept as found; its i3 line moves out of the i3 module into its own node-display-session contribution), forticlient (the AUR VPN client: its service declared, its configuration never read) and nm-applet (the desktop half of NetworkManager, apart from the server-side module). The openrazer daemon fails on both workstations because the account is not in the openrazer group; openrazer_check names it and the README carries the one-off step, since the account's user resource is zsh's. desktop.go learns to tell a program from another sharing its 15-character command name, so polychromatic's tools never count or end themselves, and a copies test holds the six carriers to one text.
50 lines
2.1 KiB
Go
50 lines
2.1 KiB
Go
// The forticlient module's Go tools bundle (novox/hq ADR 0188, ADR 0193, ADR 0208): the FortiClient
|
|
// VPN client's tray in the operator's session and the vendor's service behind it, served by the node's
|
|
// runtime as the operator account. The module holds no seat, so every tool is its own. The tools
|
|
// report running and connected state only: never a profile, a credential, a gateway or a certificate.
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
stdio "git.novox.be/novox/mesh-sdk/go"
|
|
)
|
|
|
|
func main() {
|
|
if err := stdio.Serve("", tools()); err != nil {
|
|
fmt.Fprintln(os.Stderr, err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
var machine = NewMachine()
|
|
|
|
func tools() []stdio.Tool {
|
|
return []stdio.Tool{
|
|
{
|
|
Name: "forticlient_status",
|
|
Description: "The VPN client: the installed version and whether it came from outside the official " +
|
|
"repositories, the vendor's service (active, enabled), whether the tray and its launcher run " +
|
|
"(pid, since, scope or unit), what starts the tray at login, and whether a tunnel is up (a " +
|
|
"count; never a name, an address, a gateway or a profile). (r)",
|
|
Run: func(map[string]any) (any, error) { return machine.Status() },
|
|
},
|
|
{
|
|
Name: "forticlient_restart",
|
|
Description: "End the tray and its launcher (asked first, then forced after 5 s) and start the " +
|
|
"launcher again in the operator's desktop session, under the account's service manager. The " +
|
|
"tunnel is the service's and is not touched. Needs someone logged in to the desktop. (a)",
|
|
Run: func(map[string]any) (any, error) { return machine.Restart() },
|
|
},
|
|
{
|
|
Name: "forticlient_check",
|
|
Description: "Check what the module promises and relies on: the package is installed (by hand: it is " +
|
|
"outside the official repositories); the service runs and is enabled; the tray has exactly one " +
|
|
"start (the vendor's XDG autostart entry, which the session's dex runs; no window-manager exec); " +
|
|
"and the tray and its launcher run once in a desktop session. Being connected is not checked. (r)",
|
|
Run: func(map[string]any) (any, error) { return machine.Check() },
|
|
},
|
|
}
|
|
}
|