#!/usr/bin/python import sys from flask import Flask, render_template, jsonify app = Flask(__name__) import socket def check_mask(n): if not n: return True try: mask = int(n) return ( mask > 1 and mask < 128) except: return False def check_ipv4(n): try: socket.inet_pton(socket.AF_INET, n) return True except socket.error: return False def check_ipv6(n): try: socket.inet_pton(socket.AF_INET6, n) return True except socket.error: return False @app.route("/") def hello(): return render_template('index.html') @app.route("///prefix/") @app.route("///prefix//") def prefix(host, proto, prefix, mask=""): output = '

' + host + '(' + proto + ') show route for ' + prefix + '/' + mask + '

' # security check if ( (proto == "ipv6" and check_ipv6(prefix)) or (proto == "ipv4" and check_ipv4(prefix)) ) and check_mask(mask): if mask: prefix = prefix +"/"+mask ok, string = get_cmd_result(host , proto, "show route for " + prefix) if ok: string = "\n".join([ s.replace("1007-"," ") for s in string.split("\n") if not s.startswith("0000") ]) output +='
' + string + '
' else: output += string else: output += prefix + ' not allowed' return render_template('index.html', output=output, typ="prefix", host=host+"/"+proto, prefix=prefix) @app.route("///detail/") def detail(host, proto, name): output = '

' + host + '(' + proto + ') show protocols all ' + name + '

' # security check #ok, string = get_cmd_result(host , proto, "show protocols") ok = True if ok: #protocols = [ s.split()[0] for s in string.split("\n") if s.startswith(" ") ]a protocols = [ name ] if name in protocols : ok, string = get_cmd_result(host , proto, "show protocols all " + name) if ok: string = "\n".join([ s.strip() for s in string.split("\n") if s.startswith(" ")]) output +='
' + string + '
' else: output += string else: output += name + ' don\'t exist' else: output += string return render_template('index.html', output=output, typ="detail", host=host+"/"+proto, name=name) @app.route("///summary") def summary(host, proto): output = '

' + host + '(' + proto + ') show protocols

' ok, string = get_cmd_result(host , proto, "show protocols") if ok: output += '
'
		protocols_info = [ s for s in string.split("\n") if s.startswith(" ") ]
		for infos in protocols_info:
			d = infos.split()
			name = d[0]
			typ = d[1]
			if typ == "BGP":
				output += ''%(host,proto,name,name,infos.replace(name,""))
			continue
			try:
				name, typ, status, up, date, hour, info = infos
			except:
				try:
					name, typ, status, up, date, hour = infos
					info = ""
				except:
					name, typ, status, up, hour = infos
					info = ""
					date = ""
			if typ == "BGP":
				output += ''%(host,proto,name,name,typ,status,up,date,hour,info)
		output += '
%s%s
%s%s%s%s%s %s%s
' else: output += string return render_template('index.html', output=output, typ="summary", host=host+"/"+proto) @app.route("///status") def status(host, proto): string = get_cmd_result(host, proto, "show status") output = '
' + string + '
' return render_template('index.html', output=output, host=host+"/"+proto) def get_cmd_result(host, proto, cmd): ret = True if proto == "ipv4": port = 9994 else: port = 9996 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(3.0) # sock.setblocking(0) try: sock.connect((host, port)) app.logger.info("open socket on %s:%d", host, port) sock.send(cmd + "\n") app.logger.info("send %s socket on %s:%d", cmd, host, port) bufsize = 4096 data = sock.recv(bufsize) string = data app.logger.info("read %s (%d)", data, len(data)) code = string.strip()[len(string.strip())-4:] code = string.split("\n")[-2][0:4] while not code in ["0000", "9001"]: data = sock.recv(bufsize) string = string + data app.logger.info("read %s (%d)", data, len(data)) code = string.strip()[len(string.strip())-4:] if code == "9001": ret = False app.logger.info("return %s",string) except Exception as detail: ret = False string = "Failed connect to %s:%d (%s)"%(host, port, detail) app.logger.error(string) sock.close() return (ret, string) if __name__ == "__main__": app.debug = True app.run()