commit af4656db68b8221fab9556e329a49280ad3102f2 Author: Kristjan Komlosi Date: Wed May 14 18:22:18 2025 +0200 zacetni test 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 0000000..c868ef3 Binary files /dev/null and b/__pycache__/main.cpython-313.pyc differ 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 0000000..aa94765 Binary files /dev/null and b/wall_messages.db differ