178 lines
6.6 KiB
Go
178 lines
6.6 KiB
Go
|
|
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))
|
|||
|
|
|
|||
|
|
}
|