Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
a2824bb7
Commit
a2824bb7
authored
Aug 16, 2016
by
Yu-Ju Hong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix building pkg/util/procfs on non-linux platforms
parent
d412d572
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
166 additions
and
134 deletions
+166
-134
procfs.go
pkg/util/procfs/procfs.go
+3
-130
procfs_linux.go
pkg/util/procfs/procfs_linux.go
+151
-0
procfs_linux_test.go
pkg/util/procfs/procfs_linux_test.go
+2
-0
procfs_unsupported.go
pkg/util/procfs/procfs_unsupported.go
+10
-4
No files found.
pkg/util/procfs/procfs.go
View file @
a2824bb7
...
@@ -16,134 +16,7 @@ limitations under the License.
...
@@ -16,134 +16,7 @@ limitations under the License.
package
procfs
package
procfs
import
(
type
ProcFSInterface
interface
{
"bytes"
// GetFullContainerName gets the container name given the root process id of the container.
"fmt"
GetFullContainerName
(
pid
int
)
(
string
,
error
)
"io/ioutil"
"os"
"path"
"path/filepath"
"regexp"
"strconv"
"strings"
"syscall"
"unicode"
"github.com/golang/glog"
utilerrors
"k8s.io/kubernetes/pkg/util/errors"
)
type
ProcFS
struct
{}
func
NewProcFS
()
ProcFSInterface
{
return
&
ProcFS
{}
}
func
containerNameFromProcCgroup
(
content
string
)
(
string
,
error
)
{
lines
:=
strings
.
Split
(
content
,
"
\n
"
)
for
_
,
line
:=
range
lines
{
entries
:=
strings
.
SplitN
(
line
,
":"
,
3
)
if
len
(
entries
)
==
3
&&
entries
[
1
]
==
"devices"
{
return
strings
.
TrimSpace
(
entries
[
2
]),
nil
}
}
return
""
,
fmt
.
Errorf
(
"could not find devices cgroup location"
)
}
// getFullContainerName gets the container name given the root process id of the container.
// Eg. If the devices cgroup for the container is stored in /sys/fs/cgroup/devices/docker/nginx,
// return docker/nginx. Assumes that the process is part of exactly one cgroup hierarchy.
func
(
pfs
*
ProcFS
)
GetFullContainerName
(
pid
int
)
(
string
,
error
)
{
filePath
:=
path
.
Join
(
"/proc"
,
strconv
.
Itoa
(
pid
),
"cgroup"
)
content
,
err
:=
ioutil
.
ReadFile
(
filePath
)
if
err
!=
nil
{
if
os
.
IsNotExist
(
err
)
{
return
""
,
os
.
ErrNotExist
}
return
""
,
err
}
return
containerNameFromProcCgroup
(
string
(
content
))
}
// Find process(es) using a regular expression and send a specified
// signal to each process
func
PKill
(
name
string
,
sig
syscall
.
Signal
)
error
{
if
len
(
name
)
==
0
{
return
fmt
.
Errorf
(
"name should not be empty"
)
}
re
,
err
:=
regexp
.
Compile
(
name
)
if
err
!=
nil
{
return
err
}
pids
:=
getPids
(
re
)
if
len
(
pids
)
==
0
{
return
fmt
.
Errorf
(
"unable to fetch pids for process name : %q"
,
name
)
}
errList
:=
[]
error
{}
for
_
,
pid
:=
range
pids
{
if
err
=
syscall
.
Kill
(
pid
,
sig
);
err
!=
nil
{
errList
=
append
(
errList
,
err
)
}
}
return
utilerrors
.
NewAggregate
(
errList
)
}
// Find process(es) with a specified name (exact match)
// and return their pid(s)
func
PidOf
(
name
string
)
([]
int
,
error
)
{
if
len
(
name
)
==
0
{
return
[]
int
{},
fmt
.
Errorf
(
"name should not be empty"
)
}
re
,
err
:=
regexp
.
Compile
(
"(^|/)"
+
name
+
"$"
)
if
err
!=
nil
{
return
[]
int
{},
err
}
return
getPids
(
re
),
nil
}
func
getPids
(
re
*
regexp
.
Regexp
)
[]
int
{
pids
:=
[]
int
{}
filepath
.
Walk
(
"/proc"
,
func
(
path
string
,
info
os
.
FileInfo
,
err
error
)
error
{
if
err
!=
nil
{
// We should continue processing other directories/files
return
nil
}
base
:=
filepath
.
Base
(
path
)
// Traverse only the directories we are interested in
if
info
.
IsDir
()
&&
path
!=
"/proc"
{
// If the directory is not a number (i.e. not a PID), skip it
if
_
,
err
:=
strconv
.
Atoi
(
base
);
err
!=
nil
{
return
filepath
.
SkipDir
}
}
if
base
!=
"cmdline"
{
return
nil
}
cmdline
,
err
:=
ioutil
.
ReadFile
(
path
)
if
err
!=
nil
{
glog
.
V
(
4
)
.
Infof
(
"Error reading file %s: %+v"
,
path
,
err
)
return
nil
}
// The bytes we read have '\0' as a separator for the command line
parts
:=
bytes
.
SplitN
(
cmdline
,
[]
byte
{
0
},
2
)
if
len
(
parts
)
==
0
{
return
nil
}
// Split the command line itself we are interested in just the first part
exe
:=
strings
.
FieldsFunc
(
string
(
parts
[
0
]),
func
(
c
rune
)
bool
{
return
unicode
.
IsSpace
(
c
)
||
c
==
':'
})
if
len
(
exe
)
==
0
{
return
nil
}
// Check if the name of the executable is what we are looking for
if
re
.
MatchString
(
exe
[
0
])
{
dirname
:=
filepath
.
Base
(
filepath
.
Dir
(
path
))
// Grab the PID from the directory path
pid
,
_
:=
strconv
.
Atoi
(
dirname
)
pids
=
append
(
pids
,
pid
)
}
return
nil
})
return
pids
}
}
pkg/util/procfs/procfs_linux.go
0 → 100644
View file @
a2824bb7
// +build linux
/*
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
procfs
import
(
"bytes"
"fmt"
"io/ioutil"
"os"
"path"
"path/filepath"
"regexp"
"strconv"
"strings"
"syscall"
"unicode"
"github.com/golang/glog"
utilerrors
"k8s.io/kubernetes/pkg/util/errors"
)
type
ProcFS
struct
{}
func
NewProcFS
()
ProcFSInterface
{
return
&
ProcFS
{}
}
func
containerNameFromProcCgroup
(
content
string
)
(
string
,
error
)
{
lines
:=
strings
.
Split
(
content
,
"
\n
"
)
for
_
,
line
:=
range
lines
{
entries
:=
strings
.
SplitN
(
line
,
":"
,
3
)
if
len
(
entries
)
==
3
&&
entries
[
1
]
==
"devices"
{
return
strings
.
TrimSpace
(
entries
[
2
]),
nil
}
}
return
""
,
fmt
.
Errorf
(
"could not find devices cgroup location"
)
}
// getFullContainerName gets the container name given the root process id of the container.
// Eg. If the devices cgroup for the container is stored in /sys/fs/cgroup/devices/docker/nginx,
// return docker/nginx. Assumes that the process is part of exactly one cgroup hierarchy.
func
(
pfs
*
ProcFS
)
GetFullContainerName
(
pid
int
)
(
string
,
error
)
{
filePath
:=
path
.
Join
(
"/proc"
,
strconv
.
Itoa
(
pid
),
"cgroup"
)
content
,
err
:=
ioutil
.
ReadFile
(
filePath
)
if
err
!=
nil
{
if
os
.
IsNotExist
(
err
)
{
return
""
,
os
.
ErrNotExist
}
return
""
,
err
}
return
containerNameFromProcCgroup
(
string
(
content
))
}
// Find process(es) using a regular expression and send a specified
// signal to each process
func
PKill
(
name
string
,
sig
syscall
.
Signal
)
error
{
if
len
(
name
)
==
0
{
return
fmt
.
Errorf
(
"name should not be empty"
)
}
re
,
err
:=
regexp
.
Compile
(
name
)
if
err
!=
nil
{
return
err
}
pids
:=
getPids
(
re
)
if
len
(
pids
)
==
0
{
return
fmt
.
Errorf
(
"unable to fetch pids for process name : %q"
,
name
)
}
errList
:=
[]
error
{}
for
_
,
pid
:=
range
pids
{
if
err
=
syscall
.
Kill
(
pid
,
sig
);
err
!=
nil
{
errList
=
append
(
errList
,
err
)
}
}
return
utilerrors
.
NewAggregate
(
errList
)
}
// Find process(es) with a specified name (exact match)
// and return their pid(s)
func
PidOf
(
name
string
)
([]
int
,
error
)
{
if
len
(
name
)
==
0
{
return
[]
int
{},
fmt
.
Errorf
(
"name should not be empty"
)
}
re
,
err
:=
regexp
.
Compile
(
"(^|/)"
+
name
+
"$"
)
if
err
!=
nil
{
return
[]
int
{},
err
}
return
getPids
(
re
),
nil
}
func
getPids
(
re
*
regexp
.
Regexp
)
[]
int
{
pids
:=
[]
int
{}
filepath
.
Walk
(
"/proc"
,
func
(
path
string
,
info
os
.
FileInfo
,
err
error
)
error
{
if
err
!=
nil
{
// We should continue processing other directories/files
return
nil
}
base
:=
filepath
.
Base
(
path
)
// Traverse only the directories we are interested in
if
info
.
IsDir
()
&&
path
!=
"/proc"
{
// If the directory is not a number (i.e. not a PID), skip it
if
_
,
err
:=
strconv
.
Atoi
(
base
);
err
!=
nil
{
return
filepath
.
SkipDir
}
}
if
base
!=
"cmdline"
{
return
nil
}
cmdline
,
err
:=
ioutil
.
ReadFile
(
path
)
if
err
!=
nil
{
glog
.
V
(
4
)
.
Infof
(
"Error reading file %s: %+v"
,
path
,
err
)
return
nil
}
// The bytes we read have '\0' as a separator for the command line
parts
:=
bytes
.
SplitN
(
cmdline
,
[]
byte
{
0
},
2
)
if
len
(
parts
)
==
0
{
return
nil
}
// Split the command line itself we are interested in just the first part
exe
:=
strings
.
FieldsFunc
(
string
(
parts
[
0
]),
func
(
c
rune
)
bool
{
return
unicode
.
IsSpace
(
c
)
||
c
==
':'
})
if
len
(
exe
)
==
0
{
return
nil
}
// Check if the name of the executable is what we are looking for
if
re
.
MatchString
(
exe
[
0
])
{
dirname
:=
filepath
.
Base
(
filepath
.
Dir
(
path
))
// Grab the PID from the directory path
pid
,
_
:=
strconv
.
Atoi
(
dirname
)
pids
=
append
(
pids
,
pid
)
}
return
nil
})
return
pids
}
pkg/util/procfs/procfs_test.go
→
pkg/util/procfs/procfs_
linux_
test.go
View file @
a2824bb7
// +build linux
/*
/*
Copyright 2015 The Kubernetes Authors.
Copyright 2015 The Kubernetes Authors.
...
...
pkg/util/procfs/procfs_
interface
.go
→
pkg/util/procfs/procfs_
unsupported
.go
View file @
a2824bb7
// +build !linux
/*
/*
Copyright 201
5
The Kubernetes Authors.
Copyright 201
6
The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
you may not use this file except in compliance with the License.
...
@@ -16,7 +18,11 @@ limitations under the License.
...
@@ -16,7 +18,11 @@ limitations under the License.
package
procfs
package
procfs
type
ProcFSInterface
interface
{
import
(
// GetFullContainerName gets the container name given the root process id of the container.
"fmt"
GetFullContainerName
(
pid
int
)
(
string
,
error
)
)
// GetFullContainerName gets the container name given the root process id of the container.
func
GetFullContainerName
(
pid
int
)
(
string
,
error
)
{
return
""
,
fmt
.
Errorf
(
"GetFullContainerName is unsupported in this build"
)
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment