-bash-3.00# more /opt/csw/lib/svc/method/svc-vsftpd #!/bin/sh # /etc/init.d/vsftpd # # Originally written by Nicolas LEMIRE # Adapted by Yann Rouillard # # treat unset variable as error set -u # exit immediately on error line set -e . /lib/svc/share/smf_include.sh ################################ # Variable intialization # ################################ PROGNAME=vsftpd BINPATH=/opt/csw/sbin PIDFILE=/var/run/vsftpd.pid INIT_FILE=/etc/init.d/vsftpd CONF_DIR=/opt/csw/etc/vsftpd CONF_FILE=$CONF_DIR/vsftpd.conf OPTIONS="" #################### # Useful functions # #################### # # Check vsftpd config file, i.e. it tests if: # - it is correctly set up to work with this init script (listen=yes and background=no) # - ftp user exists if anonymous access is configured # check_config_file() { if [ ! -f ${CONF_FILE} ]; then echo "vsftpd: ERROR: configuration file $CONF_FILE doesn't exist." >&2 exit $SMF_EXIT_ERR_CONFIG; fi if /usr/bin/egrep -i "^ *listen(_ipv6)? *= *yes" ${CONF_FILE} > /dev/null; then if /usr/bin/egrep -i "^ *background *= *yes" ${CONF_FILE} > /dev/null; then echo "vsftpd: ERROR: this script doesn't work with background option enabled in $CONF_FILE." >&2 exit $SMF_EXIT_ERR_CONFIG fi # As the csw package default configuration is anonymous access only and doesn't automatically create the ftp user, # we warn the user if it didn't create this user. if /usr/bin/egrep -i "^ *anonymous_enable *= *yes" ${CONF_FILE} > /dev/null; then FTP_USER=`/usr/bin/awk -F= '$0 ~ /^ *ftp_username *=/ { print $2; exit }' ${CONF_FILE}` FTP_USER=${FTP_USER:-ftp} getent passwd $FTP_USER >/dev/null || { echo "vsftpd: WARNING: You should create the user $FTP_USER for anonymous ftp access to work." exit $SMF_EXIT_MON_DEGRADE } fi return 0 fi exit $SMF_EXIT_ERR_CONFIG } # # check if a program is running by looking at its pid file # check_proc pid_file program_command # check_proc() { if [ -f $1 ]; then _PID=`cat $1 | head -1` if [ -n "$_PID" ]; then _COMMAND=`ps -p $_PID -o comm | tail -1` [ "x$_COMMAND" = "x$2" ] && return 0 fi return 2 else return 3 fi } start() { if check_proc $PIDFILE $BINPATH/$PROGNAME; then echo "$PROGNAME is already running." else rm -f $PIDFILE echo "Starting $PROGNAME: \c" $BINPATH/$PROGNAME $OPTIONS $CONF_FILE & echo $! > $PIDFILE # We can't rely on exit code for backgrounded job # so we have to test if the process is really running if check_proc $PIDFILE $BINPATH/$PROGNAME; then echo "OK." else echo "Failed." rm -f $PIDFILE fi fi } stop() { if check_proc $PIDFILE $BINPATH/$PROGNAME; then echo "Stopping $PROGNAME: \c" kill -15 `cat $PIDFILE | head -1` rm -f $PIDFILE echo "OK." else rm -f $PIDFILE echo "$PROGNAME is not running." fi } restart() { stop start } reload() { if check_proc $PIDFILE $BINPATH/$PROGNAME; then echo "Reloading $PROGNAME: \c" kill -1 `cat $PIDFILE | head -1` echo "OK." else echo "$PROGNAME is not running." fi } status() { check_proc $PIDFILE $BINPATH/$PROGNAME RET=$? if [ "$RET" -eq 0 ]; then echo "$PROGNAME is running." else echo "$PROGNAME is not running." fi return $RET } [ -x ${BINPATH}/${PROGNAME} ] || exit 5 [ -r ${CONF_FILE} ] || exit 5 # We don't do anything if vsftpd is not configured # or is configured in inetd mode check_config_file case "$1" in start) start ;; stop) stop ;; restart) restart ;; reload) reload ;; status) status ;; *) echo "Usage: $INIT_FILE {start|stop|restart|reload|status}" exit 1 ;; esac