diff --git a/bird.py b/bird.py index 9cee93c..c4e949f 100644 --- a/bird.py +++ b/bird.py @@ -77,7 +77,8 @@ def BirdSocketSingleton(host, port): class BirdSocket: - def __init__(self, host, port): + def __init__(self, host="", port="", file=""): + self.__file = file self.__host = host self.__port = port self.__sock = None @@ -85,9 +86,17 @@ class BirdSocket: def __connect(self): if self.__sock: return - self.__sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.__sock.settimeout(3.0) - self.__sock.connect((self.__host, self.__port)) + if not file: + self.__sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.__sock.settimeout(3.0) + self.__sock.connect((self.__host, self.__port)) + else: + self.__sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + self.__sock.settimeout(3.0) + self.__sock.connect(self.__file) + + # read welcome message + self.__sock.recv(1024) def close(self): if self.__sock: @@ -99,14 +108,14 @@ class BirdSocket: try: self.__connect() self.__sock.send(cmd + "\n") - return self.__read() + data = self.__read() + return data except socket.error: why = sys.exc_info()[1] self.close() return False, "Bird connection problem: %s" % why def __read(self): - code = "7000" # Not used in bird parsed_string = "" lastline = "" diff --git a/lg-proxy.cfg b/lg-proxy.cfg new file mode 100644 index 0000000..223af9f --- /dev/null +++ b/lg-proxy.cfg @@ -0,0 +1,2 @@ + +ACCESS_LIST = ["91.224.149.206", "178.33.111.110"] diff --git a/lg-proxy.py b/lg-proxy.py new file mode 100644 index 0000000..5be5735 --- /dev/null +++ b/lg-proxy.py @@ -0,0 +1,61 @@ + + +import subprocess +from urllib import unquote + +from bird import BirdSocket + +from flask import Flask, request, abort + +app = Flask(__name__) +app.config.from_pyfile('lg-proxy.cfg') + +def check_accesslist(): + if app.config["ACCESS_LIST"] and request.remote_addr not in app.config["ACCESS_LIST"]: + abort(401) + +@app.route("/traceroute") +@app.route("/traceroute6") +def traceroute(): + check_accesslist() + + if request.path == '/traceroute6': o= "-6" + else: o = "-4" + + query = request.args.get("q","") + query = unquote(query) + + command = [ 'traceroute', o, '-A', '-q1', '-w2', query] + result = subprocess.Popen( command , stdout=subprocess.PIPE).communicate()[0].decode('utf-8', 'ignore').replace("\n","
") + + return result + + + +@app.route("/bird") +@app.route("/bird6") +def bird(): + check_accesslist() + + if request.path == "/bird": b = BirdSocket(file="/var/run/bird.ctl") + elif request.path == "/bird6": b = BirdSocket(file="/var/run/bird6.ctl") + else: return "No bird socket selected", 700 + + query = request.args.get("q","") + query = unquote(query) + + status, result = b.cmd(query) + b.close() + + app.logger.debug(result) + + if status: status = 200 + else: status = 700 + + return result, status + + +if __name__ == "__main__": + app.debug = True + app.run("0.0.0.0") +