package main import ( "fmt" "html/template" "log" "net/http" "os/exec" "syscall" ) var serverCmd *exec.Cmd func startServer(w http.ResponseWriter, r *http.Request) { if serverCmd != nil { fmt.Fprintln(w, "Server is already running.") return } serverCmd = exec.Command("/opt/hl2dm/Steam/hl2dm/srcds_run", "-game", "hl2mp", "+map", "dm_lockdown", "+maxplayers", "16") serverCmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} // Allow stopping the entire process group if err := serverCmd.Start(); err != nil { log.Println("Error starting server:", err) http.Error(w, "Failed to start server", http.StatusInternalServerError) return } fmt.Fprintln(w, "Server started with PID", serverCmd.Process.Pid) } func stopServer(w http.ResponseWriter, r *http.Request) { if serverCmd == nil { fmt.Fprintln(w, "Server is not running.") return } if err := syscall.Kill(-serverCmd.Process.Pid, syscall.SIGKILL); err != nil { log.Println("Error stopping server:", err) http.Error(w, "Failed to stop server", http.StatusInternalServerError) return } serverCmd = nil fmt.Fprintln(w, "Server stopped.") } func main() { http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./static")))) // Define routes http.HandleFunc("/", homeHandler) http.HandleFunc("/hl2", hl2Handler) http.HandleFunc("/quake", quakeHandler) http.HandleFunc("/start", startServer) http.HandleFunc("/stop", stopServer) // http.HandleFunc("/restart", restartServer) // Start the server fmt.Println("Server running on http://localhost:8080") log.Fatal(http.ListenAndServe(":8080", nil)) } // Render the homepage func homeHandler(w http.ResponseWriter, r *http.Request) { tmpl := template.Must(template.ParseFiles("templates/index.xhtml")) tmpl.Execute(w, nil) } // Render the Half-Life 2 page func hl2Handler(w http.ResponseWriter, r *http.Request) { tmpl := template.Must(template.ParseFiles("templates/hl2.xhtml")) tmpl.Execute(w, nil) } // Render the Quake page func quakeHandler(w http.ResponseWriter, r *http.Request) { tmpl := template.Must(template.ParseFiles("templates/quake.xhtml")) tmpl.Execute(w, nil) }