Files
up_go/api/HandleReboot.go
T
2026-03-19 14:07:10 +07:00

56 lines
1.9 KiB
Go

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)
}
}()
}