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) } }