diff --git a/common/process.go b/common/process.go new file mode 100644 index 0000000000..5d37d0d73b --- /dev/null +++ b/common/process.go @@ -0,0 +1,27 @@ +package common + +import ( + "os" + "strconv" +) + +func AllPids(procRoot string) ([]int, error) { + fh, err := os.Open(procRoot) + if err != nil { + return nil, err + } + defer fh.Close() + dirNames, err := fh.Readdirnames(-1) + if err != nil { + return nil, err + } + pids := make([]int, len(dirNames)) + for _, dirName := range dirNames { + pid, err := strconv.Atoi(dirName) + if err != nil { // Only interested in numeric entries - skip /proc/stat, etc. + continue + } + pids = append(pids, pid) + } + return pids, err +} diff --git a/prog/weaveutil/docker_tls_args.go b/prog/weaveutil/docker_tls_args.go index 01afe805c9..300d2428f0 100644 --- a/prog/weaveutil/docker_tls_args.go +++ b/prog/weaveutil/docker_tls_args.go @@ -8,6 +8,8 @@ import ( "path/filepath" "strconv" "strings" + + "github.com/weaveworks/weave/common" ) func dockerTLSArgs(args []string) error { @@ -15,18 +17,14 @@ func dockerTLSArgs(args []string) error { cmdUsage("docker-tls-args", "") } procRoot := "/proc" - dirEntries, err := ioutil.ReadDir(procRoot) + pids, err := common.AllPids(procRoot) if err != nil { return err } - for _, dirEntry := range dirEntries { - dirName := dirEntry.Name() - if _, err := strconv.Atoi(dirName); err != nil { - continue - } - + for _, pid := range pids { isDaemon := false + dirName := strconv.Itoa(pid) if comm, err := ioutil.ReadFile(filepath.Join(procRoot, dirName, "comm")); err != nil { continue } else if string(comm) == "dockerd\n" {