#!/usr/bin/python # arekm, 2008 # remove import os import re import time import rpm import sys re_rpm = re.compile(r'.*\.rpm$') re_nvr = re.compile('^(.*)-([^-]*)-([^-]*)\.rpm$') dir = '/home/pld/admins/th/ftp/test/SRPMS/RPMS' ignore = re.compile('^(kernel-.*|\ dahdi-linux-.*|\ e1000e-.*|\ igb-.*|\ ipset-.*|\ ixgbe-.*|\ linuxrdac-.*|\ lirc-.*|\ madwifi-ng-.*|\ open-vm-tools-.*|\ r8168-.*|\ VirtualBox-.*|\ xorg-driver-video-fglrx-.*|\ xorg-driver-video-fglrx-legacy-12.x-.*|\ xorg-driver-video-nvidia-.*|\ xtables-addons-.*|\ iscsitarget-.*|\ openvswitch-.*|\ xorg-driver-video-nvidia-legacy3-.*)$') ts = rpm.TransactionSet("", (rpm.RPMVSF_NOHDRCHK or rpm.RPMVSF_NEEDPAYLOAD or rpm.RPMVSF_NODSAHEADER)) def compare(f1, f2): try: fd1 = os.open(os.path.join(dir, f1), os.O_RDONLY) except Exception, e: print e # ignore non-files return 0 try: fd2 = os.open(os.path.join(dir, f2), os.O_RDONLY) except Exception, e: print e # ignore non-files return 0 try: h1 = ts.hdrFromFdno(fd1) except Exception, e: print "hdrFromFdno for %s failed: %s" % (f1, e) os.close(fd1) os.close(fd2) return 0 try: h2 = ts.hdrFromFdno(fd2) except Exception, e: print "hdrFromFdno for %s failed: %s" % (f2, e) os.close(fd1) os.close(fd2) return 0 os.close(fd1) os.close(fd2) l1 = rpm.versionCompare(h1, h2) l2 = rpm.versionCompare(h2, h1) if l1 > 0 and l2 > 0: return 0 return -l1 def find_old(files): return sorted(files, compare) files = {} dupes = {} for file in os.listdir(dir): if not re_rpm.match(file): continue if ignore.match(file): continue m = re_nvr.match(file) if not m: print "problem with: %s" % file sys.exit(1) if len(sys.argv) == 0: p = os.path.join(dir, file) mtime = os.stat(p).st_mtime if mtime > time.time() - 3*86400: continue name = m.group(1) if files.has_key(name): if dupes.has_key(name): dupes[name].append(file) else: dupes[name] = [ files[name] ] dupes[name].append(file) else: files[name] = file for i in dupes.iterkeys(): for old in find_old(dupes[i])[1:]: os.system("/home/pld/admins/th/pld-ftp-admin/scripts/remove.py test %s" % old)