From: allfro Date: Sat, 8 Dec 2012 04:05:30 +0000 (-0500) Subject: Added auto install and uninstall of entities and machines during install-package... X-Git-Url: https://git.nothing2do.fr/?a=commitdiff_plain;h=c67655d911c9ef25df991fa4cb486a09646ca4e8;p=get-hack-src.git Added auto install and uninstall of entities and machines during install-package and uninstall-package operations. --- diff --git a/src/canari/commands/common.py b/src/canari/commands/common.py index 2fcb2ad..5c7931a 100644 --- a/src/canari/commands/common.py +++ b/src/canari/commands/common.py @@ -47,7 +47,7 @@ def _detect_settings_dir(d): print('Multiple versions of Maltego detected: ') for i, v in enumerate(vs): print('[%d] Maltego %s' % (i, v)) - r = raw_input('Please select which version you wish to install the transforms in [0]: ') + r = raw_input('Please select which version you wish to use [0]: ') try: if not r: return sep.join([d, vs[0]]) diff --git a/src/canari/commands/create_package.py b/src/canari/commands/create_package.py index 101ba7b..8b2c9f7 100644 --- a/src/canari/commands/create_package.py +++ b/src/canari/commands/create_package.py @@ -47,7 +47,7 @@ def write_root(base, init): def write_resources(package_name, resources, init, values): write_template( sep.join([resources, '__init__.py']), - init + generate_all('etc', 'images') + init + generate_all('etc', 'images', 'maltego') ) write_template( @@ -60,6 +60,11 @@ def write_resources(package_name, resources, init, values): init ) + write_template( + sep.join([resources, 'maltego', '__init__.py']), + init + ) + write_template( sep.join([resources, 'etc', '%s.conf' % package_name]), read_template('conf', values) @@ -168,7 +173,8 @@ def run(args): [transforms, 'common'], resources, [resources, 'etc'], - [resources, 'images'] + [resources, 'images'], + [resources, 'maltego'] ) else: print('A directory with the name %s already exists... exiting' % package_name) diff --git a/src/canari/commands/install_package.py b/src/canari/commands/install_package.py index e857662..3141acd 100644 --- a/src/canari/commands/install_package.py +++ b/src/canari/commands/install_package.py @@ -5,14 +5,16 @@ from ..maltego.configuration import (MaltegoTransform, CmdCwdTransformProperty, TransformSettings, CmdCwdTransformPropertySetting, CmdDbgTransformPropertySetting, CmdLineTransformPropertySetting, CmdParmTransformPropertySetting) from common import detect_settings_dir, cmd_name, fix_pypath, get_bin_dir, import_transform, import_package -from ..maltego.message import ElementTree +from ..maltego.message import ElementTree +from pkg_resources import resource_filename, resource_listdir +from xml.etree.cElementTree import XML, Element, SubElement from os import sep, path, mkdir, chdir, getcwd, name -from pkg_resources import resource_filename from argparse import ArgumentParser +from re import findall, sub +from zipfile import ZipFile from string import Template from sys import stderr -from re import sub @@ -190,6 +192,79 @@ def installconf(opts, args): writeconf(src, sep.join([opts.working_dir, '%s.conf' % opts.package]), sub=False) updateconf('%s.conf' % opts.package, sep.join([opts.working_dir, 'canari.conf'])) + +def installmtz(package, prefix): + try: + src = resource_filename('%s.resources.maltego' % package, 'entities.mtz') + if not path.exists(src): + return + prefix = 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 = path.join(prefix, category) + if not path.exists(catdir): + mkdir(catdir, mode=0755) + p = path.join(catdir, path.basename(e)) + print 'Installing entity %s to %s...' % (e, p) + with open(p, 'wb') as f: + f.write(data) + except ImportError: + pass + + +def installnbattr(xml, src, dst): + src = findall('machine\(([^\)]+)', src)[0] + if not src: + return + props = sub('\s*\n\s*|"', '', src).split(',') + e = None + for p in props: + if ':' not in p: + if xml.find('fileobject[@name="%s"]' % dst) is not None: + return + e = SubElement(xml, 'fileobject') + e.set('name', dst) + else: + n, v = p.split(':') + s = SubElement(e, 'attr') + s.set('name', n) + s.set('stringvalue', v) + s = SubElement(e, 'attr') + s.set('name', 'readonly') + s.set('boolvalue', 'false') + s = SubElement(e, 'attr') + s.set('name', 'enabled') + s.set('boolvalue', 'true') + + +def installmachines(package, prefix): + try: + prefix = path.join(prefix, 'config', 'Maltego', 'Machines') + n = path.join(prefix, '.nbattrs') + e = XML('') + if path.exists(n): + e = XML(file(n).read()) + if not path.exists(prefix): + mkdir(prefix, 0755) + package = '%s.resources.maltego' % package + for m in filter(lambda x: x.endswith('.machine'), resource_listdir(package, '')): + src = resource_filename(package, m) + dst = path.join(prefix, m) + print 'Installing machine %s to %s...' % (src, dst) + with open(dst, 'wb') as f: + data = file(src).read() + f.write(data) + installnbattr(e, data, m) + ElementTree(e).write(file(n, 'wb')) + except ImportError, e: + pass + + # Main def run(args): @@ -227,6 +302,9 @@ def run(args): opts.working_dir ) + installmtz(opts.package, opts.settings_dir) + installmachines(opts.package, opts.settings_dir) + if not transforms: print ('Error: no transforms found...') exit(-1) diff --git a/src/canari/commands/uninstall_package.py b/src/canari/commands/uninstall_package.py index fa6fc44..9ab1f60 100644 --- a/src/canari/commands/uninstall_package.py +++ b/src/canari/commands/uninstall_package.py @@ -2,6 +2,8 @@ from common import detect_settings_dir, cmd_name, fix_pypath, import_package, import_transform +from xml.etree.cElementTree import ElementTree, SubElement, XML +from pkg_resources import resource_listdir, resource_filename from os import sep, path, mkdir, listdir, unlink, rmdir from argparse import ArgumentParser @@ -45,6 +47,33 @@ def description(): return parser.description +def uninstallnbattr(machine, xml): + e = xml.find('fileobject[@name="%s"]' % machine) + if e is not None: + xml.remove(e) + +def uninstallmachines(package, prefix): + try: + prefix = path.join(prefix, 'config', 'Maltego', 'Machines') + n = path.join(prefix, '.nbattrs') + e = XML('') + if path.exists(n): + e = XML(file(n).read()) + if not path.exists(prefix): + return + package = '%s.resources.maltego' % package + for m in filter(lambda x: x.endswith('.machine'), resource_listdir(package, '')): + print 'Uninstalling machine %s...' % m + try: + unlink(path.join(prefix, m)) + uninstallnbattr(m, e) + except OSError: + pass + ElementTree(e).write(file(n, 'wb')) + except ImportError, e: + pass + + def uninstall_transform(module, spec, prefix): installdir = sep.join([prefix, 'config', 'Maltego', 'TransformRepositories', 'Local']) @@ -86,15 +115,15 @@ def run(args): opts = parse_args(args) - if not opts.package.endswith('.transforms'): - opts.package = '%s.transforms' % opts.package + if opts.package.endswith('.transforms'): + opts.package = opts.package.replace('.transforms', '') fix_pypath() - m = import_package(opts.package) + m = import_package('%s.transforms' % opts.package) for t in m.__all__: - transform = '%s.%s' % (opts.package, t) + transform = '%s.transforms.%s' % (opts.package, t) m2 = import_transform(transform) if hasattr(m2, 'dotransform') and hasattr(m2.dotransform, 'label'): uninstall_transform( @@ -102,3 +131,5 @@ def run(args): m2.dotransform, opts.settings_dir ) + + uninstallmachines(opts.package, opts.settings_dir) diff --git a/src/canari/resources/template/setup.plate b/src/canari/resources/template/setup.plate index f8e35cf..e095f20 100755 --- a/src/canari/resources/template/setup.plate +++ b/src/canari/resources/template/setup.plate @@ -11,7 +11,7 @@ setup( package_dir={ '' : 'src' }, zip_safe=False, package_data={ - '' : [ '*.gif', '*.png', '*.conf' ] # list of resources + '' : [ '*.gif', '*.png', '*.conf', '*.mtz', '*.machine' ] # list of resources }, install_requires=[ # Name of packages required for easy_install