waterlevel
This commit is contained in:
parent
74ac3f86f1
commit
601d1f6e74
2 changed files with 53 additions and 63 deletions
106
main.py
106
main.py
|
|
@ -14,81 +14,69 @@ from datetime import datetime
|
||||||
from fastapi.exceptions import RequestValidationError
|
from fastapi.exceptions import RequestValidationError
|
||||||
from starlette.exceptions import HTTPException as StarletteHTTPException
|
from starlette.exceptions import HTTPException as StarletteHTTPException
|
||||||
from fastapi.exceptions import RequestValidationError
|
from fastapi.exceptions import RequestValidationError
|
||||||
from fastapi.responses import PlainTextResponse
|
from fastapi.responses import PlainTextResponse, JSONResponse
|
||||||
from fastapi.exception_handlers import (
|
from fastapi.exception_handlers import (
|
||||||
http_exception_handler,
|
http_exception_handler,
|
||||||
request_validation_exception_handler,
|
request_validation_exception_handler,
|
||||||
)
|
)
|
||||||
|
import threading
|
||||||
|
import socket
|
||||||
|
import struct
|
||||||
|
from zoneinfo import ZoneInfo
|
||||||
|
|
||||||
temp_dir = r"/home/td/WebTemp"
|
temp_dir = r"/home/td/WebTemp"
|
||||||
tempfile.tempdir = temp_dir
|
tempfile.tempdir = temp_dir
|
||||||
con = psycopg2.connect("host=127.0.0.1 dbname=test user=alfred password='Alf red'")
|
|
||||||
|
|
||||||
|
|
||||||
app = FastAPI(title="user manager", description="User session management.", version="0.0.0.1",
|
app = FastAPI(title="user manager", description="User session management.", version="0.0.0.1",
|
||||||
docs_url="/server/docs", redoc_url="/server/redoc", openapi_url="/server/openapi.json")
|
docs_url="/server/docs", redoc_url="/server/redoc", openapi_url="/server/openapi.json")
|
||||||
|
|
||||||
app.mount("/server/static", StaticFiles(directory="static"), name="static")
|
app.mount("/server/static", StaticFiles(directory="static"), name="static")
|
||||||
templates = Jinja2Templates(directory="templates")
|
templates = Jinja2Templates(directory="templates")
|
||||||
|
distance_value = 0.0
|
||||||
|
last_updated = None
|
||||||
|
distance_value_rev = 0.0
|
||||||
|
|
||||||
@app.get("/server", response_class=HTMLResponse)
|
def get_udp_water_value():
|
||||||
async def get_server(request: Request):
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
ip = request.headers['X-Real-IP']
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
|
||||||
c = request.cookies.get("failed_reason", None)
|
count = 0
|
||||||
if c is None:
|
while True:
|
||||||
return templates.TemplateResponse(request=request, name='index.html',context={"status":""})
|
try:
|
||||||
else:
|
sock.bind(('', 8176))
|
||||||
return templates.TemplateResponse(request=request, name='index.html',context={"status":f"Failed to login: {c}"})
|
sock.settimeout(5.0)
|
||||||
|
break
|
||||||
|
except Exception as e:
|
||||||
|
count+=1
|
||||||
|
print("Exception: e", e)
|
||||||
|
time.sleep(5)
|
||||||
|
if count >= 100:
|
||||||
|
raise e
|
||||||
|
zone = ZoneInfo("Asia/Kolkata");
|
||||||
|
print("Bound to address: 8176")
|
||||||
|
global distance_value
|
||||||
|
global last_updated
|
||||||
|
global distance_value_rev
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
data, addr = sock.recvfrom(4)
|
||||||
|
print(f"Got data: {data.hex()}")
|
||||||
|
distance_value = struct.unpack('>f', data)
|
||||||
|
distance_value_rev = struct.unpack('<f', data)
|
||||||
|
print(f"Updated distance_value to: {distance_value}")
|
||||||
|
last_updated = datetime.now(zone).strftime("%d/%m/%y %H:%M:%S");
|
||||||
|
except Exception as e:
|
||||||
|
print("Did not get any data in 5 seconds: ", e)
|
||||||
|
|
||||||
|
thread = threading.Thread(target=get_udp_water_value)
|
||||||
|
thread.start();
|
||||||
|
|
||||||
|
|
||||||
@app.get("/server/user", response_class=HTMLResponse)
|
@app.get("/server/waterlevel", response_class=JSONResponse)
|
||||||
async def get_user_server(request: Request):
|
async def get_water_level(request: Request):
|
||||||
ip = request.headers['X-Real-IP']
|
global distance_value
|
||||||
username = request.cookies.get('username', None)
|
global last_updated
|
||||||
session_key = request.cookies.get('session_key', None)
|
global distance_value_rev
|
||||||
if username is None or len(username) == 0:
|
return {"water_level": distance_value, "water_level_rev": distance_value_rev, "updated_on": last_updated}
|
||||||
return RedirectResponse("/server", status_code=303)
|
|
||||||
if session_key is None or len(session_key) == 0:
|
|
||||||
return RedirectResponse("/server", status_code=303)
|
|
||||||
if not validate_session_key(username, session_key):
|
|
||||||
r = RedirectResponse("/server", status_code=303)
|
|
||||||
r.set_cookie("failed_reason", "Could not validate user session")
|
|
||||||
return r
|
|
||||||
active_users = get_active_users()
|
|
||||||
return templates.TemplateResponse(request=request, name='user.html',context={"username":username, "active_users": active_users})
|
|
||||||
|
|
||||||
|
|
||||||
def get_active_users() -> list[list]:
|
|
||||||
active_users = []
|
|
||||||
cur = con.cursor()
|
|
||||||
cur.execute("Select * from API_USERS where session_status = 'ACTIVE'")
|
|
||||||
results = cur.fetchall()
|
|
||||||
print(f"Results -> {len(results)}")
|
|
||||||
for i in results:
|
|
||||||
j = [i[0], i[3]]
|
|
||||||
active_users.append(j)
|
|
||||||
print("Active users: ", active_users)
|
|
||||||
return active_users
|
|
||||||
|
|
||||||
|
|
||||||
def validate_session_key(username, session_key) -> bool:
|
|
||||||
cur = con.cursor()
|
|
||||||
cur.execute(f"Select username, session_key, session_status, expiry_time from API_USERS where session_status='ACTIVE' and username='{username}'")
|
|
||||||
results = cur.fetchall()
|
|
||||||
if len(results) <= 0:
|
|
||||||
return False
|
|
||||||
(q_username, q_session_key, q_session_status, q_expiry_time) = results[0]
|
|
||||||
print("Len ->", len(results))
|
|
||||||
if q_username == username and q_session_key == session_key:
|
|
||||||
now_time = datetime.now()
|
|
||||||
q_expiry_time = q_expiry_time
|
|
||||||
print("Expiry time", q_expiry_time, now_time)
|
|
||||||
if q_expiry_time < now_time:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# @app.post("/api/users/create", response_class=RedirectResponse)
|
# @app.post("/api/users/create", response_class=RedirectResponse)
|
||||||
|
|
|
||||||
|
|
@ -33,9 +33,11 @@
|
||||||
if (parts.length === 2) return parts.pop().split(';').shift();
|
if (parts.length === 2) return parts.pop().split(';').shift();
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
<div align="right">
|
||||||
|
<a href="/api/users/logout" onclick="location.href=this.href+'?username='+getCookie('username')+'&session_key='+getCookie('session_key')+'&redirect=/server';return false;" class="btn btn-primary" role="button">Logout</a>
|
||||||
|
</div>
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<h3>Server Manager, Welcome {{ username }} </h3>
|
<h3>Server Manager, Welcome {{ username }} </h3>
|
||||||
<a href="/api/users/logout" onclick="location.href=this.href+'?username='+getCookie('username')+'&session_key='+getCookie('session_key')+'&redirect=/server';return false;">Logout</a>
|
|
||||||
</div>
|
</div>
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue