🐛 fix getting kernel versions for debian/proxmox
This commit is contained in:
		
							parent
							
								
									e5738cadf0
								
							
						
					
					
						commit
						28dbdcb596
					
				
					 3 changed files with 41 additions and 9 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
*.pyc
 | 
					*.pyc
 | 
				
			||||||
.cache/
 | 
					.cache/
 | 
				
			||||||
.idea/
 | 
					.idea/
 | 
				
			||||||
 | 
					.venv/
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										31
									
								
								check_kernel
									
										
									
									
									
								
							
							
						
						
									
										31
									
								
								check_kernel
									
										
									
									
									
								
							| 
						 | 
					@ -73,7 +73,7 @@ def running_kernel_version():
 | 
				
			||||||
        proc_version_ = re.sub('\(gcc.*?\)', '', proc_version_)
 | 
					        proc_version_ = re.sub('\(gcc.*?\)', '', proc_version_)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Then look for the Debian kernel version
 | 
					        # Then look for the Debian kernel version
 | 
				
			||||||
        m = re.search('(?<=Debian )(\S+)', proc_version_)
 | 
					        m = re.search('((?<=Debian )(\S+)|(?<=PVE )(\S+))', proc_version_)
 | 
				
			||||||
        if m:
 | 
					        if m:
 | 
				
			||||||
            version_str = m.group(1).strip('()')
 | 
					            version_str = m.group(1).strip('()')
 | 
				
			||||||
            version = clean_kernel_version(version_str)
 | 
					            version = clean_kernel_version(version_str)
 | 
				
			||||||
| 
						 | 
					@ -99,8 +99,17 @@ def is_redhat():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def installed_kernel_versions():
 | 
					def installed_kernel_versions():
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    Debian-based kernels come in different flavors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    On some of them, like Proxmox' PVE kernels, special care has to be taken
 | 
				
			||||||
 | 
					    when selecting the right packages to run `dpkg-query` on.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
    if is_debian():
 | 
					    if is_debian():
 | 
				
			||||||
        return installed_kernel_versions_debian()
 | 
					        return \
 | 
				
			||||||
 | 
					          installed_kernel_versions_debian(pkgname='linux-image') \
 | 
				
			||||||
 | 
					          or installed_kernel_versions_debian(pkgname='pve-kernel',
 | 
				
			||||||
 | 
					                                              pkgquery='pve-kernel*-pve')
 | 
				
			||||||
    if is_fedora() or is_redhat():
 | 
					    if is_fedora() or is_redhat():
 | 
				
			||||||
        return installed_kernel_versions_fedora()
 | 
					        return installed_kernel_versions_fedora()
 | 
				
			||||||
    return [None]
 | 
					    return [None]
 | 
				
			||||||
| 
						 | 
					@ -108,18 +117,22 @@ def installed_kernel_versions():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def check_output(cmd):
 | 
					def check_output(cmd):
 | 
				
			||||||
    """Emulate subprocess.check_output for ancient Python versions"""
 | 
					    """Emulate subprocess.check_output for ancient Python versions"""
 | 
				
			||||||
    return subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]
 | 
					    return subprocess.Popen(
 | 
				
			||||||
 | 
					        cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE
 | 
				
			||||||
 | 
					    ).communicate()[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def installed_kernel_versions_debian():
 | 
					def installed_kernel_versions_debian(pkgname='linux-image', pkgquery=None):
 | 
				
			||||||
 | 
					    if not pkgquery:
 | 
				
			||||||
 | 
					        pkgquery = '%s*' % pkgname
 | 
				
			||||||
    dpkg_out = check_output(
 | 
					    dpkg_out = check_output(
 | 
				
			||||||
        ['dpkg-query',
 | 
					        ['dpkg-query',
 | 
				
			||||||
         '--show', '--showformat', '${Package} ${Version}\n',
 | 
					         '--show', '--showformat', '${Package} ${Version}\n',
 | 
				
			||||||
         'linux-image*'])
 | 
					         pkgquery])
 | 
				
			||||||
    dpkg_out = dpkg_out.decode('ascii', 'ignore').strip()
 | 
					    dpkg_out = dpkg_out.decode('ascii', 'ignore').strip()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    versions = dpkg_out.split('\n')
 | 
					    versions = dpkg_out.split('\n')
 | 
				
			||||||
    versions = [v for v in versions if re.search('^linux-image-\d.* \S+$', v)]
 | 
					    versions = [v for v in versions if re.search('^%s-\d.* \S+$' % pkgname, v)]
 | 
				
			||||||
    versions = [clean_kernel_version(v.split(' ')[1]) for v in versions]
 | 
					    versions = [clean_kernel_version(v.split(' ')[1]) for v in versions]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return versions
 | 
					    return versions
 | 
				
			||||||
| 
						 | 
					@ -137,7 +150,11 @@ def installed_kernel_versions_fedora():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def installed_kernel_version():
 | 
					def installed_kernel_version():
 | 
				
			||||||
    return sorted(installed_kernel_versions())[-1]
 | 
					    installed = sorted(installed_kernel_versions())
 | 
				
			||||||
 | 
					    if not installed:
 | 
				
			||||||
 | 
					        print('KERNEL UNKNOWN - unable to determine running kernel version')
 | 
				
			||||||
 | 
					        sys.exit(3)
 | 
				
			||||||
 | 
					    return installed[-1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def clean_kernel_version(version):
 | 
					def clean_kernel_version(version):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,11 +26,16 @@ if not hasattr(unittest.TestCase, 'assertLess'):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class CleanKernelVersionTestCase(unittest.TestCase):
 | 
					class CleanKernelVersionTestCase(unittest.TestCase):
 | 
				
			||||||
    def testDebian(self):
 | 
					    def testDebianVanilla(self):
 | 
				
			||||||
        versions = [('3.16.7-ckt9-3~deb8u2', '3.16.7-ckt9-3~deb8u2')]
 | 
					        versions = [('3.16.7-ckt9-3~deb8u2', '3.16.7-ckt9-3~deb8u2')]
 | 
				
			||||||
        for dirty, clean in versions:
 | 
					        for dirty, clean in versions:
 | 
				
			||||||
            self.assertEqual(clean_kernel_version(dirty), Version(clean))
 | 
					            self.assertEqual(clean_kernel_version(dirty), Version(clean))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def testDebianProxmox(self):
 | 
				
			||||||
 | 
					        versions = [('5.13.19-14', '5.13.19-14')]
 | 
				
			||||||
 | 
					        for dirty, clean in versions:
 | 
				
			||||||
 | 
					            self.assertEqual(clean_kernel_version(dirty), Version(clean))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def testFedora(self):
 | 
					    def testFedora(self):
 | 
				
			||||||
        versions = [('4.0.4-301.fc22.x86_64', '4.0.4-301'),
 | 
					        versions = [('4.0.4-301.fc22.x86_64', '4.0.4-301'),
 | 
				
			||||||
                    ('4.0.0-1.fc22', '4.0.0-1')]
 | 
					                    ('4.0.0-1.fc22', '4.0.0-1')]
 | 
				
			||||||
| 
						 | 
					@ -44,7 +49,7 @@ class RunningKernelVersionTestCase(unittest.TestCase):
 | 
				
			||||||
        self.assertEqual(check_kernel.running_kernel_version(),
 | 
					        self.assertEqual(check_kernel.running_kernel_version(),
 | 
				
			||||||
                         Version('4.0.3-301'))
 | 
					                         Version('4.0.3-301'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def testDebian(self):
 | 
					    def testDebianVanilla(self):
 | 
				
			||||||
        patch_object(check_kernel, 'proc_version', return_value='Linux version 4.19.0-5-amd64 (debian-kernel@lists.debian.org) (gcc version 8.3.0 (Debian 8.3.0-7)) #1 SMP Debian 4.19.37-5 (2019-06-19)')
 | 
					        patch_object(check_kernel, 'proc_version', return_value='Linux version 4.19.0-5-amd64 (debian-kernel@lists.debian.org) (gcc version 8.3.0 (Debian 8.3.0-7)) #1 SMP Debian 4.19.37-5 (2019-06-19)')
 | 
				
			||||||
        self.assertEqual(check_kernel.running_kernel_version(),
 | 
					        self.assertEqual(check_kernel.running_kernel_version(),
 | 
				
			||||||
                         Version('4.19.37-5'))
 | 
					                         Version('4.19.37-5'))
 | 
				
			||||||
| 
						 | 
					@ -61,6 +66,15 @@ class RunningKernelVersionTestCase(unittest.TestCase):
 | 
				
			||||||
        self.assertEqual(check_kernel.running_kernel_version(),
 | 
					        self.assertEqual(check_kernel.running_kernel_version(),
 | 
				
			||||||
                         Version('5.10.46-4'))
 | 
					                         Version('5.10.46-4'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def testDebianProxmox(self):
 | 
				
			||||||
 | 
					        patch_object(check_kernel, 'proc_version', return_value='Linux version 5.4.162-1-pve (build@proxmox) (gcc version 8.3.0 (Debian 8.3.0-6)) #1 SMP PVE 5.4.162-2 (Thu, 20 Jan 2022 16:38:53 +0100)')
 | 
				
			||||||
 | 
					        self.assertEqual(check_kernel.running_kernel_version(),
 | 
				
			||||||
 | 
					                         Version('5.4.162-2'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        patch_object(check_kernel, 'proc_version', return_value='Linux version 5.13.19-6-pve (build@proxmox) (gcc (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.2) #1 SMP PVE 5.13.19-14 (Thu, 10 Mar 2022 16:24:52 +0100)')
 | 
				
			||||||
 | 
					        self.assertEqual(check_kernel.running_kernel_version(),
 | 
				
			||||||
 | 
					                         Version('5.13.19-14'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class VersionTestCase(unittest.TestCase):
 | 
					class VersionTestCase(unittest.TestCase):
 | 
				
			||||||
    def testStr(self):
 | 
					    def testStr(self):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue