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>
50 lines
1.2 KiB
Go
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)
|
|
}
|
|
}
|