Denis Egorenko | 4e45a70 | 2019-10-02 14:57:10 +0400 | [diff] [blame] | 1 | # -*- coding: utf-8 -*- |
| 2 | ''' |
| 3 | Manage Kernel switch from generic to hwe |
| 4 | |
| 5 | ''' |
| 6 | import logging |
| 7 | import json |
| 8 | import os |
| 9 | import re |
| 10 | import salt.utils |
| 11 | |
| 12 | logger = logging.getLogger(__name__) |
| 13 | stream = logging.StreamHandler() |
| 14 | logger.addHandler(stream) |
| 15 | kernel_state_backup = '/etc/salt/.kernel_state_backup' |
| 16 | |
| 17 | |
| 18 | def _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 | |
| 29 | def 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 | |
| 40 | def 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 | |
| 74 | def 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 |