diff options
author | Giuseppe Scrivano <gscrivan@redhat.com> | 2019-06-21 12:49:23 +0200 |
---|---|---|
committer | Giuseppe Scrivano <gscrivan@redhat.com> | 2019-06-27 16:34:35 +0200 |
commit | 7255468e6584d8170924dfc5ffbde136e8cc6654 (patch) | |
tree | bcc3242ce283e43eb327c30dd2145d388e681752 /libpod/runtime.go | |
parent | 0906b32087c3d7db6844873a7d46241430a1b065 (diff) | |
download | podman-7255468e6584d8170924dfc5ffbde136e8cc6654.tar.gz podman-7255468e6584d8170924dfc5ffbde136e8cc6654.tar.bz2 podman-7255468e6584d8170924dfc5ffbde136e8cc6654.zip |
rootless: enable linger if /run/user/UID not exists
at least on Fedora 30 it creates the /run/user/UID directory for the
user logged in via ssh.
This needs to be done very early so that every other check when we
create the default configuration file will point to the correct
location.
Closes: https://github.com/containers/libpod/issues/3410
Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
Diffstat (limited to 'libpod/runtime.go')
-rw-r--r-- | libpod/runtime.go | 42 |
1 files changed, 26 insertions, 16 deletions
diff --git a/libpod/runtime.go b/libpod/runtime.go index c0f49c468..5a618f592 100644 --- a/libpod/runtime.go +++ b/libpod/runtime.go @@ -10,6 +10,7 @@ import ( "strings" "sync" "syscall" + "time" "github.com/BurntSushi/toml" is "github.com/containers/image/storage" @@ -312,18 +313,39 @@ func defaultRuntimeConfig() (RuntimeConfig, error) { // SetXdgRuntimeDir ensures the XDG_RUNTIME_DIR env variable is set // containers/image uses XDG_RUNTIME_DIR to locate the auth file. -func SetXdgRuntimeDir(val string) error { +// It internally calls EnableLinger() so that the user's processes are not +// killed once the session is terminated. EnableLinger() also attempts to +// get the runtime directory when XDG_RUNTIME_DIR is not specified. +func SetXdgRuntimeDir() error { if !rootless.IsRootless() { return nil } - if val == "" { + + runtimeDir := os.Getenv("XDG_RUNTIME_DIR") + + runtimeDirLinger, err := rootless.EnableLinger() + if err != nil { + return errors.Wrapf(err, "error enabling user session") + } + if runtimeDir == "" && runtimeDirLinger != "" { + if _, err := os.Stat(runtimeDirLinger); err != nil && os.IsNotExist(err) { + chWait := make(chan error) + defer close(chWait) + if _, err := WaitForFile(runtimeDirLinger, chWait, time.Second*10); err != nil { + return errors.Wrapf(err, "waiting for directory '%s'", runtimeDirLinger) + } + } + runtimeDir = runtimeDirLinger + } + + if runtimeDir == "" { var err error - val, err = util.GetRootlessRuntimeDir() + runtimeDir, err = util.GetRootlessRuntimeDir() if err != nil { return err } } - if err := os.Setenv("XDG_RUNTIME_DIR", val); err != nil { + if err := os.Setenv("XDG_RUNTIME_DIR", runtimeDir); err != nil { return errors.Wrapf(err, "cannot set XDG_RUNTIME_DIR") } return nil @@ -479,18 +501,6 @@ func newRuntimeFromConfig(ctx context.Context, userConfigPath string, options .. runtime.config.SignaturePolicyPath = newPath } } - - runtimeDir, err := util.GetRootlessRuntimeDir() - if err != nil { - return nil, err - } - - // containers/image uses XDG_RUNTIME_DIR to locate the auth file. - // So make sure the env variable is set. - if err := SetXdgRuntimeDir(runtimeDir); err != nil { - return nil, errors.Wrapf(err, "cannot set XDG_RUNTIME_DIR") - } - } if userConfigPath != "" { |