@@ -4,6 +4,7 @@ package main
4
4
import (
5
5
"bytes"
6
6
_ "embed"
7
+ "encoding/json"
7
8
"errors"
8
9
"flag"
9
10
"fmt"
@@ -13,6 +14,7 @@ import (
13
14
"path/filepath"
14
15
rtdebug "runtime/debug"
15
16
"strconv"
17
+ "strings"
16
18
"text/template"
17
19
18
20
"golang.org/x/sys/unix"
@@ -23,17 +25,21 @@ type Service struct {
23
25
Threshold int
24
26
}
25
27
28
+ type Target struct {
29
+ Unit string `json:"unit"`
30
+ }
31
+
26
32
const threshold = "charge_control_end_threshold"
27
33
28
34
var (
29
35
tag string
30
36
31
- events = [ ... ] string {
32
- "hibernate" ,
33
- "hybrid-sleep" ,
34
- "multi-user" ,
35
- "suspend" ,
36
- "suspend-then-hibernate" ,
37
+ events = map [ string ] struct {} {
38
+ "hibernate" : {} ,
39
+ "hybrid-sleep" : {} ,
40
+ "multi-user" : {} ,
41
+ "suspend" : {} ,
42
+ "suspend-then-hibernate" : {} ,
37
43
}
38
44
39
45
services = filepath .Join ("/" , "etc" , "systemd" , "system" )
@@ -226,8 +232,27 @@ func main() {
226
232
panic (err )
227
233
}
228
234
235
+ // Creates services for events with defined targets (targets vary by
236
+ // distribution).
237
+ cmd := exec .Command ("systemctl" , "list-units" , "--type" , "target" , "--all" , "--plain" , "--output" , "json" )
238
+ output , err = cmd .CombinedOutput ()
239
+ if err != nil {
240
+ panic (err )
241
+ }
242
+ targets := make ([]Target , 0 )
243
+ if err = json .Unmarshal (output , & targets ); err != nil {
244
+ panic (err )
245
+ }
246
+ available := make ([]string , 0 )
247
+ for _ , target := range targets {
248
+ event := strings .TrimSuffix (target .Unit , ".target" )
249
+ _ , ok := events [event ]
250
+ if ok {
251
+ available = append (available , event )
252
+ }
253
+ }
229
254
tmpl := template .Must (template .New ("unit" ).Parse (unit ))
230
- for _ , event := range events {
255
+ for _ , event := range available {
231
256
service := "bat-" + event + ".service"
232
257
f , err := os .Create (filepath .Join (services , service ))
233
258
if err != nil {
@@ -316,7 +341,7 @@ func main() {
316
341
os .Exit (1 )
317
342
}
318
343
case "reset" :
319
- for _ , event := range events {
344
+ for event := range events {
320
345
service := "bat-" + event + ".service"
321
346
output , err := exec .Command ("systemctl" , "disable" , service ).CombinedOutput ()
322
347
if err != nil {
0 commit comments