From c0bbea5c830fc2c504bcf6fe1eda36d734db6733 Mon Sep 17 00:00:00 2001 From: Kristjan Komlosi Date: Sat, 17 May 2025 19:51:45 +0200 Subject: [PATCH] sinhronizacija --- __pycache__/main.cpython-313.pyc | Bin 8308 -> 10058 bytes main.py | 263 ++++++++++++++++++++----------- wall_messages.db | Bin 12288 -> 28672 bytes index.html => webroot/index.html | 93 ++++++++++- 4 files changed, 253 insertions(+), 103 deletions(-) rename index.html => webroot/index.html (59%) diff --git a/__pycache__/main.cpython-313.pyc b/__pycache__/main.cpython-313.pyc index c868ef3d58c7fdd57e5810023dc16d60257ed662..55cae707315b4e92bb53599bf2b77822aa329689 100644 GIT binary patch literal 10058 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 KM`Vim!v6zy<18=$ diff --git a/main.py b/main.py index 83124f7..51da36d 100644 --- a/main.py +++ b/main.py @@ -9,45 +9,20 @@ from fastapi import HTTPException import os from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles +import threading if os.environ.get("DATABASE_URL") == None: os.environ["DATABASE_URL"] = "sqlite:///./wall_messages.db" app = FastAPI() -start_time = time.time() -@app.get("/uptime") -def get_uptime(): - uptime_seconds = int(time.time() - start_time) - uptime_str = str(datetime.timedelta(seconds=uptime_seconds)) - return {"uptime_seconds": uptime_seconds, "uptime": uptime_str} - -@app.get("/disk") -def get_disk_usage(): - usage = psutil.disk_usage('/') - return { - "total": usage.total, - "used": usage.used, - "free": usage.free, - "percent": usage.percent - } - -@app.get("/ram") -def get_ram_usage(): - mem = psutil.virtual_memory() - return { - "total": mem.total, - "available": mem.available, - "used": mem.used, - "percent": mem.percent - } -@app.get("/cpu") -def get_cpu_usage(): - cpu_percent = psutil.cpu_percent(interval=1) - return {"cpu_percent": cpu_percent} - - +cpu_threshold = 80 +ram_threshold = 80 +disk_threshold = 80 +cpu_normal = True +ram_normal = True +disk_normal = True DATABASE_URL = "sqlite:///./wall_messages.db" @@ -55,89 +30,184 @@ engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False}) SessionLocal = sessionmaker(bind=engine) Base = declarative_base() -class WallMessageDB(Base): - __tablename__ = "wall_messages" +class LimitsModel(Base): + __tablename__ = "limits" id = Column(Integer, primary_key=True, index=True) - text = Column(String, nullable=False) - timestamp = Column(DateTime, default=datetime.datetime.utcnow(), nullable=False) + cpu_threshold = Column(Integer, default=80) + ram_threshold = Column(Integer, default=80) + disk_threshold = Column(Integer, default=80) -Base.metadata.create_all(bind=engine) +class OverageEventModel(Base): + __tablename__ = "overages" + id = Column(Integer, primary_key=True, index=True) + cpu_overage = Column(Integer, default=0) + ram_overage = Column(Integer, default=0) + disk_overage = Column(Integer, default=0) + timestamp = Column(DateTime, default=datetime.datetime.now(), nullable=False) -class WallMessageCreate(BaseModel): - text: str - -class WallMessageRead(BaseModel): +class OverageEvent(BaseModel): id: int - text: str + cpu_overage: int + ram_overage: int + disk_overage: int timestamp: datetime.datetime class Config: orm_mode = True -@app.post("/wall", response_model=WallMessageRead) -def post_wall_message(msg: WallMessageCreate): - db = SessionLocal() - db_msg = WallMessageDB(text=msg.text) - db.add(db_msg) - db.commit() - db.refresh(db_msg) - db.close() - return db_msg +Base.metadata.create_all(bind=engine) -@app.get("/wall", response_model=list[WallMessageRead]) -def get_wall_messages(): - db = SessionLocal() - messages = db.query(WallMessageDB).order_by(WallMessageDB.timestamp.desc()).all() - db.close() - return messages -@app.get("/wall/{msg_id}", response_model=WallMessageRead) -def get_wall_message(msg_id: int): +@app.on_event("startup") +def startup_event(): db = SessionLocal() - msg = db.query(WallMessageDB).filter(WallMessageDB.id == msg_id).first() + if not db.query(LimitsModel).first(): + limits = LimitsModel( + cpu_threshold=50, + ram_threshold=50, + disk_threshold=80 + ) + db.add(limits) + db.commit() db.close() - if not msg: - raise HTTPException(status_code=404, detail="Message not found") - return msg -@app.put("/wall/{msg_id}", response_model=WallMessageRead) -def update_wall_message(msg_id: int, msg: WallMessageCreate): - db = SessionLocal() - db_msg = db.query(WallMessageDB).filter(WallMessageDB.id == msg_id).first() - if not db_msg: +def check_and_log_overages(): + while True: + db = SessionLocal() + limits = db.query(LimitsModel).first() + if limits: + cpu_limit = limits.cpu_threshold + ram_limit = limits.ram_threshold + disk_limit = limits.disk_threshold + + cpu = psutil.cpu_percent(interval=0.5) + ram = psutil.virtual_memory().percent + disk = psutil.disk_usage('/').percent + + cpu_over = int(cpu > cpu_limit) + ram_over = int(ram > ram_limit) + disk_over = int(disk > disk_limit) + + last_event = db.query(OverageEventModel).order_by(OverageEventModel.timestamp.desc()).first() + should_log = False + + if last_event is None: + should_log = True + else: + if ( + last_event.cpu_overage != cpu_over or + last_event.ram_overage != ram_over or + last_event.disk_overage != disk_over + ): + should_log = True + + if should_log: + event = OverageEventModel( + cpu_overage=cpu_over, + ram_overage=ram_over, + disk_overage=disk_over, + timestamp=datetime.datetime.now() + ) + db.add(event) + db.commit() db.close() - raise HTTPException(status_code=404, detail="Message not found") - db_msg.text = msg.text - db.commit() - db.refresh(db_msg) - db.close() - return db_msg + time.sleep(10) -@app.delete("/wall/{msg_id}") -def delete_wall_message(msg_id: int): - db = SessionLocal() - db_msg = db.query(WallMessageDB).filter(WallMessageDB.id == msg_id).first() - if not db_msg: - db.close() - raise HTTPException(status_code=404, detail="Message not found") - db.delete(db_msg) - db.commit() - db.close() - return {"status": "success", "message": f"Deleted message {msg_id}"} +threading.Thread(target=check_and_log_overages, daemon=True).start() -class WallMessage(BaseModel): - message: str + + +start_time = time.time() +class Info(BaseModel): + uptime: datetime.datetime + cpu: float + ram: float + disk: float + cpu_threshold: int + ram_threshold: int + disk_threshold: int + cpu_normal: bool + ram_normal: bool + disk_normal: bool -wall_messages = [] +class Thresholds(BaseModel): + cpu_threshold: int + ram_threshold: int + disk_threshold: int -@app.post("/wall") -def post_wall_message(msg: WallMessage): - wall_messages.append(msg.message) - return {"status": "success", "message": msg.message} -@app.get("/wall") -def get_wall_messages(): - return wall_messages +@app.get("/info", response_class=Info) +def get_info(): + cpu = psutil.cpu_percent(interval=0.5) + ram = psutil.virtual_memory().percent + disk = psutil.disk_usage('/').percent + uptime = time.time() - start_time + info = Info( + uptime=uptime, + cpu=cpu, + ram=ram, + disk=disk, + cpu_threshold=cpu_threshold, + ram_threshold=ram_threshold, + disk_threshold=disk_threshold, + cpu_normal=cpu <= cpu_threshold, + ram_normal=ram <= ram_threshold, + disk_normal=disk <= disk_threshold + ) + return info + +@app.get("/limits", response_model=Thresholds) +def get_limits(): + return { + "cpu_threshold": cpu_threshold, + "ram_threshold": ram_threshold, + "disk_threshold": disk_threshold + } + +@app.post("/limits") +def set_limits(thresholds: Thresholds): + db = SessionLocal() + limits = db.query(LimitsModel).first() + if limits: + limits.cpu_threshold = thresholds.cpu_threshold + limits.ram_threshold = thresholds.ram_threshold + limits.disk_threshold = thresholds.disk_threshold + db.commit() + db.refresh(limits) + db.close() + + return { + "cpu": cpu_threshold, + "ram": ram_threshold, + "disk": disk_threshold + } +@app.get("/overages", response_model=list[OverageEvent]) +def get_overages(): + db = SessionLocal() + overages = db.query(OverageEventModel).order_by(OverageEventModel.timestamp.desc()).all() + db.close() + return overages + +@app.get("/overages/{overage_id}", response_model=OverageEvent) +def get_overage(overage_id: int): + db = SessionLocal() + overage = db.query(OverageEventModel).filter(OverageEventModel.id == overage_id).first() + db.close() + if not overage: + raise HTTPException(status_code=404, detail="Overage event not found") + return overage + +@app.delete("/overages/{overage_id}") +def delete_overage(overage_id: int): + db = SessionLocal() + overage = db.query(OverageEventModel).filter(OverageEventModel.id == overage_id).first() + if not overage: + db.close() + raise HTTPException(status_code=404, detail="Overage event not found") + db.delete(overage) + db.commit() + db.close() + return {"detail": "Overage event deleted"} app.add_middleware( CORSMiddleware, @@ -146,4 +216,5 @@ app.add_middleware( allow_methods=["*"], allow_headers=["*"], ) -app.mount("/", StaticFiles(directory=".", html=True), name="static") \ No newline at end of file + +app.mount("/", StaticFiles(directory="./webroot", html=True), name="static") \ No newline at end of file diff --git a/wall_messages.db b/wall_messages.db index aa94765ba6c842439b46a7365dda292550529894..a86a9ae0e057980c742ab6771a64b168d6730e37 100644 GIT binary patch literal 28672 zcmeI)Pfyce90%||YuB+Ut+#~($#a>2k!I_kt!q43SyjRqIEPA%lHn?A+=OgJ@hCCA z0^bgAz@sNmoIDv1MiWjPe7aGjILJ5<1Nk=V)8~19&(rStv^#Xq)`t(up6}9^>z#Jp zry6&SBZRw6DaUacwkFsbE+WeaVS#PQk^D*745xg&G0LLi)gPSvSo$r^N&M(7R=@%Q z2tWV=5P$##AOHafK;Rq&Dx#R48Yiyzy5VklTPy2t+)jPX?XGx@Fq@dEI(E&Wvz3zb zght!Yg$fPZ(Mhi{^}ZBOq{qj}_EW#U+H%8KxD^lfRkQDuog+O{Nw2{UP;>4%Ra#l7 z(aKV}e3PbQ22qsJh{GUk$4Fy|&x+>+KC%Vk4=|&O4EVELLad?dmd} zbC!F9NKM@p#B^qiJPTP`Ufc5nlzt|Doa8Vbfb8C=3BJ6W2 zgx~DA-R64hkSe4Y80cXPjQl&^)tH#pCdj*Ryl?BR)(SK09$X8NGJkyZktjn75F&Mb zi|Ztjo|qupS9%ta29ZK6A`=PG$rFKmcgv@b?CQ*YJ9-J7`Q-QR&7~bq{w#lzpUacd zFKI{mAXU!sV~AZt00Izz00bZa0SG_<0uX=z1kNU)i2_%!XBL;}W^nUPo8DT}qFPbW zGip{frnAO$PNzB3GK!XADn`-F6|#C<;EHyMeR~q=Wg3clS}$SfUZ$n%ik4MPGq3YQ z_bOPrrWkp{G&MaobT8dfRYf=QT0zsv(7jYkEhE0+fi{ z$Vk#Yd>Vp5a~gXTf|U!NP++Q>iTVGFd1mphApijgKmY;|fB*y_009U<00P4b1oQuY E0DbCd4gdfE delta 90 zcmZp8z}S#5L0XWLfq{V;h+%+fqK+|8P_Ips7bwKU_nCn|obU5yMS*6%&7b)M8QB;F a7#R2uZx(cT%|9`Kn~Mvi5hU~nCIkTRjuMan diff --git a/index.html b/webroot/index.html similarity index 59% rename from index.html rename to webroot/index.html index 4904066..cdbe140 100644 --- a/index.html +++ b/webroot/index.html @@ -17,7 +17,7 @@
-

System Monitor

+

NUIKS SysMonitor

CPU Usage: --
RAM Usage: --
SSD Usage: --
@@ -25,7 +25,7 @@
-

Wall Messages

+

Limit overages

@@ -33,6 +33,25 @@
    +
    +

    Resource Limits

    +
    + CPU Limit: + + 50% +
    +
    + RAM Limit: + + 50% +
    +
    + SSD Limit: + + 50% +
    +
    + + +