11"""Extra Ansible filters"""
22
33
4- def _rhel_kernel_info (packages , kernel_version , * _ , ** __ ):
4+ def _rhel_kernel_info (packages , kernel_version ):
55 """
6- Return kernel and associated repository.
6+ Return kernel to install with associated repository.
77
88 Args:
99 packages (dict): DNF/YUM list output.
@@ -17,8 +17,8 @@ def _rhel_kernel_info(packages, kernel_version, *_, **__):
1717 # List all available kernel version and associated repository
1818 for line in packages ['stdout' ].splitlines ():
1919 if line .startswith ('kernel.' ) and not line .startswith ('kernel.src' ):
20- yum_package = line .strip ().split ()
21- kernels .append (dict (version = yum_package [1 ], repo = yum_package [2 ]))
20+ package = line .strip ().split ()
21+ kernels .append (dict (version = package [1 ], repo = package [2 ]))
2222
2323 # Return more recent kernel version that match version requirement
2424 for kernel in reversed (kernels ):
@@ -31,9 +31,9 @@ def _rhel_kernel_info(packages, kernel_version, *_, **__):
3131 ', ' .join (kernel ['version' ] for kernel in kernels )))
3232
3333
34- def rhel_kernel (packages , kernel_version , * _ , ** __ ):
34+ def rhel_kernel (packages , kernel_version ):
3535 """
36- Return matching kernel version.
36+ Return matching kernel version to install .
3737
3838 Args:
3939 packages (dict): DNF/YUM list output.
@@ -45,7 +45,7 @@ def rhel_kernel(packages, kernel_version, *_, **__):
4545 return _rhel_kernel_info (packages , kernel_version )['version' ]
4646
4747
48- def rhel_repo (packages , kernel_version , * _ , ** __ ):
48+ def rhel_repo (packages , kernel_version ):
4949 """
5050 Return repository where found specified kernel version.
5151
@@ -59,10 +59,136 @@ def rhel_repo(packages, kernel_version, *_, **__):
5959 return _rhel_kernel_info (packages , kernel_version )['repo' ]
6060
6161
62+ def _deb_kernel_info (packages , kernel_version ):
63+ """
64+ Return best matching kernel version.
65+
66+ Args:
67+ packages (dict): apt-cache showpkg output.
68+ kernel_version (str): Kernel version to install.
69+
70+ Returns:
71+ str: kernel version.
72+ """
73+ kernels = set ()
74+
75+ # List all available kernel version and associated repository
76+ for line in packages ['stdout' ].splitlines ():
77+ line = line .strip ()
78+ if line .startswith ('Package: ' ) and (
79+ line .endswith ('-common' ) or # Debian
80+ line .endswith ('-generic' )): # Ubuntu
81+ kernel = line .split ()[1 ]
82+
83+ for string in ('linux-headers-' , 'common' , 'generic' ):
84+ kernel = kernel .replace (string , '' )
85+ kernel = kernel .strip ('-' )
86+
87+ if kernel :
88+ kernels .add (kernel )
89+
90+ # Sort Kernel versions
91+ versions = {}
92+ for kernel in kernels :
93+ try :
94+ version , build = kernel .split ('-' , 1 )
95+ except ValueError :
96+ version = kernel
97+ build = ''
98+ versions [kernel ] = list (
99+ int (ver ) for ver in version .split ('.' )) + [build ]
100+ kernels = sorted (versions .keys (), key = versions .get , reverse = True )
101+
102+ # Return more recent kernel package that match version requirement
103+ for kernel in kernels :
104+ if kernel .startswith (kernel_version ):
105+ return kernel
106+
107+ raise RuntimeError (
108+ 'No kernel matching to "%s". Available kernel versions: %s' % (
109+ kernel_version , ', ' .join (reversed (kernels ))))
110+
111+
112+ def _deb_kernel_package (kernel , dist , arch , name ):
113+ """
114+ Return kernel package name.
115+
116+ Args:
117+ kernel (str): Kernel version.
118+ dist (str): Distribution.
119+ arch (str): Architecture.
120+ name (str): Package name.
121+
122+ Returns:
123+ str: kernel package.
124+ """
125+ # Define package suffix
126+ if dist == 'Ubuntu' :
127+ suffix = 'generic'
128+ elif name == 'linux-image' :
129+ suffix = arch .replace ('x86_64' , 'amd64' )
130+ else :
131+ suffix = 'common'
132+
133+ return '-' .join ((name , kernel , suffix ))
134+
135+
136+ def deb_kernel (packages , kernel_version , dist , arch , name ):
137+ """
138+ Return kernel package to install.
139+
140+ Args:
141+ packages (dict): apt-cache showpkg output.
142+ kernel_version (str): Kernel version to install.
143+ dist (str): Distribution.
144+ arch (str): Architecture.
145+ name (str): Package name.
146+
147+ Returns:
148+ str: kernel package to install.
149+ """
150+ return _deb_kernel_package (
151+ _deb_kernel_info (packages , kernel_version ), dist , arch , name )
152+
153+
154+ def deb_installed_kernel (installed , packages , kernel_version ):
155+ """
156+ Return old kernel packages to remove.
157+
158+ Args:
159+ installed (dict): dpkg -l output.
160+ packages (dict): apt-cache showpkg output.
161+ kernel_version (str): Kernel version to install.
162+
163+ Returns:
164+ list of str: Kernel packages to remove.
165+ """
166+ # Filter installed package to keep
167+ to_keep = _deb_kernel_info (packages , kernel_version )
168+
169+ # Return installed package to remove
170+ to_remove = []
171+ for line in installed ['stdout' ].splitlines ():
172+ if ' linux-' not in line :
173+ continue
174+
175+ package = line .split ()[1 ]
176+ if ((package .startswith ('linux-image-' ) or
177+ package .startswith ('linux-headers-' )) and not (
178+ package .startswith ('linux-image-' + to_keep ) or
179+ package .startswith ('linux-headers-' + to_keep ))):
180+ to_remove .append (package )
181+
182+ return to_remove
183+
184+
62185class FilterModule (object ):
63186 """Return filter plugin"""
64187
65188 @staticmethod
66189 def filters ():
67190 """Return filter"""
68- return {'rhel_kernel' : rhel_kernel , 'rhel_repo' : rhel_repo }
191+ return {'rhel_kernel' : rhel_kernel ,
192+ 'rhel_repo' : rhel_repo ,
193+ 'deb_kernel' : deb_kernel ,
194+ 'deb_installed_kernel' : deb_installed_kernel }
0 commit comments