Package linda :: Module collector
[hide private]

Source Code for Module linda.collector

 1  import re 
 2  from linda.debug import dprint 
 3  from linda.funcs import run_external_cmd, ExtCmdException 
 4  from linda.parser.unixperm import UnixPermParser 
 5   
6 -class Collector:
7 - def __init__(self, type, lab, files):
8 self.files = {'files': {}, 'dirs': {}, 'elf': []} 9 self.output = {'file': {}, 'objdump': {}} 10 self.lab = lab 11 self._files = files 12 self.elfre = re.compile(r'ELF.*(executable|shared object|relocatable)') 13 self.bpr = re.compile(r'^(?P<perm>[^ ]+) (?P<owner>[^ ]+).+\d{2}:\d{2}[:\d{2}]? \.?(?P<file>.+?)( (->|link to) .+)?$') 14 getattr(self, '%s_parse' % type)() 15 self.run_file() 16 if type == 'bin': 17 self.determine_elf() 18 self.run_objdump()
19
20 - def bin_parse(self):
21 for line in filter(None, self._files.split('\n')): 22 bits = re.match(self.bpr, line).groupdict() 23 if bits['file'] == '/': 24 continue 25 if bits['file'].endswith('/') and bits['file'][1:-1]: 26 self.files['dirs'][bits['file'][:-1]] = \ 27 [UnixPermParser(bits['perm']), bits['owner']] 28 else: 29 self.files['files'][bits['file']] = UnixPermParser(bits['perm'])
30
31 - def src_parse(self):
32 src_files = self.files['files'].fromkeys(self._files) 33 self.files['files'] = {} 34 for file in src_files.keys(): 35 cur_file = file 36 if file.startswith('./'): 37 cur_file = file[len('./'):] 38 self.files['files'][cur_file] = src_files[file]
39
40 - def run_file(self):
41 lists_to_run = [''] 42 for file in map(lambda x: '%s/%s' % (self.lab, x), \ 43 self.files['files'].keys()): 44 if len(lists_to_run[-1]) + len(file) < 65535: 45 lists_to_run[-1] += "'%s' " % file 46 else: 47 lists_to_run.append("'%s' " % file) 48 file_output = [] 49 for list in filter(None, lists_to_run): 50 try: 51 file_output.append(run_external_cmd('file -F "improbable_linda_separator: " %s' % list)) 52 except ExtCmdException: 53 dprint(_('Failed to run %s') % list, 2) 54 for output in file_output: 55 for line in output.split('\n'): 56 split_line = line.split('improbable_linda_separator: ') 57 cur_file = re.sub('%s/' % self.lab, '', split_line[0].strip()) 58 self.output['file'][cur_file] = split_line[1].strip()
59
60 - def determine_elf(self):
61 for file in self.output['file'].keys(): 62 if re.search(self.elfre, self.output['file'][file]): 63 self.files['elf'].append(file)
64
65 - def run_objdump(self):
66 for file in self.files['elf']: 67 self.output['objdump'][file] = \ 68 run_external_cmd('LC_ALL=C objdump -hpT "%s/%s"' % \ 69 (self.lab, file), 1)
70
71 - def __call__(self, kind, key):
72 if hasattr(self, kind): 73 if getattr(self, kind).has_key(key): 74 return getattr(self, kind)[key]
75
76 - def set(self, kind, key, data):
77 if hasattr(self, kind): 78 getattr(self, kind)[key] = data 79 else: 80 raise KeyError
81