From af4656db68b8221fab9556e329a49280ad3102f2 Mon Sep 17 00:00:00 2001 From: Kristjan Komlosi Date: Wed, 14 May 2025 18:22:18 +0200 Subject: [PATCH] zacetni test --- Dockerfile | 22 +++++ __pycache__/main.cpython-313.pyc | Bin 0 -> 8308 bytes index.html | 143 +++++++++++++++++++++++++++++ main.py | 149 +++++++++++++++++++++++++++++++ requirements.txt | 16 ++++ wall_messages.db | Bin 0 -> 12288 bytes 6 files changed, 330 insertions(+) create mode 100644 Dockerfile create mode 100644 __pycache__/main.cpython-313.pyc create mode 100644 index.html create mode 100644 main.py create mode 100644 requirements.txt create mode 100644 wall_messages.db diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b1c1057 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,22 @@ +# Use official Python base image +FROM python:3.11-slim + +# Set environment variables + +# Set working directory +WORKDIR /app + +# Copy requirements file +COPY requirements.txt . + +# Install dependencies +RUN pip install --upgrade pip && pip install -r requirements.txt + +# Copy the rest of the app +COPY . . + +# Expose port (change if needed) +EXPOSE 8000 + +# Run the application +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/__pycache__/main.cpython-313.pyc b/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c868ef3d58c7fdd57e5810023dc16d60257ed662 GIT binary patch literal 8308 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 KM`Vim!v6zy<18=$ literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..4904066 --- /dev/null +++ b/index.html @@ -0,0 +1,143 @@ + + + + + System Monitor + + + + +
+

System Monitor

+
CPU Usage: --
+
RAM Usage: --
+
SSD Usage: --
+
Uptime: --
+
+ +
+

Wall Messages

+
+ + +
+
    +
    + + + + \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..83124f7 --- /dev/null +++ b/main.py @@ -0,0 +1,149 @@ +from fastapi import FastAPI +import psutil +import time +import datetime +from pydantic import BaseModel +from sqlalchemy import create_engine, Column, Integer, String, DateTime +from sqlalchemy.orm import sessionmaker, declarative_base +from fastapi import HTTPException +import os +from fastapi.middleware.cors import CORSMiddleware +from fastapi.staticfiles import StaticFiles + +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} + + + + +DATABASE_URL = "sqlite:///./wall_messages.db" + +engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False}) +SessionLocal = sessionmaker(bind=engine) +Base = declarative_base() + +class WallMessageDB(Base): + __tablename__ = "wall_messages" + id = Column(Integer, primary_key=True, index=True) + text = Column(String, nullable=False) + timestamp = Column(DateTime, default=datetime.datetime.utcnow(), nullable=False) + +Base.metadata.create_all(bind=engine) + +class WallMessageCreate(BaseModel): + text: str + +class WallMessageRead(BaseModel): + id: int + text: str + 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 + +@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): + db = SessionLocal() + msg = db.query(WallMessageDB).filter(WallMessageDB.id == msg_id).first() + 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: + 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 + +@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}"} + +class WallMessage(BaseModel): + message: str + +wall_messages = [] + +@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.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) +app.mount("/", StaticFiles(directory=".", html=True), name="static") \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..0727de3 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,16 @@ +annotated-types==0.7.0 +anyio==4.9.0 +click==8.2.0 +fastapi==0.115.12 +greenlet==3.2.2 +h11==0.16.0 +idna==3.10 +psutil==7.0.0 +pydantic==2.11.4 +pydantic_core==2.33.2 +sniffio==1.3.1 +SQLAlchemy==2.0.40 +starlette==0.46.2 +typing-inspection==0.4.0 +typing_extensions==4.13.2 +uvicorn==0.34.2 diff --git a/wall_messages.db b/wall_messages.db new file mode 100644 index 0000000000000000000000000000000000000000..aa94765ba6c842439b46a7365dda292550529894 GIT binary patch literal 12288 zcmeI#yH3L}6b4{BMW6&h*}9&IPzka01qiJL5orn`TslRmVvwZ-5V1rUVc^AhBvuC8 zib}YGHPdg&@j3G4IN#=r^GIn)w+~NMu4%w_80YMeh%x4x-Z6dI922Z96EpH(@qeMq z4&M7)X4cvMWZi4?L4yDUAOHafKmY;|fB*y_009WJBQSH;djp@psQW@Ts>z=7vdk)3 z*ZG~SGgVl5XPAf}6%@uJaYKKsrb$fJ4%$;i|8