-
Notifications
You must be signed in to change notification settings - Fork 2
/
load.go
76 lines (59 loc) · 1.72 KB
/
load.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package load
import (
"fmt"
"os"
"github.com/bensallen/modscan/pkg/mod"
"github.com/bensallen/modscan/pkg/uname"
flag "github.com/spf13/pflag"
"github.com/u-root/u-root/pkg/kmodule"
)
const usageHeader = `load - Load needed kernel modules
Usage:
load
Flags:
`
var (
flags = flag.NewFlagSet("load", flag.ContinueOnError)
rootpath = flags.StringP("root", "r", "/", "Root path for kernel modules")
kver = flags.StringP("kver", "k", "", "Set kernel version instead of using uname")
syspath = flags.StringP("syspath", "s", "/sys/devices", "Path to sysfs devices")
)
// Usage of the load subcommand
func Usage() {
fmt.Fprintf(os.Stderr, usageHeader)
// Set the modpath flag's default to use uname release.
u, _ := uname.New()
flags.Lookup("kver").DefValue = u.Release()
fmt.Fprintf(os.Stderr, flags.FlagUsagesWrapped(0)+"\n")
}
// Run load subcommand
func Run(args []string, verbose bool) error {
// Set the modpath flag's default to use uname release.
u, err := uname.New()
flags.Lookup("kver").Value.Set(u.Release())
flags.ParseErrorsWhitelist.UnknownFlags = true
if err := flags.Parse(args); err != nil {
Usage()
fmt.Fprintf(os.Stderr, "Error: %v\n\n", err)
os.Exit(2)
}
modpath := mod.ModuleDir(*rootpath, *kver)
modAliases, err := mod.ParseKernelModulesAlias(modpath)
if err != nil {
return err
}
modules, err := mod.WalkModAlias(*syspath, modAliases, nil)
if err != nil {
return err
}
kopts := kmodule.ProbeOpts{RootDir: *rootpath, KVer: *kver}
for modName := range modules {
if verbose {
fmt.Printf("loading module %q\n", modName)
}
if err := kmodule.ProbeOptions(modName, "", kopts); err != nil {
fmt.Printf("could not load module %q: %v\n", modName, err)
}
}
return nil
}