178 lines
6.6 KiB
Go
Raw Normal View History

2025-03-11 14:07:01 +03:00
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))
}