60 lines
1.6 KiB
Go
60 lines
1.6 KiB
Go
package kiosk
|
|
|
|
import (
|
|
"context"
|
|
"log/slog"
|
|
"os/exec"
|
|
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
type handler func(area string, present bool)
|
|
|
|
type configObj struct {
|
|
logger *slog.Logger
|
|
broker string
|
|
username string
|
|
password string
|
|
presenceTopic string
|
|
shell string
|
|
screen_on_cmd string
|
|
screen_off_cmd string
|
|
}
|
|
|
|
var config = configObj{}
|
|
|
|
func Run(rootLogger *slog.Logger, exitch chan bool, ctx context.Context) {
|
|
config.logger = rootLogger.With("component", "kiosk")
|
|
config.broker = viper.GetString("mqtt_broker_url")
|
|
config.username = viper.GetString("mqtt_broker_user")
|
|
config.password = viper.GetString("mqtt_broker_password")
|
|
config.presenceTopic = viper.GetString("mqtt_presence_topic")
|
|
config.shell = viper.GetString("kiosk_cmd_shell")
|
|
config.screen_on_cmd = viper.GetString("kiosk_cmd_screen_on")
|
|
config.screen_off_cmd = viper.GetString("kiosk_cmd_screen_off")
|
|
config.logger.Info("starting MQTT broker client")
|
|
brokerConsume(ctx)
|
|
exitch <- true
|
|
}
|
|
|
|
func handlePresenceMessage(msg [2]string) {
|
|
logger := config.logger
|
|
logger.Debug("received presence message", "msg", msg)
|
|
cmdStr := ""
|
|
switch msg[1] {
|
|
case "on":
|
|
cmdStr = config.screen_on_cmd
|
|
case "off":
|
|
cmdStr = config.screen_off_cmd
|
|
default:
|
|
logger.Warn("recieved unexpected presence message", "msg", msg)
|
|
return
|
|
}
|
|
logger.Info("Presence change event", "presence", msg[1], "command", cmdStr)
|
|
cmd := exec.Command(config.shell, "-c", cmdStr)
|
|
err := cmd.Run()
|
|
if err != nil {
|
|
logger.Error("error while executing command", "msg", msg, "command", cmdStr, "err", err)
|
|
}
|
|
}
|