diff --git a/dashboard/src/api/client.ts b/dashboard/src/api/client.ts index 38e09d0..9452bf6 100644 --- a/dashboard/src/api/client.ts +++ b/dashboard/src/api/client.ts @@ -19,7 +19,7 @@ export interface Wrapper { export interface Server { id: string; name: string; status: string; wrapperId: string; port: number; - queryPort: number; players: number; maxPlayers: number; created: number; + pid?: number; queryPort: number; players: number; maxPlayers: number; created: number; startedAt?: number; emptySince?: number; alive?: boolean; started?: number; } diff --git a/dashboard/src/pages/ServerDetail.tsx b/dashboard/src/pages/ServerDetail.tsx index 5c555eb..e9d59ac 100644 --- a/dashboard/src/pages/ServerDetail.tsx +++ b/dashboard/src/pages/ServerDetail.tsx @@ -5,8 +5,27 @@ import { PageState } from "../components/PageState"; import { StatusBadge } from "../components/StatusBadge"; const date = (value?: number) => value ? new Date(value).toLocaleString("de-DE") : "–"; + export function ServerDetail() { - const { id = "" } = useParams(); const [item, setItem] = useState(); const [error, setError] = useState(); - useEffect(() => { api.server(id).then(setItem).catch(setError); }, [id]); if (!item) return ; - return <>

← Server

{item.name}

ID{item.id}
Wrapper{item.wrapperId}
Spieler / Kapazität{item.players} / {item.maxPlayers}
Port / Query Port{item.port} / {item.queryPort}
Erstellt{date(item.created)}
Gestartet{date(item.startedAt)}
Leer seit{date(item.emptySince)}
; + const { id = "" } = useParams(); + const [item, setItem] = useState(); + const [error, setError] = useState(); + + useEffect(() => { api.server(id).then(setItem).catch(setError); }, [id]); + + if (!item) return ; + + return <> +

← Server

{item.name}

+
+
ID{item.id}
+
Wrapper{item.wrapperId}
+
PID{item.pid ?? "–"}
+
Spieler / Kapazität{item.players} / {item.maxPlayers}
+
Port / Query Port{item.port} / {item.queryPort}
+
Erstellt{date(item.created)}
+
Gestartet{date(item.startedAt)}
+
Leer seit{date(item.emptySince)}
+
+ ; } diff --git a/manager/src/serverLifecycle.ts b/manager/src/serverLifecycle.ts index b29d5ce..7cc5d3d 100644 --- a/manager/src/serverLifecycle.ts +++ b/manager/src/serverLifecycle.ts @@ -164,6 +164,40 @@ export class ServerLifecycle { + case "RECOVERING": + + + if( + Date.now() - + server.lastSeen + > + LIFECYCLE_CRASH_TIMEOUT + ){ + + + server.status = + "CRASHED"; + + + this.serverRegistry.update( + server + ); + + + logger.error( + "Server-Recovery fehlgeschlagen:", + server.name + ); + + + } + + + break; + + + + case "RUNNING": @@ -318,7 +352,8 @@ export class ServerLifecycle { server => server.status === "RUNNING" || - server.status === "STARTING" + server.status === "STARTING" || + server.status === "RECOVERING" ); @@ -582,7 +617,8 @@ export class ServerLifecycle { s => s.status === "RUNNING" || - s.status === "STARTING" + s.status === "STARTING" || + s.status === "RECOVERING" ) .length; diff --git a/manager/src/serverRegistry.ts b/manager/src/serverRegistry.ts index 7420b19..e057a77 100644 --- a/manager/src/serverRegistry.ts +++ b/manager/src/serverRegistry.ts @@ -16,6 +16,7 @@ export interface ServerInfo { status: | "STARTING" + | "RECOVERING" | "RUNNING" | "STOPPING" | "CRASHED"; @@ -90,7 +91,7 @@ export class ServerRegistry { port: serverData.port, queryPort: serverData.queryPort, created: serverData.created, - status: "STARTING", + status: "RECOVERING", players: 0, maxPlayers: 0, lastSeen: Date.now() @@ -347,7 +348,10 @@ export class ServerRegistry { } - else if(server.status === "RUNNING"){ + else if( + server.status === "RUNNING" || + server.status === "RECOVERING" + ){ server.status = @@ -424,7 +428,8 @@ export class ServerRegistry { } else if( - server.status === "RUNNING" + server.status === "RUNNING" || + server.status === "RECOVERING" ){ server.status = diff --git a/manager/src/web/api.ts b/manager/src/web/api.ts index 98bc0d3..218791b 100644 --- a/manager/src/web/api.ts +++ b/manager/src/web/api.ts @@ -102,6 +102,7 @@ export class WebApi { name: server.name, status: server.status, wrapperId: server.wrapperId, + pid: server.pid, port: server.port, queryPort: server.queryPort, players: server.players, @@ -124,6 +125,7 @@ export class WebApi { name: server.name, status: server.status, wrapperId: server.wrapperId, + pid: server.pid, port: server.port, queryPort: server.queryPort, players: server.players, diff --git a/manager/src/web/types.ts b/manager/src/web/types.ts index 6a5cc11..2d2ed67 100644 --- a/manager/src/web/types.ts +++ b/manager/src/web/types.ts @@ -46,6 +46,7 @@ export interface ServerSummary { name: string; status: string; wrapperId: string; + pid?: number; port: number; queryPort: number; players: number;