From 6f69be3f6a3a0036902e34e1df8516f3407c4507 Mon Sep 17 00:00:00 2001 From: Fredrik Eriksson Date: Thu, 18 Apr 2019 10:31:00 +0200 Subject: [PATCH] * allow mapping processes to multiple init-scripts * reverse-ish the version logic --- config.cfg | 45 +++++++++++++++++++++++++-------------------- sau/freebsd.py | 10 +++++----- sau/gentoo.py | 12 ++++++------ sau/helpers.py | 16 ++++++---------- sau/services.py | 23 ++++++++++++----------- 5 files changed, 54 insertions(+), 52 deletions(-) diff --git a/config.cfg b/config.cfg index 120b798..ad2af65 100644 --- a/config.cfg +++ b/config.cfg @@ -1,16 +1,16 @@ # Default settings in the default section (obviously) [default] -# version_diff represents (hopefully) the compatibility change for the package. -# It works by starting with the number of dots in the version scheme + 1, and -# then removes 1 for every field that is the same in the current and new -# version. Some examples: -# 1.0.0 -> 1.0.0 (level 0, a reinstall of the same version) -# 1.0.0 -> 1.0.1 (level 1) -# 1.0.0 -> 1.1.0 (level 2) -# 1.0.0 -> 2.0.0 (level 3) -# 1.0.0.0 -> 2.0.0.0 (level 4) -# 1.0.1 -> 1.0.1.1 (level 2, because that's how it turned out...) -min_version_diff=2 +# version_sensitivity represents how many point fields (counting from left) that must +# match in the versioning scheme for automatic upgrades to be allowed. Typically +# you want to set this to 1 to not auto-update major version that may brake things +# Some examples: +# 1.0.0 -> 1.0.0 (3) +# 1.0.0 -> 1.0.1 (2) +# 1.0.0 -> 1.1.0 (1) +# 1.0.0 -> 2.0.0 (0) +# 1.0.0.0 -> 2.0.0.0 (0) +# 1.0.1 -> 1.0.1.1 (3) +version_sensitivity=1 # sau can reboot on system upgrades (FreeBSD) or if the service restarts does # not close all deleted files (any platform) @@ -36,18 +36,20 @@ stderr_loglevel=debug syslog_loglevel=info -# The packages section contains = pairs to override the -# default min_version_diff. Note that package naming may differ depending on +# The packages section contains = pairs to override the +# default version_sensitivity. Note that package naming may differ depending on # platform [packages] -# Gentoo kernel stuff should be updated manually -sys-kernel/gentoo-sources=0 -sys-kernel/spl=0 -sys-fs/zfs-kmod=0 -dev-db/postgresql=1 +# Gentoo uses the category/package naming scheme +dev-db/postgresql=2 -# FreeBSD uses the short package name -gitlab=1 +# Gentoo kernel stuff should be updated manually +sys-kernel/gentoo-sources=-1 +sys-kernel/spl=-1 +sys-fs/zfs-kmod=-1 + +# FreeBSD uses the short package name (without category) +gitlab=2 # The processes section contains = @@ -58,6 +60,9 @@ gitlab=1 gitlab-workhorse=gitlab qemu-system-x86_64= +# sometimes multiple services will have to be restarted +#ruby24=puppetserver puppetdb + # The services section contains restart policy for specific services. # valid policies are 'ignore', 'warn', 'restart' and 'silent-restart'. # 'silent-restart' is like 'restart', but will not log a warning when diff --git a/sau/freebsd.py b/sau/freebsd.py index 91de5cc..2e980bc 100644 --- a/sau/freebsd.py +++ b/sau/freebsd.py @@ -107,16 +107,16 @@ def pkg_upgrade(): log.warning('stderr: {}'.format(line)) return False - default_version_diff = conf.getint('default', 'min_version_diff', fallback=2) + default_version_sens = conf.getint('default', 'version_sensitivity', fallback=1) for pkg in upgrades: pkg['upgrade_level'] = sau.helpers.version_diff(pkg['version_new'], pkg['version_old']) log.info('pkg upgrade available {}'.format(pkg)) - diff = conf.getint('packages', pkg['pkg'], fallback=default_version_diff) - if diff >= pkg['upgrade_level']: - log.debug('configured level {} >= pkg level {}'.format(diff, pkg['upgrade_level'])) + sens = conf.getint('packages', pkg['pkg'], fallback=default_version_sens) + if sens <= pkg['upgrade_level']: + log.debug('configured level {} <= pkg level {}'.format(sens, pkg['upgrade_level'])) pkg['upgrade'] = True else: - log.debug('configured level {} < pkg level {}'.format(diff, pkg['upgrade_level'])) + log.debug('configured level {} > pkg level {}'.format(sens, pkg['upgrade_level'])) pkg['upgrade'] = False for pkg in [x for x in upgrades if not x['upgrade']]: diff --git a/sau/gentoo.py b/sau/gentoo.py index 59eed96..b1ccaed 100644 --- a/sau/gentoo.py +++ b/sau/gentoo.py @@ -113,7 +113,7 @@ def pkg_upgrade(): ignore_re = re.compile(r'^(|.*caus.* rebuilds.*|.*scheduled for merge.*|.*waiting for lock on.*)$') - default_version_diff = conf.getint('default', 'min_version_diff', fallback=2) + default_version_sens = conf.getint('default', 'version_sensitivity', fallback=1) cmd = [ EMERGE_PATH, '--color', 'n', '-uDNpq', '@world' ] ret, out, err = sau.helpers.exec_cmd(cmd) @@ -144,12 +144,12 @@ def pkg_upgrade(): name = nmatch.group(1) version = nmatch.group(2) - min_diff = conf.getint('packages', name, fallback=default_version_diff) - diff = sau.helpers.version_diff(version, old) - if min_diff >= diff: - log.info('{}-{} -> {} configured level {} >= pkg level {}'.format(name, old, version, min_diff, diff)) + sens = conf.getint('packages', name, fallback=default_version_sens) + common = sau.helpers.version_diff(version, old) + if sens <= common: + log.info('{}-{} -> {} configured level {} <= pkg level {}'.format(name, old, version, sens, common)) else: - log.warning('{}-{} -> {} configured level {} < pkg level {}'.format(name, old, version, min_diff, diff)) + log.warning('{}-{} -> {} configured level {} > pkg level {}'.format(name, old, version, sens, common)) do_rebuild = False if not do_rebuild: diff --git a/sau/helpers.py b/sau/helpers.py index cafdd76..1433cdb 100644 --- a/sau/helpers.py +++ b/sau/helpers.py @@ -27,18 +27,14 @@ def exec_cmd(cmd, timeout=600, env = None): def version_diff(new, old): - """ This will return 100 if the versions are not properly compareable, - otherwise it will return the number of points that differ. Typically 3 is a - major upgrade, 2 minor, 1 point release and patch-levels. It can also - return 0 if both versions are the same.""" - new_list = list(new.rsplit('.')) - old_list = list(old.rsplit('.')) + """ This will return the number of common fields in the version scheme, + counted from the left. """ + new_list = list(new.split('.')) + old_list = list(old.split('.')) common = min(len(new_list), len(old_list)) - longest = max(len(new_list), len(old_list)) - diff = longest-common for i in range(0, common): if new_list[i] == old_list[i]: continue - return len(new_list) - i + diff - return 0 + return i + return common diff --git a/sau/services.py b/sau/services.py index a786841..e8850c2 100644 --- a/sau/services.py +++ b/sau/services.py @@ -136,18 +136,19 @@ def restart_services(): services[proc_name] = service_name processes[service_name] = [proc] - for service in [x for x in services.values() if x]: - policy = _get_service_restart_policy(service) - if policy == 'ignore': - log.info('Service "{}" ignored by configuration'.format(service)) - continue - elif policy == 'warn': - log.warning('Service "{}" has open deleted files and should be restarted'.format(service)) - continue + for service_all in [x for x in services.values() if x]: + for service in service_all.split(): + policy = _get_service_restart_policy(service) + if policy == 'ignore': + log.info('Service "{}" ignored by configuration'.format(service)) + continue + elif policy == 'warn': + log.warning('Service "{}" has open deleted files and should be restarted'.format(service)) + continue - if not policy.startswith('silent'): - log.warning('Restarting service {}'.format(service)) - platform.restart_service(service) + if not policy.startswith('silent'): + log.warning('Restarting service {}'.format(service)) + platform.restart_service(service) recommend_restart = False for proc in retest_procs: