Skip to content
Snippets Groups Projects
Commit b5f76565 authored by Erik Reid's avatar Erik Reid
Browse files

use logging instead of printing

parent 3a84a2ce
No related branches found
No related tags found
No related merge requests found
import contextlib
import json
import logging
import re
from multiprocessing import Pool, Process, Queue
......@@ -46,12 +47,8 @@ def walk(agent_hostname, community, base_oid):
"""
https://stackoverflow.com/a/45001921
http://snmplabs.com/pysnmp/docs/hlapi/asyncore/sync/manager/cmdgen/nextcmd.html
http://snmplabs.com/pysnmp/faq/pass-custom-mib-to-manager.html
https://github.com/etingof/pysnmp/blob/master/examples/v3arch/asyncore/manager/cmdgen/getnext-multiple-oids-and-resolve-with-mib.py
http://snmplabs.com/pysnmp/examples/smi/manager/browsing-mib-tree.html
:param agent_hostname:
......@@ -67,7 +64,7 @@ def walk(agent_hostname, community, base_oid):
# Pre-load MIB modules we expect to work with
mibBuilder.loadModules('SNMPv2-MIB', 'SNMP-COMMUNITY-MIB', 'RFC1213-MIB')
# print("walking %s: %s" % (agent_hostname, base_oid))
# logging.debug("walking %s: %s" % (agent_hostname, base_oid))
for (engineErrorIndication,
pduErrorIndication,
errorIndex,
......@@ -89,8 +86,6 @@ def walk(agent_hostname, community, base_oid):
# for x in varBinds]
for oid, val in varBinds:
yield {"oid": "." + str(oid), "value": val.prettyPrint()}
# print("\toid: '%s', val: '%s'" % (
# oid.prettyPrint(), val.prettyPrint()))
def _validate_config(ctx, param, value):
......@@ -128,7 +123,7 @@ def load_routers(config_file):
for line in config_file:
m = re.match(r'^([a-z\d]+\.[a-z\d]{3,4}\.[a-z\d]{2}\.(geant|eumedconnect)\d*\.net)\s*=([^,]+)\s*,(.*)\s*$', line)
if not m:
print("malformed config file line: '%s'" + line.strip())
logging.warning("malformed config file line: '%s'" + line.strip())
continue
yield {
"hostname": m.group(1),
......@@ -136,6 +131,7 @@ def load_routers(config_file):
"address": m.group(4)
}
@contextlib.contextmanager
def connection(alarmsdb):
cx = None
......@@ -145,7 +141,6 @@ def connection(alarmsdb):
user=alarmsdb["username"],
passwd=alarmsdb["password"],
db=alarmsdb["dbname"])
# print(cx)
yield cx
finally:
if cx:
......@@ -165,11 +160,11 @@ def cursor(cnx):
def _db_test(db, router):
with cursor(db) as crs:
# print(router)
logging.debug("_db_test: %r" % router)
query = "SELECT absid FROM routers WHERE hostname = %s"
crs.execute(query, (router['hostname'],))
for (absid,) in crs:
print(absid)
logging.debug("absid: %r" % absid)
def _v6address_oid2str(dotted_decimal):
......@@ -186,9 +181,7 @@ def get_router_interfaces(router):
details = {}
for name, oid in oid_map.items():
details[name] = walk(router["hostname"], router["community"], oid)
# print(name)
details[name] = list(details[name])
# print(details[name])
v4IfcNames = {}
for v4IfcName in details["v4InterfaceName"]:
......@@ -252,35 +245,34 @@ def exec_router_commands_json(router, ssh_params, commands):
assert stdout.channel.recv_exit_status() == 0
for c in commands:
print("command: '%s'" % (c + " | display json"))
logging.debug("command: '%s'" % (c + " | display json"))
_, stdout, _ = ssh.exec_command(c + " | display json")
assert stdout.channel.recv_exit_status() == 0
# TODO: error handling
# output = stdout.read()
output = stdout.read()
if output:
print("%r output: [%d] %r" % (router, len(output), output[:20]))
logging.debug("%r output: [%d] %r" % (router, len(output), output[:20]))
yield json.loads(output)
else:
print("%r output empty")
logging.debug("%r output empty")
yield {}
def get_router_interfaces_q(router, q):
print("[ENTER>>] get_router_interfaces_q: %r" % router)
logging.debug("[ENTER>>] get_router_interfaces_q: %r" % router)
q.put(list(get_router_interfaces(router)))
print("[<<EXIT] get_router_interfaces_q: %r" % router)
logging.debug("[<<EXIT] get_router_interfaces_q: %r" % router)
def exec_router_commands_json_q(router, ssh_params, commands, q):
print("[ENTER>>] exec_router_commands_q: %r" % router)
logging.debug("[ENTER>>] exec_router_commands_q: %r" % router)
q.put(list(exec_router_commands_json(router, ssh_params, commands)))
print("[<<EXIT] exec_router_commands_q: %r" % router)
logging.debug("[<<EXIT] exec_router_commands_q: %r" % router)
def get_router_details(router, params, q):
print("get_router_details: %r" % router)
logging.debug("get_router_details: %r" % router)
commands = [
'show configuration routing-instances IAS protocols bgp',
......@@ -300,33 +292,22 @@ def get_router_details(router, params, q):
commands_proc = Process(target=exec_router_commands_json_q, args=(router, params["ssh"], commands, commands_proc_queue))
commands_proc.start()
result = {}
print("waiting for commands result: %r" % router)
logging.debug("waiting for commands result: %r" % router)
command_output = commands_proc_queue.get()
assert len(command_output) == len(commands)
result = dict(zip(["bgp", "vrr", "interfaces"], command_output))
commands_proc.join()
print("... got commands result & joined: %r" % router)
logging.debug("... got commands result & joined: %r" % router)
print("waiting for snmp ifc results: %r" % router)
logging.debug("waiting for snmp ifc results: %r" % router)
result["snmp-interfaces"] = snmpifc_proc_queue.get()
snmpifc_proc.join()
print("... got snmp ifc result & joined: %r" % router)
logging.debug("... got snmp ifc result & joined: %r" % router)
q.put(result)
@click.command()
@click.option(
"--config",
# required=True,
type=click.File(),
help="Configuration filename",
default=open("config.json"),
callback=_validate_config)
def cli(config):
def load_network_details(config):
with open("routers_community.conf") as f:
routers = list(load_routers(f))
......@@ -339,43 +320,32 @@ def cli(config):
result = {}
for p in processes:
print("waiting for get_router_details result: %r" % p["router"])
logging.debug("waiting for get_router_details result: %r" % p["router"])
result[p["router"]["hostname"]] = p["queue"].get()
p["process"].join()
print("got result and joined get_router_details proc: %r" % p["router"])
logging.debug("got result and joined get_router_details proc: %r" % p["router"])
return result
@click.command()
@click.option(
"--config",
# required=True,
type=click.File(),
help="Configuration filename",
default=open("config.json"),
callback=_validate_config)
def cli(config):
network_details = load_network_details(config)
filename = "/tmp/router-info.json"
logging.debug("writing output to: " + filename)
with open(filename, "w") as f:
f.write(json.dumps(result))
print("writing output to: " + filename)
# for r, i in zip(routers, pool.map(get_router_details, args)):
# print(r)
# print(i)
# print("")
# break
# # i = get_router_interfaces(r)
# # print(r["hostname"])
# # for ifc in i:
# # print("\t%r" % ifc)
# # break
# # # commands = [
# # # 'show configuration routing-instances IAS protocols bgp | display set | match neighbor | match description | match "GEANT-IX | GEANT-IX-"',
# # # 'show configuration routing-instances IAS protocols bgp | display set | match neighbor | match description | match "GEANT-IXv6 | GEANT-IXv6-"',
# # # 'show configuration logical-systems VRR protocols bgp group VPN-RR-INTERNAL | match "neigh|desc"',
# # # 'show configuration logical-systems VRR protocols bgp group VPN-RR | match "neigh|desc"'
# # # ]
# # # for lines in exec_router_commands(r, config["ssh"], commands):
# # # print("-------------")
# # # print("".join(lines))
# # break
f.write(json.dumps(network_details))
if __name__ == "__main__":
logging.basicConfig(level=logging.DEBUG)
cli()
# with open("oid_list.conf") as f:
# print(load_oids(f))
# with open("routers_community.conf") as f:
# for r in load_routers(f):
# _db_test(r)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment