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  }