diff --git a/branches/ucs-4.0/ucs-4.0-1/test/ucs-test/tests/60_umc/08_logrotate b/branches/ucs-4.0/ucs-4.0-1/test/ucs-test/tests/60_umc/08_logrotate index 721cabd..1f3e3fd 100755 --- a/branches/ucs-4.0/ucs-4.0-1/test/ucs-test/tests/60_umc/08_logrotate +++ b/branches/ucs-4.0/ucs-4.0-1/test/ucs-test/tests/60_umc/08_logrotate @@ -1,7 +1,5 @@ #!/usr/share/ucs-test/runner python ## desc: Logrotation should trigger UMC components to reopen their logfiles -## roles: -## - domaincontroller_master ## packages: ## - univention-management-console ## - univention-management-console-frontend @@ -14,6 +12,7 @@ from subprocess import call, Popen, PIPE from univention.testing.utils import fail + class LogrotateError(Exception): pass @@ -22,12 +21,12 @@ class LogrotateService(object): def __init__(self, service, logfile_pattern): self.service = service self.logfile_pattern = logfile_pattern + self.old_stat = None @property def pgrep_pattern(self): return r'^/usr/bin/python.*%s.*' % (self.service,) - @property def pid(self): process = Popen(['pgrep', '-x', '-f', self.pgrep_pattern], stdout=PIPE) stdout, stderr = process.communicate() @@ -40,59 +39,63 @@ class LogrotateService(object): raise LogrotateError('multiple services of %s are started: pids=%s' % (self.service, pids)) return pids[0] - @property def logfile(self): - pid = self.pid - logfile = None + pid = self.pid() for file_ in os.listdir('/proc/%d/fd/' % (pid,)): file_ = os.path.join('/proc/%d/fd/' % (pid,), file_) if os.path.islink(file_) and os.readlink(file_).startswith(self.logfile_pattern): - logfile = file_ - break - return logfile + return file_ + + def stat(self): + logfile = self.logfile() + if not logfile: + raise LogrotateError('No logfile for service %s found.' % (self.service,)) + try: + stat = os.stat(logfile) + print logfile, stat + except OSError: + raise LogrotateError('%s does not exists (service=%s)' % (logfile, self.service)) + return stat def service_restart(self): call(['invoke-rc.d', os.path.basename(self.service), 'restart']) sleep(1) # give time to restart - def logrotate(self): - if call(['logrotate', '-f', '/etc/logrotate.d/univention-management-console']): - raise LogrotateError('logrotate failed') - - def main(self): + def pre(self): self.service_restart() + self.old_stat = self.stat() - logfile = self.logfile - if not logfile: - raise LogrotateError('No logfile for service %s found.' % (self.service,)) - if not os.path.exists(os.readlink(logfile)): # readlink -> "/var/log/univention/management-console-server.log" - raise LogrotateError('%s does not exists (before logrotating) (service=%s)' % (logfile, self.service)) - - self.logrotate() - - if not os.path.exists(os.readlink(logfile)): # readlink -> "/var/log/univention/management-console-server.log (deleted)" - raise LogrotateError('Logrotate was executed, the service %s did not reopen the logfile.' % (self.service,)) - - -class UmcServer(LogrotateService): + def post(self): + for i in xrange(10): + if i: + sleep(1) + new_stat = self.stat() + if not os.path.samestat(self.old_stat, new_stat): + return + raise LogrotateError('Logrotate was executed, the service %s did not reopen the logfile %s.' % ( + self.service, logfile)) - def __init__(self): - super(UmcServer, self).__init__('/usr/sbin/univention-management-console-server', '/var/log/univention/management-console-server.log') - -class UmcWebServer(LogrotateService): - - def __init__(self): - super(UmcWebServer, self).__init__('/usr/sbin/univention-management-console-web-server', '/var/log/univention/management-console-web-server.log') +def logrotate(): + cmd = ('logrotate', '-v', '-f', '/etc/logrotate.d/univention-management-console') + if call(cmd): + raise LogrotateError('logrotate failed: %r' % (cmd,)) def main(): - for ServiceClass in (UmcServer, UmcWebServer): - service = ServiceClass() - try: - service.main() - except LogrotateError as exc: - fail('ERROR: %s' % (exc,)) + services = [ + LogrotateService('/usr/sbin/univention-management-console-server', '/var/log/univention/management-console-server.log'), + LogrotateService('/usr/sbin/univention-management-console-web-server', '/var/log/univention/management-console-web-server.log'), + ] + try: + for service in services: + service.pre() + logrotate() + for service in services: + service.post() + except LogrotateError as exc: + fail('ERROR: %s' % (exc,)) + if __name__ == '__main__': main()