diff --git a/pkg/volume/volume.go b/pkg/volume/volume.go index aab01158f2b..83b231b42a9 100644 --- a/pkg/volume/volume.go +++ b/pkg/volume/volume.go @@ -20,6 +20,7 @@ import ( "io/ioutil" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/resource" + "os" "path" ) diff --git a/pkg/volume/volume_linux.go b/pkg/volume/volume_linux.go new file mode 100644 index 00000000000..d99d3f780d2 --- /dev/null +++ b/pkg/volume/volume_linux.go @@ -0,0 +1,79 @@ +// +build linux + +/* +Copyright 2016 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package volume + +import ( + "k8s.io/kubernetes/pkg/util/chmod" + "k8s.io/kubernetes/pkg/util/chown" + "path/filepath" + "syscall" + + "github.com/golang/glog" + "os" +) + +const ( + rwMask = os.FileMode(0660) + roMask = os.FileMode(0440) +) + +// SetVolumeOwnership modifies the given volume to be owned by +// fsGroup, and sets SetGid so that newly created files are owned by +// fsGroup. If fsGroup is nil nothing is done. +func SetVolumeOwnership(builder Builder, fsGroup *int64) error { + + if fsGroup == nil { + return nil + } + + chownRunner := chown.New() + chmodRunner := chmod.New() + return filepath.Walk(builder.GetPath(), func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + stat, ok := info.Sys().(*syscall.Stat_t) + if !ok { + return nil + } + + if stat == nil { + glog.Errorf("Got nil stat_t for path %v while setting ownership of volume", path) + return nil + } + + err = chownRunner.Chown(path, int(stat.Uid), int(*fsGroup)) + if err != nil { + glog.Errorf("Chown failed on %v: %v", path, err) + } + + mask := rwMask + if builder.GetAttributes().ReadOnly { + mask = roMask + } + + err = chmodRunner.Chmod(path, info.Mode()|mask|os.ModeSetgid) + if err != nil { + glog.Errorf("Chmod failed on %v: %v", path, err) + } + + return nil + }) +} diff --git a/pkg/volume/volume_unsupported.go b/pkg/volume/volume_unsupported.go new file mode 100644 index 00000000000..dd86d0e06f6 --- /dev/null +++ b/pkg/volume/volume_unsupported.go @@ -0,0 +1,23 @@ +// +build !linux + +/* +Copyright 2016 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package volume + +func SetVolumeOwnership(builder Builder, fsGroup *int64) error { + return nil +}