waterlevel

This commit is contained in:
TheUnrealDragon 2026-06-12 21:34:09 +05:30
commit 601d1f6e74
2 changed files with 53 additions and 63 deletions

106
main.py
View file

@ -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)

View file

@ -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>