Files
NanoKVM-MIRROR/server/utils/hdmi.go
watermeko b587b9f912 fix: stop HDMI capture when logged out (#841)
* fix: stop HDMI capture when logged out

* feat: stop HDMI capture when viewers are idle

* fix: keep HDMI capture active for consumers
2026-07-30 17:29:07 +08:00

68 lines
1.5 KiB
Go

package utils
import (
"os"
"strconv"
"strings"
log "github.com/sirupsen/logrus"
)
const (
HDMIDisableFile = "/etc/kvm/hdmi_disable"
HDMIIdleTimeoutFile = "/etc/kvm/hdmi_idle_timeout"
DefaultHDMIIdleTimeout = 0
MaxHDMIIdleTimeoutMinutes = 7 * 24 * 60
)
func PersistHDMIDisabled() {
f, err := os.OpenFile(HDMIDisableFile, os.O_CREATE|os.O_RDONLY, 0644)
if err != nil {
log.Error("failed to create hdmi disable file:", err)
return
}
f.Close()
}
func PersistHDMIEnabled() {
if err := os.Remove(HDMIDisableFile); err != nil {
log.Error("failed to remove hdmi disable file:", err)
return
}
}
func IsHdmiDisabled() bool {
if _, err := os.Stat(HDMIDisableFile); err != nil {
if os.IsNotExist(err) {
return false // HDMI is enabled
}
log.Error("failed to check hdmi disable file:", err)
return false // Assume HDMI is enabled on error
}
return true // HDMI is disabled
}
func PersistHDMIIdleTimeout(minutes int) {
if err := os.WriteFile(HDMIIdleTimeoutFile, []byte(strconv.Itoa(minutes)), 0644); err != nil {
log.Error("failed to persist hdmi idle timeout:", err)
}
}
func GetHDMIIdleTimeout() int {
data, err := os.ReadFile(HDMIIdleTimeoutFile)
if err != nil {
if !os.IsNotExist(err) {
log.Error("failed to read hdmi idle timeout:", err)
}
return DefaultHDMIIdleTimeout
}
minutes, err := strconv.Atoi(strings.TrimSpace(string(data)))
if err != nil || minutes < 0 || minutes > MaxHDMIIdleTimeoutMinutes {
log.Error("invalid hdmi idle timeout")
return DefaultHDMIIdleTimeout
}
return minutes
}