mirror of
https://github.com/containers/podman.git
synced 2025-05-28 13:40:33 +08:00

It is not correct to rely on specific location of the podman binary. In most cases it is /usr/bin/podman, but sometimes is not (e.g. in system tests). Use /proc/self/exe instead of hardcoded path. Signed-off-by: Danila Kiver <danila.kiver@mail.ru>
60 lines
1.5 KiB
Go
60 lines
1.5 KiB
Go
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
|
|
}
|