Match by debian release
This commit is contained in:
parent
9fd4b541da
commit
d13eab6947
@ -27,7 +27,7 @@ type kernel struct {
|
|||||||
// KernelMask defines the kernel
|
// KernelMask defines the kernel
|
||||||
type KernelMask struct {
|
type KernelMask struct {
|
||||||
DistroType DistroType
|
DistroType DistroType
|
||||||
DistroRelease string // 18.04/7.4.1708/9.1
|
DistroRelease string // 18.04/7/9
|
||||||
ReleaseMask string
|
ReleaseMask string
|
||||||
|
|
||||||
// Overrides ReleaseMask
|
// Overrides ReleaseMask
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
package debian
|
package debian
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"os/user"
|
"os/user"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
@ -10,10 +12,17 @@ import (
|
|||||||
"code.dumpstack.io/tools/out-of-tree/config"
|
"code.dumpstack.io/tools/out-of-tree/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CodeName int
|
type Release int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Wheezy CodeName = iota
|
None Release = iota
|
||||||
|
Buzz
|
||||||
|
Hamm
|
||||||
|
Woody
|
||||||
|
Etch
|
||||||
|
Lenny
|
||||||
|
Squeeze
|
||||||
|
Wheezy
|
||||||
Jessie
|
Jessie
|
||||||
Stretch
|
Stretch
|
||||||
Buster
|
Buster
|
||||||
@ -21,7 +30,14 @@ const (
|
|||||||
Bookworm
|
Bookworm
|
||||||
)
|
)
|
||||||
|
|
||||||
var CodeNameStrings = [...]string{
|
var ReleaseStrings = [...]string{
|
||||||
|
"",
|
||||||
|
"Buzz",
|
||||||
|
"Hamm",
|
||||||
|
"Woody",
|
||||||
|
"Etch",
|
||||||
|
"Lenny",
|
||||||
|
"Squeeze",
|
||||||
"Wheezy",
|
"Wheezy",
|
||||||
"Jessie",
|
"Jessie",
|
||||||
"Stretch",
|
"Stretch",
|
||||||
@ -30,8 +46,79 @@ var CodeNameStrings = [...]string{
|
|||||||
"Bookworm",
|
"Bookworm",
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cn CodeName) String() string {
|
func (cn Release) String() string {
|
||||||
return CodeNameStrings[cn]
|
return ReleaseStrings[cn]
|
||||||
|
}
|
||||||
|
|
||||||
|
func releaseFromString(s string) (r Release) {
|
||||||
|
switch strings.ToLower(s) {
|
||||||
|
case "7", "wheezy":
|
||||||
|
r = Wheezy
|
||||||
|
case "8", "jessie":
|
||||||
|
r = Jessie
|
||||||
|
case "9", "stretch":
|
||||||
|
r = Stretch
|
||||||
|
case "10", "buster":
|
||||||
|
r = Buster
|
||||||
|
case "11", "bullseye":
|
||||||
|
r = Bullseye
|
||||||
|
default:
|
||||||
|
r = None
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseKernelMajorMinor(deb string) (major, minor int, err error) {
|
||||||
|
// linux-image-4.17.0-2-amd64 -> 4.17
|
||||||
|
re := regexp.MustCompile(`([0-9]*\.[0-9]*)`)
|
||||||
|
|
||||||
|
s := re.FindString(deb)
|
||||||
|
if s == "" {
|
||||||
|
err = errors.New("empty result")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
split := strings.Split(s, ".")
|
||||||
|
if len(split) != 2 {
|
||||||
|
err = errors.New("unexpected input")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
major, err = strconv.Atoi(split[0])
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
minor, err = strconv.Atoi(split[1])
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func kernelRelease(deb string) (r Release, err error) {
|
||||||
|
major, minor, err := parseKernelMajorMinor(deb)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if major < 3 {
|
||||||
|
err = errors.New("not supported")
|
||||||
|
return
|
||||||
|
} else if major <= 3 && minor < 16 {
|
||||||
|
r = Wheezy // 3.2
|
||||||
|
} else if major <= 4 && minor < 9 {
|
||||||
|
r = Jessie // 3.16
|
||||||
|
} else if major <= 4 && minor < 19 {
|
||||||
|
r = Stretch // 4.9
|
||||||
|
} else if major <= 5 && minor < 10 {
|
||||||
|
r = Buster // 4.19
|
||||||
|
} else {
|
||||||
|
r = Bullseye // 5.10
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -66,10 +153,23 @@ func MatchImagePkg(km config.KernelMask) (pkgs []string, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
release := releaseFromString(km.DistroRelease)
|
||||||
|
|
||||||
r := regexp.MustCompile(km.ReleaseMask)
|
r := regexp.MustCompile(km.ReleaseMask)
|
||||||
|
|
||||||
for _, dk := range kernels {
|
for _, dk := range kernels {
|
||||||
p := strings.Replace(dk.Image.Deb.Name, ".deb", "", -1)
|
p := strings.Replace(dk.Image.Deb.Name, ".deb", "", -1)
|
||||||
|
|
||||||
|
var kr Release
|
||||||
|
kr, err = kernelRelease(p)
|
||||||
|
if err != nil {
|
||||||
|
log.Warn().Err(err).Msg("")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if kr != release {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if r.MatchString(p) {
|
if r.MatchString(p) {
|
||||||
pkgs = append(pkgs, p)
|
pkgs = append(pkgs, p)
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestMatchImagePkg(t *testing.T) {
|
func TestMatchImagePkg(t *testing.T) {
|
||||||
km := config.KernelMask{ReleaseMask: "3.2.0-4"}
|
km := config.KernelMask{
|
||||||
|
ReleaseMask: "3.2.0-4",
|
||||||
|
DistroRelease: "7",
|
||||||
|
}
|
||||||
|
|
||||||
pkgs, err := MatchImagePkg(km)
|
pkgs, err := MatchImagePkg(km)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -18,3 +21,51 @@ func TestMatchImagePkg(t *testing.T) {
|
|||||||
t.Fatal("no packages")
|
t.Fatal("no packages")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestParseKernelMajorMinor(t *testing.T) {
|
||||||
|
type testcase struct {
|
||||||
|
Deb string
|
||||||
|
Major, Minor int
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range []testcase{
|
||||||
|
testcase{"linux-image-4.17.0-2-amd64", 4, 17},
|
||||||
|
testcase{"linux-image-6.1.0-8-amd64-unsigned", 6, 1},
|
||||||
|
testcase{"linux-image-6.1.0-0.deb11.7-amd64-unsigned", 6, 1},
|
||||||
|
testcase{"linux-image-3.2.0-0.bpo.4-amd64_3.2.41-2+deb7u2~bpo60+1_amd64", 3, 2},
|
||||||
|
testcase{"linux-image-5.16.0-rc5-amd64-unsigned_5.16~rc5-1~exp1_amd64", 5, 16},
|
||||||
|
testcase{"linux-image-3.6-trunk-amd64_3.8.4-1~experimental.1_amd64", 3, 6},
|
||||||
|
} {
|
||||||
|
major, minor, err := parseKernelMajorMinor(tc.Deb)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if major != tc.Major || minor != tc.Minor {
|
||||||
|
t.Fatalf("%v -> %v.%v != %v.%v", tc.Deb, major, minor,
|
||||||
|
tc.Major, tc.Minor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestKernelRelease(t *testing.T) {
|
||||||
|
type testcase struct {
|
||||||
|
Deb string
|
||||||
|
Release Release
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range []testcase{
|
||||||
|
testcase{"linux-image-4.17.0-2-amd64", Stretch},
|
||||||
|
testcase{"linux-image-6.1.0-8-amd64-unsigned", Bullseye},
|
||||||
|
testcase{"linux-image-6.1.0-0.deb11.7-amd64-unsigned", Bullseye},
|
||||||
|
testcase{"linux-image-3.2.0-0.bpo.4-amd64_3.2.41-2+deb7u2~bpo60+1_amd64", Wheezy},
|
||||||
|
testcase{"linux-image-5.16.0-rc5-amd64-unsigned_5.16~rc5-1~exp1_amd64", Bullseye},
|
||||||
|
} {
|
||||||
|
r, err := kernelRelease(tc.Deb)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if r != tc.Release {
|
||||||
|
t.Fatalf("%v -> %v != %v", tc.Deb, r, tc.Release)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user