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