tags 566597 + patch thanks Hi,
attached you'll find a patch which implements the wanted feature. I really dislike the (a,b) = self.run(['apt-get','install', '-y', 'logrotate']) line, but I have NO idea how to tell piuparts we need logrotate in the chroot now. I hope you can fix that one somehow ;) Regards Evgeni, tired but happy
Index: piuparts.py =================================================================== --- piuparts.py (revision 635) +++ piuparts.py (working copy) @@ -148,6 +148,7 @@ self.list_installed_files = False self.no_upgrade_test = False self.skip_cronfiles_test = False + self.skip_logrotatefiles_test = False self.check_broken_symlinks = True self.warn_broken_symlinks = False self.debfoster_options = None @@ -850,6 +851,12 @@ if not settings.skip_cronfiles_test and cronfiles: self.check_output_cronfiles(cronfiles_list) + if not settings.skip_logrotatefiles_test: + logrotatefiles, logrotatefiles_list = self.check_if_logrotatefiles(packages) + + if not settings.skip_logrotatefiles_test and logrotatefiles: + self.check_output_logrotatefiles(logrotatefiles_list) + # Then purge all packages being depended on. self.remove_or_purge("purge", deps_to_purge) @@ -1033,6 +1040,51 @@ if failed: panic() + def check_if_logrotatefiles(self, packages): + """Check if the packages have logrotate files under /etc/logrotate.d and in case positive, + it returns the list of files. """ + + dir = self.relative("var/lib/dpkg/info") + list = [] + has_logrotatefiles = False + for p in packages: + basename = p + ".list" + + if not os.path.exists(os.path.join(dir,basename)): + continue + + f = file(os.path.join(dir,basename), "r") + for line in f: + pathname = line.strip() + if pathname.startswith("/etc/logrotate.d/"): + if os.path.isfile(self.relative(pathname.strip("/"))): + if not has_logrotatefiles: + has_logrotatefiles = True + list.append(pathname) + logging.info("Package " + p + " contains logrotate file: " + pathname) + f.close() + + return has_logrotatefiles, list + + def check_output_logrotatefiles (self, list): + """Check if a given list of logrotatefiles has any output. Executes + logrotate file as logrotate would do from cron (except for SHELL)""" + failed = False + # XXX That's a crude hack. Can't we define a set of needed packages differently? + (a,b) = self.run(['apt-get','install', '-y', 'logrotate']) + for file in list: + + if not os.path.exists(self.relative(file.strip("/"))): + continue + + (retval, output) = self.run(['/usr/sbin/logrotate', file]) + if output: + failed = True + logging.error("FAIL: Logrotate file %s has output with package removed" % file) + + if failed: + panic() + def run_scripts (self, step): """ Run custom scripts to given step post-install|remove|purge""" @@ -1881,6 +1933,10 @@ action="store_true", default=False, help="Skip testing the output from the cron files.") + parser.add_option("--skip-logrotatefiles-test", + action="store_true", default=False, + help="Skip testing the output from the logrotate files.") + parser.add_option("--skip-minimize", action="store_true", default=True, help="Skip minimize chroot step. This is the default now.") @@ -1935,6 +1991,7 @@ settings.list_installed_files = opts.list_installed_files settings.no_upgrade_test = opts.no_upgrade_test settings.skip_cronfiles_test = opts.skip_cronfiles_test + settings.skip_logrotatefiles_test = opts.skip_logrotatefiles_test settings.keyring = opts.keyring settings.do_not_verify_signatures = opts.do_not_verify_signatures if settings.do_not_verify_signatures: