Compare commits

...

2 Commits

Author SHA1 Message Date
Stefan Nilsson
a0bdb57b79 Replaced OS ping with python ping3 2025-02-11 14:53:50 +01:00
Stefan Nilsson
edbee69a8f Added delete to servers and clusters 2025-02-11 14:27:28 +01:00
3 changed files with 32 additions and 3 deletions

View File

@ -1,4 +1,4 @@
FROM python:3.10-slim
FROM python:3.13-slim
WORKDIR /app

32
main.py
View File

@ -7,6 +7,7 @@ import sqlite3
from wakeonlan import send_magic_packet
from pydantic import BaseModel
from fastapi.openapi.utils import get_openapi
from ping3 import ping
# Database setup
def init_db():
@ -59,6 +60,13 @@ def add_or_update_cluster(name: str, api_token: str):
conn.commit()
conn.close()
def delete_cluster(name: str):
conn = sqlite3.connect("servers.db")
cursor = conn.cursor()
cursor.execute("DELETE FROM clusters WHERE name = ?", (name,))
conn.commit()
conn.close()
def add_or_update_server(name: str, ip: str, mac: str, cluster_name: str):
conn = sqlite3.connect("servers.db")
cursor = conn.cursor()
@ -66,6 +74,13 @@ def add_or_update_server(name: str, ip: str, mac: str, cluster_name: str):
conn.commit()
conn.close()
def delete_server(name: str):
conn = sqlite3.connect("servers.db")
cursor = conn.cursor()
cursor.execute("DELETE FROM servers WHERE name = ?", (name,))
conn.commit()
conn.close()
app = FastAPI()
class ServerModel(BaseModel):
@ -134,15 +149,21 @@ def get_clusters():
return list_clusters()
@app.post("/clusters")
@app.put("/clusters")
def add_cluster(cluster: ClusterModel):
"""Adds or updates a cluster."""
add_or_update_cluster(cluster.name, cluster.api_token)
return {"message": "Cluster added/updated successfully"}
@app.delete("/clusters/{cluster_name}")
def remove_cluster(cluster_name: str):
"""Deletes a cluster."""
delete_cluster(cluster_name)
return {"message": "Cluster deleted successfully"}
def check_power_state(server_ip):
"""Check if the server is online by pinging it."""
response = subprocess.run(["ping", "-c", "1", server_ip], stdout=subprocess.DEVNULL)
return "on" if response.returncode == 0 else "off"
return "on" if ping(server_ip, timeout=1) else "off"
@app.get("/states/{server_name}")
def get_power_status(server_name: str):
@ -186,9 +207,16 @@ def get_servers():
return list_servers()
@app.post("/servers")
@app.put("/servers")
def add_server(server: ServerModel):
"""Adds or updates a server."""
add_or_update_server(server.name, server.ip, server.mac, server.cluster_name)
return {"message": "Server added/updated successfully"}
@app.delete("/servers/{server_name}")
def remove_server(server_name: str):
"""Deletes a server."""
delete_server(server_name)
return {"message": "Server deleted successfully"}
# Run the server with: uvicorn main:app --host 0.0.0.0 --port 8000

View File

@ -6,6 +6,7 @@ click==8.1.8
fastapi==0.115.8
h11==0.14.0
idna==3.10
ping3==4.0.8
pydantic==2.10.6
pydantic_core==2.27.2
requests==2.32.3