346 lines
3.7 KiB
TypeScript
346 lines
3.7 KiB
TypeScript
import { spawn, ChildProcess } from "child_process";
|
|
import { ServerStartCommand } from "server-manager-shared";
|
|
import { SERVER_SCRIPT_PATH, SERVER_WORKING_DIRECTORY } from "./config";
|
|
import { getLogger } from "./logger";
|
|
|
|
const logger = getLogger("ProcessManager");
|
|
|
|
|
|
interface ServerProcess {
|
|
|
|
|
|
id:string;
|
|
|
|
name:string;
|
|
|
|
port:number;
|
|
|
|
queryPort:number;
|
|
|
|
process:ChildProcess;
|
|
|
|
started:number;
|
|
|
|
alive:boolean;
|
|
|
|
|
|
players:number;
|
|
|
|
maxPlayers:number;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
export class ProcessManager {
|
|
|
|
|
|
|
|
private processes =
|
|
new Map<string, ServerProcess>();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
startServer(data: ServerStartCommand){
|
|
|
|
|
|
|
|
logger.debug(
|
|
"Starte Game Server:",
|
|
data.name
|
|
);
|
|
|
|
|
|
|
|
|
|
const args = [
|
|
|
|
`-Port=${data.port}`,
|
|
|
|
`-QueryPort=${data.queryPort}`,
|
|
|
|
`-ServerName=${data.name}`
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
const process = spawn(
|
|
SERVER_SCRIPT_PATH,
|
|
args,
|
|
{
|
|
cwd: SERVER_WORKING_DIRECTORY,
|
|
stdio:"pipe",
|
|
detached:true
|
|
}
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
process.stdout?.on(
|
|
"data",
|
|
data=>{
|
|
|
|
|
|
logger.debug(
|
|
`[${data.name}]`,
|
|
data.toString()
|
|
);
|
|
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
process.stderr?.on(
|
|
|
|
"data",
|
|
|
|
data=>{
|
|
|
|
|
|
logger.error(
|
|
|
|
"SERVER ERROR:",
|
|
data.toString()
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
process.on("exit", code=>{
|
|
|
|
|
|
const server =
|
|
this.processes.get(data.serverId);
|
|
|
|
|
|
|
|
if(server){
|
|
|
|
|
|
logger.info(
|
|
"Server beendet:",
|
|
server.name,
|
|
code
|
|
);
|
|
|
|
|
|
this.processes.delete(
|
|
data.serverId
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.processes.set(
|
|
|
|
data.serverId,
|
|
|
|
{
|
|
|
|
id:data.serverId,
|
|
|
|
name:data.name,
|
|
|
|
port:data.port,
|
|
|
|
queryPort:data.queryPort,
|
|
|
|
process,
|
|
|
|
started:Date.now(),
|
|
|
|
alive:true,
|
|
|
|
|
|
players:0,
|
|
|
|
maxPlayers:0
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
logger.info(
|
|
"Server gestartet:",
|
|
{
|
|
id:data.serverId,
|
|
pid:process.pid
|
|
}
|
|
);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
stopServer(id:string){
|
|
|
|
|
|
|
|
const server =
|
|
this.processes.get(id);
|
|
|
|
|
|
|
|
|
|
if(!server){
|
|
|
|
|
|
logger.warn(
|
|
|
|
"Server nicht gefunden:",
|
|
|
|
id
|
|
|
|
);
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
logger.debug(
|
|
"Stoppe Server:",
|
|
server.name
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
process.kill(
|
|
-server.process.pid!,
|
|
"SIGTERM"
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
getServers(){
|
|
|
|
|
|
return Array.from(
|
|
|
|
this.processes.values()
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
getStatus(){
|
|
|
|
|
|
return Array.from(
|
|
this.processes.values()
|
|
).map(server => ({
|
|
|
|
|
|
id:
|
|
server.id,
|
|
|
|
|
|
name:
|
|
server.name,
|
|
|
|
|
|
port:
|
|
server.port,
|
|
|
|
|
|
queryPort:
|
|
server.queryPort,
|
|
|
|
|
|
pid:
|
|
server.process.pid,
|
|
|
|
|
|
alive:
|
|
server.alive,
|
|
|
|
|
|
players:
|
|
server.players,
|
|
|
|
|
|
maxPlayers:
|
|
server.maxPlayers,
|
|
|
|
|
|
started:
|
|
server.started
|
|
|
|
|
|
}));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|