added option for automatic kernel detection

This commit is contained in:
Christian Goll
2022-02-02 11:40:57 +01:00
parent fb1b04c370
commit 4eabb957bb
3 changed files with 60 additions and 11 deletions

View File

@@ -14,13 +14,15 @@ import (
) )
func CobraRunE(cmd *cobra.Command, args []string) error { func CobraRunE(cmd *cobra.Command, args []string) error {
if len(args) == 0 && !OptDetect {
// Checking if container flag was set, then overwriting OptRoot wwlog.Printf(wwlog.ERROR, "the '--detect' flag is needed, if no kernel version is suppiled")
kernelVersion := args[0] os.Exit(1)
kernelName := kernelVersion
if len(args) > 1 {
kernelName = args[1]
} }
if OptDetect && (OptRoot == "" || OptContainer == "") {
wwlog.Printf(wwlog.ERROR, "the '--detect flag needs the '--container' or '--root' flag")
os.Exit(1)
}
// Checking if container flag was set, then overwriting OptRoot
if OptContainer != "" { if OptContainer != "" {
if container.ValidSource(OptContainer) { if container.ValidSource(OptContainer) {
OptRoot = container.RootFsDir(OptContainer) OptRoot = container.RootFsDir(OptContainer)
@@ -29,6 +31,24 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
os.Exit(1) os.Exit(1)
} }
} }
var kernelVersion string
var err error
if len(args) > 0 {
kernelVersion = args[0]
} else {
kernelVersion, err = kernel.FindKernelVersion(OptRoot)
if err != nil {
wwlog.Printf(wwlog.ERROR, "could not detect kernel under %s\n", OptRoot)
os.Exit(1)
}
}
kernelName := kernelVersion
if len(args) > 1 {
kernelName = args[1]
} else if OptDetect && (OptContainer != "") {
kernelName = OptContainer
}
output, err := kernel.Build(kernelVersion, kernelName, OptRoot) output, err := kernel.Build(kernelVersion, kernelName, OptRoot)
if err != nil { if err != nil {
wwlog.Printf(wwlog.ERROR, "Failed building kernel: %s\n", err) wwlog.Printf(wwlog.ERROR, "Failed building kernel: %s\n", err)

View File

@@ -10,17 +10,18 @@ import (
var ( var (
baseCmd = &cobra.Command{ baseCmd = &cobra.Command{
DisableFlagsInUseLine: true, DisableFlagsInUseLine: true,
Use: "import [OPTIONS] KERNEL", Use: "import [OPTIONS] KERNEL",
Short: "Import Kernel version into Warewulf", Short: "Import Kernel version into Warewulf",
Long: "This will import a boot KERNEL version from the control node into Warewulf", Long: "This will import a boot KERNEL version from the control node into Warewulf",
RunE: CobraRunE, RunE: CobraRunE,
Args: cobra.MinimumNArgs(1), Args: cobra.MinimumNArgs(0),
} }
BuildAll bool BuildAll bool
ByNode bool ByNode bool
SetDefault bool SetDefault bool
OptRoot string OptRoot string
OptContainer string OptContainer string
OptDetect bool
) )
func init() { func init() {
@@ -36,6 +37,7 @@ func init() {
if err != nil { if err != nil {
log.Println(err) log.Println(err)
} }
baseCmd.PersistentFlags().BoolVarP(&OptDetect, "detect", "D", false, "Try to detect the kernel version in an automated way, needs the -C or -r option")
} }
// GetRootCommand returns the root cobra.Command for the application. // GetRootCommand returns the root cobra.Command for the application.

View File

@@ -8,6 +8,8 @@ import (
"os" "os"
"os/exec" "os/exec"
"path" "path"
"path/filepath"
"regexp"
"github.com/pkg/errors" "github.com/pkg/errors"
@@ -228,3 +230,28 @@ func DeleteKernel(name string) error {
wwlog.Printf(wwlog.VERBOSE, "Removing path: %s\n", fullPath) wwlog.Printf(wwlog.VERBOSE, "Removing path: %s\n", fullPath)
return os.RemoveAll(fullPath) return os.RemoveAll(fullPath)
} }
func FindKernelVersion(root string) (string, error) {
for _, searchPath := range kernelSearchPaths {
testPattern := fmt.Sprintf(path.Join(root, searchPath), `*`)
wwlog.Printf(wwlog.VERBOSE, "Looking for kernel version with pattern at: %s\n", testPattern)
potentialKernel, _ := filepath.Glob(testPattern)
if len(potentialKernel) == 0 {
continue
}
for _, foundKernel := range potentialKernel {
wwlog.Printf(wwlog.VERBOSE, "Parsing out kernel version for %s\n", foundKernel)
re := regexp.MustCompile(fmt.Sprintf(path.Join(root, searchPath), `([\w\d-\.]*)`))
version := re.FindAllStringSubmatch(foundKernel, -1)
if version == nil {
return "", fmt.Errorf("could not parse kernel version")
}
wwlog.Printf(wwlog.VERBOSE, "found kernel version %s\n", version)
return version[0][1], nil
}
}
return "", fmt.Errorf("could not find kernel version")
}