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
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
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
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
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
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
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
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