#!/usr/bin/env yaegi package main import ( "encoding/json" "log" "os" "os/exec" "os/signal" "runtime" "strings" . "syscall" ) func main() { runtime.GOMAXPROCS(1) var ( update = make(chan os.Signal, 1) cancel = make(chan os.Signal, 1) ) signal.Notify(update, SIGUSR1, SIGUSR2, SIGHUP) signal.Notify(cancel, SIGTERM, SIGINT) // could use golang.org/x/sys/unix.Prctl here // but I want to avoid the dependency if _, _, e := Syscall6(uintptr(SYS_PRCTL), uintptr(PR_SET_PDEATHSIG), uintptr(SIGTERM), 0, 0, 0, 0); e != 0 { log.Fatalf("error: %v", e) } lookup() for { select { case sig := <-update: switch sig { case SIGUSR1: printJson("day") // TODO(robert): toggle wlsunset off? case SIGUSR2: printJson("night") // TODO(robert): toggle wlsunset on? case SIGHUP: lookup() } case <-cancel: log.Printf("%v exiting\n", os.Args[0]) os.Exit(0) } } } func printJson(phase string) { _ = json.NewEncoder(os.Stdout).Encode(map[string]interface{}{ "class": phase, "alt": phase, "tooltip": "gamma: " + phase, "text": phase, }) } func lookup() { cmdEnv, ok := os.LookupEnv("GAMMA_COMMAND") if !ok { printJson("unknown") return } b, err := exec.Command("bash", "-c", cmdEnv).Output() if err != nil { log.Fatalf("error: %v", err) return } phase := strings.TrimSpace(string(b)) printJson(phase) }