From 49945b1a2bd93c456df8993c001b33a37072505c Mon Sep 17 00:00:00 2001 From: Mike Gerber Date: Sun, 24 May 2015 23:16:13 +0200 Subject: [PATCH] Fix getting kernel version on older Debian systems --- check_kernel | 39 ++++++++++++++++++++++++++++----------- check_kernel_test.py | 7 +++++++ 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/check_kernel b/check_kernel index cc09cb2..04abd18 100755 --- a/check_kernel +++ b/check_kernel @@ -15,8 +15,16 @@ class Version(object): def __str__(self): return self.version_str + def __repr__(self): + return 'Version(\'%s\')' % self.version_str + def components(self): - return re.split('\.|-', self.version_str) + # Split the version into components, by word boundaries, or a + # change between numbers and non-numbers and vice-versa. re.split() + # does not work on zero-length delimiters, so we have to use a + # sub+split. + return re.sub(r'\b|(?<=\d)(?=\D)|(?<=\D)(?=\d)', '\n', + self.version_str).split('\n') def __eq__(self, other): return self.version_str == other.version_str @@ -46,16 +54,25 @@ def proc_version(): def running_kernel_version(): - m = re.findall('(?<=Debian )\S+', proc_version()) - if m: - # Note: it's the _second_ match - version = clean_kernel_version(m[1]) - return version - - m = re.search('(?<=Linux version )\S+', proc_version()) - if m: - version = clean_kernel_version(m.group(0)) - return version + proc_version_ = proc_version() + + if re.search('Debian', proc_version_): + # Remove gcc version first + proc_version_ = re.sub('\(gcc[^(]+\(Debian [^)]+\)\s+\)', '', + proc_version_) + + # Then look for the Debian kernel version + m = re.search('(?<=Debian )(\S+)', proc_version_) + if m: + version_str = m.group(1).strip('()') + version = clean_kernel_version(version_str) + return version + + else: + m = re.search('(?<=Linux version )(\S+)', proc_version_) + if m: + version = clean_kernel_version(m.group(0)) + return version def is_debian(): diff --git a/check_kernel_test.py b/check_kernel_test.py index c16a4c6..e8cfd0c 100644 --- a/check_kernel_test.py +++ b/check_kernel_test.py @@ -38,6 +38,10 @@ class RunningKernelVersionTestCase(unittest.TestCase): self.assertEqual(check_kernel.running_kernel_version(), Version('3.16.7-ckt9-3~deb8u1')) + with unittest.mock.patch.object(check_kernel, 'proc_version', return_value='Linux version 2.6.32-5-amd64 (Debian 2.6.32-48squeeze11) (ben@decadent.org.uk) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Wed Feb 18 13:14:10 UTC 2015'): + self.assertEqual(check_kernel.running_kernel_version(), + Version('2.6.32-48squeeze11')) + class VersionTestCase(unittest.TestCase): def testStr(self): @@ -45,11 +49,14 @@ class VersionTestCase(unittest.TestCase): def testComparingTrivial(self): self.assertEqual(Version('1.0'), Version('1.0')) + self.assertEqual(Version('2.6.32-5foo1'), Version('2.6.32-5foo1')) + self.assertGreater(Version('2.0'), Version('1.0')) def testComparingNonTrivial(self): self.assertGreater(Version('2.12'), Version('2.2')) self.assertGreater(Version('3.12-12'), Version('3.12-2')) + self.assertGreater(Version('2.6.32-5foo1'), Version('2.6.32-5foo0')) if __name__ == '__main__':