aboutsummaryrefslogtreecommitdiff
path: root/sbin
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2017-10-25 15:30:35 +0000
committerWarner Losh <imp@FreeBSD.org>2017-10-25 15:30:35 +0000
commit7d7d9013f1fd4bba8a6993ae09e18c1a56c99373 (patch)
tree2dcdce5e7d15925d0da62a122dd6c2a7d1da1553 /sbin
parente60baa725230ed256b04bfe82488ae46fa770a5c (diff)
downloadsrc-7d7d9013f1fd4bba8a6993ae09e18c1a56c99373.tar.gz
src-7d7d9013f1fd4bba8a6993ae09e18c1a56c99373.zip
Add power cycle support to reboot/halt as -c.
When -c is specified, the system will be power cycled if the underlying hardware supports it. Otherwise the system will be halted or rebooted depending on which command was used. Sponsored by: Netflix
Notes
Notes: svn path=/head/; revision=324986
Diffstat (limited to 'sbin')
-rw-r--r--sbin/reboot/reboot.819
-rw-r--r--sbin/reboot/reboot.c15
2 files changed, 30 insertions, 4 deletions
diff --git a/sbin/reboot/reboot.8 b/sbin/reboot/reboot.8
index c31f9663a88f..6f2d023e8bb9 100644
--- a/sbin/reboot/reboot.8
+++ b/sbin/reboot/reboot.8
@@ -28,7 +28,7 @@
.\" @(#)reboot.8 8.1 (Berkeley) 6/9/93
.\" $FreeBSD$
.\"
-.Dd March 19, 2017
+.Dd October 23, 2017
.Dt REBOOT 8
.Os
.Sh NAME
@@ -42,7 +42,7 @@
.Op Fl lNnpq
.Op Fl k Ar kernel
.Nm
-.Op Fl dlNnpqr
+.Op Fl cdlNnpqr
.Op Fl k Ar kernel
.Nm fasthalt
.Op Fl lNnpq
@@ -66,6 +66,20 @@ accounting database.
.Pp
The options are as follows:
.Bl -tag -width indent
+.It Fl c
+The system will turn off the power and then turn it back on if it can.
+If the power down action fails, the system
+will halt or reboot normally, depending on whether
+.Nm halt
+or
+.Nm
+was called.
+At the present time, only the
+.Xr ipmi 4
+driver implements the power cycle functionality and only on hardware
+with a BMC that supports power cycling.
+Unlike power off, the amount of hardware that supports power cycling
+is small.
.It Fl d
The system is requested to create a crash dump.
This option is
@@ -162,6 +176,7 @@ reboot -r
.Sh SEE ALSO
.Xr kenv 1 ,
.Xr getutxent 3 ,
+.Xr ipmi 4 ,
.Xr boot 8 ,
.Xr dumpon 8 ,
.Xr nextboot 8 ,
diff --git a/sbin/reboot/reboot.c b/sbin/reboot/reboot.c
index 8722e27511f5..5bc3328a0b93 100644
--- a/sbin/reboot/reboot.c
+++ b/sbin/reboot/reboot.c
@@ -77,8 +77,11 @@ main(int argc, char *argv[])
} else
howto = 0;
lflag = nflag = qflag = Nflag = 0;
- while ((ch = getopt(argc, argv, "dk:lNnpqr")) != -1)
+ while ((ch = getopt(argc, argv, "cdk:lNnpqr")) != -1)
switch(ch) {
+ case 'c':
+ howto |= RB_POWERCYCLE;
+ break;
case 'd':
howto |= RB_DUMP;
break;
@@ -116,8 +119,10 @@ main(int argc, char *argv[])
errx(1, "cannot dump (-d) when halting; must reboot instead");
if (Nflag && (howto & RB_NOSYNC) != 0)
errx(1, "-N cannot be used with -n");
+ if ((howto & RB_POWEROFF) && (howto & RB_POWERCYCLE))
+ errx(1, "-c and -p cannot be used together");
if ((howto & RB_REROOT) != 0 && howto != RB_REROOT)
- errx(1, "-r cannot be used with -d, -n, or -p");
+ errx(1, "-r cannot be used with -c, -d, -n, or -p");
if (geteuid()) {
errno = EPERM;
err(1, NULL);
@@ -151,6 +156,12 @@ main(int argc, char *argv[])
} else if (howto & RB_REROOT) {
openlog("reroot", 0, LOG_AUTH | LOG_CONS);
syslog(LOG_CRIT, "rerooted by %s", user);
+ } else if (howto & RB_POWEROFF) {
+ openlog("reboot", 0, LOG_AUTH | LOG_CONS);
+ syslog(LOG_CRIT, "powered off by %s", user);
+ } else if (howto & RB_POWERCYCLE) {
+ openlog("reboot", 0, LOG_AUTH | LOG_CONS);
+ syslog(LOG_CRIT, "power cycled by %s", user);
} else {
openlog("reboot", 0, LOG_AUTH | LOG_CONS);
syslog(LOG_CRIT, "rebooted by %s", user);