Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This commit splits out the varlink-specific parts into files appended with `_varlink`. Fixes: gh#6286 Signed-off-by: Lokesh Mandvekar <lsm5@fedoraproject.org>
- Loading branch information
Showing
5 changed files
with
245 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
// +build linux | ||
// +build varlink | ||
|
||
package system | ||
|
||
import ( | ||
"fmt" | ||
"net/url" | ||
"os" | ||
"path/filepath" | ||
"syscall" | ||
"time" | ||
|
||
"github.com/containers/libpod/cmd/podman/registry" | ||
"github.com/containers/libpod/pkg/domain/entities" | ||
"github.com/containers/libpod/pkg/rootless" | ||
"github.com/containers/libpod/pkg/systemd" | ||
"github.com/containers/libpod/pkg/util" | ||
"github.com/sirupsen/logrus" | ||
"github.com/spf13/cobra" | ||
"github.com/spf13/pflag" | ||
) | ||
|
||
var ( | ||
srvDescription = `Run an API service | ||
Enable a listening service for API access to Podman commands. | ||
` | ||
|
||
srvCmd = &cobra.Command{ | ||
Use: "service [flags] [URI]", | ||
Args: cobra.MaximumNArgs(1), | ||
Short: "Run API service", | ||
Long: srvDescription, | ||
RunE: service, | ||
Example: `podman system service --time=0 unix:///tmp/podman.sock`, | ||
} | ||
|
||
srvArgs = struct { | ||
Timeout int64 | ||
Varlink bool | ||
}{} | ||
) | ||
|
||
func init() { | ||
registry.Commands = append(registry.Commands, registry.CliCommand{ | ||
Mode: []entities.EngineMode{entities.ABIMode}, | ||
Command: srvCmd, | ||
Parent: systemCmd, | ||
}) | ||
|
||
flags := srvCmd.Flags() | ||
flags.Int64VarP(&srvArgs.Timeout, "time", "t", 5, "Time until the service session expires in seconds. Use 0 to disable the timeout") | ||
flags.BoolVar(&srvArgs.Varlink, "varlink", false, "Use legacy varlink service instead of REST") | ||
|
||
_ = flags.MarkDeprecated("varlink", "valink API is deprecated.") | ||
flags.SetNormalizeFunc(aliasTimeoutFlag) | ||
} | ||
|
||
func aliasTimeoutFlag(_ *pflag.FlagSet, name string) pflag.NormalizedName { | ||
if name == "timeout" { | ||
name = "time" | ||
} | ||
return pflag.NormalizedName(name) | ||
} | ||
|
||
func service(cmd *cobra.Command, args []string) error { | ||
apiURI, err := resolveApiURI(args) | ||
if err != nil { | ||
return err | ||
} | ||
logrus.Infof("using API endpoint: '%s'", apiURI) | ||
|
||
// Clean up any old existing unix domain socket | ||
if len(apiURI) > 0 { | ||
uri, err := url.Parse(apiURI) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
// socket activation uses a unix:// socket in the shipped unit files but apiURI is coded as "" at this layer. | ||
if "unix" == uri.Scheme && !registry.IsRemote() { | ||
if err := syscall.Unlink(uri.Path); err != nil && !os.IsNotExist(err) { | ||
return err | ||
} | ||
mask := syscall.Umask(0177) | ||
defer syscall.Umask(mask) | ||
} | ||
} | ||
|
||
opts := entities.ServiceOptions{ | ||
URI: apiURI, | ||
Timeout: time.Duration(srvArgs.Timeout) * time.Second, | ||
Command: cmd, | ||
} | ||
|
||
if srvArgs.Varlink { | ||
return registry.ContainerEngine().VarlinkService(registry.GetContext(), opts) | ||
} | ||
|
||
logrus.Warn("This function is EXPERIMENTAL") | ||
fmt.Fprintf(os.Stderr, "This function is EXPERIMENTAL.\n") | ||
|
||
return restService(opts, cmd.Flags(), registry.PodmanConfig()) | ||
} | ||
|
||
func resolveApiURI(_url []string) (string, error) { | ||
// When determining _*THE*_ listening endpoint -- | ||
// 1) User input wins always | ||
// 2) systemd socket activation | ||
// 3) rootless honors XDG_RUNTIME_DIR | ||
// 4) if varlink -- adapter.DefaultVarlinkAddress | ||
// 5) lastly adapter.DefaultAPIAddress | ||
|
||
if len(_url) == 0 { | ||
if v, found := os.LookupEnv("PODMAN_SOCKET"); found { | ||
logrus.Debugf("PODMAN_SOCKET='%s' used to determine API endpoint", v) | ||
_url = []string{v} | ||
} | ||
} | ||
|
||
switch { | ||
case len(_url) > 0 && _url[0] != "": | ||
return _url[0], nil | ||
case systemd.SocketActivated(): | ||
logrus.Info("using systemd socket activation to determine API endpoint") | ||
return "", nil | ||
case rootless.IsRootless(): | ||
xdg, err := util.GetRuntimeDir() | ||
if err != nil { | ||
return "", err | ||
} | ||
|
||
socketName := "podman.sock" | ||
if srvArgs.Varlink { | ||
socketName = "io.podman" | ||
} | ||
socketDir := filepath.Join(xdg, "podman", socketName) | ||
if _, err := os.Stat(filepath.Dir(socketDir)); err != nil { | ||
if os.IsNotExist(err) { | ||
if err := os.Mkdir(filepath.Dir(socketDir), 0755); err != nil { | ||
return "", err | ||
} | ||
} else { | ||
return "", err | ||
} | ||
} | ||
return "unix:" + socketDir, nil | ||
case srvArgs.Varlink: | ||
return registry.DefaultVarlinkAddress, nil | ||
default: | ||
return registry.DefaultRootAPIAddress, nil | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,5 @@ | ||
// +build linux | ||
// +build varlink | ||
|
||
package system | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
// +build varlink | ||
|
||
package entities | ||
|
||
import ( | ||
"context" | ||
|
||
"github.com/containers/common/pkg/config" | ||
"github.com/containers/libpod/libpod/define" | ||
"github.com/containers/libpod/pkg/specgen" | ||
"github.com/spf13/cobra" | ||
) | ||
|
||
type ContainerEngine interface { | ||
AutoUpdate(ctx context.Context, options AutoUpdateOptions) (*AutoUpdateReport, []error) | ||
Config(ctx context.Context) (*config.Config, error) | ||
ContainerAttach(ctx context.Context, nameOrId string, options AttachOptions) error | ||
ContainerCheckpoint(ctx context.Context, namesOrIds []string, options CheckpointOptions) ([]*CheckpointReport, error) | ||
ContainerCleanup(ctx context.Context, namesOrIds []string, options ContainerCleanupOptions) ([]*ContainerCleanupReport, error) | ||
ContainerCommit(ctx context.Context, nameOrId string, options CommitOptions) (*CommitReport, error) | ||
ContainerCp(ctx context.Context, source, dest string, options ContainerCpOptions) (*ContainerCpReport, error) | ||
ContainerCreate(ctx context.Context, s *specgen.SpecGenerator) (*ContainerCreateReport, error) | ||
ContainerDiff(ctx context.Context, nameOrId string, options DiffOptions) (*DiffReport, error) | ||
ContainerExec(ctx context.Context, nameOrId string, options ExecOptions, streams define.AttachStreams) (int, error) | ||
ContainerExecDetached(ctx context.Context, nameOrID string, options ExecOptions) (string, error) | ||
ContainerExists(ctx context.Context, nameOrId string) (*BoolReport, error) | ||
ContainerExport(ctx context.Context, nameOrId string, options ContainerExportOptions) error | ||
ContainerInit(ctx context.Context, namesOrIds []string, options ContainerInitOptions) ([]*ContainerInitReport, error) | ||
ContainerInspect(ctx context.Context, namesOrIds []string, options InspectOptions) ([]*ContainerInspectReport, error) | ||
ContainerKill(ctx context.Context, namesOrIds []string, options KillOptions) ([]*KillReport, error) | ||
ContainerList(ctx context.Context, options ContainerListOptions) ([]ListContainer, error) | ||
ContainerLogs(ctx context.Context, containers []string, options ContainerLogsOptions) error | ||
ContainerMount(ctx context.Context, nameOrIds []string, options ContainerMountOptions) ([]*ContainerMountReport, error) | ||
ContainerPause(ctx context.Context, namesOrIds []string, options PauseUnPauseOptions) ([]*PauseUnpauseReport, error) | ||
ContainerPort(ctx context.Context, nameOrId string, options ContainerPortOptions) ([]*ContainerPortReport, error) | ||
ContainerPrune(ctx context.Context, options ContainerPruneOptions) (*ContainerPruneReport, error) | ||
ContainerRestart(ctx context.Context, namesOrIds []string, options RestartOptions) ([]*RestartReport, error) | ||
ContainerRestore(ctx context.Context, namesOrIds []string, options RestoreOptions) ([]*RestoreReport, error) | ||
ContainerRm(ctx context.Context, namesOrIds []string, options RmOptions) ([]*RmReport, error) | ||
ContainerRun(ctx context.Context, opts ContainerRunOptions) (*ContainerRunReport, error) | ||
ContainerRunlabel(ctx context.Context, label string, image string, args []string, opts ContainerRunlabelOptions) error | ||
ContainerStart(ctx context.Context, namesOrIds []string, options ContainerStartOptions) ([]*ContainerStartReport, error) | ||
ContainerStats(ctx context.Context, namesOrIds []string, options ContainerStatsOptions) error | ||
ContainerStop(ctx context.Context, namesOrIds []string, options StopOptions) ([]*StopReport, error) | ||
ContainerTop(ctx context.Context, options TopOptions) (*StringSliceReport, error) | ||
ContainerUnmount(ctx context.Context, nameOrIds []string, options ContainerUnmountOptions) ([]*ContainerUnmountReport, error) | ||
ContainerUnpause(ctx context.Context, namesOrIds []string, options PauseUnPauseOptions) ([]*PauseUnpauseReport, error) | ||
ContainerWait(ctx context.Context, namesOrIds []string, options WaitOptions) ([]WaitReport, error) | ||
Events(ctx context.Context, opts EventsOptions) error | ||
GenerateSystemd(ctx context.Context, nameOrID string, opts GenerateSystemdOptions) (*GenerateSystemdReport, error) | ||
GenerateKube(ctx context.Context, nameOrID string, opts GenerateKubeOptions) (*GenerateKubeReport, error) | ||
SystemPrune(ctx context.Context, options SystemPruneOptions) (*SystemPruneReport, error) | ||
HealthCheckRun(ctx context.Context, nameOrId string, options HealthCheckOptions) (*define.HealthCheckResults, error) | ||
Info(ctx context.Context) (*define.Info, error) | ||
NetworkCreate(ctx context.Context, name string, options NetworkCreateOptions) (*NetworkCreateReport, error) | ||
NetworkInspect(ctx context.Context, namesOrIds []string, options NetworkInspectOptions) ([]NetworkInspectReport, error) | ||
NetworkList(ctx context.Context, options NetworkListOptions) ([]*NetworkListReport, error) | ||
NetworkRm(ctx context.Context, namesOrIds []string, options NetworkRmOptions) ([]*NetworkRmReport, error) | ||
PlayKube(ctx context.Context, path string, opts PlayKubeOptions) (*PlayKubeReport, error) | ||
PodCreate(ctx context.Context, opts PodCreateOptions) (*PodCreateReport, error) | ||
PodExists(ctx context.Context, nameOrId string) (*BoolReport, error) | ||
PodInspect(ctx context.Context, options PodInspectOptions) (*PodInspectReport, error) | ||
PodKill(ctx context.Context, namesOrIds []string, options PodKillOptions) ([]*PodKillReport, error) | ||
PodPause(ctx context.Context, namesOrIds []string, options PodPauseOptions) ([]*PodPauseReport, error) | ||
PodPrune(ctx context.Context, options PodPruneOptions) ([]*PodPruneReport, error) | ||
PodPs(ctx context.Context, options PodPSOptions) ([]*ListPodsReport, error) | ||
PodRestart(ctx context.Context, namesOrIds []string, options PodRestartOptions) ([]*PodRestartReport, error) | ||
PodRm(ctx context.Context, namesOrIds []string, options PodRmOptions) ([]*PodRmReport, error) | ||
PodStart(ctx context.Context, namesOrIds []string, options PodStartOptions) ([]*PodStartReport, error) | ||
PodStats(ctx context.Context, namesOrIds []string, options PodStatsOptions) ([]*PodStatsReport, error) | ||
PodStop(ctx context.Context, namesOrIds []string, options PodStopOptions) ([]*PodStopReport, error) | ||
PodTop(ctx context.Context, options PodTopOptions) (*StringSliceReport, error) | ||
PodUnpause(ctx context.Context, namesOrIds []string, options PodunpauseOptions) ([]*PodUnpauseReport, error) | ||
SetupRootless(ctx context.Context, cmd *cobra.Command) error | ||
Shutdown(ctx context.Context) | ||
SystemDf(ctx context.Context, options SystemDfOptions) (*SystemDfReport, error) | ||
Unshare(ctx context.Context, args []string) error | ||
VarlinkService(ctx context.Context, opts ServiceOptions) error | ||
Version(ctx context.Context) (*SystemVersionReport, error) | ||
VolumeCreate(ctx context.Context, opts VolumeCreateOptions) (*IdOrNameResponse, error) | ||
VolumeInspect(ctx context.Context, namesOrIds []string, opts VolumeInspectOptions) ([]*VolumeInspectReport, error) | ||
VolumeList(ctx context.Context, opts VolumeListOptions) ([]*VolumeListReport, error) | ||
VolumePrune(ctx context.Context, opts VolumePruneOptions) ([]*VolumePruneReport, error) | ||
VolumeRm(ctx context.Context, namesOrIds []string, opts VolumeRmOptions) ([]*VolumeRmReport, error) | ||
} |