fixed detection of deleted files on linux

This commit is contained in:
Fredrik Eriksson 2019-04-07 14:29:54 +02:00
parent 6f19bf71ca
commit d08fa867d4
No known key found for this signature in database
GPG Key ID: 8825C73A0FD1502A
3 changed files with 57 additions and 15 deletions

11
bin/sau
View File

@ -5,6 +5,7 @@ import logging.handlers
import os import os
import platform import platform
import sys import sys
import time
import sau import sau
import sau.services import sau.services
@ -14,14 +15,20 @@ import sau.platforms
def main(): def main():
conf = sau.config conf = sau.config
log = logging.getLogger(sau.LOGNAME) log = logging.getLogger(sau.LOGNAME)
reboot_required = False
platform = sau.platforms.get_platform() platform = sau.platforms.get_platform()
#reboot_required = platform.system_upgrade() reboot_required = platform.system_upgrade()
platform.pkg_upgrade() platform.pkg_upgrade()
reboot_recommended = sau.services.restart_services() reboot_recommended = sau.services.restart_services()
if conf.getboolean('default', 'do_reboot', fallback=False): if conf.getboolean('default', 'do_reboot', fallback=False):
if reboot_required:
log.warning('Rebooting because of a system upgrade')
elif reboot_recommended:
log.warning('Rebooting because service restarts did not close all deleted files')
if reboot_required or reboot_recommended: if reboot_required or reboot_recommended:
# sleep a little to make sure the above log-messages has reached
# syslog before we reboot
time.sleep(1)
os.system('/sbin/reboot') os.system('/sbin/reboot')

View File

@ -72,7 +72,7 @@ def identify_service_from_bin(exe):
def restart_service(service): def restart_service(service):
log = logging.getLogger(sau.LOGNAME) log = logging.getLogger(sau.LOGNAME)
cmd = [ SERVICE_PATH, service, 'restart' ] cmd = [ RC_SERVICE_PATH, service, 'restart' ]
log.debug('Executing "{}"'.format(' '.join(cmd))) log.debug('Executing "{}"'.format(' '.join(cmd)))
proc = subprocess.Popen( proc = subprocess.Popen(
cmd, cmd,
@ -92,6 +92,7 @@ def restart_service(service):
log.info("restarted service {}".format(service)) log.info("restarted service {}".format(service))
def system_upgrade(): def system_upgrade():
log = logging.getLogger(sau.LOGNAME)
log.debug('Gentoo has no concept of system upgrade, ignoring...') log.debug('Gentoo has no concept of system upgrade, ignoring...')
return False return False
@ -179,18 +180,11 @@ def _get_upgradable_packages_eix():
return upgradable return upgradable
def _get_upgradable_packages():
log = loggin.getLogger(sau.LOGNAME)
conf = sau.config
pretend_re = re.compile(r'^\[ebuild ([^\]]*)\] ([^ ]+)( \[([^\])]\])?')
def pkg_upgrade(): def pkg_upgrade():
log = logging.getLogger(sau.LOGNAME) log = logging.getLogger(sau.LOGNAME)
conf = sau.config conf = sau.config
_sync_portage() _sync_portage()
#packages = _get_upgradable_packages()
# [ebuild U ] media-plugins/alsa-plugins-1.1.8 [1.1.6] # [ebuild U ] media-plugins/alsa-plugins-1.1.8 [1.1.6]
pretend_re = re.compile(r'^\[ebuild ([^\]]*)\] ([^ ]+)( \[[^\]]+\])?') pretend_re = re.compile(r'^\[ebuild ([^\]]*)\] ([^ ]+)( \[[^\]]+\])?')
@ -240,7 +234,7 @@ def pkg_upgrade():
min_diff = conf.getint('packages', name, fallback=default_version_diff) min_diff = conf.getint('packages', name, fallback=default_version_diff)
diff = sau.helpers.version_diff(version, old) diff = sau.helpers.version_diff(version, old)
if min_diff >= diff: if min_diff >= diff:
log.debug('{}-{} -> {} configured level {} >= pkg level {}'.format(name, old, version, min_diff, diff)) log.info('{}-{} -> {} configured level {} >= pkg level {}'.format(name, old, version, min_diff, diff))
else: else:
log.warning('{}-{} -> {} configured level {} < pkg level {}'.format(name, old, version, min_diff, diff)) log.warning('{}-{} -> {} configured level {} < pkg level {}'.format(name, old, version, min_diff, diff))
do_rebuild = False do_rebuild = False
@ -259,8 +253,8 @@ def pkg_upgrade():
out = out.decode('utf-8') out = out.decode('utf-8')
err = err.decode('utf-8') err = err.decode('utf-8')
if not proc.returncode == 0 or err: if proc.returncode != 0 or err:
log.error('emerge pretend returned {}'.format(proc.returncode)) log.error('emerge returned {}'.format(proc.returncode))
for line in out.splitlines(): for line in out.splitlines():
log.error('stdout: {}'.format(line)) log.error('stdout: {}'.format(line))
for line in err.splitlines(): for line in err.splitlines():
@ -268,5 +262,27 @@ def pkg_upgrade():
else: else:
log.info('upgrade complete') log.info('upgrade complete')
for line in out.splitlines(): for line in out.splitlines():
log.warning('stdout: {}'.format(line)) if line.startswith(' * '):
log.warning(line)
cmd = [ EMERGE_PATH, '--color', 'n', '-q', '@preserved-rebuild' ]
log.debug('Executing "{}"'.format(' '.join(cmd)))
proc = subprocess.Popen(
cmd,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE)
out, err = proc.communicate()
out = out.decode('utf-8')
err = err.decode('utf-8')
if proc.returncode != 0 or err:
log.error('preserved-rebuild returned {}'.format(proc.returncode))
for line in out.splitlines():
log.error('stdout: {}'.format(line))
for line in err.splitlines():
log.error('stderr: {}'.format(line))
else:
log.info('preserved-rebuild complete')
for line in out.splitlines():
if line.startswith(' * '):
log.warning(line)

View File

@ -11,11 +11,28 @@ import sau
import sau.errors import sau.errors
import sau.platforms import sau.platforms
proc_fd_map_re = re.compile(r'^.*(/[^\(]*) \(deleted\)$')
def _get_deleted_open_files(proc): def _get_deleted_open_files(proc):
log = logging.getLogger(sau.LOGNAME)
files = set() files = set()
# try the linux-way first
maps_file = '/proc/{}/maps'.format(proc.pid)
if os.path.isfile(maps_file):
with open(maps_file, 'r') as f:
for line in f:
match = re.match(proc_fd_map_re, line)
if match:
files.add(match.group(1))
return files
# on FreeBSD psutils open_files() helpfully returns a null path if a file
# has been deleted.
try: try:
for f in proc.open_files(): for f in proc.open_files():
if 'lvmetad' in f.path:
log.debug(f)
if f.path and os.path.exists(f.path): if f.path and os.path.exists(f.path):
continue continue
else: else:
@ -108,9 +125,11 @@ def restart_services():
log.warning('Could not find service for process {}'.format(proc)) log.warning('Could not find service for process {}'.format(proc))
continue continue
if service_name:
services.add(service_name) services.add(service_name)
for service in services: for service in services:
log.info('Restarting service {}'.format(service))
platform.restart_service(service) platform.restart_service(service)
recommend_restart = False recommend_restart = False