def merge_host(db, ident): saved = [] for source in ("snmp", "login", "annotations"): collection = getattr(db, source) d = collection.find_one({"ident": ident}) if d is not None: del d["_id"] saved.append(d) merged = mergedict(saved) old = db.hosts.find_one({"ident": ident}, {"_id": True}) if old is not None: merged["_id"] = old["_id"] merged["timestamp"] = time.time() ## xxx should this be here? make sure interfaces are sorted ifaces = merged.get("interfaces") if ifaces is not None: ifaces.sort(lambda x,y: cmp(x.get("ifindex", 0), y.get("ifindex", 0))) merged["interfaces"] = ifaces db.hosts.save(merged) return merged
from pprint import pprint from storage import pkey_check, mergedict logging.basicConfig(level=logging.INFO) # from rlogin import Rcmd, MetaHost # c = Rcmd(host=argv[1], username=argv[3], password=argv[4]) # h = MetaHost(c) # pprint(h.router_info()) # c.logout() # exit(0) descr = interrogate(argv[1], community=argv[2], username=argv[3], password=argv[4]) # pprint(descr) ident = pkey_check(descr) print "identifier:", ident import redis import json r = redis.Redis() for k, v in descr.items(): r.hset(k, ident, json.dumps(v)) merged = mergedict(list(descr.values())) r.hset("hosts", ident, merged) for addr in [x.get("mac") for x in merged["interfaces"]]: if addr is None: continue r.hset("macaddrs", addr, ident)
if addrinfo is None: addrinfo = {"address": str(v4if.ip)} hosts = addrinfo.setdefault("hosts", []) hosts.append(DBRef("hosts", merged["_id"])) addrinfo["hosts"] = list(set(hosts)) db.v4addr.save(addrinfo) macaddr = iface.get("mac") if macaddr is not None: addrinfo = db.macaddr.find_one({"address": macaddr}) if addrinfo is None: addrinfo = {"address": macaddr} addrinfo["host"] = DBRef("hosts", merged["_id"]) db.macaddr.save(addrinfo) else: ### used for discovery merged = mergedict(descriptions.values()) return merged def interrogate_parser(p): p.add_argument("hostname", nargs=1) p.add_argument("-s", dest="snmp", action="store_false", default=True, help="Do not use SNMP") p.add_argument("-l", dest="login", action="store_false", default=True, help="Do not use remote login (SSH)") p.add_argument("-m", dest="merge", action="store_false", default=True, help="Do not merge descriptions") p.set_defaults(func=interrogate) def host(args): db = get_db(args)