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 b24474d5bce6d85e28858cc4fce12e40142f9f79

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,service = request.form.get("host", "8.8.8.8"),request.form.get("service","ping")
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 print("Processing request {},{} from {} {}".format(host, service, request.environ["REMOTE_ADDR"], request.headers.get("User-Agent")))
39 if service == "ping":
40 resp = make_response(check_output(["ping", "-i", "0.2", "-q", "-c", "4", quote(host)]))
41 elif service == "mtr":
42 resp = make_response(check_output(["mtr", "-c", "1", "--report-wide", "-m", "60", "-b", quote(host)]))
43 else:
44 return "oi"
45 print(" Completed request {},{} from {} {}".format(host,service, request.environ["REMOTE_ADDR"], request.headers.get("User-Agent")))
46 resp.headers["Content-Type"] = "text/plain"
47 return resp
48
49if __name__ == "__main__":
50 app.run(port=5001)