@@ -122,40 +122,60 @@ func (d *daemon) loop(refresh time.Duration) {
122122 }
123123}
124124
125- func (d * daemon ) initialize () error {
126- err := os .MkdirAll (d .dir , defaultDirPermission )
125+ // chmodIfNeeded sets mode on path only if it differs from the current mode.
126+ // This avoids "operation not permitted" when running as non-root when permissions are already correct.
127+ func chmodIfNeeded (path string , want os.FileMode ) error {
128+ info , err := os .Stat (path )
127129 if err != nil {
130+ return err
131+ }
132+ if info .Mode ().Perm () == want .Perm () {
133+ return nil
134+ }
135+ return os .Chmod (path , want )
136+ }
137+
138+ // ensureDirExists creates path as a directory with perm, or returns nil if it already exists.
139+ // When running as non-root (e.g. in Kubernetes), the directory may have been created by an
140+ // init container; if MkdirAll fails with permission denied, we still succeed when the path exists.
141+ func ensureDirExists (path string , perm os.FileMode ) error {
142+ err := os .MkdirAll (path , perm )
143+ if err == nil {
144+ return nil
145+ }
146+ info , statErr := os .Stat (path )
147+ if statErr == nil && info .IsDir () {
148+ return nil
149+ }
150+ return err
151+ }
152+
153+ func (d * daemon ) initialize () error {
154+ if err := ensureDirExists (d .dir , defaultDirPermission ); err != nil {
128155 return fmt .Errorf ("failed to initialize /var/lib/knox (run 'sudo mkdir /var/lib/knox'?): %w" , err )
129156 }
130157
131- // Need to chmod due to a umask set on masterless puppet machines
132- err = os .Chmod (d .dir , defaultDirPermission )
133- if err != nil {
158+ // Need to chmod due to a umask set on masterless puppet machines (skip if already correct for non-root)
159+ if err := chmodIfNeeded (d .dir , defaultDirPermission ); err != nil {
134160 return fmt .Errorf ("failed to open up directory permissions: %w" , err )
135161 }
136- err = os .MkdirAll (d .keyDir (), defaultDirPermission )
137- if err != nil {
162+ if err := ensureDirExists (d .keyDir (), defaultDirPermission ); err != nil {
138163 return fmt .Errorf ("failed to make key folders: %w" , err )
139164 }
140165
141- // Need to chmod due to a umask set on masterless puppet machines
142- err = os .Chmod (d .keyDir (), defaultDirPermission )
143- if err != nil {
166+ if err := chmodIfNeeded (d .keyDir (), defaultDirPermission ); err != nil {
144167 return fmt .Errorf ("failed to open up directory permissions: %w" , err )
145168 }
146- _ , err = os .Stat (d .registerFilename ())
169+ _ , err : = os .Stat (d .registerFilename ())
147170 if os .IsNotExist (err ) {
148- err := os .WriteFile (d .registerFilename (), []byte {}, defaultFilePermission )
149- if err != nil {
171+ if err := os .WriteFile (d .registerFilename (), []byte {}, defaultFilePermission ); err != nil {
150172 return fmt .Errorf ("failed to initialize registered key file: %w" , err )
151173 }
152174 } else if err != nil {
153175 return err
154176 }
155177
156- // Need to chmod due to a umask set on masterless puppet machines
157- err = os .Chmod (d .registerFilename (), defaultFilePermission )
158- if err != nil {
178+ if err := chmodIfNeeded (d .registerFilename (), defaultFilePermission ); err != nil {
159179 return fmt .Errorf ("failed to open up register file permissions: %w" , err )
160180 }
161181 d .registerKeyFile = NewKeysFile (d .registerFilename ())
@@ -319,8 +339,7 @@ func (d daemon) processKey(keyID string) error {
319339 return fmt .Errorf ("error renaming key %s temporary file: %w" , keyID , err )
320340 }
321341
322- err = os .Chmod (d .keyFilename (keyID ), defaultFilePermission )
323- if err != nil {
342+ if err := chmodIfNeeded (d .keyFilename (keyID ), defaultFilePermission ); err != nil {
324343 return fmt .Errorf ("failed to open up key file permissions: %w" , err )
325344 }
326345 return nil
0 commit comments