#! /usr/bin/python # # Copyright (c) 2006 by Aurelien Foret <orelien@chez.com> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. import os from util import * from stat import * class pmrule: """Rule object """ def __init__(self, rule): self.rule = rule self.false = 0 self.result = 0 def __str__(self): return "rule = %s" % self.rule def check(self, root, retcode, localdb, files): """ """ success = 1 [test, args] = self.rule.split("=") if test[0] == "!": self.false = 1 test = test.lstrip("!") [kind, case] = test.split("_") if "|" in args: [key, value] = args.split("|", 1) else: [key, value] = [args, None] if kind == "PACMAN": if case == "RETCODE": if retcode != int(key): success = 0 elif case == "OUTPUT": logfile = os.path.join(root, LOGFILE) if not os.access(logfile, os.F_OK): print "LOGFILE not found, cannot validate 'OUTPUT' rule" success = 0 elif not grep(os.path.join(root, LOGFILE), key): success = 0 else: print "PACMAN rule '%s' not found" % case success = -1 elif kind == "PKG": newpkg = localdb.db_read(key) if not newpkg: success = 0 else: vprint("\tnewpkg.checksum : %s" % newpkg.checksum) vprint("\tnewpkg.mtime : %s" % newpkg.mtime) if case == "EXIST": success = 1 elif case == "MODIFIED": if not localdb.ispkgmodified(newpkg): success = 0 elif case == "VERSION": if value != newpkg.version: success = 0 elif case == "GROUPS": if not value in newpkg.groups: success = 0 elif case == "PROVIDES": if not value in newpkg.provides: success = 0 elif case == "DEPENDS": if not value in newpkg.depends: success = 0 elif case == "OPTDEPENDS": if not value in newpkg.optdepends: success = 0 elif case == "REASON": if newpkg.reason != int(value): success = 0 elif case == "FILES": if not value in newpkg.files: success = 0 elif case == "BACKUP": found = 0 for f in newpkg.backup: name, md5sum = f.split("\t") if value == name: found = 1 if not found: success = 0 else: print "PKG rule '%s' not found" % case success = -1 elif kind == "FILE": filename = os.path.join(root, key) if case == "EXIST": if not os.path.isfile(filename): success = 0 elif case == "MODIFIED": for f in files: if f.name == key: if not f.ismodified(): success = 0 elif case == "MODE": if not os.path.isfile(filename): success = 0 else: mode = os.lstat(filename)[ST_MODE] if int(value,8) != S_IMODE(mode): success = 0 elif case == "TYPE": if value == "dir": if not os.path.isdir(filename): success = 0 elif value == "file": if not os.path.isfile(filename): success = 0 elif value == "link": if not os.path.islink(filename): success = 0 elif case == "PACNEW": if not os.path.isfile("%s%s" % (filename, PM_PACNEW)): success = 0 elif case == "PACORIG": if not os.path.isfile("%s%s" % (filename, PM_PACORIG)): success = 0 elif case == "PACSAVE": if not os.path.isfile("%s%s" % (filename, PM_PACSAVE)): success = 0 else: print "FILE rule '%s' not found" % case success = -1 else: print "Rule kind '%s' not found" % kind success = -1 if self.false and success != -1: success = not success self.result = success return success if __name__ != "__main__": rule = pmrule("PKG_EXIST=dummy") # vim: set ts=4 sw=4 et: