package api import ( "encoding/json" "fmt" "net/http" "os" "os/exec" "syscall" "time" ) // MOUNT_POINT должен быть определён (например, как глобальная константа) // const MOUNT_POINT = "/mnt/mydevice" // handleReboot обрабатывает HTTP-запрос на перезагрузку системы func HandleReboot(w http.ResponseWriter, r *http.Request) { MOUNT_POINT := os.Getenv("MOUNT_POINT") // Отправляем JSON-ответ (как в C: mg_http_reply) response := map[string]string{ "status": "success", "message": "System rebooting...", } w.Header().Set("Content-Type", "application/json") if err := json.NewEncoder(w).Encode(response); err != nil { fmt.Printf("Failed to send reboot response: %v\n", err) return } // Синхронизируем все файловые системы (аналог sync()) syscall.Sync() // Размонтируем точку монтирования, если она смонтирована fmt.Printf("Unmounting %s...\n", MOUNT_POINT) if err := syscall.Unmount(MOUNT_POINT, 0); err != nil { // Ошибку не фатализируем, просто логируем fmt.Printf("Unmount error: %v\n", err) } // Повторная синхронизация syscall.Sync() // Инициируем мягкую перезагрузку через команду shutdown fmt.Println("Initiating soft reboot via shutdown...") // Запускаем shutdown в отдельной горутине с небольшой задержкой, // чтобы ответ гарантированно ушёл клиенту до завершения сервера go func() { time.Sleep(500 * time.Millisecond) // ждём 0.5 секунды cmd := exec.Command("shutdown", "-r", "now") if err := cmd.Run(); err != nil { fmt.Printf("Reboot failed: %v\n", err) } }() }