- Set a two read-only variables (${prefix} and ${etcdir}). This is

especially useful when using /etc/rc.d scripts with third-party
software installed from ports.
- Fix rc.d/sshd to work with openssh from ports using ${etcdir}
instead of hardcoded /etc.

Reviewed by:	brooks
Approved by:	cperciva (mentor)
MFC after:	1 week
This commit is contained in:
Florent Thoumie 2006-04-11 08:55:27 +00:00
parent cd86367a5a
commit f0a4a7a722
2 changed files with 60 additions and 30 deletions

View File

@ -19,6 +19,8 @@ extra_commands="keygen reload"
timeout=300 timeout=300
load_rc_config $name
user_reseed() user_reseed()
{ {
( (
@ -47,47 +49,46 @@ sshd_keygen()
umask 022 umask 022
# Can't do anything if ssh is not installed # Can't do anything if ssh is not installed
[ -x /usr/bin/ssh-keygen ] || { [ -x ${prefix}/bin/ssh-keygen ] || {
warn "/usr/bin/ssh-keygen does not exist." warn "${prefix}/bin/ssh-keygen does not exist."
return 1 return 1
} }
if [ -f /etc/ssh/ssh_host_key ]; then if [ -f ${etcdir}/ssh/ssh_host_key ]; then
echo "You already have an RSA host key" \ echo "You already have an RSA host key" \
"in /etc/ssh/ssh_host_key" "in ${etcdir}/ssh/ssh_host_key"
echo "Skipping protocol version 1 RSA Key Generation" echo "Skipping protocol version 1 RSA Key Generation"
else else
/usr/bin/ssh-keygen -t rsa1 -b 1024 \ ${prefix}/bin/ssh-keygen -t rsa1 -b 1024 \
-f /etc/ssh/ssh_host_key -N '' -f ${etcdir}/ssh/ssh_host_key -N ''
fi fi
if [ -f /etc/ssh/ssh_host_dsa_key ]; then if [ -f ${etcdir}/ssh/ssh_host_dsa_key ]; then
echo "You already have a DSA host key" \ echo "You already have a DSA host key" \
"in /etc/ssh/ssh_host_dsa_key" "in ${etcdir}/ssh/ssh_host_dsa_key"
echo "Skipping protocol version 2 DSA Key Generation" echo "Skipping protocol version 2 DSA Key Generation"
else else
/usr/bin/ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N '' ${prefix}/bin/ssh-keygen -t dsa -f ${etcdir}/ssh/ssh_host_dsa_key -N ''
fi fi
if [ -f /etc/ssh/ssh_host_rsa_key ]; then if [ -f ${etcdir}/ssh/ssh_host_rsa_key ]; then
echo "You already have a RSA host key" \ echo "You already have a RSA host key" \
"in /etc/ssh/ssh_host_rsa_key" "in ${etcdir}/ssh/ssh_host_rsa_key"
echo "Skipping protocol version 2 RSA Key Generation" echo "Skipping protocol version 2 RSA Key Generation"
else else
/usr/bin/ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' ${prefix}/bin/ssh-keygen -t rsa -f ${etcdir}/ssh/ssh_host_rsa_key -N ''
fi fi
) )
} }
sshd_precmd() sshd_precmd()
{ {
if [ ! -f /etc/ssh/ssh_host_key -o \ if [ ! -f ${etcdir}/ssh/ssh_host_key -o \
! -f /etc/ssh/ssh_host_dsa_key -o \ ! -f ${etcdir}/ssh/ssh_host_dsa_key -o \
! -f /etc/ssh/ssh_host_rsa_key ]; then ! -f ${etcdir}/ssh/ssh_host_rsa_key ]; then
user_reseed user_reseed
run_rc_command keygen run_rc_command keygen
fi fi
} }
load_rc_config $name
run_rc_command "$1" run_rc_command "$1"

View File

@ -362,6 +362,10 @@ wait_for_pids()
# rcvar n This is checked with checkyesno to determine # rcvar n This is checked with checkyesno to determine
# if the action should be run. # if the action should be run.
# #
# ${name}_program n Full path to command.
# Meant to be used in /etc/rc.conf to override
# ${command}.
#
# ${name}_chroot n Directory to chroot to before running ${command} # ${name}_chroot n Directory to chroot to before running ${command}
# Requires /usr to be mounted. # Requires /usr to be mounted.
# #
@ -498,9 +502,6 @@ run_rc_command()
;; ;;
esac esac
eval _override_command=\$${name}_program
command=${command:+${_override_command:-$command}}
_keywords="start stop restart rcvar $extra_commands" _keywords="start stop restart rcvar $extra_commands"
rc_pid= rc_pid=
_pidcmd= _pidcmd=
@ -857,14 +858,16 @@ run_rc_script()
} }
# #
# load_rc_config command # load_rc_config name
# Source in the configuration file for a given command. # Source in the configuration file for a given name.
# #
load_rc_config() load_rc_config()
{ {
_command=$1 local _tmp
if [ -z "$_command" ]; then
err 3 'USAGE: load_rc_config command' _name=$1
if [ -z "$_name" ]; then
err 3 'USAGE: load_rc_config name'
fi fi
if ${_rc_conf_loaded:-false}; then if ${_rc_conf_loaded:-false}; then
@ -880,9 +883,35 @@ load_rc_config()
fi fi
_rc_conf_loaded=true _rc_conf_loaded=true
fi fi
if [ -f /etc/rc.conf.d/"$_command" ]; then
debug "Sourcing /etc/rc.conf.d/${_command}" eval _override_command=\$${name}_program
. /etc/rc.conf.d/"$_command" command=${command:+${_override_command:-$command}}
if [ -z "${command}" ]; then
_tmp=`/bin/realpath $0`
prefix=${_tmp%/etc/rc.d/*}/
else
prefix=${command%/*bin/*}/
fi
if [ "${prefix}" = "/" -o "${prefix}" = "/usr/" ] ; then
etcdir="/etc"
else
etcdir="${prefix}etc"
fi
# XXX - Deprecated
if [ -f /etc/rc.conf.d/${_name} -a ${etcdir} != "/etc" ]; then
debug "Sourcing /etc/rc.conf.d/${_name}"
warn "Warning: /etc/rc.conf.d/${_name} is deprecated, please use ${etcdir}/rc.conf.d/${_name} instead."
if [ -f ${etcdir}/rc.conf.d/${_name} ]
warn "Warning: Both /etc/rc.conf.d/${_name} and ${etcdir}/rc.conf.d/${_name} exist."
fi
. /etc/rc.conf.d/${_name}
fi
if [ -f ${etcdir}/rc.conf.d/${_name} ]; then
debug "Sourcing ${etcdir}/rc.conf.d/${_name}"
. ${etcdir}/rc.conf.d/${_name}
fi fi
# XXX - Deprecated variable name support # XXX - Deprecated variable name support
@ -903,15 +932,15 @@ load_rc_config()
} }
# #
# load_rc_config_var cmd var # load_rc_config_var name var
# Read the rc.conf(5) var for cmd and set in the # Read the rc.conf(5) var for name and set in the
# current shell, using load_rc_config in a subshell to prevent # current shell, using load_rc_config in a subshell to prevent
# unwanted side effects from other variable assignments. # unwanted side effects from other variable assignments.
# #
load_rc_config_var() load_rc_config_var()
{ {
if [ $# -ne 2 ]; then if [ $# -ne 2 ]; then
err 3 'USAGE: load_rc_config_var cmd var' err 3 'USAGE: load_rc_config_var name var'
fi fi
eval $(eval '( eval $(eval '(
load_rc_config '$1' >/dev/null; load_rc_config '$1' >/dev/null;