mirror of
https://github.com/kemko/nomad.git
synced 2026-01-04 17:35:43 +03:00
refactor lookup code
This commit is contained in:
@@ -36,12 +36,19 @@ func (f *BridgeFingerprint) Fingerprint(req *FingerprintRequest, resp *Fingerpri
|
||||
}
|
||||
|
||||
func (f *BridgeFingerprint) checkKMod(mod string) error {
|
||||
dynErr := f.checkKDynMod(mod)
|
||||
hostInfo, err := host.Info()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
dynErr := f.checkKModFile(mod, "/proc/modules", fmt.Sprintf("%s\\s+.*$", mod))
|
||||
if dynErr == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
builtinErr := f.checkKBuiltinMod(mod)
|
||||
builtinErr := f.checkKModFile(mod,
|
||||
fmt.Sprintf("/lib/modules/%s/modules.builtin", hostInfo.KernelVersion),
|
||||
fmt.Sprintf(".+\\/%s.ko$", mod))
|
||||
if builtinErr == nil {
|
||||
return nil
|
||||
}
|
||||
@@ -49,33 +56,7 @@ func (f *BridgeFingerprint) checkKMod(mod string) error {
|
||||
return fmt.Errorf("%v, %v", dynErr, builtinErr)
|
||||
}
|
||||
|
||||
func (f *BridgeFingerprint) checkKDynMod(mod string) error {
|
||||
file, err := os.Open("/proc/modules")
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not read /proc/modules: %v", err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
pattern := fmt.Sprintf("%s\\s+.*$", mod)
|
||||
for scanner.Scan() {
|
||||
if matched, err := regexp.MatchString(pattern, scanner.Text()); matched {
|
||||
return nil
|
||||
} else if err != nil {
|
||||
return fmt.Errorf("could not parse /proc/modules: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
return fmt.Errorf("could not detect dynamic kernel module %s", mod)
|
||||
}
|
||||
|
||||
func (f *BridgeFingerprint) checkKBuiltinMod(mod string) error {
|
||||
hostInfo, err := host.Info()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fileName := fmt.Sprintf("/lib/modules/%s/modules.builtin", hostInfo.KernelVersion)
|
||||
func (f *BridgeFingerprint) checkKModFile(mod, fileName, pattern string) error {
|
||||
file, err := os.Open(fileName)
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not read %s: %v", fileName, err)
|
||||
@@ -83,7 +64,6 @@ func (f *BridgeFingerprint) checkKBuiltinMod(mod string) error {
|
||||
defer file.Close()
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
pattern := fmt.Sprintf(".+\\/%s.ko$", mod)
|
||||
for scanner.Scan() {
|
||||
if matched, err := regexp.MatchString(pattern, scanner.Text()); matched {
|
||||
return nil
|
||||
@@ -92,5 +72,5 @@ func (f *BridgeFingerprint) checkKBuiltinMod(mod string) error {
|
||||
}
|
||||
}
|
||||
|
||||
return fmt.Errorf("could not detect builtin kernel module %s", mod)
|
||||
return fmt.Errorf("could not detect kernel module %s", mod)
|
||||
}
|
||||
|
||||
@@ -10,6 +10,5 @@ func TestBridgeFingerprint_checkKMod(t *testing.T) {
|
||||
require := require.New(t)
|
||||
f := &BridgeFingerprint{}
|
||||
require.NoError(f.checkKMod("ip_tables"))
|
||||
require.NoError(f.checkKMod("bridge"))
|
||||
require.Error(f.checkKMod("nonexistentmodule"))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user