fortify/cmd/flaunch/activate.go
Ophestra e59c4f424d
All checks were successful
Tests / Go tests (push) Successful in 33s
Nix / NixOS tests (push) Successful in 3m39s
cmd/flaunch: implement app bundle wrapper
This tool 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-27 18:28:16 +09:00

50 lines
1.2 KiB
Go

package main
import (
"errors"
"os"
"os/exec"
"path"
"git.gensokyo.uk/security/fortify/internal/fmsg"
)
func actionActivate(args []string) {
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: %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)
}
}