blob: 3e634cbd8697dc1fdd7a69e83efe6cc859e714ae [file] [log] [blame]
Denis Egorenko4e45a702019-10-02 14:57:10 +04001# -*- coding: utf-8 -*-
2'''
3Manage Kernel switch from generic to hwe
4
5'''
6import logging
7import json
8import os
9import re
10import salt.utils
11
12logger = logging.getLogger(__name__)
13stream = logging.StreamHandler()
14logger.addHandler(stream)
15kernel_state_backup = '/etc/salt/.kernel_state_backup'
16
17
18def _get_hwe_packages(only_kernel=True):
19 distribRelease = __salt__['grains.get']('lsb_distrib_release')
20 hwe_pkgs = [ 'linux-image-generic-hwe-{0}'.format(distribRelease),
21 'linux-image-extra-virtual-hwe-{0}'.format(distribRelease) ]
22 if only_kernel:
23 return hwe_pkgs
24
25 return hwe_pkgs + [ 'linux-generic-hwe-{0}'.format(distribRelease),
26 'linux-headers-virtual-hwe-{0}'.format(distribRelease) ]
27
28
29def check_hwe_kernel():
30 pgks_res = {}
31 for pkg in _get_hwe_packages():
32 try:
33 pgks_res[pkg] = __salt__['pkg.info_installed'](pkg)
34 except:
35 pgks_res[pkg] = 'Not installed'
36 continue
37 return pgks_res
38
39
40def switch_kernel(dry_run=False, only_kernel=True):
41 kernel_state = {}
42 kernel = __salt__['cmd.shell']('uname -r | cut -f 1 -d "-"')
43 hwe_pkgs_array = _get_hwe_packages(only_kernel)
44 hwe_pkgs = ','.join(hwe_pkgs_array)
45 if dry_run:
46 kernel_state['to_install'] = hwe_pkgs_array
47 else:
48 kernel_state['installed'] = __salt__['pkg.install'](hwe_pkgs)
49 with open(kernel_state_backup, 'w') as f:
50 f.write(json.dumps(kernel_state))
51
52 gen_pkgs_to_remove = [ 'linux-image-generic', 'linux-headers-generic',
53 'linux-image-extra-virtual', 'linux-image-virtual',
54 'linux-signed-generic', 'linux-signed-image-generic' ]
55 installed_gen_pkg = __salt__['pkg.list_pkgs']()
56 for pkg in installed_gen_pkg:
57 if (re.match("^linux-headers.*-{0}-.*".format(kernel), pkg) or
58 re.match("^linux-image.*-{0}-.*".format(kernel), pkg) or
59 re.match("^linux-modules.*-{0}-.*".format(kernel), pkg) or
60 re.match("^linux-signed-image.*-{0}-.*".format(kernel), pkg)):
61 gen_pkgs_to_remove.append(pkg)
62
63 if dry_run:
64 kernel_state['to_remove'] = gen_pkgs_to_remove
65 else:
66 pkgs = __salt__['pkg.purge'](','.join(gen_pkgs_to_remove))
67 kernel_state['removed'] = pkgs['removed'].copy()
68 kernel_state['removed'].update(pkgs['installed'])
69 with open(kernel_state_backup, 'w') as f:
70 f.write(json.dumps(kernel_state))
71 return kernel_state
72
73
74def rollback_switch_kernel(dry_run=False):
75 kernel_info = {}
76 kernel_state = {}
77 if not os.path.isfile(kernel_state_backup):
78 return 'Nothing to rollback.'
79
80 with open(kernel_state_backup, 'r') as f:
81 kernel_info = json.loads(f.read())
82
83 gen_pkgs = []
84 for pkg,ver in kernel_info['removed'].items():
85 gen_pkgs.append('{0}={1}'.format(pkg, ver['old']))
86 hwe_pkgs = []
87 for pkg,ver in kernel_info['installed'].items():
88 hwe_pkgs.append(pkg)
89
90 if dry_run:
91 kernel_state['to_install'] = gen_pkgs
92 kernel_state['to_remove'] = hwe_pkgs
93 else:
94 kernel_state['installed'] = __salt__['pkg.install'](','.join(gen_pkgs))
95 pkgs = __salt__['pkg.purge'](','.join(hwe_pkgs))
96 kernel_state['removed'] = pkgs['removed'].copy()
97 kernel_state['removed'].update(pkgs['installed'])
98 os.remove(kernel_state_backup)
99
100 return kernel_state