github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/cmds/core/watchdog/watchdog_linux.go (about) 1 // Copyright 2021 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // watchdog interacts with /dev/watchdog. 6 // 7 // Synopsis: 8 // 9 // watchdog [--dev=DEV] keepalive 10 // Pet the watchdog. This resets the time left back to the timeout. 11 // watchdog [--dev=DEV] set[pre]timeout DURATION 12 // Set the watchdog timeout or pretimeout 13 // watchdog [--dev=DEV] get[pre]timeout 14 // Print the watchdog timeout or pretimeout 15 // watchdog [--dev=DEV] gettimeleft 16 // Print the amount of time left. 17 // 18 // Options: 19 // 20 // --dev DEV: Device (default /dev/watchdog) 21 package main 22 23 import ( 24 "fmt" 25 "log" 26 "os" 27 "time" 28 29 flag "github.com/spf13/pflag" 30 "github.com/mvdan/u-root-coreutils/pkg/watchdog" 31 ) 32 33 var dev = flag.String("dev", "/dev/watchdog", "device") 34 35 func usage() { 36 flag.Usage() 37 fmt.Print(`watchdog keepalive 38 Pet the watchdog. This resets the time left back to the timeout. 39 watchdog set[pre]timeout DURATION 40 Set the watchdog timeout or pretimeout. 41 watchdog get[pre]timeout 42 Print the watchdog timeout or pretimeout. 43 watchdog gettimeleft 44 Print the amount of time left. 45 `) 46 os.Exit(1) 47 } 48 49 func runCommand() error { 50 flag.Parse() 51 if flag.NArg() < 1 { 52 usage() 53 } 54 55 wd, err := watchdog.Open(*dev) 56 if err != nil { 57 return err 58 } 59 defer func() { 60 if err := wd.Close(); err != nil { 61 log.Printf("Failed to close watchdog: %v", err) 62 } 63 }() 64 65 switch flag.Arg(0) { 66 case "keepalive": 67 if flag.NArg() != 1 { 68 usage() 69 } 70 if err := wd.KeepAlive(); err != nil { 71 return err 72 } 73 case "settimeout": 74 if flag.NArg() != 2 { 75 usage() 76 } 77 d, err := time.ParseDuration(flag.Arg(1)) 78 if err != nil { 79 return err 80 } 81 if err := wd.SetTimeout(d); err != nil { 82 return err 83 } 84 case "setpretimeout": 85 if flag.NArg() != 2 { 86 usage() 87 } 88 d, err := time.ParseDuration(flag.Arg(1)) 89 if err != nil { 90 return err 91 } 92 if err := wd.SetPreTimeout(d); err != nil { 93 return err 94 } 95 case "gettimeout": 96 if flag.NArg() != 1 { 97 usage() 98 } 99 i, err := wd.Timeout() 100 if err != nil { 101 return err 102 } 103 fmt.Println(i) 104 case "getpretimeout": 105 if flag.NArg() != 1 { 106 usage() 107 } 108 i, err := wd.PreTimeout() 109 if err != nil { 110 return err 111 } 112 fmt.Println(i) 113 case "gettimeleft": 114 if flag.NArg() != 1 { 115 usage() 116 } 117 i, err := wd.TimeLeft() 118 if err != nil { 119 return err 120 } 121 fmt.Println(i) 122 default: 123 return fmt.Errorf("unrecognized command: %q", flag.Arg(0)) 124 } 125 return nil 126 } 127 128 func main() { 129 if err := runCommand(); err != nil { 130 log.Fatal(err) 131 } 132 }