chultun/internal/budget/launch.go

52 lines
1.2 KiB
Go

package budget
import (
"fmt"
"os"
"os/exec"
"syscall"
)
func systemctl(args ...string) error {
cmd := exec.Command("systemctl", append([]string{"--user"}, args...)...)
cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
return cmd.Run()
}
func runArgs(c config, name, id string, command []string) ([]string, error) {
if len(command) > 0 && command[0] == "--" {
command = command[1:]
}
if len(command) == 0 {
return nil, fmt.Errorf("a command is required")
}
values, err := c.assignments(name)
if err != nil {
return nil, err
}
slice := "app.slice"
if name == "search" {
slice = "search.slice"
}
args := []string{"systemd-run", "--user", "--scope", "--collect", "--quiet", "--unit=work-" + id, "--slice=" + slice}
for _, value := range values {
args = append(args, "--property="+value)
}
return append(append(args, "--"), command...), nil
}
func launch(c config, name string, command []string) error {
id, err := randomID()
if err != nil {
return err
}
args, err := runArgs(c, name, id, command)
if err != nil {
return err
}
path, err := exec.LookPath(args[0])
if err != nil {
return err
}
return syscall.Exec(path, args, os.Environ())
}