69 lines
2.2 KiB
Go
69 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/containers/libpod/cmd/podman/cliconfig"
|
|
"github.com/containers/libpod/pkg/adapter"
|
|
"github.com/pkg/errors"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var (
|
|
containerSystemdCommand cliconfig.GenerateSystemdValues
|
|
containerSystemdDescription = `Command generates a systemd unit file for a Podman container
|
|
`
|
|
_containerSystemdCommand = &cobra.Command{
|
|
Use: "systemd [flags] CONTAINER | POD",
|
|
Short: "Generate a systemd unit file for a Podman container",
|
|
Long: containerSystemdDescription,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
containerSystemdCommand.InputArgs = args
|
|
containerSystemdCommand.GlobalFlags = MainGlobalOpts
|
|
containerSystemdCommand.Remote = remoteclient
|
|
return generateSystemdCmd(&containerSystemdCommand)
|
|
},
|
|
Args: func(cmd *cobra.Command, args []string) error {
|
|
if len(args) > 1 || len(args) < 1 {
|
|
return errors.New("provide only one container name or ID")
|
|
}
|
|
return nil
|
|
},
|
|
Example: `podman generate systemd ctrID
|
|
`,
|
|
}
|
|
)
|
|
|
|
func init() {
|
|
containerSystemdCommand.Command = _containerSystemdCommand
|
|
containerSystemdCommand.SetHelpTemplate(HelpTemplate())
|
|
containerSystemdCommand.SetUsageTemplate(UsageTemplate())
|
|
flags := containerSystemdCommand.Flags()
|
|
flags.BoolVarP(&containerSystemdCommand.Name, "name", "n", false, "use the container/pod name instead of ID")
|
|
if !remoteclient {
|
|
flags.BoolVarP(&containerSystemdCommand.Files, "files", "f", false, "generate files instead of printing to stdout")
|
|
}
|
|
flags.IntVarP(&containerSystemdCommand.StopTimeout, "timeout", "t", -1, "stop timeout override")
|
|
flags.StringVar(&containerSystemdCommand.RestartPolicy, "restart-policy", "on-failure", "applicable systemd restart-policy")
|
|
}
|
|
|
|
func generateSystemdCmd(c *cliconfig.GenerateSystemdValues) error {
|
|
runtime, err := adapter.GetRuntime(getContext(), &c.PodmanCommand)
|
|
if err != nil {
|
|
return errors.Wrapf(err, "could not get runtime")
|
|
}
|
|
defer runtime.DeferredShutdown(false)
|
|
|
|
// User input stop timeout must be 0 or greater
|
|
if c.Flag("timeout").Changed && c.StopTimeout < 0 {
|
|
return errors.New("timeout value must be 0 or greater")
|
|
}
|
|
|
|
unit, err := runtime.GenerateSystemd(c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
fmt.Println(unit)
|
|
return nil
|
|
}
|