package webserver import ( "encoding/json" "fmt" "net/http" serveractions "manage-servers/server-actions" "github.com/spf13/viper" ) type WebServer struct { servers []serveractions.Server } func StartWebServer(servers []serveractions.Server) { ws := &WebServer{servers: servers} fmt.Println("Starting web server on :8080...") http.HandleFunc("/", ws.handleRoot) http.HandleFunc("/servers", ws.handleServers) http.HandleFunc("/wake", ws.handleWakeServer) http.HandleFunc("/shutdown", ws.handleShutdownServer) http.HandleFunc("/reboot", ws.handleRebootServer) http.HandleFunc("/status", ws.handleStatus) if err := http.ListenAndServe(":8080", nil); err != nil { fmt.Printf("Error starting server: %v\n", err) } } func (ws *WebServer) handleRoot(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "index.html") } func (ws *WebServer) handleServers(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: ws.getServers(w, r) case http.MethodPost: ws.addServer(w, r) case http.MethodDelete: ws.deleteServer(w, r) default: http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) } } func (ws *WebServer) getServers(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(ws.servers) } func (ws *WebServer) addServer(w http.ResponseWriter, r *http.Request) { var newServer serveractions.Server if err := json.NewDecoder(r.Body).Decode(&newServer); err != nil { http.Error(w, "Invalid request body", http.StatusBadRequest) return } ws.servers = append(ws.servers, newServer) viper.Set("servers", ws.servers) if err := viper.WriteConfig(); err != nil { // If the file does not exist, create it if _, ok := err.(viper.ConfigFileNotFoundError); ok { if err = viper.SafeWriteConfig(); err != nil { http.Error(w, fmt.Sprintf("Error creating config file: %v", err), http.StatusInternalServerError) return } } else { http.Error(w, fmt.Sprintf("Error writing config file: %v", err), http.StatusInternalServerError) return } } w.WriteHeader(http.StatusCreated) } func (ws *WebServer) deleteServer(w http.ResponseWriter, r *http.Request) { serverName := r.URL.Query().Get("name") if serverName == "" { http.Error(w, "Missing server name", http.StatusBadRequest) return } var found bool var updatedServers []serveractions.Server for _, server := range ws.servers { if server.Name != serverName { updatedServers = append(updatedServers, server) } else { found = true } } if !found { http.Error(w, "Server not found", http.StatusNotFound) return } ws.servers = updatedServers viper.Set("servers", ws.servers) if err := viper.WriteConfig(); err != nil { http.Error(w, fmt.Sprintf("Error writing config file: %v", err), http.StatusInternalServerError) return } w.WriteHeader(http.StatusOK) } func (ws *WebServer) handleWakeServer(w http.ResponseWriter, r *http.Request) { serverName := r.URL.Query().Get("name") if serverName == "" { http.Error(w, "Missing server name", http.StatusBadRequest) return } serveractions.WakeServer(serverName, ws.servers) w.WriteHeader(http.StatusOK) } func (ws *WebServer) handleShutdownServer(w http.ResponseWriter, r *http.Request) { serverName := r.URL.Query().Get("name") if serverName == "" { http.Error(w, "Missing server name", http.StatusBadRequest) return } serveractions.ShutdownServer(serverName, ws.servers) w.WriteHeader(http.StatusOK) } func (ws *WebServer) handleRebootServer(w http.ResponseWriter, r *http.Request) { serverName := r.URL.Query().Get("name") if serverName == "" { http.Error(w, "Missing server name", http.StatusBadRequest) return } serveractions.RebootServer(serverName, ws.servers) w.WriteHeader(http.StatusOK) } func (ws *WebServer) handleStatus(w http.ResponseWriter, r *http.Request) { serverName := r.URL.Query().Get("name") if serverName == "" { http.Error(w, "Missing server name", http.StatusBadRequest) return } for _, s := range ws.servers { if s.Name == serverName { online := serveractions.PingHost(s.IP) status := "Offline" if online { status = "Online" } w.Write([]byte(status)) return } } http.Error(w, "Server not found", http.StatusNotFound) }