Last active 1535433284

A Looking Glass implementation in Python3 and Flask. Vet code for security concerns before deploying, this isn't tested for vulnerabilities in any way

Revision 3f84a666c96ac4b8f8dad3a5af4b414240c55aa4

lookingglass.py Raw
1#!/usr/bin/env python3
2from flask import Flask,request,make_response
3from shlex import quote
4from subprocess import check_output
5import socket
6
7app = Flask(__name__)
8
9@app.route('/')
10def index():
11 return """<form method="post" action="process">
12 <input type="text" name="host"><br>
13 <input type="radio name="service" id="ping"><label for="ping">Ping</label><br>
14 <input type="radio name="service" id="mtr"><label for="mtr">mtr</label><br>
15 <input type="submit"></form>
16"""
17
18@app.route("/process", methods=["POST"])
19def process():
20 host = request.form.get("host", "8.8.8.8")
21 try:
22 # Is it an ip?
23 _ = socket.inet_aton(host)
24 except OSError:
25 # Well it's not ipv4,
26 try:
27 _ = socket.inet_pton(socket.AF_INET6, host)
28 except OSError:
29 # Not ipv6 either. We'll try resolving dns
30 try:
31 host = socket.gethostbyname(host)
32 except socket.gaierror:
33 return "We only support ipv4/ipv6/valid domains\n"
34 else:
35 pass # host is ipv6
36 else:
37 pass # host is ipv4
38 host,service = quote(request.form.get("host", "8.8.8.8")),request.form.get("service","ping")
39 print("Processing request {},{} from {} {}".format(host,service, request.environ["REMOTE_ADDR"], request.headers.get("User-Agent")))
40 if service == "ping":
41 resp = make_response(check_output(["ping", "-i", "0.2", "-q", "-c", "4", host]))
42 elif service == "mtr":
43 resp = make_response(check_output(["mtr", "-c", "1", "--report-wide", "-m", "60", "-b", host]))
44 else:
45 return "oi"
46 print(" Completed request {},{} from {} {}".format(host,service, request.environ["REMOTE_ADDR"], request.headers.get("User-Agent")))
47 resp.headers["Content-Type"] = "text/plain"
48 return resp
49
50if __name__ == "__main__":
51 app.run(port=5001)