bin/137864: [patch] sysinstall: add possibility to shutdown/poweroff without modifying /etc/rc.conf

Michael Leun michael.leun at arcor.net
Mon Aug 17 06:10:06 UTC 2009


>Number:         137864
>Category:       bin
>Synopsis:       [patch] sysinstall: add possibility to shutdown/poweroff without modifying /etc/rc.conf
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Mon Aug 17 06:10:05 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator:     Michael Leun
>Release:        7.2
>Organization:
Vodafone AG & Co. KG
>Environment:
FreeBSD build72-64.tnd.arcor.net 7.2-RELEASE FreeBSD 7.2-RELEASE #0: Fri May  1 07:18:07 UTC 2009     root at driscoll.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  amd64

>Description:
I've created customized install disks doing an unattended installation of the current (current when creating the disk) patchlevel of FreeBSD.
At the end of the installation a customized package which brings some configuration files, changes some config and creates /etc/rc.conf from scratch is installed.
But with unmodified sysinstall all changes made in the post install script of the custom package get clobbered / commented out.

My search for a solution lead to http://lists.freebsd.org/pipermail/freebsd-questions/2005-December/107861.html

This patch adds an option "shutdownNoRC" to shutdown without touching /etc/rc.conf (and also "poweroff" to just power off and "poweroffNoRC" to power off without touching rc.conf) at the end of the installation.

Note: This fixes bin/69942.

>How-To-Repeat:
Create an custom install media which installs a package modifying /etc/rc.conf
>Fix:
Patch attached
Adds alternate commands to quit installation, offering the possibility not to change / create /etc/rc.conf by sysinstall.

Patch attached with submission follows:

# Patch FreeBSD 7.2 sysinstall to have options not to touch /etc/rc.conf
# originally created by Antony Mawer see
# http://lists.freebsd.org/pipermail/freebsd-questions/2005-December/107861.html
#
# Adapted to FreeBSD 7.2 by Michael Leun on behalf of Vodafone AG & Co. KG

diff -Nur usr.sbin.orig/sysinstall/dispatch.c usr.sbin/sysinstall/dispatch.c
--- usr.sbin.orig/sysinstall/dispatch.c	2009-04-15 05:14:26.000000000 +0200
+++ usr.sbin/sysinstall/dispatch.c	2009-06-24 22:53:47.000000000 +0200
@@ -43,6 +43,9 @@
 #include "list.h"
 
 static int dispatch_shutdown(dialogMenuItem *unused);
+static int dispatch_shutdown_norc(dialogMenuItem *unused);
+static int dispatch_poweroff(dialogMenuItem *unused);
+static int dispatch_poweroff_norc(dialogMenuItem *unused);
 static int dispatch_systemExecute(dialogMenuItem *unused);
 static int dispatch_msgConfirm(dialogMenuItem *unused);
 static int dispatch_mediaOpen(dialogMenuItem *unused);
@@ -113,9 +116,13 @@
     { "addGroup",		userAddGroup		},
     { "addUser",		userAddUser		},
     { "shutdown",		dispatch_shutdown 	},
+    { "shutdownNoRC",		dispatch_shutdown_norc	},
+    { "poweroff",		dispatch_poweroff	},
+    { "poweroffNoRC",		dispatch_poweroff_norc	},
     { "system",			dispatch_systemExecute	},
     { "dumpVariables",		dump_variables		},
     { "tcpMenuSelect",		tcpMenuSelect		},
+    { "configCountry",		configCountry		},
     { NULL, NULL },
 };
 
@@ -180,6 +187,27 @@
 }
 
 static int
+dispatch_shutdown_norc(dialogMenuItem *unused)
+{
+    systemShutdownNow(0, SHUTDOWN_NO_RC_CONF);
+    return DITEM_FAILURE;
+}
+
+static int
+dispatch_poweroff(dialogMenuItem *unused)
+{
+    systemShutdownNow(0, SHUTDOWN_POWEROFF);
+    return DITEM_FAILURE;
+}
+
+static int
+dispatch_poweroff_norc(dialogMenuItem *unused)
+{
+    systemShutdownNow(0, SHUTDOWN_POWEROFF | SHUTDOWN_NO_RC_CONF);
+    return DITEM_FAILURE;
+}
+
+static int
 dispatch_systemExecute(dialogMenuItem *unused)
 {
     char *cmd = variable_get(VAR_COMMAND);
diff -Nur usr.sbin.orig/sysinstall/sysinstall.8 usr.sbin/sysinstall/sysinstall.8
--- usr.sbin.orig/sysinstall/sysinstall.8	2009-04-15 05:14:26.000000000 +0200
+++ usr.sbin/sysinstall/sysinstall.8	2009-06-24 22:51:20.000000000 +0200
@@ -835,6 +835,26 @@
 .Pp
 .Sy Variables :
 None
+.It shutdownNoRC
+Stop the script and terminate sysinstall, but do not touch
+.Pa /etc/rc.conf .
+.Pp
+.Sy Variables :
+None
+.It poweroff
+The same as
+.Pa shutdown ,
+only power off the system (if possible) rather than rebooting.
+.Pp
+.Sy Variables :
+None
+.It poweroffNoRC
+The same as
+.Pa shutdownNoRC ,
+only power off the system (if possible) rather than rebooting.
+.Pp
+.Sy Variables :
+None
 .It system
 Execute an arbitrary command with
 .Xr system 3
diff -Nur usr.sbin.orig/sysinstall/sysinstall.h usr.sbin/sysinstall/sysinstall.h
--- usr.sbin.orig/sysinstall/sysinstall.h	2009-04-15 05:14:26.000000000 +0200
+++ usr.sbin/sysinstall/sysinstall.h	2009-06-24 22:51:20.000000000 +0200
@@ -407,6 +407,10 @@
     char extras[EXTRAS_FIELD_LEN];
 } DevInfo;
 
+/* systemShutdownNow bitfield flags */
+#define SHUTDOWN_POWEROFF	0x1	/* Power off after shutdown */
+#define SHUTDOWN_NO_RC_CONF	0x2	/* Don't attempt to update rc.conf */
+
 
 /*** Externs ***/
 extern jmp_buf		BailOut;		/* Used to get the heck out */
@@ -838,6 +842,7 @@
 /* system.c */
 extern void	systemInitialize(int argc, char **argv);
 extern void	systemShutdown(int status);
+extern void	systemShutdownNow(int status, int shutdown_flags);
 extern int	execExecute(char *cmd, char *name);
 extern int	systemExecute(char *cmd);
 extern void	systemSuspendDialog(void);
diff -Nur usr.sbin.orig/sysinstall/system.c usr.sbin/sysinstall/system.c
--- usr.sbin.orig/sysinstall/system.c	2009-04-15 05:14:26.000000000 +0200
+++ usr.sbin/sysinstall/system.c	2009-06-24 22:51:20.000000000 +0200
@@ -238,12 +238,20 @@
 void
 systemShutdown(int status)
 {
+    systemShutdownNow(status, 0);
+}
+
+void
+systemShutdownNow(int status, int shutdown_flags)
+{
+
     /* If some media is open, close it down */
     if (status >=0)
 	mediaClose();
 
     /* write out any changes to rc.conf .. */
-    configRC_conf();
+    if (!(shutdown_flags & SHUTDOWN_NO_RC_CONF))
+	configRC_conf();
 
     /* Shut down the dialog library */
     if (DialogActive) {
@@ -264,7 +272,10 @@
 #if defined(__alpha__) || defined(__sparc64__)
 	reboot(RB_HALT);
 #else
-	reboot(RB_AUTOBOOT);
+	if (shutdown_flags & SHUTDOWN_POWEROFF)
+		reboot(RB_HALT | RB_POWEROFF);
+	else
+		reboot(RB_AUTOBOOT);
 #endif
     }
     else


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list