summaryrefslogtreecommitdiff
path: root/pkg/systemdgen/systemdgen.go
blob: 06c5ebde56376b8dc55d9575264acf1d1ee52167 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package systemdgen

import (
	"fmt"
	"os"

	"github.com/pkg/errors"
	"github.com/sirupsen/logrus"
)

var template = `[Unit]
Description=%s Podman Container
[Service]
Restart=%s
ExecStart=%s start %s
ExecStop=%s stop -t %d %s
KillMode=none
Type=forking
PIDFile=%s
[Install]
WantedBy=multi-user.target`

var restartPolicies = []string{"no", "on-success", "on-failure", "on-abnormal", "on-watchdog", "on-abort", "always"}

// ValidateRestartPolicy checks that the user-provided policy is valid
func ValidateRestartPolicy(restart string) error {
	for _, i := range restartPolicies {
		if i == restart {
			return nil
		}
	}
	return errors.Errorf("%s is not a valid restart policy", restart)
}

// CreateSystemdUnitAsString takes variables to create a systemd unit file used to control
// a libpod container
func CreateSystemdUnitAsString(name, cid, restart, pidFile string, stopTimeout int) (string, error) {
	podmanExe := getPodmanExecutable()
	return createSystemdUnitAsString(podmanExe, name, cid, restart, pidFile, stopTimeout)
}

func createSystemdUnitAsString(exe, name, cid, restart, pidFile string, stopTimeout int) (string, error) {
	if err := ValidateRestartPolicy(restart); err != nil {
		return "", err
	}

	unit := fmt.Sprintf(template, name, restart, exe, name, exe, stopTimeout, name, pidFile)
	return unit, nil
}

func getPodmanExecutable() string {
	podmanExe, err := os.Executable()
	if err != nil {
		podmanExe = "/usr/bin/podman"
		logrus.Warnf("Could not obtain podman executable location, using default %s", podmanExe)
	}

	return podmanExe
}