fdb_analyze3.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import csv,re,collections
  2. rows=[]
  3. with open('/tmp/fdb_hosts.tsv',encoding='utf-8') as f:
  4. for x in csv.DictReader(f,delimiter='\t'): rows.append(x)
  5. devnames={}
  6. for x in rows:
  7. devnames[x['switch_name']]=x['switch_ip']
  8. def is_device(name,ip):
  9. n=name.lower()
  10. if re.search(r'(core|dist|access|switch|ap-|-ap\b|surve|office-access)',n): return True
  11. if ip in devnames.values(): return True
  12. return False
  13. def peer_from_alias(alias):
  14. a=alias.strip()
  15. m=re.search(r'TO[-_ ]?(.+)$',a,re.I)
  16. return m.group(1).strip() if m else None
  17. def find_dev(tok):
  18. tok=tok.strip().strip('-')
  19. if not tok: return None
  20. tl=tok.lower()
  21. # exact-ish prefix match on device names
  22. best=None
  23. for nm in devnames:
  24. nl=nm.lower()
  25. if tl[:10] in nl or nl[:10] in tl:
  26. return nm
  27. # token like 3101-GRDA27-OFFICE
  28. key=tl.split('-')[0]
  29. if key and key in nl:
  30. if best is None: best=nm
  31. return best
  32. links=[];seenset=set()
  33. endpoints=[];dev_edges=[]
  34. for x in rows:
  35. alias=x['port_alias']; sw=x['switch_name']
  36. ptok=peer_from_alias(alias)
  37. if ptok:
  38. b=find_dev(ptok)
  39. if b:
  40. key=tuple(sorted([sw,b]))
  41. if key not in seenset and b!=sw:
  42. seenset.add(key); links.append((sw,x['port'],alias,b))
  43. continue
  44. if is_device(x['zabbix_name'],x['ip']):
  45. dev_edges.append(x)
  46. else:
  47. endpoints.append(x)
  48. print("rows=",len(rows))
  49. print("alias_links=",len(links))
  50. print("device_edges(no alias)=",len(dev_edges))
  51. print("endpoint_edges=",len(endpoints))
  52. print("\n-- 45 alias-based switch links --")
  53. for s,p,a,b in links[:45]:
  54. print(f" {s[:44]:44s}[{p:12s} {a[:22]:22s}] <-> {b[:44]}")
  55. # also show device_edges sample (switch mgmt seen on a port, no alias)
  56. print("\n-- 20 device_edges (no alias) --")
  57. for x in dev_edges[:20]:
  58. print(f" {x['zabbix_name'][:40]:40s} -> {x['switch_name'][:38]:38s} {x['port']:12s} macs={x['port_mac_count']}")
  59. with open('/tmp/fdb_links_alias.tsv','w',encoding='utf-8') as f:
  60. f.write('a_switch\ta_port\ta_alias\tb_switch\n')
  61. for r in links: f.write('\t'.join(r)+'\n')
  62. with open('/tmp/fdb_endpoints.tsv','w',encoding='utf-8') as f:
  63. f.write('ip\tname\tmac\tswitch_name\tswitch_ip\tport\tport_alias\tport_mac_count\n')
  64. for x in endpoints:
  65. f.write('\t'.join([x['ip'],x['zabbix_name'],x['mac'],x['switch_name'],x['switch_ip'],x['port'],x['port_alias'],x['port_mac_count']])+'\n')
  66. with open('/tmp/fdb_devedges.tsv','w',encoding='utf-8') as f:
  67. f.write('ip\tname\tmac\tswitch_name\tswitch_ip\tport\tport_alias\tport_mac_count\n')
  68. for x in dev_edges:
  69. f.write('\t'.join([x['ip'],x['zabbix_name'],x['mac'],x['switch_name'],x['switch_ip'],x['port'],x['port_alias'],x['port_mac_count']])+'\n')