def installmtz(package, prefix): try: src = resource_filename('%s.resources.maltego' % package, 'entities.mtz') if not os.path.exists(src): return prefix = os.path.join(prefix, 'config', 'Maltego', 'Entities') z = ZipFile(src) entities = filter(lambda x: x.endswith('.entity'), z.namelist()) for e in entities: data = z.open(e).read() xml = XML(data) category = xml.get('category') catdir = os.path.join(prefix, category) if not os.path.exists(catdir): os.mkdir(catdir) p = os.path.join(catdir, os.path.basename(e)) print 'Installing entity %s to %s...' % (e, p) with open(p, 'wb') as f: f.write(data) except ImportError: pass
def installmtz(package, prefix): try: src = resource_filename("%s.resources.maltego" % package, "entities.mtz") if not os.path.exists(src): return prefix = os.path.join(prefix, "config", "Maltego", "Entities") z = ZipFile(src) entities = filter(lambda x: x.endswith(".entity"), z.namelist()) for e in entities: data = z.open(e).read() xml = XML(data) category = xml.get("category") catdir = os.path.join(prefix, category) if not os.path.exists(catdir): os.mkdir(catdir) p = os.path.join(catdir, os.path.basename(e)) print "Installing entity %s to %s..." % (e, p) with open(p, "wb") as f: f.write(data) except ImportError: pass
def run(args): opts = parse_args(args) if path.exists(opts.outfile) and not opts.append and not \ parse_bool('%s already exists. Are you sure you want to overwrite it? [y/N]: ' % repr(opts.outfile), default='n'): exit(-1) entity_source = None if opts.mtz_file is None: d = detect_settings_dir() if maltego_version(d) >= '3.4.0': print(""" =========================== ERROR: NOT SUPPORTED =========================== Starting from Maltego v3.4.0 the 'canari generate-entities' command can no longer generate entity definition files from the Maltego configuration directory. Entities can only be generated from export files (*.mtz). To export entities navigate to the 'Manage' tab in Maltego, then click on the 'Export Entities' button and follow the prompts. Once the entities have been exported, run the following command: shell> canari generate-entities -m myentities.mtz =========================== ERROR: NOT SUPPORTED =========================== """) exit(-1) entity_source = DirFile( path.join(d, 'config', 'Maltego', 'Entities') ) else: entity_source = ZipFile(opts.mtz_file) entity_files = filter(lambda x: x.endswith('.entity'), entity_source.namelist()) namespaces = dict() excluded_entities = [] if opts.append: existing_entities = get_existing_entities(opts.outfile) # excluded_entities.extend([e._type_ for e in existing_entities]) for entity_class in existing_entities: excluded_entities.extend(entity_class._type_) if entity_class._type_.endswith('Entity'): namespaces[entity_class._namespace_] = entity_class.__name__ print 'Generating %s...' % repr(opts.outfile) outfile = open(opts.outfile, 'ab' if opts.append else 'wb') if opts.append: outfile.write('\n\n') else: outfile.write('#!/usr/bin/env python\n\nfrom canari.maltego.entities import EntityField, Entity\n\n\n') for entity_file in entity_files: xml = XML(entity_source.open(entity_file).read()) id_ = xml.get('id') if (opts.entity and id_ not in opts.entity) or id_ in excluded_entities: continue namespace_entity = id_.split('.') base_classname = None namespace = '.'.join(namespace_entity[:-1]) name = namespace_entity[-1] classname = name if (opts.namespace and namespace not in opts.namespace) or namespace in opts.exclude_namespace: continue if namespace not in namespaces: base_classname = '%sEntity' % (''.join([n.title() for n in namespace_entity[:-1]])) namespaces[namespace] = base_classname outfile.write('class %s(Entity):\n _namespace_ = %s\n\n' % (base_classname, repr(namespace))) else: base_classname = namespaces[namespace] for field in xml.findall('Properties/Fields/Field'): fields = [ 'name=%s' % repr(field.get('name')), 'propname=%s' % repr(normalize_fn(field.get('name'))), 'displayname=%s' % repr(field.get('displayName')) ] outfile.write('@EntityField(%s)\n' % ', '.join(fields)) outfile.write('class %s(%s):\n pass\n\n\n' % (classname, base_classname)) outfile.close() print 'done.'
from sys import argv zip = ZipFile(argv[1]) entities = filter(lambda x: x.endswith('.entity'), zip.namelist()) def normalize_fn(fn): # Get rid of starting underscores or numbers and bad chars for var names in python return sub(r'[^A-Za-z0-9]', '', sub(r'^[^A-Za-z]+', '', fn)) nses = dict() for e in entities: xml = XML(zip.open(e).read()) id_ = xml.get('id') ens = id_.split('.') base_classname = None namespace = '.'.join(ens[:-1]) name = ens[-1] classname = name if namespace not in nses: base_classname = '%sEntity' % (''.join([ n.title() for n in ens[:-1] ])) nses[namespace] = base_classname print 'class %s(Entity):\n namespace = %s\n\n' % (base_classname, repr(namespace)) else: base_classname = nses[namespace]
from sys import argv zip = ZipFile(argv[1]) entities = filter(lambda x: x.endswith('.entity'), zip.namelist()) def normalize_fn(fn): # Get rid of starting underscores or numbers and bad chars for var names in python return sub(r'[^A-Za-z0-9]', '', sub(r'^[^A-Za-z]+', '', fn)) nses = dict() for e in entities: xml = XML(zip.open(e).read()) id_ = xml.get('id') ens = id_.split('.') base_classname = None namespace = '.'.join(ens[:-1]) name = ens[-1] classname = name if namespace not in nses: base_classname = '%sEntity' % (''.join([n.title() for n in ens[:-1]])) nses[namespace] = base_classname print 'class %s(Entity):\n namespace = %s\n\n' % (base_classname, repr(namespace)) else:
def run(args): opts = parse_args(args) if path.exists(opts.outfile) and not opts.append and not \ parse_bool('%s already exists. Are you sure you want to overwrite it? [y/N]: ' % repr(opts.outfile), default='n'): exit(-1) ar = DirFile( path.join(detect_settings_dir(), 'config', 'Maltego', 'Entities') ) if opts.mtz_file is None else ZipFile(opts.mtz_file) entities = filter(lambda x: x.endswith('.entity'), ar.namelist()) nses = dict() el = [] if opts.append: l = diff(opts.outfile) el.extend([i.type for i in l]) for i in l: if i.type.endswith('Entity'): nses[i.namespace] = i.__class__.__name__ print 'Generating %s...' % repr(opts.outfile) fd = open(opts.outfile, 'ab' if opts.append else 'wb') if opts.append: fd.write('\n\n') else: fd.write('#!/usr/bin/env python\n\nfrom canari.maltego.entities import EntityField, Entity\n\n\n') for e in entities: xml = XML(ar.open(e).read()) id_ = xml.get('id') if (opts.entity and id_ not in opts.entity) or id_ in el: continue ens = id_.split('.') base_classname = None namespace = '.'.join(ens[:-1]) name = ens[-1] classname = name if (opts.namespace and namespace not in opts.namespace) or namespace in opts.exclude_namespace: continue if namespace not in nses: base_classname = '%sEntity' % (''.join([ n.title() for n in ens[:-1] ])) nses[namespace] = base_classname fd.write('class %s(Entity):\n namespace = %s\n\n' % (base_classname, repr(namespace))) else: base_classname = nses[namespace] for f in xml.findall('Properties/Fields/Field'): fields = [ 'name=%s' % repr(f.get('name')), 'propname=%s' % repr(normalize_fn(f.get('name'))), 'displayname=%s' % repr(f.get('displayName')) ] fd.write('@EntityField(%s)\n' % ', '.join(fields)) fd.write('class %s(%s):\n pass\n\n\n' % (classname, base_classname)) fd.close() print 'done.'
def run(args): opts = parse_args(args) if path.exists(opts.outfile) and not opts.append and not \ parse_bool('%s already exists. Are you sure you want to overwrite it? [y/N]: ' % repr(opts.outfile), default='n'): exit(-1) entity_source = None if opts.mtz_file is None: d = detect_settings_dir() if maltego_version(d) >= '3.4.0': print(""" =========================== ERROR: NOT SUPPORTED =========================== Starting from Maltego v3.4.0 the 'canari generate-entities' command can no longer generate entity definition files from the Maltego configuration directory. Entities can only be generated from export files (*.mtz). To export entities navigate to the 'Manage' tab in Maltego, then click on the 'Export Entities' button and follow the prompts. Once the entities have been exported, run the following command: shell> canari generate-entities -m myentities.mtz =========================== ERROR: NOT SUPPORTED =========================== """) exit(-1) entity_source = DirFile(path.join(d, 'config', 'Maltego', 'Entities')) else: entity_source = ZipFile(opts.mtz_file) entity_files = filter(lambda x: x.endswith('.entity'), entity_source.namelist()) namespaces = dict() excluded_entities = [] if opts.append: existing_entities = get_existing_entities(opts.outfile) # excluded_entities.extend([e._type_ for e in existing_entities]) for entity_class in existing_entities: excluded_entities.extend(entity_class._type_) if entity_class._type_.endswith('Entity'): namespaces[entity_class._namespace_] = entity_class.__name__ print 'Generating %s...' % repr(opts.outfile) outfile = open(opts.outfile, 'ab' if opts.append else 'wb') if opts.append: outfile.write('\n\n') else: outfile.write( '#!/usr/bin/env python\n\nfrom canari.maltego.entities import EntityField, Entity\n\n\n' ) for entity_file in entity_files: xml = XML(entity_source.open(entity_file).read()) id_ = xml.get('id') if (opts.entity and id_ not in opts.entity) or id_ in excluded_entities: continue namespace_entity = id_.split('.') base_classname = None namespace = '.'.join(namespace_entity[:-1]) name = namespace_entity[-1] classname = name if (opts.namespace and namespace not in opts.namespace) or namespace in opts.exclude_namespace: continue if namespace not in namespaces: base_classname = '%sEntity' % (''.join( [n.title() for n in namespace_entity[:-1]])) namespaces[namespace] = base_classname outfile.write('class %s(Entity):\n _namespace_ = %s\n\n' % (base_classname, repr(namespace))) else: base_classname = namespaces[namespace] for field in xml.findall('Properties/Fields/Field'): fields = [ 'name=%s' % repr(field.get('name')), 'propname=%s' % repr(normalize_fn(field.get('name'))), 'displayname=%s' % repr(field.get('displayName')) ] outfile.write('@EntityField(%s)\n' % ', '.join(fields)) outfile.write('class %s(%s):\n pass\n\n\n' % (classname, base_classname)) outfile.close() print 'done.'