spiegel_podman/cmd/podman/shared/funcs.go
baude 10a62d60a9 container runlabel NAME implementation
when using container runlabel, if a --name is not provided, we must
deduce the container name from the base name of the image to maintain
parity with the atomic cli.

fixed small bug where we split the cmd on " " rather than using fields could
lead to extra spaces in command output.

Signed-off-by: baude <bbaude@redhat.com>
2019-01-04 12:57:55 -06:00

107 lines
2.5 KiB
Go

package shared
import (
"fmt"
"os"
"path/filepath"
"strings"
"github.com/google/shlex"
)
func substituteCommand(cmd string) (string, error) {
var (
newCommand string
)
// Replace cmd with "/proc/self/exe" if "podman" or "docker" is being
// used. If "/usr/bin/docker" is provided, we also sub in podman.
// Otherwise, leave the command unchanged.
if cmd == "podman" || filepath.Base(cmd) == "docker" {
newCommand = "/proc/self/exe"
} else {
newCommand = cmd
}
// If cmd is an absolute or relative path, check if the file exists.
// Throw an error if it doesn't exist.
if strings.Contains(newCommand, "/") || strings.HasPrefix(newCommand, ".") {
res, err := filepath.Abs(newCommand)
if err != nil {
return "", err
}
if _, err := os.Stat(res); !os.IsNotExist(err) {
return res, nil
} else if err != nil {
return "", err
}
}
return newCommand, nil
}
// GenerateCommand takes a label (string) and converts it to an executable command
func GenerateCommand(command, imageName, name string) ([]string, error) {
var (
newCommand []string
)
if name == "" {
name = imageName
}
cmd, err := shlex.Split(command)
if err != nil {
return nil, err
}
prog, err := substituteCommand(cmd[0])
if err != nil {
return nil, err
}
newCommand = append(newCommand, prog)
for _, arg := range cmd[1:] {
var newArg string
switch arg {
case "IMAGE":
newArg = imageName
case "$IMAGE":
newArg = imageName
case "IMAGE=IMAGE":
newArg = fmt.Sprintf("IMAGE=%s", imageName)
case "IMAGE=$IMAGE":
newArg = fmt.Sprintf("IMAGE=%s", imageName)
case "NAME":
newArg = name
case "NAME=NAME":
newArg = fmt.Sprintf("NAME=%s", name)
case "NAME=$NAME":
newArg = fmt.Sprintf("NAME=%s", name)
case "$NAME":
newArg = name
default:
newArg = arg
}
newCommand = append(newCommand, newArg)
}
return newCommand, nil
}
// GenerateRunEnvironment merges the current environment variables with optional
// environment variables provided by the user
func GenerateRunEnvironment(name, imageName string, opts map[string]string) []string {
newEnv := os.Environ()
newEnv = append(newEnv, fmt.Sprintf("NAME=%s", name))
newEnv = append(newEnv, fmt.Sprintf("IMAGE=%s", imageName))
if opts["opt1"] != "" {
newEnv = append(newEnv, fmt.Sprintf("OPT1=%s", opts["opt1"]))
}
if opts["opt2"] != "" {
newEnv = append(newEnv, fmt.Sprintf("OPT2=%s", opts["opt2"]))
}
if opts["opt3"] != "" {
newEnv = append(newEnv, fmt.Sprintf("OPT3=%s", opts["opt3"]))
}
return newEnv
}