package main import ( "encoding/json" "log" "net/http" "network_configurator/network" "network_configurator/network/eth" "network_configurator/network/wlan" "path/filepath" "strings" ) func main() { http.HandleFunc("/api/eth/netplan", eth.NetplanHandler) http.HandleFunc("/api/eth/netplan/raw", eth.RawNetplanHandler) http.HandleFunc("/api/eth/mac", eth.MacAdres) http.HandleFunc("/api/eth/eth0ips", eth.InterfaceIPs) http.HandleFunc("/api/wlan/connect", wlan.ConnectWiFi) http.HandleFunc("/api/wlan/disconnect", wlan.DisconnectWiFi) http.HandleFunc("/api/wlan/enable-hotspot", wlan.EnableHotspot) http.HandleFunc("/api/wlan/disable-hotspot", wlan.DisableHotspot) http.HandleFunc("/api/wlan/set-static-ip", wlan.SetStaticIP) http.HandleFunc("/api/wlan/enable-dhcp", wlan.EnableDHCP) http.HandleFunc("/api/wlan/list-networks", wlan.ListNetworks) http.HandleFunc("/api/wlan/network-info", wlan.GetNetworkInfo) // Обработчик для сканирования WiFi http.HandleFunc("/api/wifi/scan", func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { network.SendJSONError(w, "Метод не разрешен", http.StatusMethodNotAllowed) return } networks, err := network.ScanWiFiNetworks() if err != nil { log.Printf("Ошибка сканирования WiFi: %v", err) network.SendJSONError(w, "Ошибка сканирования WiFi", http.StatusInternalServerError) return } network.SendJSONResponse(w, networks, http.StatusOK) }) // Обработчик для подключения к WiFi http.HandleFunc("/api/wifi/connect", func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { network.SendJSONError(w, "Метод не разрешен", http.StatusMethodNotAllowed) return } var requestBody map[string]string err := json.NewDecoder(r.Body).Decode(&requestBody) if err != nil { network.SendJSONError(w, "Неверный запрос", http.StatusBadRequest) return } ssid := requestBody["ssid"] password := requestBody["password"] if ssid == "" || password == "" { network.SendJSONError(w, "Необходимо указать SSID и пароль", http.StatusBadRequest) return } err = network.ConnectToWiFi(ssid, password) if err != nil { log.Printf("Ошибка подключения к WiFi: %v", err) network.SendJSONError(w, "Ошибка подключения к WiFi", http.StatusInternalServerError) return } network.SendJSONResponse(w, map[string]string{"status": "success", "message": "Подключение к WiFi инициировано"}, http.StatusOK) }) // Обработчик для получения статуса сети http.HandleFunc("/api/network/status", func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { network.SendJSONError(w, "Метод не разрешен", http.StatusMethodNotAllowed) return } status, err := network.GetNetworkStatus() if err != nil { log.Printf("Ошибка получения статуса сети: %v", err) network.SendJSONError(w, "Ошибка получения статуса сети", http.StatusInternalServerError) return } network.SendJSONResponse(w, status, http.StatusOK) }) // Обработчик для настройки статического IP http.HandleFunc("/api/network/configure", func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { network.SendJSONError(w, "Метод не разрешен", http.StatusMethodNotAllowed) return } var requestBody map[string]string err := json.NewDecoder(r.Body).Decode(&requestBody) if err != nil { network.SendJSONError(w, "Неверный запрос", http.StatusBadRequest) return } iface := requestBody["interface"] ip := requestBody["ip"] netmask := requestBody["netmask"] gateway := requestBody["gateway"] if iface == "" || ip == "" || netmask == "" { // Шлюз может быть пустым network.SendJSONError(w, "Необходимо указать интерфейс, IP и маску", http.StatusBadRequest) return } err = network.ConfigureNetworkInterface(iface, ip, netmask, gateway) if err != nil { log.Printf("Ошибка конфигурации сети: %v", err) network.SendJSONError(w, "Ошибка конфигурации сети: "+err.Error(), http.StatusInternalServerError) return } network.SendJSONResponse(w, map[string]string{"status": "success", "message": "Настройки сети применены"}, http.StatusOK) }) // Обработчик для получения текущего SSID подключенной WiFi сети http.HandleFunc("/api/wifi/connected-ssid", func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { network.SendJSONError(w, "Метод не разрешен", http.StatusMethodNotAllowed) return } ssid, err := network.GetConnectedWiFiSSID() if err != nil { log.Printf("Ошибка получения текущего SSID: %v", err) // Не отправляем ошибку, если нет подключения, просто возвращаем пустой SSID if strings.Contains(err.Error(), "не удалось получить SSID") { network.SendJSONResponse(w, map[string]string{"ssid": ""}, http.StatusOK) return } network.SendJSONError(w, "Ошибка получения текущего SSID", http.StatusInternalServerError) return } network.SendJSONResponse(w, map[string]string{"ssid": ssid}, http.StatusOK) }) // Обработчик для отключения от WiFi сети http.HandleFunc("/api/wifi/disconnect", func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { // Лучше использовать POST для действий network.SendJSONError(w, "Метод не разрешен", http.StatusMethodNotAllowed) return } err := network.DisconnectWiFi() if err != nil { log.Printf("Ошибка отключения от WiFi: %v", err) network.SendJSONError(w, "Ошибка отключения от WiFi", http.StatusInternalServerError) return } network.SendJSONResponse(w, map[string]string{"status": "success", "message": "Отключение от WiFi инициировано"}, http.StatusOK) }) // Обработчик для статики frontend (React build) fs := http.FileServer(http.Dir(filepath.Join("frontend", "build"))) http.Handle("/", fs) port := ":8088" log.Printf("Сервер запущен на порту %s", port) log.Fatal(http.ListenAndServe(port, nil)) }