Mercurial > illumos > illumos-gate
changeset 12938:599476a18982
PSARC/2010/164 interfaces for basic install network configuration
6923163 Automated Install requires mechanism for configuring static IP addresses
6923168 Automated Install requires a mechanism for configuring name services for clients
author | Mark Haywood <Mark.Haywood@Oracle.COM> |
---|---|
date | Tue, 27 Jul 2010 20:35:25 -0400 |
parents | 12cf927830ab |
children | a27c46eb192b |
files | usr/src/cmd/cmd-inet/lib/ipmgmtd/ipmgmt_impl.h usr/src/cmd/cmd-inet/lib/ipmgmtd/ipmgmt_persist.c usr/src/cmd/cmd-inet/lib/ipmgmtd/ipmgmt_util.c usr/src/cmd/svc/milestone/Makefile usr/src/cmd/svc/milestone/net-install usr/src/cmd/svc/milestone/net-routing-setup usr/src/cmd/svc/milestone/network-install.xml usr/src/cmd/svc/shell/net_include.sh usr/src/lib/libipadm/common/ipadm_ipmgmt.h usr/src/lib/libresolv2/Makefile usr/src/lib/libresolv2/dns-install usr/src/lib/libresolv2/install.xml usr/src/pkg/manifests/SUNWcs.mf |
diffstat | 13 files changed, 1304 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/cmd/cmd-inet/lib/ipmgmtd/ipmgmt_impl.h Tue Jul 27 17:15:36 2010 -0700 +++ b/usr/src/cmd/cmd-inet/lib/ipmgmtd/ipmgmt_impl.h Tue Jul 27 20:35:25 2010 -0400 @@ -45,6 +45,7 @@ /* ipmgmt_util.c */ extern void ipmgmt_log(int, const char *, ...); +extern int ipmgmt_cpfile(const char *, const char *, boolean_t); /* ipmgmt_persist.c */ @@ -137,8 +138,16 @@ * in-memory copy of list `aobjmap' on disk. This is done to recover from * daemon reboot (using svcadm) or crashes. */ +#define IPADM_TMPFS_DIR "/etc/svc/volatile/ipadm" #define ADDROBJ_MAPPING_DB_FILE IPADM_TMPFS_DIR"/aobjmap.conf" +/* + * A temporary copy of the ipadm configuration file might need + * to be created if write requests are encountered during boottime + * and the root filesystem is mounted read-only. + */ +#define IPADM_VOL_DB_FILE IPADM_TMPFS_DIR"/ipadm.conf" + extern int ipmgmt_db_walk(db_wfunc_t *, void *, ipadm_db_op_t); extern int ipmgmt_aobjmap_op(ipmgmt_aobjmap_t *, uint32_t); extern boolean_t ipmgmt_aobjmap_init(void *, nvlist_t *, char *,
--- a/usr/src/cmd/cmd-inet/lib/ipmgmtd/ipmgmt_persist.c Tue Jul 27 17:15:36 2010 -0700 +++ b/usr/src/cmd/cmd-inet/lib/ipmgmtd/ipmgmt_persist.c Tue Jul 27 20:35:25 2010 -0400 @@ -69,6 +69,9 @@ extern pthread_rwlock_t ipmgmt_dbconf_lock; +/* signifies whether volatile copy of data store is in use */ +static boolean_t ipmgmt_rdonly_root = B_FALSE; + /* * Checks if the database nvl, `db_nvl' contains and matches ALL of the passed * in private nvpairs `proto', `ifname' & `aobjname'. @@ -358,8 +361,49 @@ } /* + * This function only gets called if a volatile filesystem version + * of the configuration file has been created. This only happens in the + * extremely rare case that a request has been made to update the configuration + * file at boottime while the root filesystem was read-only. This is + * really a rare occurrence now that we don't support UFS root filesystems + * any longer. This function will periodically attempt to write the + * configuration back to its location on the root filesystem. Success + * will indicate that the filesystem is no longer read-only. + */ +/* ARGSUSED */ +static void * +ipmgmt_db_restore_thread(void *arg) +{ + int err; + + for (;;) { + (void) sleep(5); + (void) pthread_rwlock_wrlock(&ipmgmt_dbconf_lock); + if (!ipmgmt_rdonly_root) + break; + err = ipmgmt_cpfile(IPADM_VOL_DB_FILE, IPADM_DB_FILE, B_FALSE); + if (err == 0) { + ipmgmt_rdonly_root = B_FALSE; + break; + } + (void) pthread_rwlock_unlock(&ipmgmt_dbconf_lock); + } + (void) pthread_rwlock_unlock(&ipmgmt_dbconf_lock); + return (NULL); +} + +/* * This function takes the appropriate lock, read or write, based on the - * `db_op' and then calls DB walker ipadm_rw_db(). + * `db_op' and then calls DB walker ipadm_rw_db(). The code is complicated + * by the fact that we are not always guaranteed to have a writable root + * filesystem since it is possible that we are reading or writing during + * bootime while the root filesystem is still read-only. This is, by far, + * the exception case. Normally, this function will be called when the + * root filesystem is writable. In the unusual case where this is not + * true, the configuration file is copied to the volatile file system + * and is updated there until the root filesystem becomes writable. At + * that time the file will be moved back to its proper location by + * ipmgmt_db_restore_thread(). */ extern int ipmgmt_db_walk(db_wfunc_t *db_walk_func, void *db_warg, ipadm_db_op_t db_op) @@ -367,9 +411,9 @@ int err; boolean_t writeop; mode_t mode; + pthread_t tid; writeop = (db_op != IPADM_DB_READ); - if (writeop) { (void) pthread_rwlock_wrlock(&ipmgmt_dbconf_lock); mode = IPADM_FILE_MODE; @@ -378,7 +422,42 @@ mode = 0; } - err = ipadm_rw_db(db_walk_func, db_warg, IPADM_DB_FILE, mode, db_op); + /* + * Did a previous write attempt fail? If so, don't even try to + * read/write to IPADM_DB_FILE. + */ + if (!ipmgmt_rdonly_root) { + err = ipadm_rw_db(db_walk_func, db_warg, IPADM_DB_FILE, + mode, db_op); + if (err != EROFS) + goto done; + } + + /* + * If we haven't already copied the file to the volatile + * file system, do so. This should only happen on a failed + * writeop(i.e., we have acquired the write lock above). + */ + if (access(IPADM_VOL_DB_FILE, F_OK) != 0) { + assert(writeop); + err = ipmgmt_cpfile(IPADM_DB_FILE, IPADM_VOL_DB_FILE, B_TRUE); + if (err != 0) + goto done; + err = pthread_create(&tid, NULL, ipmgmt_db_restore_thread, + NULL); + if (err != 0) { + (void) unlink(IPADM_VOL_DB_FILE); + goto done; + } + ipmgmt_rdonly_root = B_TRUE; + } + + /* + * Read/write from the volatile copy. + */ + err = ipadm_rw_db(db_walk_func, db_warg, IPADM_VOL_DB_FILE, + mode, db_op); +done: (void) pthread_rwlock_unlock(&ipmgmt_dbconf_lock); return (err); }
--- a/usr/src/cmd/cmd-inet/lib/ipmgmtd/ipmgmt_util.c Tue Jul 27 17:15:36 2010 -0700 +++ b/usr/src/cmd/cmd-inet/lib/ipmgmtd/ipmgmt_util.c Tue Jul 27 20:35:25 2010 -0400 @@ -20,8 +20,7 @@ */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. */ /* @@ -33,8 +32,12 @@ #include <stdio.h> #include <syslog.h> #include <stdarg.h> +#include <unistd.h> +#include <errno.h> #include "ipmgmt_impl.h" +#define IPMGMT_BUFSIZ 1024 + void ipmgmt_log(int pri, const char *fmt, ...) { @@ -44,3 +47,84 @@ vsyslog(pri, fmt, alist); va_end(alist); } + +/* + * Copy a source file to a new destination. The source file will be + * removed if rdonly is false (i.e., used when the source file resides + * on a read-only file system). + * + * Returns 0 on success and errno on failure. + */ +int +ipmgmt_cpfile(const char *src, const char *dst, boolean_t rdonly) +{ + struct stat statbuf; + FILE *sfp, *dfp; + char buf[IPMGMT_BUFSIZ]; + size_t bytes; + int err = 0; + + /* + * Attempt to open the destination file first since we + * want to optimize for the case where it is read-only + * and will return EROFS. + */ + if ((dfp = fopen(dst, "w+")) == NULL) + return (errno); + + /* + * Require that the source file exists. + */ + if (stat(src, &statbuf) != 0) { + err = errno; + (void) fclose(dfp); + return (err); + } + if ((sfp = fopen(src, "r")) == NULL) { + err = errno; + (void) fclose(dfp); + return (err); + } + + /* + * Copy the file. + */ + while (((bytes = fread(buf, 1, sizeof (buf), sfp)) != 0) && + (errno == 0)) { + (void) fwrite(buf, bytes, 1, dfp); + if (errno != 0) + break; + } + if (errno != 0) + err = errno; + + (void) fclose(sfp); + (void) fclose(dfp); + + /* + * If any error occurred, then remove the destination file. + */ + if (err != 0) { + (void) unlink(dst); + return (err); + } + + /* + * Make sure the file attributes are correct. + */ + if (chmod(dst, IPADM_FILE_MODE) != 0 || + chown(dst, UID_NETADM, GID_NETADM) != 0) { + err = errno; + (void) unlink(dst); + return (err); + } + + /* + * If the source file does not reside on a read-only file system + * then remove it. + */ + if (!rdonly) + (void) unlink(src); + + return (0); +}
--- a/usr/src/cmd/svc/milestone/Makefile Tue Jul 27 17:15:36 2010 -0700 +++ b/usr/src/cmd/svc/milestone/Makefile Tue Jul 27 20:35:25 2010 -0400 @@ -19,8 +19,7 @@ # CDDL HEADER END # # -# Copyright 2010 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. +# Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. # include ../../Makefile.cmd @@ -40,6 +39,7 @@ NETSVCS= \ network-initial.xml \ + network-install.xml \ network-iptun.xml \ network-ipqos.xml \ network-location.xml \ @@ -112,6 +112,7 @@ net-loc \ net-loopback \ net-init \ + net-install \ net-iptun \ net-ipqos \ net-netmask \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/cmd/svc/milestone/net-install Tue Jul 27 20:35:25 2010 -0400 @@ -0,0 +1,485 @@ +#!/sbin/sh +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# +# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# + +. /lib/svc/share/smf_include.sh +. /lib/svc/share/net_include.sh + +IPADM=/sbin/ipadm +SVCCFG=/usr/sbin/svccfg +SVCPROP=/usr/bin/svcprop +SVCADM=/usr/sbin/svcadm +ROUTE=/sbin/route + +NET_NWAM_FMRI="svc:/network/physical:nwam" +NET_INSTALL_FMRI=$SMF_FMRI + +NET_V4IF=install_ipv4_interface +NET_V6IF=install_ipv6_interface + +NET_UNDEFINED_STRING_PROP="\"\"" + +net_install_debug=0 + +unset net_install_name net_install_addrtype net_install_addr \ + net_install_dhcpwait net_install_interface_id \ + net_install_stateless net_install_stateful net_install_route + +net_configure_install_if() +{ + ipv6_interface=$1 + + case $net_install_addrtype in + static) + cmd="$IPADM create-addr -T static " + cmd=$cmd"-a local=$net_install_addr $net_install_name" + ;; + + dhcp) + dhcpwait="" + if [ "$net_install_dhcpwait" != "" ]; then + dhcpwait="-w $net_install_dhcpwait" + fi + + cmd="$IPADM create-addr -T dhcp $dhcpwait $net_install_name" + ;; + addrconf) + interface_id="" + if [ "$net_install_interface_id" != "" ]; then + interface_id="-i $net_install_interface_id" + fi + + state="" + if [ "$net_install_stateless" != "" ]; then + state="-p stateless=$net_install_stateless" + fi + + if [ "$net_install_stateful" != "" ]; then + if [ "$state" = "" ]; then + state="-p stateful=$net_install_stateful" + else + state=$state",stateful=$net_install_stateful" + fi + fi + + cmd="$IPADM create-addr -T addrconf " + cmd=$cmd"$interface_id $state $net_install_name" + ;; + esac + + $cmd + if [ $? -ne 0 ]; then + net_record_err "Error configuring interface:\n\"$cmd\"" $? + return $SMF_EXIT_ERR_FATAL + fi + + if [ "$net_install_route" != "" ]; then + if [ $ipv6_interface == 1 ]; then + details="-inet6 default" + else + details="default" + fi + ifp=`echo $net_install_name | /usr/bin/cut -f1 -d'/'` + details="$details $net_install_route -ifp $ifp" + cmd="$ROUTE add $details" + $cmd + cmd="$ROUTE get $details" + $cmd + if [ $? -ne 0 ]; then + err=$? + msg="Error creating default route:\n\"$cmd\"" + net_record_err "$msg" $err + return $SMF_EXIT_ERR_FATAL + fi + rootdir=/etc/svc/volatile + /usr/bin/mkdir -p $rootdir/etc/inet + if [ $? -ne 0 ]; then + err=$? + msg="Error creating \"$rootdir/etc/inet\" directory" + net_record_err "$msg" $err + return $SMF_EXIT_ERR_FATAL + fi + cmd="$ROUTE -R $rootdir -p add $details" + $cmd + if [ $? -ne 0 ]; then + err=$? + msg="Error adding persistent default route:\n\"$cmd\"" + net_record_err "$msg" $err + return $SMF_EXIT_ERR_FATAL + fi + fi + + return $SMF_EXIT_OK +} + +net_process_v4_pg() +{ + net_install_name="" + net_install_addrtype="" + net_install_addr="" + net_install_dhcpwait="" + net_install_route="" + + # + # Retrieve the mandatory interface name property value. If + # the value is empty, then no interface is configured. + # + prop=`$SVCPROP -p $NET_V4IF/name $NET_INSTALL_FMRI` + if [ $? -ne 0 -o "$prop" = "$NET_UNDEFINED_STRING_PROP" ]; then + return $SMF_EXIT_OK + fi + net_install_name=$prop + + # + # Retrieve the mandatory address type property value. The two + # valid values are "static" and "dhcp". + # + prop=`$SVCPROP -p $NET_V4IF/address_type $NET_INSTALL_FMRI` + if [ $? -ne 0 -o "$prop" = "$NET_UNDEFINED_STRING_PROP" ]; then + msg="No \"address_type\" property defined in the " + msg=$msg"\"$NET_V4IF\" property group" + net_record_err "$msg" 0 + return $SMF_EXIT_ERR_CONFIG + fi + case $prop in + static | dhcp) + net_install_addrtype=$prop + ;; + *) + msg="Bad value, \"$prop\", defined for the \"address_type\" " + msg=$msg"property in the \"$NET_V4IF\" property group" + net_record_err "$msg" 0 + return $SMF_EXIT_ERR_CONFIG + ;; + esac + + # + # Retrieve the static address property value. The address property + # only applies to static address type configurations. If not + # configuring a static address, then the property should still have + # its default value of 0.0.0.0/0. + # + prop=`$SVCPROP -p $NET_V4IF/static_address $NET_INSTALL_FMRI` + if [ $? -eq 0 -a "$prop" != "$NET_UNDEFINED_STRING_PROP" ]; then + if [ "$net_install_addrtype" = "dhcp" ]; then + if [ "$prop" != "${NET_INADDR_ANY}/0" ]; then + msg="Warning: static address ignored " + msg=$msg"in the \"$NET_V4IF\ property group" + net_record_err "$msg" 0 + fi + else + if [ "$prop" = "${NET_INADDR_ANY}/0" ]; then + msg="Error: static address required in the " + msg=$msg"\"$NET_V4IF\" property group" + net_record_err "$msg" 0 + return $SMF_EXIT_ERR_CONFIG + fi + net_install_addr=$prop + fi + else + if [ "$net_install_addrtype" = "static" ]; then + msg="Error: static address required in the " + msg=$msg"\"$NET_V4IF\" property group" + net_record_err "$msg" 0 + return $SMF_EXIT_ERR_CONFIG + fi + fi + + # + # Retrieve the optional DHCP wait property value. + # + prop=`$SVCPROP -p $NET_V4IF/dhcp_wait $NET_INSTALL_FMRI` + if [ $? -eq 0 -a "$prop" != "$NET_UNDEFINED_STRING_PROP" ]; then + if [ "$net_install_addrtype" != "dhcp" ]; then + if [ "$prop" != "120" ]; then + msg="Warning: DHCP wait value ignored in the " + msg=$msg"\"$NET_V4IF\" property group" + net_record_err "$msg" 0 + fi + else + net_install_dhcpwait=$prop + fi + fi + + # + # Retrieve the optional default route property value. + # + prop=`$SVCPROP -p $NET_V4IF/default_route $NET_INSTALL_FMRI` + if [ $? -eq 0 -a "$prop" != "$NET_UNDEFINED_STRING_PROP" ]; then + if [ "$prop" != "$NET_INADDR_ANY" ]; then + net_install_route=$prop + fi + fi + + net_configure_install_if 0 + + return $? +} + +net_process_v6_pg() +{ + net_install_name="" + net_install_addrtype="" + net_install_addr="" + net_install_stateless="" + net_install_stateful="" + net_install_interface_id="" + net_install_route="" + + # + # Retrieve the mandatory interface name property value. If + # the value is empty, then no interface is configured. + # + prop=`$SVCPROP -p $NET_V6IF/name $NET_INSTALL_FMRI` + if [ $? -ne 0 -o "$prop" = "$NET_UNDEFINED_STRING_PROP" ]; then + return $SMF_EXIT_OK + fi + net_install_name=$prop + + # + # Retrieve the mandatory address type property value. The two + # valid values are "static" and "addrconf". + # + prop=`$SVCPROP -p $NET_V6IF/address_type $NET_INSTALL_FMRI` + if [ $? -ne 0 -o "$prop" = "$NET_UNDEFINED_STRING_PROP" ]; then + msg="No \"address_type\" property defined in the " + msg=$msg"\"$NET_V6IF\" property group" + net_record_err "$msg" 0 + return $SMF_EXIT_ERR_CONFIG + fi + case $prop in + static | addrconf) + net_install_addrtype=$prop + ;; + *) + msg="Bad value \"$prop\" defined for \"address_type\"" + net_record_err "$msg" 0 + return $SMF_EXIT_ERR_CONFIG + ;; + esac + + # + # Retrieve the static address property value. The address property + # only applies to static address type configurations. If not + # configuring a static address, then the property should still have + # its default value of ::0/0. + # + prop=`$SVCPROP -p $NET_V6IF/static_address $NET_INSTALL_FMRI` + if [ $? -eq 0 -a "$prop" != "$NET_UNDEFINED_STRING_PROP" ]; then + if [ "$net_install_addrtype" = "addrconf" ]; then + if [ "$prop" != "${NET_IN6ADDR_ANY_INIT}/0" ]; then + msg="Warning: static address ignored in the " + msg=$msg"\"$NET_V6IF\" property group" + net_record_err "$msg" 0 + fi + else + if [ "$prop" = "${NET_IN6ADDR_ANY_INIT}/0" ]; then + msg="Error: static address required in the " + msg=$msg"\"$NET_V6IF\" property group" + net_record_err "$msg" 0 + return $SMF_EXIT_ERR_CONFIG + fi + net_install_addr=$prop + fi + else + if [ "$net_install_addrtype" = "static" ]; then + msg="Error: static address required in the " + msg=$msg"\"$NET_V6IF\" property group" + net_record_err "$msg" 0 + return $SMF_EXIT_ERR_CONFIG + fi + + fi + + # + # Retrieve the optional interface id property value. The + # property only applies to addrconf address type configurations. + # If configuring a static address, then the property should still + # have its default value of ::0/0. + # + prop=`$SVCPROP -p $NET_V6IF/interface_id $NET_INSTALL_FMRI` + if [ $? -eq 0 -a "$prop" != "$NET_UNDEFINED_STRING_PROP" ]; then + if [ "$prop" != "${NET_IN6ADDR_ANY_INIT}/0" ]; then + if [ "$net_install_addrtype" != "addrconf" ]; then + msg="Warning: interface id value ignored in " + msg=$msg"the \"$NET_V6IF\" property group" + net_record_err "$msg" 0 + else + net_install_interface_id=$prop + fi + fi + fi + + # + # Retrieve the optional stateless property value. The property + # only applies to addrconf address type configurations. If + # configuring a static address, then the property should still + # have its default value of "yes". + # + prop=`$SVCPROP -p $NET_V6IF/stateless $NET_INSTALL_FMRI` + if [ $? -eq 0 -a "$prop" != "$NET_UNDEFINED_STRING_PROP" ]; then + case $prop in + yes) + net_install_stateless=$prop + ;; + no) + if [ "$net_install_addrtype" != "addrconf" ]; then + msg="Warning: stateless value ignored in the " + msg=$msg"\"$NET_V6IF\" property group" + net_record_err "$msg" 0 + else + net_install_stateless=$prop + fi + ;; + *) + msg="Bad value \"$prop\" defined for the \"stateless\"" + msg=$msg" property in the \"$NET_V6IF\" property group" + net_record_err "$msg" 0 + return $SMF_EXIT_ERR_CONFIG + ;; + esac + fi + + # + # Retrieve the optional stateful property value. The property + # only applies to addrconf address type configurations. If + # configuring a static address, then the property should still + # have its default value of "yes". + # + prop=`$SVCPROP -p $NET_V6IF/stateful $NET_INSTALL_FMRI` + if [ $? -eq 0 -a "$prop" != "$NET_UNDEFINED_STRING_PROP" ]; then + case $prop in + yes) + net_install_stateful=$prop + ;; + no) + if [ "$net_install_addrtype" != "addrconf" ]; then + msg="Warning: stateless value ignored in the " + msg=$msg"\"$NET_V6IF\" property group" + net_record_err "$msg" 0 + else + net_install_stateful=$prop + fi + ;; + *) + msg="Bad value \"$prop\" defined for the \"stateless\"" + msg=$msg" property in the \"$NET_V6IF\" property group" + net_record_err "$msg" 0 + return $SMF_EXIT_ERR_CONFIG + ;; + esac + fi + + # + # Retrieve the optional default route property value. + # + prop=`$SVCPROP -p $NET_V6IF/default_route $NET_INSTALL_FMRI` + if [ $? -eq 0 -a "$prop" != "$NET_UNDEFINED_STRING_PROP" ]; then + if [ "$prop" != "$NET_IN6ADDR_ANY_INIT" ]; then + net_install_route=$prop + fi + fi + + net_configure_install_if 1 + + return $? +} + +net_process_install() +{ + vout=`$SVCCFG -s $NET_INSTALL_FMRI validate 2>&1` + if [ "$vout" != "" ]; then + msg="Validation errors in $NET_INSTALL_FMRI:\n$vout" + net_record_err "$msg" 0 + return $SMF_EXIT_ERR_CONFIG + fi + + ecode=$SMF_EXIT_OK + errs=0 + ifcnt=0 + for intf in $NET_V4IF $NET_V6IF + do + pg=`$SVCPROP -p $intf $NET_INSTALL_FMRI` + if [ $? -eq 0 ]; then + if service_is_enabled $NET_NWAM_FMRI; then + msg="NWAM enabled. Install static " + msg=$msg"configuration ignored." + net_record_err "$msg" 0 + errs=`expr $errs + 1` + ecode=$SMF_EXIT_ERR_CONFIG + else + if [ "$intf" == "$NET_V4IF" ]; then + net_process_v4_pg + else + net_process_v6_pg + fi + if [ $? -ne $SMF_EXIT_OK ]; then + # + # Last error wins. + # + ecode=$? + errs=`expr $errs + 1` + else + ifcnt=`expr $ifcnt + 1` + fi + fi + $SVCCFG -s $NET_INSTALL_FMRI delpg $intf + $SVCCFG -s $NET_INSTALL_FMRI refresh + fi + done + + if [ $net_install_debug -eq 1 ]; then + if [ $errs -ne 0 ]; then + echo "$errs errors encountered" \ + "configuring interfaces on behalf of install" + fi + + if [ $ifcnt -ne 0 ]; then + echo "$ifcnt interfaces configured on" \ + "behalf of install" + fi + fi + + return $ecode +} + +# +# The network/install service will be enabled by the install derived profile +# after the intial install. The service will disable itself after processing +# the install defined property values. +# +# When the non-global shared-IP stack zone boots, it tries to bring up this +# service as well. We just want to exit successfully. +# +if smf_is_nonglobalzone; then + if [ `/sbin/zonename -t` = shared ]; then + $SVCADM disable $NET_INSTALL_FMRI + exit $SMF_EXIT_OK + fi +fi + +net_process_install || exit $? + +$SVCADM disable $NET_INSTALL_FMRI +exit $SMF_EXIT_OK
--- a/usr/src/cmd/svc/milestone/net-routing-setup Tue Jul 27 17:15:36 2010 -0700 +++ b/usr/src/cmd/svc/milestone/net-routing-setup Tue Jul 27 20:35:25 2010 -0400 @@ -20,8 +20,7 @@ # CDDL HEADER END # # -# Copyright 2009 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. +# Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. # This script configures IP routing. @@ -185,6 +184,23 @@ fi # +# See if static routes were created by install. If so, they were created +# under /etc/svc/volatile. Copy them into their proper place. +# +if [ -f /etc/svc/volatile/etc/inet/static_routes ]; then + echo "Installing persistent routes" + if [ -f /etc/inet/static_routes ]; then + cat /etc/svc/volatile/etc/inet/static_routes | grep -v '^#' \ + >> /etc/inet/static_routes + else + cp /etc/svc/volatile/etc/inet/static_routes \ + /etc/inet/static_routes + fi + /usr/bin/rm /etc/svc/volatile/etc/inet/static_routes + +fi + +# # Read /etc/inet/static_routes and add each route. # if [ -f /etc/inet/static_routes ]; then
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/cmd/svc/milestone/network-install.xml Tue Jul 27 20:35:25 2010 -0400 @@ -0,0 +1,246 @@ +<?xml version="1.0"?> +<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1"> +<!-- + Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + + CDDL HEADER START + + The contents of this file are subject to the terms of the + Common Development and Distribution License (the "License"). + You may not use this file except in compliance with the License. + + You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + or http://www.opensolaris.org/os/licensing. + See the License for the specific language governing permissions + and limitations under the License. + + When distributing Covered Code, include this CDDL HEADER in each + file and include the License file at usr/src/OPENSOLARIS.LICENSE. + If applicable, add the following below this CDDL HEADER, with the + fields enclosed by brackets "[]" replaced with your own identifying + information: Portions Copyright [yyyy] [name of copyright owner] + + CDDL HEADER END + + NOTE: This service manifest is not editable; its contents will + be overwritten by package or patch operations, including + operating system upgrade. Make customizations in a different + file. +--> + +<service_bundle type='manifest' name='SUNWcsr:network-install'> + +<service + name='network/install' + type='service' + version='1'> + + <create_default_instance enabled='false' /> + + <single_instance /> + + <dependency + name='ipmgmt' + grouping='require_all' + restart_on='none' + type='service'> + <service_fmri value='svc:/network/ip-interface-management' /> + </dependency> + + <dependent name='physical_default' + grouping='optional_all' + restart_on='none'> + <service_fmri value='svc:/network/physical:default' /> + </dependent> + + <exec_method + type='method' + name='start' + exec='/lib/svc/method/net-install' + timeout_seconds='600' /> + + <exec_method + type='method' + name='stop' + exec=':true' + timeout_seconds='0' /> + + <property_group name='startd' type='framework'> + <propval name='duration' type='astring' value='transient' /> + </property_group> + + <!-- The following property group is used only at install time to + configure an initial IPv4 network interface --> + <property_group name='install_ipv4_interface' type='application'> + <propval name='name' type='astring' value='' /> + <propval name='address_type' type='astring' value='static' /> + <propval name='static_address' type='net_address_v4' + value='0.0.0.0/0' /> + <propval name='dhcp_wait' type='astring' value='120' /> + <propval name='default_route' type='net_address_v4' + value='0.0.0.0' /> + </property_group> + + <!-- The following property group is used only at install time to + configure an initial IPv6 network interface --> + <property_group name='install_ipv6_interface' type='application'> + <propval name='name' type='astring' value='' /> + <propval name='address_type' type='astring' value='addrconf' /> + <propval name='static_address' type='net_address_v6' + value='::0/0' /> + <propval name='interface_id' type='net_address_v6' + value='::0/0' /> + <propval name='stateless' type='astring' value='yes' /> + <propval name='stateful' type='astring' value='yes'/> + <propval name='default_route' type='net_address_v6' + value='::0' /> + </property_group> + + <stability value='Unstable' /> + + <template> + <common_name> + <loctext xml:lang='C'> + physical network interfaces install + </loctext> + </common_name> + <documentation> + <manpage title='ipadm' section='1M' + manpath='/usr/share/man' /> + </documentation> + <pg_pattern name='install_ipv4_interface' type='application' + target='this' required='false'> + <description> <loctext xml:lang='C'> + Install derived configuration data used to configure an initial IPv4 physical interface. + </loctext> </description> + <prop_pattern name='name' type='astring' + required='true'> + <description> <loctext xml:lang='C'> + The "addrobj" value to be passed to the ipadm(1M) "create-addr" command. + </loctext> </description> + <cardinality min='1' max='1'/> + </prop_pattern> + <prop_pattern name='address_type' type='astring' + required='true'> + <description> <loctext xml:lang='C'> + The "-T" option value to be passed to the ipadm(1M) "create-addr" command. + </loctext> </description> + <cardinality min='1' max='1'/> + <constraints> + <value name='static'> + <description> <loctext xml:lang='C'> + Signifies that the IPv4 interface will be configured with a static address defined by the "static_address" property. + </loctext> </description> + </value> + <value name='dhcp'> + <description> <loctext xml:lang='C'> + Signifies that the IPv4 interface will be configured by DHCP. The "static_address" property will be ignored. + </loctext> </description> + </value> + </constraints> + </prop_pattern> + <prop_pattern name='static_address' + type='net_address_v4' required='false'> + <description> <loctext xml:lang='C'> + The "local" address value to be passed to the ipadm(1M) "create-addr" command. Only required if "address_type" has a value of "static". + </loctext> </description> + <cardinality min='1' max='1'/> + </prop_pattern> + <prop_pattern name='dhcp_wait' type='astring' + required='false'> + <description> <loctext xml:lang='C'> + The "-w" option value to be passed to the ipadm(1M) "create-addr" command. Represents the maximum time to wait for DHCP offer. + </loctext> </description> + <units> + <loctext xml:lang='C'>seconds</loctext> + </units> + <cardinality min='1' max='1'/> + </prop_pattern> + <prop_pattern name='default_route' + type='net_address_v4' required='false'> + <description> <loctext xml:lang='C'> + The default route associated with this interface. Used to add a default route using route(1M). + </loctext> </description> + <cardinality min='1' max='1'/> + </prop_pattern> + </pg_pattern> + <pg_pattern name='install_ipv6_interface' type='application' + target='this' required='false'> + <description> <loctext xml:lang='C'> + Install derived configuration data used to configure an initial IPv6 physical interface. + </loctext> </description> + <prop_pattern name='name' type='astring' + required='true'> + <description> <loctext xml:lang='C'> + The "addrobj" value to be passed to the ipadm(1M) "create-addr" command. + </loctext> </description> + <cardinality min='1' max='1'/> + </prop_pattern> + <prop_pattern name='address_type' type='astring' + required='true'> + <description> <loctext xml:lang='C'> + The "-T" option value to be passed to the ipadm(1M) "create-addr" command. + </loctext> </description> + <cardinality min='1' max='1'/> + <constraints> + <value name='static'> + <description> <loctext xml:lang='C'> + Signifies that the IPv4 interface will be configured with a static address defined by the "static_address" property. + </loctext> </description> + </value> + <value name='addrconf'> + <description> <loctext xml:lang='C'> + Signifies that the IPv6 interface will be configured by IPv6 auto-configuration. The "static_address" property will be ignored. + </loctext> </description> + </value> + </constraints> + </prop_pattern> + <prop_pattern name='static_address' + type='net_address_v6' required='false'> + <description> <loctext xml:lang='C'> + The "local" address value to be passed to the ipadm(1M) "create-addr" command. Only required if "address_type" has a value of "static". + </loctext> </description> + <cardinality min='1' max='1'/> + </prop_pattern> + <prop_pattern name='interface_id' + type='net_address_v6' required='false'> + <description> <loctext xml:lang='C'> + The "-i" token value to be passed to the ipadm(1M) "create-addr" command. Ignored if "address_type" has a value of "static". + </loctext> </description> + <cardinality min='1' max='1'/> + </prop_pattern> + + <prop_pattern name='stateless' + type='astring' required='false'> + <description> <loctext xml:lang='C'> + The "stateless" value to be passed to the ipadm(1M) "create-addr" command. Ignored if "address_type" has a value of "static". + </loctext> </description> + <cardinality min='1' max='1'/> + <constraints> + <value name='yes'/> + <value name='no'/> + </constraints> + </prop_pattern> + <prop_pattern name='stateful' + type='astring' required='false'> + <description> <loctext xml:lang='C'> + The "stateful" value to be passed to the ipadm(1M) "create-addr" command. Ignored if "address_type" has a value of "static". + </loctext> </description> + <cardinality min='1' max='1'/> + <constraints> + <value name='yes'/> + <value name='no'/> + </constraints> + </prop_pattern> + <prop_pattern name='default_route' + type='net_address_v6' required='false'> + <description> <loctext xml:lang='C'> + The default route associated with this interface. Used to add a default route using route(1M). + </loctext> </description> + <cardinality min='1' max='1'/> + </prop_pattern> + </pg_pattern> + </template> +</service> + +</service_bundle>
--- a/usr/src/cmd/svc/shell/net_include.sh Tue Jul 27 17:15:36 2010 -0700 +++ b/usr/src/cmd/svc/shell/net_include.sh Tue Jul 27 20:35:25 2010 -0400 @@ -26,6 +26,9 @@ # All rights reserved. # +NET_INADDR_ANY="0.0.0.0" +NET_IN6ADDR_ANY_INIT="::0" + # Print warnings to console warn_failed_ifs() { echo "Failed to $1 interface(s):$2" >/dev/msglog @@ -44,6 +47,17 @@ done } +net_record_err() +{ + message=$1 + err=$2 + + echo "$message" | smf_console + if [ $err -ne 0 ]; then + echo "Error code = $err" | smf_console + fi +} + # # inet_list list of IPv4 interfaces. # inet6_list list of IPv6 interfaces.
--- a/usr/src/lib/libipadm/common/ipadm_ipmgmt.h Tue Jul 27 17:15:36 2010 -0700 +++ b/usr/src/lib/libipadm/common/ipadm_ipmgmt.h Tue Jul 27 20:35:25 2010 -0400 @@ -50,7 +50,6 @@ /* Permanent data store for ipadm */ #define IPADM_DB_FILE "/etc/ipadm/ipadm.conf" #define IPADM_FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) -#define IPADM_TMPFS_DIR "/etc/svc/volatile/ipadm" /* * For more information on these definitions please refer to the top of
--- a/usr/src/lib/libresolv2/Makefile Tue Jul 27 17:15:36 2010 -0700 +++ b/usr/src/lib/libresolv2/Makefile Tue Jul 27 20:35:25 2010 -0400 @@ -19,21 +19,25 @@ # CDDL HEADER END # # -# Copyright 2010 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# +# Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved. # include ../../Makefile.master include ../Makefile.lib -MANIFEST= client.xml +MANIFEST= client.xml install.xml MANIFESTDIR= $(ROOT)/lib/svc/manifest/network/dns ROOTMANIFEST= $(MANIFEST:%=$(MANIFESTDIR)/%) $(ROOTMANIFEST) := FILEMODE = 444 +SVCMETHOD= dns-install +SVCMETHODDIR= $(ROOT)/lib/svc/method +ROOTSVCMETHOD= $(SVCMETHOD:%=$(SVCMETHODDIR)/%) + +$(ROOTSVCMETHOD) := FILEMODE = 0555 + CHKMANIFEST= $(MANIFEST:%.xml=%.xmlchk) SUBDIRS= include $(MACH) @@ -59,7 +63,7 @@ all clean clobber lint: $(SUBDIRS) -install: $(SUBDIRS) $(ROOTMANIFEST) +install: $(SUBDIRS) $(ROOTMANIFEST) $(ROOTSVCMETHOD) $(ROOTMANIFEST): $(MANIFESTDIR) @@ -68,6 +72,13 @@ $(MANIFESTDIR)/%: % $(INS.file) +$(ROOTSVCMETHOD): $(SVCMETHODDIR) + +$(SVCMETHODDIR): + $(INS.dir) + +$(SVCMETHODDIR)/%: % + $(INS.file) # install rule for install_h target $(ROOTHDRDIR)/%: %
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/lib/libresolv2/dns-install Tue Jul 27 20:35:25 2010 -0400 @@ -0,0 +1,204 @@ +#!/sbin/sh +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# +# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# + +# +# Install DNS client service +# + +. /lib/svc/share/smf_include.sh +. /lib/svc/share/net_include.sh + +SVCCFG=/usr/sbin/svccfg +SVCPROP=/usr/bin/svcprop +SVCADM=/usr/sbin/svcadm + +DNS_NWAM_FMRI="svc:/network/physical:nwam" +DNS_INSTALL_FMRI=$SMF_FMRI + +DNS_INSTALL_PG="install_props" + +DNS_UNDEFINED_STRING_PROP="\"\"" + +dns_install_debug=0 + +unset dns_install_domain dns_install_servers dns_install_search + +dns_process_install_pg() +{ + dns_install_domain="" + dns_install_servers="" + dns_install_search="" + config=0 + + # + # Retrieve the name server property values. + # + prop=`$SVCPROP -p $DNS_INSTALL_PG/nameserver $DNS_INSTALL_FMRI` + if [ $? -eq 0 -a "$prop" != "$NET_INADDR_ANY" ]; then + dns_install_servers=$prop + config=1 + fi + + # + # Retrieve the name service domain. + # + prop=`$SVCPROP -p $DNS_INSTALL_PG/domain $DNS_INSTALL_FMRI` + if [ $? -eq 0 -a "$prop" != "$DNS_UNDEFINED_STRING_PROP" ]; then + dns_install_domain=$prop + config=1 + fi + + # + # Retrieve the search list. + # + prop=`$SVCPROP -p $DNS_INSTALL_PG/search $DNS_INSTALL_FMRI` + if [ $? -eq 0 -a "$prop" != "$DNS_UNDEFINED_STRING_PROP" ]; then + dns_install_search=$prop + config=1 + fi + + [ $config -ne 0 ] || return $SMF_EXIT_OK + + # + # Create the resolv.conf file. + # + /usr/bin/touch /etc/resolv.conf.$$ + if [ $? -ne 0 ]; then + net_record_err "Error creating \"/etc/resolv.conf.$$\"" $? + return $SMF_EXIT_ERR_FATAL + fi + + for j in $dns_install_servers + do + server=`echo $j | /usr/bin/sed s/\"//g` + echo "nameserver $server" >>/etc/resolv.conf.$$ + done + + if [ "$dns_install_domain" != "" ]; then + echo "domain $dns_install_domain" >>/etc/resolv.conf.$$ + fi + + if [ "$dns_install_search" != "" ]; then + list="search" + for j in $dns_install_search + do + domain=`echo $j | /usr/bin/sed s/\"//g` + list="$list $domain" + done + echo $list >>/etc/resolv.conf.$$ + fi + + /usr/bin/mv /etc/resolv.conf.$$ /etc/resolv.conf + if [ $? -ne 0 ]; then + err=$? + msg="Error moving /etc/resolv.conf.$$ to \"/etc/resolv.conf\"" + net_record_err "$msg" $err + return $SMF_EXIT_ERR_FATAL + fi + + /usr/bin/chmod 644 /etc/resolv.conf + if [ $? -ne 0 ]; then + err=$? + msg="Error setting permissions on \"/etc/resolv.conf\"" + net_record_err "$msg" $err + return $SMF_EXIT_ERR_FATAL + fi + + # + # Create the nsswitch.conf file + # + /usr/bin/cp -f /etc/nsswitch.dns /etc/nsswitch.conf + if [ $? -ne 0 ]; then + err=$? + msg="Error copying /etc/nsswitch.dns to \"/etc/nsswitch.conf\"" + net_record_err "$msg" $err + return $SMF_EXIT_ERR_FATAL + fi + + /usr/bin/chmod 644 /etc/nsswitch.conf + if [ $? -ne 0 ]; then + err=$? + msg="Error setting permissions on \"/etc/nsswitch.conf\"" + net_record_err "$msg" $err + return $SMF_EXIT_ERR_FATAL + fi + + return $SMF_EXIT_OK +} + +dns_process_install() +{ + vout=`$SVCCFG -s $DNS_INSTALL_FMRI validate 2>&1` + if [ "$vout" != "" ]; then + msg="Validation errors in $DNS_INSTALL_FMRI:\n$vout" + net_record_err "$msg" 0 + return $SMF_EXIT_ERR_CONFIG + fi + + ecode=$SMF_EXIT_OK + errs=0 + cnt=0 + pg=`$SVCPROP -p $DNS_INSTALL_PG $DNS_INSTALL_FMRI` + if [ $? -eq 0 ]; then + if service_is_enabled $DNS_NWAM_FMRI; then + echo "NWAM enabled. Install static" \ + "DNS configuration ignored." | smf_console + errs=`expr $errs + 1` + ecode=$SMF_EXIT_ERR_CONFIG + else + dns_process_install_pg + if [ $? -ne $SMF_EXIT_OK ]; then + ecode=$? + errs=`expr $errs + 1` + else + cnt=`expr $cnt + 1` + fi + + fi + $SVCCFG -s $DNS_INSTALL_FMRI delpg $DNS_INSTALL_PG + $SVCCFG -s $DNS_INSTALL_FMRI refresh + fi + + if [ $dns_install_debug -eq 1 ]; then + if [ $errs -ne 0 ]; then + echo "$errs errors encountered" \ + "configuring DNS on behalf of install" + fi + + if [ $cntf -ne 0 ]; then + echo "DNS configured on behalf of install" + fi + fi + + return $ecode +} + +# +# Script execution starts here. +# +dns_process_install || exit $? + +$SVCADM disable $DNS_INSTALL_FMRI +exit $SMF_EXIT_OK
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/lib/libresolv2/install.xml Tue Jul 27 20:35:25 2010 -0400 @@ -0,0 +1,137 @@ +<?xml version="1.0"?> +<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1"> +<!-- + Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + + CDDL HEADER START + + The contents of this file are subject to the terms of the + Common Development and Distribution License (the "License"). + You may not use this file except in compliance with the License. + + You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + or http://www.opensolaris.org/os/licensing. + See the License for the specific language governing permissions + and limitations under the License. + + When distributing Covered Code, include this CDDL HEADER in each + file and include the License file at usr/src/OPENSOLARIS.LICENSE. + If applicable, add the following below this CDDL HEADER, with the + fields enclosed by brackets "[]" replaced with your own identifying + information: Portions Copyright [yyyy] [name of copyright owner] + + CDDL HEADER END + + NOTE: This service manifest is not editable; its contents will + be overwritten by package or patch operations, including + operating system upgrade. Make customizations in a different + file. +--> + +<service_bundle type='manifest' name='SUNWcsr:dns-install'> + +<service + name='network/dns/install' + type='service' + version='1'> + + <create_default_instance enabled='false' /> + + <single_instance /> + + <dependency + name='filesystem' + grouping='require_all' + restart_on='none' + type='service'> + <service_fmri value='svc:/system/filesystem/root' /> + <service_fmri value='svc:/system/filesystem/usr' /> + <service_fmri value='svc:/system/filesystem/minimal' /> + </dependency> + + <dependent name='network-service' + grouping='optional_all' + restart_on='none'> + <service_fmri value='svc:/network/service' /> + </dependent> + + <dependent name='dns-client' + grouping='optional_all' + restart_on='none'> + <service_fmri value='svc:/network/dns/client' /> + </dependent> + + <exec_method + type='method' + name='start' + exec='/lib/svc/method/dns-install' + timeout_seconds='30' /> + + <exec_method + type='method' + name='stop' + exec=':true' + timeout_seconds='0' /> + + <property_group name='startd' type='framework'> + <propval name='duration' type='astring' value='transient' /> + </property_group> + + <property_group name='install_props' type='application'> + <property name='nameserver' type='net_address'> + <net_address_list> + <value_node value='0.0.0.0' /> + </net_address_list> + </property> + <propval name='domain' type='astring' value='' /> + <property name='search' type='astring'> + <astring_list> + <value_node value='' /> + </astring_list> + </property> + </property_group> + + <stability value='Unstable' /> + + <template> + <common_name> + <loctext xml:lang='C'> + DNS resolver install + </loctext> + </common_name> + <documentation> + <manpage title='resolver' section='3RESOLV' + manpath='/usr/share/man' /> + </documentation> + <pg_pattern name='install_props' type='application' + target='this' required='false'> + <description> <loctext xml:lang='C'> + Install derived configuration data used to configure an initial DNS client. + </loctext> </description> + <prop_pattern name='nameserver' type='net_address' + required='true'> + <description> <loctext xml:lang='C'> + The value used to construct the "nameserver" directive in resolv.conf(4). + </loctext> </description> + <cardinality min='1' max='3'/> + </prop_pattern> + <prop_pattern name='domain' type='astring' + required='false'> + <description> <loctext xml:lang='C'> + The value used to construct the "domain" directive in resolv.conf(4). + </loctext> </description> + <cardinality min='1' max='1'/> + </prop_pattern> + <prop_pattern name='search' type='astring' + required='false'> + <description> <loctext xml:lang='C'> + The value used to construct the "search" directive in resolv.conf(4). + </loctext> </description> + <cardinality min='1' max='6'/> + </prop_pattern> + </pg_pattern> + </template> + +</service> + +</service_bundle>
--- a/usr/src/pkg/manifests/SUNWcs.mf Tue Jul 27 17:15:36 2010 -0700 +++ b/usr/src/pkg/manifests/SUNWcs.mf Tue Jul 27 20:35:25 2010 -0400 @@ -523,6 +523,7 @@ file path=lib/svc/manifest/milestone/sysconfig.xml group=sys mode=0444 file path=lib/svc/manifest/network/dlmgmt.xml group=sys mode=0444 file path=lib/svc/manifest/network/dns/client.xml group=sys mode=0444 +file path=lib/svc/manifest/network/dns/install.xml group=sys mode=0444 file path=lib/svc/manifest/network/forwarding.xml group=sys mode=0444 file path=lib/svc/manifest/network/inetd-upgrade.xml group=sys mode=0444 file path=lib/svc/manifest/network/inetd.xml group=sys mode=0444 @@ -532,6 +533,7 @@ file path=lib/svc/manifest/network/ipsec/policy.xml group=sys mode=0444 file path=lib/svc/manifest/network/ldap/client.xml group=sys mode=0444 file path=lib/svc/manifest/network/network-initial.xml group=sys mode=0444 +file path=lib/svc/manifest/network/network-install.xml group=sys mode=0444 file path=lib/svc/manifest/network/network-ipmgmt.xml group=sys mode=0444 file path=lib/svc/manifest/network/network-ipqos.xml group=sys mode=0444 file path=lib/svc/manifest/network/network-iptun.xml group=sys mode=0444 @@ -593,6 +595,7 @@ file path=lib/svc/method/console-login mode=0555 file path=lib/svc/method/devices-audio mode=0555 file path=lib/svc/method/devices-local mode=0555 +file path=lib/svc/method/dns-install mode=0555 file path=lib/svc/method/fs-local mode=0555 file path=lib/svc/method/fs-minimal mode=0555 file path=lib/svc/method/fs-root mode=0555 @@ -605,6 +608,7 @@ file path=lib/svc/method/manifest-import mode=0555 file path=lib/svc/method/mpxio-upgrade mode=0555 file path=lib/svc/method/net-init mode=0555 +file path=lib/svc/method/net-install mode=0555 file path=lib/svc/method/net-ipmgmt mode=0555 file path=lib/svc/method/net-ipqos mode=0555 file path=lib/svc/method/net-iptun mode=0555