summaryrefslogtreecommitdiff
path: root/pkg/apparmor
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/apparmor')
-rw-r--r--pkg/apparmor/aaparser.go90
-rw-r--r--pkg/apparmor/apparmor_linux.go79
-rw-r--r--pkg/apparmor/apparmor_linux_test.go (renamed from pkg/apparmor/aaparser_test.go)4
3 files changed, 80 insertions, 93 deletions
diff --git a/pkg/apparmor/aaparser.go b/pkg/apparmor/aaparser.go
deleted file mode 100644
index cec9c4885..000000000
--- a/pkg/apparmor/aaparser.go
+++ /dev/null
@@ -1,90 +0,0 @@
-// +build linux,apparmor
-
-package apparmor
-
-import (
- "fmt"
- "os/exec"
- "strconv"
- "strings"
-)
-
-const (
- binary = "apparmor_parser"
-)
-
-// getVersion returns the major and minor version of apparmor_parser.
-func getVersion() (int, error) {
- output, err := cmd("", "--version")
- if err != nil {
- return -1, err
- }
-
- return parseVersion(output)
-}
-
-// loadProfile runs `apparmor_parser -Kr` on a specified apparmor profile to
-// replace the profile. The `-K` is necessary to make sure that apparmor_parser
-// doesn't try to write to a read-only filesystem.
-func loadProfile(profilePath string) error {
- _, err := cmd("", "-Kr", profilePath)
- return err
-}
-
-// cmd runs `apparmor_parser` with the passed arguments.
-func cmd(dir string, arg ...string) (string, error) {
- c := exec.Command(binary, arg...)
- c.Dir = dir
-
- output, err := c.CombinedOutput()
- if err != nil {
- return "", fmt.Errorf("running `%s %s` failed with output: %s\nerror: %v", c.Path, strings.Join(c.Args, " "), output, err)
- }
-
- return string(output), nil
-}
-
-// parseVersion takes the output from `apparmor_parser --version` and returns
-// a representation of the {major, minor, patch} version as a single number of
-// the form MMmmPPP {major, minor, patch}.
-func parseVersion(output string) (int, error) {
- // output is in the form of the following:
- // AppArmor parser version 2.9.1
- // Copyright (C) 1999-2008 Novell Inc.
- // Copyright 2009-2012 Canonical Ltd.
-
- lines := strings.SplitN(output, "\n", 2)
- words := strings.Split(lines[0], " ")
- version := words[len(words)-1]
-
- // split by major minor version
- v := strings.Split(version, ".")
- if len(v) == 0 || len(v) > 3 {
- return -1, fmt.Errorf("parsing version failed for output: `%s`", output)
- }
-
- // Default the versions to 0.
- var majorVersion, minorVersion, patchLevel int
-
- majorVersion, err := strconv.Atoi(v[0])
- if err != nil {
- return -1, err
- }
-
- if len(v) > 1 {
- minorVersion, err = strconv.Atoi(v[1])
- if err != nil {
- return -1, err
- }
- }
- if len(v) > 2 {
- patchLevel, err = strconv.Atoi(v[2])
- if err != nil {
- return -1, err
- }
- }
-
- // major*10^5 + minor*10^3 + patch*10^0
- numericVersion := majorVersion*1e5 + minorVersion*1e3 + patchLevel
- return numericVersion, nil
-}
diff --git a/pkg/apparmor/apparmor_linux.go b/pkg/apparmor/apparmor_linux.go
index a09c5fc44..4cc95a107 100644
--- a/pkg/apparmor/apparmor_linux.go
+++ b/pkg/apparmor/apparmor_linux.go
@@ -4,10 +4,13 @@ package apparmor
import (
"bufio"
+ "fmt"
"io"
"io/ioutil"
"os"
+ "os/exec"
"path"
+ "strconv"
"strings"
"text/template"
@@ -48,7 +51,7 @@ func (p *profileData) generateDefault(out io.Writer) error {
p.InnerImports = append(p.InnerImports, "#include <abstractions/base>")
}
- ver, err := getVersion()
+ ver, err := getAAParserVersion()
if err != nil {
return err
}
@@ -115,3 +118,77 @@ func IsLoaded(name string) (bool, error) {
return false, nil
}
+
+// execAAParser runs `apparmor_parser` with the passed arguments.
+func execAAParser(dir string, args ...string) (string, error) {
+ c := exec.Command("apparmor_parser", args...)
+ c.Dir = dir
+
+ output, err := c.CombinedOutput()
+ if err != nil {
+ return "", fmt.Errorf("running `%s %s` failed with output: %s\nerror: %v", c.Path, strings.Join(c.Args, " "), output, err)
+ }
+
+ return string(output), nil
+}
+
+// loadProfile runs `apparmor_parser -Kr` on a specified apparmor profile to
+// replace the profile. The `-K` is necessary to make sure that apparmor_parser
+// doesn't try to write to a read-only filesystem.
+func loadProfile(profilePath string) error {
+ _, err := execAAParser("", "-Kr", profilePath)
+ return err
+}
+
+// getAAParserVersion returns the major and minor version of apparmor_parser.
+func getAAParserVersion() (int, error) {
+ output, err := execAAParser("", "--version")
+ if err != nil {
+ return -1, err
+ }
+ return parseAAParserVersion(output)
+}
+
+// parseAAParserVersion parses the given `apparmor_parser --version` output and
+// returns the major and minor version number as an integer.
+func parseAAParserVersion(output string) (int, error) {
+ // output is in the form of the following:
+ // AppArmor parser version 2.9.1
+ // Copyright (C) 1999-2008 Novell Inc.
+ // Copyright 2009-2012 Canonical Ltd.
+ lines := strings.SplitN(output, "\n", 2)
+ words := strings.Split(lines[0], " ")
+ version := words[len(words)-1]
+
+ // split by major minor version
+ v := strings.Split(version, ".")
+ if len(v) == 0 || len(v) > 3 {
+ return -1, fmt.Errorf("parsing version failed for output: `%s`", output)
+ }
+
+ // Default the versions to 0.
+ var majorVersion, minorVersion, patchLevel int
+
+ majorVersion, err := strconv.Atoi(v[0])
+ if err != nil {
+ return -1, err
+ }
+
+ if len(v) > 1 {
+ minorVersion, err = strconv.Atoi(v[1])
+ if err != nil {
+ return -1, err
+ }
+ }
+ if len(v) > 2 {
+ patchLevel, err = strconv.Atoi(v[2])
+ if err != nil {
+ return -1, err
+ }
+ }
+
+ // major*10^5 + minor*10^3 + patch*10^0
+ numericVersion := majorVersion*1e5 + minorVersion*1e3 + patchLevel
+ return numericVersion, nil
+
+}
diff --git a/pkg/apparmor/aaparser_test.go b/pkg/apparmor/apparmor_linux_test.go
index 296c101ed..4aa3753d9 100644
--- a/pkg/apparmor/aaparser_test.go
+++ b/pkg/apparmor/apparmor_linux_test.go
@@ -11,7 +11,7 @@ type versionExpected struct {
version int
}
-func TestParseVersion(t *testing.T) {
+func TestParseAAParserVersion(t *testing.T) {
if !IsEnabled() {
t.Skip("AppArmor disabled: skipping tests")
}
@@ -67,7 +67,7 @@ Copyright 2009-2012 Canonical Ltd.
}
for _, v := range versions {
- version, err := parseVersion(v.output)
+ version, err := parseAAParserVersion(v.output)
if err != nil {
t.Fatalf("expected error to be nil for %#v, got: %v", v, err)
}