diff options
author | Arne Juul <arnej@yahooinc.com> | 2023-01-11 16:06:59 +0000 |
---|---|---|
committer | Arne Juul <arnej@yahooinc.com> | 2023-01-17 14:36:16 +0000 |
commit | 8783c000bc1dc5c0badbf0ad5264119faf80c5bc (patch) | |
tree | 2d9d8c60d3567ecaa8f2d44109f92d1197223658 /client | |
parent | 69d0f324263f0075a283b66bca6fab2a12b2b66e (diff) |
be less strict about ownership/permissions
Diffstat (limited to 'client')
-rw-r--r-- | client/go/util/fix_fs.go | 68 |
1 files changed, 57 insertions, 11 deletions
diff --git a/client/go/util/fix_fs.go b/client/go/util/fix_fs.go index 552585e4d20..fcbcefd0d71 100644 --- a/client/go/util/fix_fs.go +++ b/client/go/util/fix_fs.go @@ -7,6 +7,7 @@ import ( "errors" "fmt" "os" + "os/user" "strings" "github.com/vespa-engine/vespa/client/go/trace" @@ -52,56 +53,101 @@ func statNoSymlinks(path string) (info os.FileInfo, err error) { return info, err } -// ensure directory exist with correct owner/permissions +// ensure directory exists with suitable permissions func (spec *FixSpec) FixDir(dirName string) { info, err := statNoSymlinks(dirName) if errors.Is(err, os.ErrNotExist) { trace.Trace("mkdir: ", dirName) err = os.MkdirAll(dirName, spec.DirMode) if err != nil { - JustExitWith(err) + spec.complainAndExit(err, dirName, spec.DirMode) } info, err = statNoSymlinks(dirName) } if err != nil { - JustExitWith(err) + spec.complainAndExit(err, dirName, spec.DirMode) } if !info.IsDir() { - JustExitMsg(fmt.Sprintf("Not a directory: %s", dirName)) + err = fmt.Errorf("Not a directory: '%s'", dirName) + spec.complainAndExit(err, dirName, spec.DirMode) } trace.Debug("chown: ", dirName, spec.UserId, spec.GroupId) err = os.Chown(dirName, spec.UserId, spec.GroupId) if err != nil { - JustExitWith(err) + spec.ensureWritableDir(dirName) + return } trace.Debug("chmod: ", dirName, spec.DirMode) err = os.Chmod(dirName, spec.DirMode) if err != nil { - JustExitWith(err) + spec.ensureWritableDir(dirName) } trace.Debug("directory ok:", dirName) } -// ensure file gets correct owner/permissions if it exists +// ensure file has suitable permissions if it exists func (spec *FixSpec) FixFile(fileName string) { info, err := statNoSymlinks(fileName) if err != nil { if !errors.Is(err, os.ErrNotExist) { - trace.Warning("stat error: ", err) + spec.complainAndExit(err, fileName, spec.FileMode) } return } if info.IsDir() { - JustExitMsg("Should not be a directory: " + fileName) + err = fmt.Errorf("Should not be a directory: '%s'", fileName) + spec.complainAndExit(err, fileName, spec.FileMode) } trace.Debug("chown: ", fileName, spec.UserId, spec.GroupId) err = os.Chown(fileName, spec.UserId, spec.GroupId) if err != nil { - JustExitWith(err) + spec.ensureWritableFile(fileName) + return } trace.Debug("chmod: ", fileName, spec.FileMode) err = os.Chmod(fileName, spec.FileMode) if err != nil { - JustExitWith(err) + spec.ensureWritableFile(fileName) + } +} + +func (spec *FixSpec) ensureWritableFile(fileName string) { + f, err := os.OpenFile(fileName, os.O_APPEND|os.O_RDWR, spec.FileMode) + if err == nil { + f.Close() + return + } + trace.Warning(err, "- will try to remove this file") + err = os.Remove(fileName) + if err != nil { + trace.Warning("Could neither write to nor remove '" + fileName + "'") + spec.complainAndExit(err, fileName, spec.FileMode) } } + +func (spec *FixSpec) ensureWritableDir(dirName string) { + tmpFile, err := os.CreateTemp(dirName, "tmp.probe.*.tmp") + if err != nil { + trace.Warning("Could not create a file in directory '" + dirName + "'") + spec.complainAndExit(err, dirName, spec.DirMode) + } + tmpFile.Close() + err = os.Remove(tmpFile.Name()) + if err != nil { + spec.complainAndExit(err, dirName, spec.DirMode) + } +} + +func (spec *FixSpec) complainAndExit(got error, fn string, wanted os.FileMode) { + trace.Warning("problem:", got) + currentUser, _ := user.Current() + trace.Warning("Currently running as user:", currentUser.Username) + trace.Warning("Wanted", fn, "to be owned by user id:", spec.UserId) + trace.Warning("Wanted", fn, "to have group id:", spec.GroupId) + trace.Warning("Wanted", fn, "to have permissions:", wanted) + trace.Warning("current status of", fn, "is:") + out, _ := BackTicksWithStderr.Run("stat", "--", fn) + trace.Warning(out) + trace.Warning("this is a fatal error!") + JustExitWith(got) +} |