summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorArne Juul <arnej@yahooinc.com>2023-01-11 16:06:59 +0000
committerArne Juul <arnej@yahooinc.com>2023-01-17 14:36:16 +0000
commit8783c000bc1dc5c0badbf0ad5264119faf80c5bc (patch)
tree2d9d8c60d3567ecaa8f2d44109f92d1197223658 /client
parent69d0f324263f0075a283b66bca6fab2a12b2b66e (diff)
be less strict about ownership/permissions
Diffstat (limited to 'client')
-rw-r--r--client/go/util/fix_fs.go68
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)
+}