1*eb8dc403SDave Cobbley#!/usr/bin/env python3 2*eb8dc403SDave Cobbley 3*eb8dc403SDave Cobbleyimport os 4*eb8dc403SDave Cobbleyimport sys 5*eb8dc403SDave Cobbleyimport glob 6*eb8dc403SDave Cobbleyimport shutil 7*eb8dc403SDave Cobbleyimport errno 8*eb8dc403SDave Cobbley 9*eb8dc403SDave Cobbleydef mkdir(d): 10*eb8dc403SDave Cobbley try: 11*eb8dc403SDave Cobbley os.makedirs(d) 12*eb8dc403SDave Cobbley except OSError as e: 13*eb8dc403SDave Cobbley if e.errno != errno.EEXIST: 14*eb8dc403SDave Cobbley raise e 15*eb8dc403SDave Cobbley 16*eb8dc403SDave Cobbleyif len(sys.argv) < 5: 17*eb8dc403SDave Cobbley print("Incorrect number of arguments specified") 18*eb8dc403SDave Cobbley print("syntax: gen-lockedsig-cache <locked-sigs.inc> <input-cachedir> <output-cachedir> <nativelsbstring> [filterfile]") 19*eb8dc403SDave Cobbley sys.exit(1) 20*eb8dc403SDave Cobbley 21*eb8dc403SDave Cobbleyfilterlist = [] 22*eb8dc403SDave Cobbleyif len(sys.argv) > 5: 23*eb8dc403SDave Cobbley print('Reading filter file %s' % sys.argv[5]) 24*eb8dc403SDave Cobbley with open(sys.argv[5]) as f: 25*eb8dc403SDave Cobbley for l in f.readlines(): 26*eb8dc403SDave Cobbley if ":" in l: 27*eb8dc403SDave Cobbley filterlist.append(l.rstrip()) 28*eb8dc403SDave Cobbley 29*eb8dc403SDave Cobbleyprint('Reading %s' % sys.argv[1]) 30*eb8dc403SDave Cobbleysigs = [] 31*eb8dc403SDave Cobbleywith open(sys.argv[1]) as f: 32*eb8dc403SDave Cobbley for l in f.readlines(): 33*eb8dc403SDave Cobbley if ":" in l: 34*eb8dc403SDave Cobbley task, sig = l.split()[0].rsplit(':', 1) 35*eb8dc403SDave Cobbley if filterlist and not task in filterlist: 36*eb8dc403SDave Cobbley print('Filtering out %s' % task) 37*eb8dc403SDave Cobbley else: 38*eb8dc403SDave Cobbley sigs.append(sig) 39*eb8dc403SDave Cobbley 40*eb8dc403SDave Cobbleyprint('Gathering file list') 41*eb8dc403SDave Cobbleyfiles = set() 42*eb8dc403SDave Cobbleyfor s in sigs: 43*eb8dc403SDave Cobbley p = sys.argv[2] + "/" + s[:2] + "/*" + s + "*" 44*eb8dc403SDave Cobbley files |= set(glob.glob(p)) 45*eb8dc403SDave Cobbley p = sys.argv[2] + "/%s/" % sys.argv[4] + s[:2] + "/*" + s + "*" 46*eb8dc403SDave Cobbley files |= set(glob.glob(p)) 47*eb8dc403SDave Cobbley 48*eb8dc403SDave Cobbleyprint('Processing files') 49*eb8dc403SDave Cobbleyfor f in files: 50*eb8dc403SDave Cobbley sys.stdout.write('Processing %s... ' % f) 51*eb8dc403SDave Cobbley _, ext = os.path.splitext(f) 52*eb8dc403SDave Cobbley if not ext in ['.tgz', '.siginfo', '.sig']: 53*eb8dc403SDave Cobbley # Most likely a temp file, skip it 54*eb8dc403SDave Cobbley print('skipping') 55*eb8dc403SDave Cobbley continue 56*eb8dc403SDave Cobbley dst = os.path.join(sys.argv[3], os.path.relpath(f, sys.argv[2])) 57*eb8dc403SDave Cobbley destdir = os.path.dirname(dst) 58*eb8dc403SDave Cobbley mkdir(destdir) 59*eb8dc403SDave Cobbley 60*eb8dc403SDave Cobbley src = os.path.realpath(f) 61*eb8dc403SDave Cobbley if os.path.exists(dst): 62*eb8dc403SDave Cobbley os.remove(dst) 63*eb8dc403SDave Cobbley if (os.stat(src).st_dev == os.stat(destdir).st_dev): 64*eb8dc403SDave Cobbley print('linking') 65*eb8dc403SDave Cobbley try: 66*eb8dc403SDave Cobbley os.link(src, dst) 67*eb8dc403SDave Cobbley except OSError as e: 68*eb8dc403SDave Cobbley print('hard linking failed, copying') 69*eb8dc403SDave Cobbley shutil.copyfile(src, dst) 70*eb8dc403SDave Cobbley else: 71*eb8dc403SDave Cobbley print('copying') 72*eb8dc403SDave Cobbley shutil.copyfile(src, dst) 73*eb8dc403SDave Cobbley 74*eb8dc403SDave Cobbleyprint('Done!') 75