hostscan

NMAP Host Generator
git clone git@jamesshield.xyz:repos/hostscan.git
Log | Files | Refs | README | LICENSE

commit c2e92a8940d68478e622bd312501d577cd22474e
parent 3c30427e0352c5b4e43089b7892a399b00df9f86
Author: James Alexander Shield <james.shield@zoodata.com.au>
Date:   Sun,  5 Jul 2020 20:16:46 +0800

Port to Python 3

Diffstat:
Mdocopt.py | 44++++++++++++++++++++++----------------------
Mnmap-scan.py | 31++++++++++++++++++-------------
2 files changed, 40 insertions(+), 35 deletions(-)

diff --git a/docopt.py b/docopt.py @@ -81,7 +81,7 @@ def transform(pattern): while groups: children = groups.pop(0) parents = [Required, Optional, OptionsShortcut, Either, OneOrMore] - if any(t in map(type, children) for t in parents): + if any(t in list(map(type, children)) for t in parents): child = [c for c in children if type(c) in parents][0] children.remove(child) if type(child) is Either: @@ -179,19 +179,19 @@ class Command(Argument): class Option(LeafPattern): - def __init__(self, short=None, long=None, argcount=0, value=False): + def __init__(self, short=None, long_opt=None, argcount=0, value=False): assert argcount in (0, 1) - self.short, self.long, self.argcount = short, long, argcount + self.short, self.long_opt, self.argcount = short, long_opt, argcount self.value = None if value is False and argcount else value @classmethod def parse(class_, option_description): - short, long, argcount, value = None, None, 0, False + short, long_opt, argcount, value = None, None, 0, False options, _, description = option_description.strip().partition(' ') options = options.replace(',', ' ').replace('=', ' ') for s in options.split(): if s.startswith('--'): - long = s + long_opt = s elif s.startswith('-'): short = s else: @@ -199,7 +199,7 @@ class Option(LeafPattern): if argcount: matched = re.findall('\[default: (.*)\]', description, flags=re.I) value = matched[0] if matched else None - return class_(short, long, argcount, value) + return class_(short, long_opt, argcount, value) def single_match(self, left): for n, pattern in enumerate(left): @@ -209,10 +209,10 @@ class Option(LeafPattern): @property def name(self): - return self.long or self.short + return self.long_opt or self.short def __repr__(self): - return 'Option(%r, %r, %r, %r)' % (self.short, self.long, + return 'Option(%r, %r, %r, %r)' % (self.short, self.long_opt, self.argcount, self.value) @@ -300,31 +300,31 @@ class Tokens(list): def parse_long(tokens, options): """long ::= '--' chars [ ( ' ' | '=' ) chars ] ;""" - long, eq, value = tokens.move().partition('=') - assert long.startswith('--') + long_opt, eq, value = tokens.move().partition('=') + assert long_opt.startswith('--') value = None if eq == value == '' else value - similar = [o for o in options if o.long == long] + similar = [o for o in options if o.long_opt == long_opt] if tokens.error is DocoptExit and similar == []: # if no exact match - similar = [o for o in options if o.long and o.long.startswith(long)] + similar = [o for o in options if o.long_opt and o.long_opt.startswith(long_opt)] if len(similar) > 1: # might be simply specified ambiguously 2+ times? raise tokens.error('%s is not a unique prefix: %s?' % - (long, ', '.join(o.long for o in similar))) + (long_opt, ', '.join(o.long_opt for o in similar))) elif len(similar) < 1: argcount = 1 if eq == '=' else 0 - o = Option(None, long, argcount) + o = Option(None, long_opt, argcount) options.append(o) if tokens.error is DocoptExit: - o = Option(None, long, argcount, value if argcount else True) + o = Option(None, long_opt, argcount, value if argcount else True) else: - o = Option(similar[0].short, similar[0].long, + o = Option(similar[0].short, similar[0].long_opt, similar[0].argcount, similar[0].value) if o.argcount == 0: if value is not None: - raise tokens.error('%s must not have an argument' % o.long) + raise tokens.error('%s must not have an argument' % o.long_opt) else: if value is None: if tokens.current() in [None, '--']: - raise tokens.error('%s requires argument' % o.long) + raise tokens.error('%s requires argument' % o.long_opt) value = tokens.move() if tokens.error is DocoptExit: o.value = value if value is not None else True @@ -349,7 +349,7 @@ def parse_shorts(tokens, options): if tokens.error is DocoptExit: o = Option(short, None, 0, True) else: # why copying is necessary here? - o = Option(short, similar[0].long, + o = Option(short, similar[0].long_opt, similar[0].argcount, similar[0].value) value = None if o.argcount != 0: @@ -475,7 +475,7 @@ def formal_usage(section): def extras(help, version, options, doc): if help and any((o.name in ('-h', '--help')) and o.value for o in options): - print(doc.strip("\n")) + print((doc.strip("\n"))) sys.exit() if version and any(o.name == '--version' and o.value for o in options): print(version) @@ -484,7 +484,7 @@ def extras(help, version, options, doc): class Dict(dict): def __repr__(self): - return '{%s}' % ',\n '.join('%r: %r' % i for i in sorted(self.items())) + return '{%s}' % ',\n '.join('%r: %r' % i for i in self.items()) def docopt(doc, argv=None, help=True, version=None, options_first=False): @@ -572,7 +572,7 @@ def docopt(doc, argv=None, help=True, version=None, options_first=False): doc_options = parse_defaults(doc) options_shortcut.children = list(set(doc_options) - pattern_options) #if any_options: - # options_shortcut.children += [Option(o.short, o.long, o.argcount) + # options_shortcut.children += [Option(o.short, o.long_opt, o.argcount) # for o in argv if type(o) is Option] extras(help, version, argv, doc) matched, left, collected = pattern.fix().match(argv) diff --git a/nmap-scan.py b/nmap-scan.py @@ -1,4 +1,4 @@ -#! /usr/bin/env python +#! /usr/bin/env python3 """ Usage: nmap-scan [options] <network> @@ -24,6 +24,8 @@ import datetime import os import sys +from pprint import pprint + if os.name == 'posix' and sys.version_info[0] < 3: import subprocess32 as subprocess from subprocess32 import CalledProcessError @@ -34,7 +36,7 @@ out = "" def debug(msg, obj): if obj is not None: - print "DEBUG: {0} {1}\n".format(msg, pprint(obj)) + print("DEBUG: {0} {1}\n".format(msg, pprint(obj))) def run_nmap(net): try: @@ -61,10 +63,13 @@ def parsexml(f): if _address_type == 'mac': _macaddress = addr.get('addr') _vendor = addr.get('vendor') - if (args['--snmp']): + if args["--snmp"]: if debug: - print("Run SNMPGET for {}".format(_ipaddress)) - varBind = snmpget(_ipaddress) + print("Run SNMPGET for {}".format(_ipaddress)) + varBind = snmpget(_ipaddress) + + + hostname = host.find("./hostnames/hostname").get('name') if ET.iselement(host.find("./hostnames/hostname")) else _ipaskey # Per Host _host[_ipaskey] = { '_id': _ipaskey, 'name': hostname, 'ip': _ipaddress, 'mac': _macaddress, 'vendor': _vendor} @@ -96,7 +101,7 @@ def parsexml(f): 'product' : service.get("product"), 'service_name' : service.get("name"),} - if port.get("portid") not in _services.values(): + if port.get("portid") not in list(_services.values()): _services.setdefault('services',[]).append(_service) @@ -123,28 +128,28 @@ def snmpget(host): # Check for errors and print out results if errorIndication: - print("Found ErrorI: {}".format(errI)) + print(("Found ErrorI: {}".format(errI))) return None elif errorStatus: errS = errorStatus - print("Found ErrorS: {}".format(errorStatus)) + print(("Found ErrorS: {}".format(errorStatus))) return None else: for v in varBinds: if debug: - print("Varbinds: {}".format(pprint(varBinds))) + print(("Varbinds: {}".format(pprint(varBinds)))) # print('%s = %s' % (name.prettyPrint(), val.prettyPrint())) return varBinds def print_hosts(collection): - for k,v in collection.iteritems(): - print "%s\t%s" % (v['ip'],v['name']) + for k,v in collection.items(): + print("%s\t%s" % (v['ip'],v['name'])) def print_ansible(collection): - print "[hosts]" + print("[hosts]") for i in collection: - print "%s\tansible_ssh_user=%s\tansible_ssh_pass=%s" % (i, 'root', '#password#') + print("%s\tansible_ssh_user=%s\tansible_ssh_pass=%s" % (i, 'root', '#password#')) def print_raw(collection): pprint(collection)