/
powerbutton.go
62 lines (54 loc) · 1.12 KB
/
powerbutton.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package gokrazy
import (
"context"
"log"
"path/filepath"
"github.com/kenshaw/evdev"
"golang.org/x/sys/unix"
)
func pollPowerButton1(path string) error {
dev, err := evdev.OpenFile(path)
if err != nil {
return err
}
defer dev.Close()
if !dev.KeyTypes()[evdev.KeyPower] {
return nil
}
log.Printf("polling device %s for power button events", path)
ch := dev.Poll(context.Background())
for event := range ch {
k, ok := event.Type.(evdev.KeyType)
if !ok {
continue
}
if k != evdev.KeyPower {
continue
}
if event.Value != 1 {
continue
}
log.Printf("power pressed, event %+v", event)
killSupervisedServicesAndUmountPerm(defaultSignalDelay)
log.Println("Powering off")
if err := unix.Reboot(unix.LINUX_REBOOT_CMD_POWER_OFF); err != nil {
return err
}
}
return nil
}
func pollPowerButtons() error {
matches, err := filepath.Glob("/dev/input/event*")
if err != nil {
return err
}
for _, match := range matches {
match := match // copy
go func() {
if err := pollPowerButton1(match); err != nil {
log.Printf("pollPowerButton1(%s): %v", match, err)
}
}()
}
return nil
}