2 """Extra Ansible filters"""
4 def deb_kernel(packages, kernel_version, current_version):
6 Return best matching kernel version.
8 packages (dict): apt-cache showpkg output.
9 kernel_version (str): Kernel version to install.
10 current_version (str): Current kernel version.
16 # List all available kernel version and associated repository
17 for line in packages['stdout'].splitlines():
19 if line.startswith('Package: ') and (
20 line.endswith('-common') or # Debian
21 line.endswith('-generic')): # Ubuntu
22 kernel = line.split()[1]
24 for string in ('linux-headers-', 'common', 'generic'):
25 kernel = kernel.replace(string, '')
26 kernel = kernel.strip('-')
31 # Sort Kernel versions
33 for kernel in kernels:
35 version, build = kernel.split('-', 1)
39 versions[kernel] = list(
40 int(ver) for ver in version.split('.')) + [build]
41 kernels = sorted(versions.keys(), key=versions.get, reverse=True)
43 # Return more recent kernel package that match version requirement
44 for kernel in kernels:
45 if kernel.startswith(kernel_version):
49 'No kernel matching to "%s". Available kernel versions: %s' % (
50 kernel_version, ', '.join(reversed(kernels))))
53 def _deb_kernel_package(kernel, dist, arch, name):
55 Return kernel package name.
57 kernel (str): Kernel version.
58 dist (str): Distribution.
59 arch (str): Architecture.
60 name (str): Package name.
64 # Define package suffix
67 elif name == 'linux-image':
68 suffix = arch.replace('x86_64', 'amd64')
72 return '-'.join((name, kernel, suffix))
75 def deb_kernel_pkg(packages, kernel_version, current_version, dist, arch, name):
77 Return kernel package to install.
79 packages (dict): apt-cache showpkg output.
80 kernel_version (str): Kernel version to install.
81 current_version (str): Current kernel version.
82 dist (str): Distribution.
83 arch (str): Architecture.
84 name (str): Package name.
86 str: kernel package to install.
88 return _deb_kernel_package(
89 deb_kernel(packages, kernel_version, current_version), dist, arch, name)
92 def deb_installed_kernel(installed, packages, kernel_version, current_version):
94 Return old kernel packages to remove.
96 installed (dict): dpkg -l output.
97 packages (dict): apt-cache showpkg output.
98 kernel_version (str): Kernel version to install.
99 current_version (str): Current kernel version.
101 list of str: Kernel packages to remove.
103 # Filter installed package to keep
104 to_keep = deb_kernel(packages, kernel_version, current_version)
106 # Return installed package to remove
108 for line in installed['stdout'].splitlines():
109 if ' linux-' not in line:
112 package = line.split()[1]
113 if ((package.startswith('linux-image-') or
114 package.startswith('linux-headers-')) and not (
115 package.startswith('linux-image-' + to_keep) or
116 package.startswith('linux-headers-' + to_keep))):
117 to_remove.append(package)
122 def kernel_match(kernel, kernel_spec):
124 Check if kernel version match.
127 kernel_spec (str): Kernel to match.
129 bool: True if Kernel match.
131 return kernel.startswith(kernel_spec)
134 class FilterModule(object):
135 """Return filter plugin"""
140 return {'deb_kernel': deb_kernel,
141 'deb_kernel_pkg': deb_kernel_pkg,
142 'deb_installed_kernel': deb_installed_kernel,
143 'kernel_match': kernel_match}