fortify/cmd/fpkg/activate.go
Ophestra 4e5785f37f
All checks were successful
Tests / Go tests (push) Successful in 52s
Nix / NixOS tests (push) Successful in 4m4s
cmd/fpkg: app bundle helper
This helper program creates fortify configuration for running an application bundle. The activate action wraps a home-manager activation package and ensures each generation gets activated once.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2024-12-28 00:54:15 +09:00

58 lines
1.5 KiB
Go

package main
import (
"errors"
"os"
"os/exec"
"path"
"git.gensokyo.uk/security/fortify/fst"
"git.gensokyo.uk/security/fortify/internal/fmsg"
)
func actionActivate(args []string) {
// simple check so activate is not attempted outside fortify
if s, err := os.Stat(path.Join(fst.Tmp, "sbin")); err != nil {
fmsg.Fatalf("cannot stat fortify sbin: %v", err)
} else if !s.IsDir() {
fmsg.Fatal("fortify sbin path is not a directory")
}
home := os.Getenv("HOME")
if !path.IsAbs(home) {
fmsg.Fatalf("path %q is not aboslute", home)
}
marker := path.Join(home, ".hm-activation")
if len(args) != 1 {
fmsg.Fatalf("invalid argument")
}
activate := path.Join(args[0], "activate")
var cmd *exec.Cmd
if l, err := os.Readlink(marker); err != nil && !errors.Is(err, os.ErrNotExist) {
fmsg.Fatalf("cannot read activation marker %q: %v", marker, err)
} else if err != nil || l != activate {
cmd = exec.Command(activate)
}
// marker present and equals to current activation package
if cmd == nil {
fmsg.Exit(0)
panic("unreachable")
}
cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
cmd.Env = os.Environ()
if err := cmd.Run(); err != nil {
fmsg.Fatalf("cannot activate home-manager configuration: %v", err)
}
if err := os.Remove(marker); err != nil && !errors.Is(err, os.ErrNotExist) {
fmsg.Fatalf("cannot remove existing marker: %v", err)
}
if err := os.Symlink(activate, marker); err != nil {
fmsg.Fatalf("cannot create activation marker: %v", err)
}
}