-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlookup_server.py
executable file
·69 lines (64 loc) · 1.88 KB
/
lookup_server.py
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
64
65
66
67
68
69
#!/usr/bin/env python3
from fastapi import FastAPI, Request, BackgroundTasks
from datetime import datetime, timedelta
lookup = {}
last_check = datetime.now()
app = FastAPI()
def clear_old_entries():
global last_check
last_check = datetime.now()
for k, v in lookup.copy().items():
if datetime.now() - v["timestamp"] > timedelta(minutes=15):
del lookup[k]
@app.get("/")
async def root(request: Request, key: str, background_tasks: BackgroundTasks):
global lookup
if datetime.now() - last_check > timedelta(minutes=15):
background_tasks.add_task(clear_old_entries)
delimiter = request.headers.get("actually-post-with-delimiter", "")
delete = request.headers.get("actually-delete", None)
if delete:
try:
del lookup[key]
return True
except KeyError:
return None
if not delimiter or (delimiter and delimiter not in key):
if not key:
return lookup
else:
return lookup.get(key, None)
else:
keylist = key.split(delimiter)
key = keylist[0]
keylist.pop(0)
if lookup.get(key, None) is None:
lookup[key] = {}
if len(keylist) > 1:
lookup[key]["list"] = keylist
else:
lookup[key]["value"] = keylist[0]
lookup[key]["timestamp"] = datetime.now()
return lookup.get(key)
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser()
parser.add_argument(
"ip", nargs="?")
parser.add_argument(
"port", nargs="?", type=int, default=8000)
args = parser.parse_args()
ip = args.ip
port = args.port
if not ip:
import re
import subprocess
result = subprocess.run(['ip', 'addr', 'show', 'docker0'], capture_output=True, text=True)
ip_pattern = r'inet\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
match = re.search(ip_pattern, result.stdout)
if match:
ip = match.group(1)
else:
ip = "0.0.0.0"
import uvicorn
uvicorn.run(app, host=ip, port=port)