| ... | ... |
@@ -251,7 +251,7 @@ func NewRuntime(autoRestart bool) (*Runtime, error) {
|
| 251 | 251 |
return nil, err |
| 252 | 252 |
} |
| 253 | 253 |
|
| 254 |
- if k, err := GetKernelVersion(); err != nil {
|
|
| 254 |
+ if k, err := utils.GetKernelVersion(); err != nil {
|
|
| 255 | 255 |
log.Printf("WARNING: %s\n", err)
|
| 256 | 256 |
} else {
|
| 257 | 257 |
runtime.kernelVersion = k |
| ... | ... |
@@ -1,9 +1,5 @@ |
| 1 | 1 |
package docker |
| 2 | 2 |
|
| 3 |
-import ( |
|
| 4 |
- "github.com/dotcloud/docker/utils" |
|
| 5 |
-) |
|
| 6 |
- |
|
| 7 | 3 |
// Compare two Config struct. Do not compare the "Image" nor "Hostname" fields |
| 8 | 4 |
// If OpenStdin is set, then it differs |
| 9 | 5 |
func CompareConfig(a, b *Config) bool {
|
| ... | ... |
@@ -51,7 +47,3 @@ func CompareConfig(a, b *Config) bool {
|
| 51 | 51 |
|
| 52 | 52 |
return true |
| 53 | 53 |
} |
| 54 |
- |
|
| 55 |
-func GetKernelVersion() (*utils.KernelVersionInfo, error) {
|
|
| 56 |
- return getKernelVersion() |
|
| 57 |
-} |
| 0 | 10 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,15 @@ |
| 0 |
+package utils |
|
| 1 |
+ |
|
| 2 |
+import ( |
|
| 3 |
+ "syscall" |
|
| 4 |
+) |
|
| 5 |
+ |
|
| 6 |
+// FIXME: Move this to utils package |
|
| 7 |
+func uname() (*syscall.Utsname, error) {
|
|
| 8 |
+ uts := &syscall.Utsname{}
|
|
| 9 |
+ |
|
| 10 |
+ if err := syscall.Uname(uts); err != nil {
|
|
| 11 |
+ return nil, err |
|
| 12 |
+ } |
|
| 13 |
+ return uts, nil |
|
| 14 |
+} |
| ... | ... |
@@ -14,6 +14,7 @@ import ( |
| 14 | 14 |
"os/exec" |
| 15 | 15 |
"path/filepath" |
| 16 | 16 |
"runtime" |
| 17 |
+ "strconv" |
|
| 17 | 18 |
"strings" |
| 18 | 19 |
"sync" |
| 19 | 20 |
"time" |
| ... | ... |
@@ -468,3 +469,64 @@ func FindCgroupMountpoint(cgroupType string) (string, error) {
|
| 468 | 468 |
|
| 469 | 469 |
return "", fmt.Errorf("cgroup mountpoint not found for %s", cgroupType)
|
| 470 | 470 |
} |
| 471 |
+ |
|
| 472 |
+func GetKernelVersion() (*KernelVersionInfo, error) {
|
|
| 473 |
+ var ( |
|
| 474 |
+ flavor string |
|
| 475 |
+ kernel, major, minor int |
|
| 476 |
+ err error |
|
| 477 |
+ ) |
|
| 478 |
+ |
|
| 479 |
+ uts, err := uname() |
|
| 480 |
+ if err != nil {
|
|
| 481 |
+ return nil, err |
|
| 482 |
+ } |
|
| 483 |
+ |
|
| 484 |
+ release := make([]byte, len(uts.Release)) |
|
| 485 |
+ |
|
| 486 |
+ i := 0 |
|
| 487 |
+ for _, c := range uts.Release {
|
|
| 488 |
+ release[i] = byte(c) |
|
| 489 |
+ i++ |
|
| 490 |
+ } |
|
| 491 |
+ |
|
| 492 |
+ // Remove the \x00 from the release for Atoi to parse correctly |
|
| 493 |
+ release = release[:bytes.IndexByte(release, 0)] |
|
| 494 |
+ |
|
| 495 |
+ tmp := strings.SplitN(string(release), "-", 2) |
|
| 496 |
+ tmp2 := strings.SplitN(tmp[0], ".", 3) |
|
| 497 |
+ |
|
| 498 |
+ if len(tmp2) > 0 {
|
|
| 499 |
+ kernel, err = strconv.Atoi(tmp2[0]) |
|
| 500 |
+ if err != nil {
|
|
| 501 |
+ return nil, err |
|
| 502 |
+ } |
|
| 503 |
+ } |
|
| 504 |
+ |
|
| 505 |
+ if len(tmp2) > 1 {
|
|
| 506 |
+ major, err = strconv.Atoi(tmp2[1]) |
|
| 507 |
+ if err != nil {
|
|
| 508 |
+ return nil, err |
|
| 509 |
+ } |
|
| 510 |
+ } |
|
| 511 |
+ |
|
| 512 |
+ if len(tmp2) > 2 {
|
|
| 513 |
+ minor, err = strconv.Atoi(tmp2[2]) |
|
| 514 |
+ if err != nil {
|
|
| 515 |
+ return nil, err |
|
| 516 |
+ } |
|
| 517 |
+ } |
|
| 518 |
+ |
|
| 519 |
+ if len(tmp) == 2 {
|
|
| 520 |
+ flavor = tmp[1] |
|
| 521 |
+ } else {
|
|
| 522 |
+ flavor = "" |
|
| 523 |
+ } |
|
| 524 |
+ |
|
| 525 |
+ return &KernelVersionInfo{
|
|
| 526 |
+ Kernel: kernel, |
|
| 527 |
+ Major: major, |
|
| 528 |
+ Minor: minor, |
|
| 529 |
+ Flavor: flavor, |
|
| 530 |
+ }, nil |
|
| 531 |
+} |