43 lines
1.6 KiB
Go
43 lines
1.6 KiB
Go
package main
|
|
|
|
// The module's own forge key (novox/hq ADR 0466 §2, issue 1484): mesh-sdk's key keeper, kind builder, for the
|
|
// module's account in its home. It makes ~/.ssh/mesh_ed25519 when it is missing and writes one entry to this
|
|
// module's `keys` state at <node>.<account>, which gitea's provider reads to register the key on the forge user
|
|
// that reads and pushes nothing (ADR 0466 §3).
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"os/user"
|
|
"strings"
|
|
"time"
|
|
|
|
stdio "git.novox.be/novox/mesh-sdk/go"
|
|
"git.novox.be/novox/mesh-sdk/go/forgekey"
|
|
)
|
|
|
|
// keeperFor is this module's keeper: go/forgekey's, of kind builder, for account in home on node, whose entry lies
|
|
// at <node>.<account> of the keys state.
|
|
func keeperFor(home, node, account string, run forgekey.Runner, state forgekey.KeyPutter) *forgekey.KeyKeeper {
|
|
return &forgekey.KeyKeeper{Home: home, Node: node, Account: account, Kind: forgekey.KindBuilder, Run: run, State: state, Now: time.Now}
|
|
}
|
|
|
|
// startKeeper runs the keeper when the runtime launched this process for a node: outside a launch — a build, a
|
|
// check — there is no state to put the entry in.
|
|
func startKeeper(ctx context.Context) {
|
|
node := strings.TrimSpace(os.Getenv("MESH_NODE"))
|
|
u, err := user.Current()
|
|
if node == "" || err != nil || u.HomeDir == "" {
|
|
return
|
|
}
|
|
k := keeperFor(u.HomeDir, node, u.Username, forgekey.ExecRunner, keysState{})
|
|
k.Keep(ctx, func(f string, a ...any) { fmt.Fprintf(os.Stderr, "[mesh-build-node] "+f+"\n", a...) })
|
|
}
|
|
|
|
type keysState struct{}
|
|
|
|
func (keysState) Put(key string, value any) (uint64, error) {
|
|
return stdio.State("keys").Put(key, value)
|
|
}
|