#!/usr/bin/python3 # arekm, 2008 # remove from __future__ import print_function 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-.*)$') #|\ #crash-.*|\ #dahdi-linux-.*|\ #e1000e-.*|\ #igb-.*|\ #ipset-.*|\ #iscsitarget-.*|\ #ixgbe-.*|\ #kernel-net-wl-.*|\ #lin_tape-.*|\ #linux-fusion-.*|\ #linuxrdac-.*|\ #lirc-.*|\ #lttng-modules-.*|\ #madwifi-ng-.*|\ #nvidiabl-.*|\ #open-vm-tools-.*|\ #openvswitch-.*|\ #r8168-.*|\ #spl-.*|\ #tpm_emulator-.*|\ #VirtualBox-.*|\ #vpb-driver-.*|\ #xorg-driver-video-fglrx-.*|\ #xorg-driver-video-fglrx-legacy-.*|\ #xorg-driver-video-nvidia-.*|\ #xorg-driver-video-nvidia-legacy3-.*|\ #xorg-driver-video-nvidia-legacy-304xx-.*|\ #xtables-addons-.*)$') ts = rpm.TransactionSet("", (rpm.RPMVSF_NOHDRCHK or rpm.RPMVSF_NEEDPAYLOAD)) def compare(f1, f2): try: fd1 = os.open(os.path.join(dir, f1), os.O_RDONLY) except Exception as e: print(e) # ignore non-files return 0 try: fd2 = os.open(os.path.join(dir, f2), os.O_RDONLY) except Exception as e: print(e) # ignore non-files return 0 try: h1 = ts.hdrFromFdno(fd1) except Exception as e: print("hdrFromFdno for %s failed: %s" % (f1, e)) os.close(fd1) os.close(fd2) return 0 try: h2 = ts.hdrFromFdno(fd2) except Exception as e: print("hdrFromFdno for %s failed: %s" % (f2, e)) os.close(fd1) os.close(fd2) return 0 os.close(fd1) os.close(fd2) try: l1 = rpm.versionCompare(h1, h2) except ValueError: l1 = -1 try: l2 = rpm.versionCompare(h2, h1) except ValueError: l2 = -1 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 name in files: if name in dupes: dupes[name].append(file) else: dupes[name] = [ files[name] ] dupes[name].append(file) else: files[name] = file for i in iter(dupes.keys()): for old in find_old(dupes[i])[1:]: print("removing: %s" % old) os.system("/home/pld/admins/th/pld-ftp-admin/scripts/remove.py test %s" % old)