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
This commit is contained in:
imp 2017-10-25 15:30:35 +00:00
parent 2f467bc5fe
commit 981a951111
2 changed files with 30 additions and 4 deletions

View File

@ -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 ,

View File

@ -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);