refractor(build): move os logic to its own module.

This commit is contained in:
Alexandre Pujol 2024-03-21 18:58:32 +00:00
parent 662dd1c6dc
commit e1d1d0be3d
No known key found for this signature in database
GPG Key ID: C5469996F0DF68EC
9 changed files with 158 additions and 86 deletions

View File

@ -15,7 +15,7 @@ import (
"github.com/roddhjav/apparmor.d/pkg/aa" "github.com/roddhjav/apparmor.d/pkg/aa"
"github.com/roddhjav/apparmor.d/pkg/integration" "github.com/roddhjav/apparmor.d/pkg/integration"
"github.com/roddhjav/apparmor.d/pkg/logging" "github.com/roddhjav/apparmor.d/pkg/logging"
"github.com/roddhjav/apparmor.d/pkg/prebuild" oss "github.com/roddhjav/apparmor.d/pkg/os"
) )
const usage = `aa-test [-h] [--bootstrap | --run | --list] const usage = `aa-test [-h] [--bootstrap | --run | --list]
@ -123,7 +123,7 @@ func testDeps(dryRun bool) error {
} }
deps := tSuite.GetDependencies() deps := tSuite.GetDependencies()
switch prebuild.Distribution { switch oss.Distribution {
case "arch": case "arch":
arg := []string{"pacman", "-Sy", "--noconfirm"} arg := []string{"pacman", "-Sy", "--noconfirm"}
arg = append(arg, deps...) arg = append(arg, deps...)

View File

@ -10,6 +10,7 @@ import (
"os" "os"
"github.com/roddhjav/apparmor.d/pkg/logging" "github.com/roddhjav/apparmor.d/pkg/logging"
oss "github.com/roddhjav/apparmor.d/pkg/os"
"github.com/roddhjav/apparmor.d/pkg/prebuild" "github.com/roddhjav/apparmor.d/pkg/prebuild"
) )
@ -46,7 +47,7 @@ func init() {
} }
func aaPrebuild() error { func aaPrebuild() error {
logging.Step("Building apparmor.d profiles for %s.", prebuild.Distribution) logging.Step("Building apparmor.d profiles for %s.", oss.Distribution)
if full { if full {
prebuild.Prepares = append(prebuild.Prepares, prebuild.SetFullSystemPolicy) prebuild.Prepares = append(prebuild.Prepares, prebuild.SetFullSystemPolicy)

View File

@ -9,6 +9,7 @@ import (
"os/exec" "os/exec"
"testing" "testing"
oss "github.com/roddhjav/apparmor.d/pkg/os"
"github.com/roddhjav/apparmor.d/pkg/prebuild" "github.com/roddhjav/apparmor.d/pkg/prebuild"
) )
@ -71,7 +72,7 @@ func Test_AAPrebuild(t *testing.T) {
chdirGitRoot() chdirGitRoot()
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
prebuild.Distribution = tt.dist oss.Distribution = tt.dist
if tt.full { if tt.full {
prebuild.Prepares = append(prebuild.Prepares, prebuild.SetFullSystemPolicy) prebuild.Prepares = append(prebuild.Prepares, prebuild.SetFullSystemPolicy)
} }

90
pkg/os/os.go Normal file
View File

@ -0,0 +1,90 @@
// apparmor.d - Full set of apparmor profiles
// Copyright (C) 2023-2024 Alexandre Pujol <alexandre@pujol.io>
// SPDX-License-Identifier: GPL-2.0-only
package util
import (
"os"
"slices"
"strings"
"github.com/arduino/go-paths-helper"
)
var (
Distribution = getDistribution()
Release = getOSRelease()
Family = getFamily()
)
var (
osReleaseFile = "/etc/os-release"
supportedDists = map[string][]string{
"arch": {},
"debian": {},
"ubuntu": {},
"opensuse": {"suse", "opensuse-tumbleweed"},
"whonix": {},
}
famillyDists = map[string][]string{
"apt": {"debian", "ubuntu", "whonix"},
"pacman": {"arch"},
"zypper": {"opensuse"},
}
)
func getOSRelease() map[string]string {
var lines []string
var err error
for _, name := range []string{osReleaseFile, "/usr/lib/os-release"} {
path := paths.New(name)
if path.Exist() {
lines, err = path.ReadFileAsLines()
if err != nil {
panic(err)
}
break
}
}
os := map[string]string{}
for _, line := range lines {
item := strings.Split(line, "=")
if len(item) == 2 {
os[item[0]] = strings.Trim(item[1], "\"")
}
}
return os
}
func getDistribution() string {
dist, present := os.LookupEnv("DISTRIBUTION")
if present {
return dist
}
id := Release["ID"]
if id == "ubuntu" {
return id
}
id_like := Release["ID_LIKE"]
for main, based := range supportedDists {
if main == id || main == id_like {
return main
} else if slices.Contains(based, id) {
return main
} else if slices.Contains(based, id_like) {
return main
}
}
return id
}
func getFamily() string {
for familly, dist := range famillyDists {
if slices.Contains(dist, Distribution) {
return familly
}
}
return ""
}

View File

@ -2,7 +2,7 @@
// Copyright (C) 2023-2024 Alexandre Pujol <alexandre@pujol.io> // Copyright (C) 2023-2024 Alexandre Pujol <alexandre@pujol.io>
// SPDX-License-Identifier: GPL-2.0-only // SPDX-License-Identifier: GPL-2.0-only
package prebuild package util
import ( import (
"reflect" "reflect"
@ -79,7 +79,7 @@ ANSI_COLOR="0;38;2;60;110;180"
LOGO=fedora-logo-icon` LOGO=fedora-logo-icon`
) )
func TestNewOSRelease(t *testing.T) { func Test_getOSRelease(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
osRelease string osRelease string
@ -128,14 +128,14 @@ func TestNewOSRelease(t *testing.T) {
if err != nil { if err != nil {
return return
} }
if got := NewOSRelease(); !reflect.DeepEqual(got, tt.want) { if got := getOSRelease(); !reflect.DeepEqual(got, tt.want) {
t.Errorf("NewOSRelease() = %v, want %v", got, tt.want) t.Errorf("getOSRelease() = %v, want %v", got, tt.want)
} }
}) })
} }
} }
func Test_getSupportedDistribution(t *testing.T) { func Test_getDistribution(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
osRelease string osRelease string
@ -161,11 +161,11 @@ func Test_getSupportedDistribution(t *testing.T) {
osRelease: OpenSUSETumbleweed, osRelease: OpenSUSETumbleweed,
want: "opensuse", want: "opensuse",
}, },
// { {
// name: "Fedora", name: "Fedora",
// osRelease: Fedora, osRelease: Fedora,
// want: "fedora", want: "fedora",
// }, },
} }
osReleaseFile = "/tmp/os-release" osReleaseFile = "/tmp/os-release"
@ -175,9 +175,48 @@ func Test_getSupportedDistribution(t *testing.T) {
if err != nil { if err != nil {
return return
} }
got := getSupportedDistribution() Release = getOSRelease()
got := getDistribution()
if got != tt.want { if got != tt.want {
t.Errorf("getSupportedDistribution() = %v, want %v", got, tt.want) t.Errorf("getDistribution() = %v, want %v", got, tt.want)
}
})
}
}
func Test_getFamily(t *testing.T) {
tests := []struct {
name string
dist string
want string
}{
{
name: "Archlinux",
dist: "arch",
want: "pacman",
},
{
name: "Ubuntu",
dist: "ubuntu",
want: "apt",
},
{
name: "Debian",
dist: "debian",
want: "apt",
},
{
name: "OpenSUSE Tumbleweed",
dist: "opensuse",
want: "zypper",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Distribution = tt.dist
if got := getFamily(); got != tt.want {
t.Errorf("getFamily() = %v, want %v", got, tt.want)
} }
}) })
} }

View File

@ -11,11 +11,11 @@ import (
"github.com/arduino/go-paths-helper" "github.com/arduino/go-paths-helper"
"github.com/roddhjav/apparmor.d/pkg/logging" "github.com/roddhjav/apparmor.d/pkg/logging"
oss "github.com/roddhjav/apparmor.d/pkg/os"
) )
var ( var (
overwrite bool = false overwrite bool = false
Distribution string
DistDir *paths.Path DistDir *paths.Path
Root *paths.Path Root *paths.Path
RootApparmord *paths.Path RootApparmord *paths.Path
@ -27,10 +27,8 @@ func init() {
Root = paths.New(".build") Root = paths.New(".build")
FlagDir = DistDir.Join("flags") FlagDir = DistDir.Join("flags")
RootApparmord = Root.Join("apparmor.d") RootApparmord = Root.Join("apparmor.d")
Distribution = getSupportedDistribution() if oss.Distribution == "ubuntu" {
if Distribution == "ubuntu" { if oss.Release["VERSION_CODENAME"] == "noble" {
os := NewOSRelease()
if os["VERSION_CODENAME"] == "noble" {
Builds = append(Builds, BuildABI3) Builds = append(Builds, BuildABI3)
overwrite = true overwrite = true
} }

View File

@ -8,6 +8,8 @@ import (
"os" "os"
"os/exec" "os/exec"
"testing" "testing"
oss "github.com/roddhjav/apparmor.d/pkg/os"
) )
func chdirGitRoot() { func chdirGitRoot() {
@ -74,7 +76,7 @@ func Test_PreBuild(t *testing.T) {
chdirGitRoot() chdirGitRoot()
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
Distribution = tt.dist oss.Distribution = tt.dist
if tt.full { if tt.full {
Prepares = append(Prepares, SetFullSystemPolicy) Prepares = append(Prepares, SetFullSystemPolicy)
Builds = append(Builds, BuildFullSystemPolicy) Builds = append(Builds, BuildFullSystemPolicy)

View File

@ -12,6 +12,7 @@ import (
"github.com/arduino/go-paths-helper" "github.com/arduino/go-paths-helper"
"github.com/roddhjav/apparmor.d/pkg/logging" "github.com/roddhjav/apparmor.d/pkg/logging"
oss "github.com/roddhjav/apparmor.d/pkg/os"
"github.com/roddhjav/apparmor.d/pkg/util" "github.com/roddhjav/apparmor.d/pkg/util"
) )
@ -59,7 +60,7 @@ func Synchronise() ([]string, error) {
// Ignore profiles and files as defined in dists/ignore/ // Ignore profiles and files as defined in dists/ignore/
func Ignore() ([]string, error) { func Ignore() ([]string, error) {
res := []string{} res := []string{}
for _, name := range []string{"main.ignore", Distribution + ".ignore"} { for _, name := range []string{"main.ignore", oss.Distribution + ".ignore"} {
path := DistDir.Join("ignore", name) path := DistDir.Join("ignore", name)
if !path.Exist() { if !path.Exist() {
continue continue
@ -130,7 +131,7 @@ func Merge() ([]string, error) {
// Set the distribution specificities // Set the distribution specificities
func Configure() ([]string, error) { func Configure() ([]string, error) {
res := []string{} res := []string{}
switch Distribution { switch oss.Distribution {
case "arch", "opensuse": case "arch", "opensuse":
case "ubuntu": case "ubuntu":
@ -152,7 +153,7 @@ func Configure() ([]string, error) {
} }
default: default:
return []string{}, fmt.Errorf("%s is not a supported distribution", Distribution) return []string{}, fmt.Errorf("%s is not a supported distribution", oss.Distribution)
} }
return res, nil return res, nil
@ -161,7 +162,7 @@ func Configure() ([]string, error) {
// Set flags on some profiles according to manifest defined in `dists/flags/` // Set flags on some profiles according to manifest defined in `dists/flags/`
func SetFlags() ([]string, error) { func SetFlags() ([]string, error) {
res := []string{} res := []string{}
for _, name := range []string{"main.flags", Distribution + ".flags"} { for _, name := range []string{"main.flags", oss.Distribution + ".flags"} {
path := FlagDir.Join(name) path := FlagDir.Join(name)
if !path.Exist() { if !path.Exist() {
continue continue

View File

@ -5,71 +5,11 @@
package prebuild package prebuild
import ( import (
"os"
"strings" "strings"
"github.com/arduino/go-paths-helper" "github.com/arduino/go-paths-helper"
"golang.org/x/exp/slices"
) )
var (
osReleaseFile = "/etc/os-release"
supportedDists = map[string][]string{
"arch": {},
"debian": {},
"ubuntu": {},
"opensuse": {"suse", "opensuse-tumbleweed"},
"whonix": {},
}
)
func NewOSRelease() map[string]string {
var lines []string
var err error
for _, name := range []string{osReleaseFile, "/usr/lib/os-release"} {
path := paths.New(name)
if path.Exist() {
lines, err = path.ReadFileAsLines()
if err != nil {
panic(err)
}
break
}
}
os := map[string]string{}
for _, line := range lines {
item := strings.Split(line, "=")
if len(item) == 2 {
os[item[0]] = strings.Trim(item[1], "\"")
}
}
return os
}
func getSupportedDistribution() string {
dist, present := os.LookupEnv("DISTRIBUTION")
if present {
return dist
}
os := NewOSRelease()
id := os["ID"]
if id == "ubuntu" {
return id
}
id_like := os["ID_LIKE"]
for main, based := range supportedDists {
if main == id || main == id_like {
return main
} else if slices.Contains(based, id) {
return main
} else if slices.Contains(based, id_like) {
return main
}
}
return id
}
func copyTo(src *paths.Path, dst *paths.Path) error { func copyTo(src *paths.Path, dst *paths.Path) error {
files, err := src.ReadDirRecursiveFiltered(nil, paths.FilterOutDirectories(), paths.FilterOutNames("README.md")) files, err := src.ReadDirRecursiveFiltered(nil, paths.FilterOutDirectories(), paths.FilterOutNames("README.md"))
if err != nil { if err != nil {