github.com/ncdc/docker@v0.10.1-0.20160129113957-6c6729ef5b74/pkg/aaparser/aaparser.go (about)

     1  // Package aaparser is a convenience package interacting with `apparmor_parser`.
     2  package aaparser
     3  
     4  import (
     5  	"fmt"
     6  	"os/exec"
     7  	"path/filepath"
     8  	"strconv"
     9  	"strings"
    10  )
    11  
    12  const (
    13  	binary = "apparmor_parser"
    14  )
    15  
    16  // GetVersion returns the major and minor version of apparmor_parser.
    17  func GetVersion() (int, int, error) {
    18  	output, err := cmd("", "--version")
    19  	if err != nil {
    20  		return -1, -1, err
    21  	}
    22  
    23  	return parseVersion(string(output))
    24  }
    25  
    26  // LoadProfile runs `apparmor_parser -r -W` on a specified apparmor profile to
    27  // replace and write it to disk.
    28  func LoadProfile(profilePath string) error {
    29  	_, err := cmd(filepath.Dir(profilePath), "-r", "-W", filepath.Base(profilePath))
    30  	if err != nil {
    31  		return err
    32  	}
    33  	return nil
    34  }
    35  
    36  // cmd runs `apparmor_parser` with the passed arguments.
    37  func cmd(dir string, arg ...string) (string, error) {
    38  	c := exec.Command(binary, arg...)
    39  	c.Dir = dir
    40  
    41  	output, err := c.CombinedOutput()
    42  	if err != nil {
    43  		return "", fmt.Errorf("running `%s %s` failed with output: %s\nerror: %v", c.Path, strings.Join(c.Args, " "), string(output), err)
    44  	}
    45  
    46  	return string(output), nil
    47  }
    48  
    49  // parseVersion takes the output from `apparmor_parser --version` and returns
    50  // the major and minor version for `apparor_parser`.
    51  func parseVersion(output string) (int, int, error) {
    52  	// output is in the form of the following:
    53  	// AppArmor parser version 2.9.1
    54  	// Copyright (C) 1999-2008 Novell Inc.
    55  	// Copyright 2009-2012 Canonical Ltd.
    56  	lines := strings.SplitN(output, "\n", 2)
    57  	words := strings.Split(lines[0], " ")
    58  	version := words[len(words)-1]
    59  
    60  	// split by major minor version
    61  	v := strings.Split(version, ".")
    62  	if len(v) < 2 {
    63  		return -1, -1, fmt.Errorf("parsing major minor version failed for output: `%s`", output)
    64  	}
    65  
    66  	majorVersion, err := strconv.Atoi(v[0])
    67  	if err != nil {
    68  		return -1, -1, err
    69  	}
    70  	minorVersion, err := strconv.Atoi(v[1])
    71  	if err != nil {
    72  		return -1, -1, err
    73  	}
    74  
    75  	return majorVersion, minorVersion, nil
    76  }