view usr/src/cmd/cmd-inet/usr.sbin/in.ftpd/ftpaddhost.sh @ 4:1a15d5aaf794

synchronized with onnv_86 (6202) in onnv-gate
author Koji Uno <koji.uno@sun.com>
date Mon, 31 Aug 2009 14:38:03 +0900
parents c9caec207d52
children
line wrap: on
line source

#!/usr/bin/ksh
#
# ident	"%Z%%M%	%I%	%E% SMI"
#
# Copyright (c) 1997-2001 by Sun Microsystems, Inc.
# All rights reserved.
#
#
# This script sets up a virtual FTP host.
#
# Usage:
#	ftpaddhost -c|-l [-b] [ -x xferlog ] hostname root_dir
#
# ftpaddhost configures virtual host hostname under directory root_dir.
# An IP address can be used for hostname.
#
# The -c (complete) option configures complete virtual hosting, which allows
# each virtual host to have its own version of the ftpaccess, ftpconversions,
# ftpgroups, ftphosts and ftpusers files. The master version of each of these
# configuration files is copied from the /etc/ftpd directory and placed in
# the /etc/ftpd/virtual-ftpd/hostname directory. If the /etc/ftpusers file
# exists it is appended to the virtual ftpusers file. If a virtual host lacks
# its own version of a configuration file, the master version is used.
#
# The -l (limited) option configures limited virtual hosting, which only
# allows a small number of parameters to be configured differently for a
# virtual host (see the virtual keyword on the ftpaccess(4) manual page).
#
# When the -b (banner) option is supplied, ftpaddhost creates a banner for
# the virtual host, useful to see that the virtual host is working.
#
# When the -x xferlog option is supplied, ftpaddhost creates a logfile entry
# which causes the transfer logs for the virtual host to be written to the
# specified file.
#
# Exit codes:	0 - success
#		1 - usage
#		2 - command failure
#

usage()
{
	fmt=`gettext "Usage: %s -c|-l [-b] [ -x xferlog ] hostname root_dir"`
	printf "$fmt\n" "$cmd" >&2
	exit 1
}

verify_root()
{
	# Verify caller has a real user ID of 0.
	set `id`
	if [ "$1" != "uid=0(root)" ]
	then
		fmt=`gettext "%s: Error: Only root can run %s"`
		printf "$fmt\n" "$cmd" "$cmd" >&2
		exit 1
	fi
}

# Make directory $1 with mode $2 and ownership $3.
make_dir()
{
	if [ ! -d "$1" ]
	then
		mkdir "$1" || exit 2
	fi
	chmod "$2" "$1"
	chown "$3" "$1"
}

setup_complete_vhost()
{
	fmt=`gettext "Setting up complete virtual host %s"`
	printf "$fmt\n" "$hostname"
	make_dir /etc/ftpd/virtual-ftpd 755 root:sys
	make_dir "/etc/ftpd/virtual-ftpd/$hostname" 755 root:sys

	fmt=`gettext "Configuration directory is %s"`
	printf "$fmt\n" "/etc/ftpd/virtual-ftpd/$hostname"

	# Update the virtual host configuration file.
	vhconfig=/etc/ftpd/ftpservers

	fmt=`gettext "Updating virtual hosting configuration file %s"`
	printf "$fmt\n" $vhconfig
	if [ -f $vhconfig ]
	then
		# Remove any existing entries for the virtual host.
		sed "/^[ 	]*$hostname[ 	]/d" $vhconfig >$vhconfig.tmp.$$
		mv -f $vhconfig.tmp.$$ $vhconfig || exit 2
	fi

	echo "$hostname /etc/ftpd/virtual-ftpd/$hostname" >>$vhconfig
	chmod 644 $vhconfig
	chown root:sys $vhconfig

	# Make copies of the master configuration files.
	for file in ftpconversions ftpgroups ftphosts ftpusers
	do
		target="/etc/ftpd/virtual-ftpd/$hostname/$file"
		rm -f "$target"
		if [ -f /etc/ftpd/$file ]
		then
			cp /etc/ftpd/$file "$target" || exit 2
			chmod 644 "$target"
			chown root:sys "$target"
		fi
	done

	# Append /etc/ftpusers to the virtual hosts ftpusers.
	if [ -f /etc/ftpusers ]
	then
		target="/etc/ftpd/virtual-ftpd/$hostname/ftpusers"
		cat /etc/ftpusers >>"$target"
		chmod 644 "$target"
		chown root:sys "$target"
	fi

	vhftpaccess="/etc/ftpd/virtual-ftpd/$hostname/ftpaccess"
	rm -f "$vhftpaccess"

	# Remove any existing root or logfile entries.
	sed "/^[ 	]*root[ 	]/d
	     /^[ 	]*logfile[ 	]/d" $ftpaccess >"$vhftpaccess"

	# Add the virtual host root.
	echo "root $vhroot" >>"$vhftpaccess"

	# Add a banner to show the virtual host configuration worked.
	if [ -n "$banner" ]
	then
		# Add a banner entry if there isn't already one.
		grep "^[ 	]*banner[ 	]" "$vhftpaccess" >/dev/null 2>&1
		if [ $? -eq 0 ]
		then
			fmt=`gettext "Existing banner entry not changed in %s"`
			printf "$fmt\n" "$vhftpaccess"
		else
			bannerf="/etc/ftpd/virtual-ftpd/$hostname/cbanner.msg"
			if [ -f "$bannerf" ]
			then
				fmt=`gettext "Using existing banner file %s"`
				printf "$fmt\n" "$bannerf"
			else
				fmt=`gettext "Creating banner file %s"`
				printf "$fmt\n" "$bannerf"
				fmt=`gettext "Complete virtual host %%L test banner"`
				printf "$fmt\n" >"$bannerf"
				chmod 644 "$bannerf"
				chown root:sys "$bannerf"
			fi
			echo "banner $bannerf" >>"$vhftpaccess"
		fi
	fi

	# Add the transfer logfile.
	if [ -n "$logfile" ]
	then
		echo "logfile $logfile" >>"$vhftpaccess"
	fi

	chmod 644 "$vhftpaccess"
	chown root:sys "$vhftpaccess"
}

setup_limited_vhost()
{
	# Check complete virtual hosting is not configured for the host.
	grep "^[ 	]*$hostname[ 	]" /etc/ftpd/ftpservers >/dev/null 2>&1
	if [ $? -eq 0 ]
	then
		fmt=`gettext "%s: Error: Complete virtual hosting already configured for %s"`
		printf "$fmt\n" "$cmd" "$hostname" >&2
		exit 1
	fi

	fmt=`gettext "Setting up limited virtual host %s"`
	printf "$fmt\n" "$hostname"

	# Update the ftpaccess file.
	fmt=`gettext "Updating FTP server configuration file %s"`
	printf "$fmt\n" $ftpaccess

	# Remove any existing entries for the virtual host.
	sed "/^[ 	]*virtual[ 	][ 	]*$hostname[ 	]/d" $ftpaccess >$ftpaccess.tmp.$$
	mv -f $ftpaccess.tmp.$$ $ftpaccess || exit 2

	# Add a limited virtual hosting entry for the virtual host.
	echo "virtual $hostname root $vhroot" >>$ftpaccess

	# Add a banner to show the virtual host configuration worked.
	if [ -n "$banner" ]
	then
		bannerf="/etc/ftpd/virtual-ftpd/$hostname/lbanner.msg"
		if [ -f "$bannerf" ]
		then
			fmt=`gettext "Using existing banner file %s"`
			printf "$fmt\n" "$bannerf"
		else
			fmt=`gettext "Creating banner file %s"`
			printf "$fmt\n" "$bannerf"
			make_dir /etc/ftpd/virtual-ftpd 755 root:sys
			make_dir "/etc/ftpd/virtual-ftpd/$hostname" 755 root:sys
			fmt=`gettext "Limited virtual host %%L test banner"`
			printf "$fmt\n" >"$bannerf"
			chmod 644 "$bannerf"
			chown root:sys "$bannerf"
		fi
		echo "virtual $hostname banner $bannerf" >>$ftpaccess
	fi

	# Add the transfer logfile.
	if [ -n "$logfile" ]
	then
		echo "virtual $hostname logfile $logfile" >>$ftpaccess
	fi

	chmod 644 $ftpaccess
	chown root:sys $ftpaccess
}

# Execution starts here.

IFS=" 	
"
SHELL=/usr/bin/ksh
PATH=/usr/bin
TEXTDOMAIN=SUNW_OST_OSCMD
export SHELL PATH IFS TEXTDOMAIN

cmd=`basename "$0"`

verify_root

while getopts bclx: arg
do
	case $arg in
	b)	banner=1;;
	c)	complete=1;;
	l)	limited=1;;
	x)	logfile="$OPTARG";;
	\?)	usage;;
	esac
done
shift `expr $OPTIND - 1`

# Check arguments.
[ -z "$complete" -a -z "$limited" ] && usage
[ -n "$complete" -a -n "$limited" ] && usage

[ $# -ne 2 ] && usage
hostname="$1"
vhroot="$2"

[ -z "$hostname" -o -z "$vhroot" ] && usage

echo "$hostname" | grep / >/dev/null 2>&1
if [ $? -eq 0 ]
then
	fmt=`gettext "%s: Error: hostname must not contain a /"`
	printf "$fmt\n" "$cmd" >&2
	usage
fi

echo "$vhroot" | grep "^/" >/dev/null 2>&1
if [ $? -ne 0 ]
then
	fmt=`gettext "%s: Error: root_dir must be an absolute pathname"`
	printf "$fmt\n" "$cmd" >&2
	usage
fi

if [ -n "$logfile" ]
then
	echo "$logfile" | grep "^/" >/dev/null 2>&1
	if [ $? -ne 0 ]
	then
		fmt=`gettext "%s: Error: xferlog must be an absolute pathname"`
		printf "$fmt\n" "$cmd" >&2
		usage
	fi
fi

ftpaccess=/etc/ftpd/ftpaccess
if [ ! -f $ftpaccess ]
then
	fmt=`gettext "%s: Error: FTP server configuration file %s missing"`
	printf "$fmt\n" "$cmd" $ftpaccess >&2
	exit 2
fi

grep "^ftp:" /etc/passwd >/dev/null 2>&1
if [ $? -ne 0 ]
then
	fmt=`gettext "Warning: Must create ftp user account before virtual hosts will work"`
	printf "$fmt\n"
fi

# Ignore certain signals.
trap '' 1 2 3 15

umask 022

if [ -n "$complete" ]
then
	setup_complete_vhost
else
	setup_limited_vhost
fi

/usr/sbin/ftpconfig -d "$vhroot" >/dev/null
if [ $? -ne 0 ]
then
	fmt=`gettext "%s: Error: ftpconfig -d %s failed"`
	printf "$fmt\n" "$cmd" "$vhroot" >&2
	exit 2
fi

exit 0