@@ -15,6 +15,7 @@ import (
15
15
"strconv"
16
16
"strings"
17
17
"syscall"
18
+ "text/template"
18
19
"time"
19
20
20
21
"golang.org/x/sys/unix"
@@ -23,10 +24,10 @@ import (
23
24
const (
24
25
device = "/sys/class/power_supply/BAT?"
25
26
threshold = "charge_control_end_threshold"
26
- service = "/etc/systemd/system/[email protected] "
27
+ services = "/etc/systemd/system/"
27
28
)
28
29
29
- var targets = [... ]string {
30
+ var events = [... ]string {
30
31
"hibernate" ,
31
32
"hybrid-sleep" ,
32
33
"multi-user" ,
@@ -37,7 +38,7 @@ var targets = [...]string{
37
38
var build , tag string
38
39
39
40
var (
40
- //go:embed bat@ .service
41
+ //go:embed bat.service
41
42
unit string
42
43
//go:embed help.fmt
43
44
help string
@@ -141,16 +142,43 @@ func main() {
141
142
if err != nil {
142
143
log .Fatal (err )
143
144
}
144
- tmpl := fmt .Sprintf (unit , current )
145
- if err := os .WriteFile (service , []byte (tmpl ), 0o644 ); err != nil {
146
- if errors .Is (err , syscall .EACCES ) {
147
- fmt .Fprintln (os .Stderr , "Permission denied. Try running this command using sudo." )
145
+
146
+ shell , err := exec .LookPath ("bash" )
147
+ if err != nil {
148
+ if errors .Is (err , exec .ErrNotFound ) {
149
+ fmt .Fprintln (os .Stderr , "Could not find Bash on your system." )
148
150
os .Exit (1 )
149
151
}
150
152
log .Fatal (err )
151
153
}
152
- for _ , target := range targets {
153
- cmd := exec .Command ("systemctl" , "enable" , fmt .Sprintf ("bat@%s.service" , target ))
154
+
155
+ for _ , event := range events {
156
+ tmpl , err := template .New ("unit" ).Parse (unit )
157
+ if err != nil {
158
+ log .Fatal (err )
159
+ }
160
+
161
+ name := services + "bat-" + event + ".service"
162
+ f , err := os .Create (name )
163
+ if err != nil {
164
+ if errors .Is (err , syscall .EACCES ) {
165
+ fmt .Fprintln (os .Stderr , "Permission denied. Try running this command using sudo." )
166
+ os .Exit (1 )
167
+ }
168
+ log .Fatal (err )
169
+ }
170
+ defer f .Close ()
171
+
172
+ service := struct {
173
+ Event string
174
+ Shell string
175
+ Threshold int
176
+ }{event , shell , current }
177
+ if err := tmpl .Execute (f , service ); err != nil {
178
+ log .Fatal (err )
179
+ }
180
+
181
+ cmd := exec .Command ("systemctl" , "enable" , name )
154
182
if err := cmd .Run (); err != nil {
155
183
log .Fatal (err )
156
184
}
@@ -202,9 +230,10 @@ func main() {
202
230
fmt .Fprintln (os .Stdout , "Charging threshold set.\n Run `sudo bat persist` to persist the setting between restarts." )
203
231
}
204
232
case "reset" :
205
- for _ , target := range targets {
233
+ for _ , event := range events {
234
+ name := services + "bat-" + event + ".service"
206
235
buf := new (bytes.Buffer )
207
- cmd := exec .Command ("systemctl" , "disable" , fmt . Sprintf ( "bat@%s.service" , target ) )
236
+ cmd := exec .Command ("systemctl" , "disable" , name )
208
237
cmd .Stderr = buf
209
238
if err := cmd .Run (); err != nil {
210
239
switch message := buf .String (); {
@@ -217,9 +246,9 @@ func main() {
217
246
log .Fatal (err )
218
247
}
219
248
}
220
- }
221
- if err := os . Remove ( service ); err != nil && ! errors . Is ( err , syscall . ENOENT ) {
222
- log . Fatal ( err )
249
+ if err := os . Remove ( name ); err != nil && ! errors . Is ( err , syscall . ENOENT ) {
250
+ log . Fatal ( err )
251
+ }
223
252
}
224
253
fmt .Fprintln (os .Stdout , "Charging threshold persistence reset." )
225
254
default :
0 commit comments