diff options
Diffstat (limited to 'vendor/k8s.io/kubernetes/pkg/util/io/writer.go')
-rw-r--r-- | vendor/k8s.io/kubernetes/pkg/util/io/writer.go | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/vendor/k8s.io/kubernetes/pkg/util/io/writer.go b/vendor/k8s.io/kubernetes/pkg/util/io/writer.go new file mode 100644 index 000000000..086508c90 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/util/io/writer.go @@ -0,0 +1,80 @@ +/* +Copyright 2015 The Kubernetes Authors. + +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 io + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "os/exec" + + "github.com/golang/glog" +) + +// Writer is an interface which allows to write data to a file. +type Writer interface { + WriteFile(filename string, data []byte, perm os.FileMode) error +} + +// StdWriter implements Writer interface and uses standard libraries +// for writing data to files. +type StdWriter struct { +} + +func (writer *StdWriter) WriteFile(filename string, data []byte, perm os.FileMode) error { + return ioutil.WriteFile(filename, data, perm) +} + +// Alternative implementation of Writer interface that allows writing data to file +// using nsenter command. +// If a program (e.g. kubelet) runs in a container it may want to write data to +// a mounted device. Since in Docker, mount propagation mode is set to private, +// it will not see the mounted device in its own namespace. To work around this +// limitaion one has to first enter hosts namespace (by using 'nsenter') and only +// then write data. +type NsenterWriter struct { +} + +// TODO: should take a writer, not []byte +func (writer *NsenterWriter) WriteFile(filename string, data []byte, perm os.FileMode) error { + cmd := "nsenter" + base_args := []string{ + "--mount=/rootfs/proc/1/ns/mnt", + "--", + } + + echo_args := append(base_args, "sh", "-c", fmt.Sprintf("cat > %s", filename)) + glog.V(5).Infof("Command to write data to file: %v %v", cmd, echo_args) + command := exec.Command(cmd, echo_args...) + command.Stdin = bytes.NewBuffer(data) + outputBytes, err := command.CombinedOutput() + if err != nil { + glog.Errorf("Output from writing to %q: %v", filename, string(outputBytes)) + return err + } + + chmod_args := append(base_args, "chmod", fmt.Sprintf("%o", perm), filename) + glog.V(5).Infof("Command to change permissions to file: %v %v", cmd, chmod_args) + outputBytes, err = exec.Command(cmd, chmod_args...).CombinedOutput() + if err != nil { + glog.Errorf("Output from chmod command: %v", string(outputBytes)) + return err + } + + return nil +} |