56 lines
1.9 KiB
Go
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)
|
|
}
|
|
}()
|
|
}
|