summaryrefslogtreecommitdiff
path: root/bin/tab_server.py
blob: b2f59dd1c32d6df0437ab531301e1469f141b6e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/usr/bin/env python3
"""
Simple tab server for remote newsbeuter. Opens tabs on local desktop from a
newsbeuter running elsewhere. Expected to be port forwarded to the remote
server and then used over curl as newsbeuter"s browser command.

1. RemoteForward 1424 localhost:1424
2. browser "curl -F"a=%u" http://localhost:1424"
3. Profit?!
"""

import os
import sys
import subprocess
import webbrowser
from cgi import FieldStorage
from argparse import ArgumentParser
from wsgiref.simple_server import make_server


at_work = os.environ.get("AT_WORK", "false").lower() == "true"

parser = ArgumentParser()
parser.add_argument("-b", "--browser", help="Browser to use")
parser.add_argument("-a", "--addr", default="127.0.0.1", help="Bind address")
parser.add_argument("-p", "--port", help="Bind port", type=int,
    default="1425" if at_work else "1424")


args = parser.parse_args()
opener = webbrowser.get(args.browser).open_new_tab


try:
    with open("/dev/null", "w") as fp:
        subprocess.call(["open"], stderr=fp)
    use_open = True
except OSError:
    use_open = False


def simple_app(environ, start_response):
    if environ["REMOTE_ADDR"] != "127.0.0.1":
        start_response("403 Forbidden", [("Content-type", "text/plain")])
        return "Go away."
    else:
        start_response("200 OK", [("Content-type", "text/plain")])

    url = FieldStorage(fp=environ["wsgi.input"], environ=environ).getvalue("a")

    if use_open:
        subprocess.call(['open', url], shell=False)
        return ""
    else:
        return opener(url) and ""


try:
    print("Listening on {}:{}...".format(args.addr, args.port))
    make_server(args.addr, args.port, simple_app).serve_forever()
except KeyboardInterrupt:
    print("Shutting down...")
    sys.exit(0)