From e0e2f40e84a5a63a2ea220a0974ac56e6a52c48a Mon Sep 17 00:00:00 2001 From: Ophestra Date: Thu, 26 Dec 2024 13:21:49 +0900 Subject: 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 --- cmd/fpkg/proc.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 cmd/fpkg/proc.go (limited to 'cmd/fpkg/proc.go') diff --git a/cmd/fpkg/proc.go b/cmd/fpkg/proc.go new file mode 100644 index 00000000..a995c9f1 --- /dev/null +++ b/cmd/fpkg/proc.go @@ -0,0 +1,64 @@ +package main + +import ( + "encoding/json" + "errors" + "io" + "os" + "os/exec" + + "git.gensokyo.uk/security/fortify/fst" + "git.gensokyo.uk/security/fortify/internal" + "git.gensokyo.uk/security/fortify/internal/fmsg" +) + +func fortifyApp(config *fst.Config, beforeFail func()) { + var ( + cmd *exec.Cmd + st io.WriteCloser + ) + if p, ok := internal.Check(internal.Fortify); !ok { + beforeFail() + fmsg.Fatal("invalid fortify path, this copy of fpkg is not compiled correctly") + panic("unreachable") + } else if r, w, err := os.Pipe(); err != nil { + beforeFail() + fmsg.Fatalf("cannot pipe: %v", err) + panic("unreachable") + } else { + if fmsg.Verbose() { + cmd = exec.Command(p, "-v", "app", "3") + } else { + cmd = exec.Command(p, "app", "3") + } + cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr + cmd.ExtraFiles = []*os.File{r} + st = w + } + + go func() { + if err := json.NewEncoder(st).Encode(config); err != nil { + beforeFail() + fmsg.Fatalf("cannot send configuration: %v", err) + panic("unreachable") + } + }() + + if err := cmd.Start(); err != nil { + beforeFail() + fmsg.Fatalf("cannot start fortify: %v", err) + panic("unreachable") + } + if err := cmd.Wait(); err != nil { + var exitError *exec.ExitError + if errors.As(err, &exitError) { + beforeFail() + fmsg.Exit(exitError.ExitCode()) + panic("unreachable") + } else { + beforeFail() + fmsg.Fatalf("cannot wait: %v", err) + panic("unreachable") + } + } +} -- cgit v1.3.1