#!/bin/bash
### BEGIN INIT INFO
# Provides:          ofr
# Required-Start:    $syslog $time $local_fs
# Required-Stop:     $syslog $time $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Vyatta Router
# Description:       Debian init script for the Vyatta Router
### END INIT INFO
# **** License ****
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# A copy of the GNU General Public License is available as
# `/usr/share/common-licenses/GPL' in the Debian GNU/Linux distribution
# or on the World Wide Web at `http://www.gnu.org/copyleft/gpl.html'.
# You can also obtain it by writing to the Free Software Foundation,
# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
# MA 02110-1301, USA.
#
# Author:	Tom Grennan <tgrennan@vyatta.com>
# **** End License ****

. /lib/lsb/init-functions

: ${vyatta_env:=/etc/default/vyatta}
source $vyatta_env

declare progname=${0##*/}
declare action=$1; shift

declare -x BOOTFILE=$vyatta_sysconfdir/config/config.boot

declare -a subinit
declare -a all_subinits=(
    rl-system
    firewall )

if [ $# -gt 0 ] ; then
    for s in $@ ; do
	[ -x ${vyatta_sbindir}/${s}.init ] && subinit[${#subinit}]=$s
    done
else
    for s in ${all_subinits[@]} ; do
	[ -x ${vyatta_sbindir}/${s}.init ] && subinit[${#subinit}]=$s
    done
    if [ -x ${vyatta_sbindir}/rtrmgr.init ] ; then
	subinit+=( rtrmgr )
	GROUP=xorp
    else
	GROUP=vyattacfg
    fi
fi


have_rl_system () {
    test -x $vyatta_sbindir/rl-system.init
}

# if necessary, provide initial config
init_bootfile () {
    if [ ! -d /media/floppy/config ] && grep -q fd /proc/devices
    then
        mkdir -p /media/floppy
	mount /dev/fd0 /media/floppy -o sync ||
            mount -t ext2 /dev/fd0 /media/floppy -o sync ||
            mount -t vfat /dev/fd0 /media/floppy
    fi 2>/dev/null

    [ -d /media/floppy/config ] &&
    	mount -o bind /media/floppy/config /opt/vyatta/etc/config

    if [ -f $BOOTFILE ] && grep -q '/\*XORP Configuration File, v1.0\*/' \
			    $BOOTFILE >&/dev/null; then
	CURTIME=$(date +%F-%H%M%S)
	mv $BOOTFILE $BOOTFILE.pre-glendale.$CURTIME
    fi
    if [ ! -f $BOOTFILE ] ; then
	if [ -f $vyatta_sysconfdir/config.boot.default ]; then
	  cp $vyatta_sysconfdir/config.boot.default $BOOTFILE
        else
          $vyatta_sbindir/vyatta_current_conf_ver.pl > $BOOTFILE
        fi
    fi
    chgrp ${GROUP} $BOOTFILE
    chmod 660 $BOOTFILE
    ## remove the unnecessary and potentially conflicting
    ## config-directory statement (i.e. /mnt/floppy vs. /media/floppy
    sed -i '/^rtrmgr {$/,/^}$/d' $BOOTFILE
}

# if necessary, migrate initial config
migrate_bootfile ()
{
    if [ -x $vyatta_sbindir/vyatta_config_migrate.pl ]; then
        log_progress_msg migrate
        $vyatta_sbindir/vyatta_config_migrate.pl $BOOTFILE
    fi
}

# load the initial config
load_bootfile ()
{
  if [ -x $vyatta_sbindir/vyatta-config-loader.pl ]; then
    log_progress_msg configure
    sg ${GROUP} -c "$vyatta_sbindir/vyatta-config-loader.pl $BOOTFILE"
  fi
}


# Unload the RAID modules that we are not using.  It is safe to try to
# unload all of the RAID modules.   The kernel will refuse to unload any
# that we are actually using.
#
cleanup_raid()
{
    MD_MODULES='linear multipath raid0 raid1 raid456 raid5 raid6 raid10'
    rmmod $MD_MODULES > /tmp/vyatta_raid_cleanup_log 2>&1
}



start ()
{
    log_action_begin_msg "Mounting Vyatta Config"
    mount -o nosuid,nodev,mode=775 -t tmpfs none ${vyatta_configdir} && \
	chgrp ${GROUP} ${vyatta_configdir}
    log_action_end_msg $?
    init_bootfile
    log_daemon_msg "Starting Vyatta router"
    migrate_bootfile
    for s in ${subinit[@]} ; do
	log_progress_msg $s
	${vyatta_sbindir}/${s}.init start || (log_end_msg $? && return)
    done
    load_bootfile
    cleanup_raid
    chmod g-w,o-w /

    log_end_msg $?
}

stop()
{
    local -i status=0
    log_daemon_msg "Stopping Vyatta router"
    for ((i=${#sub_inits[@]} - 1; i >= 0; i--)) ; do
	s=${subinit[$i]}
	log_progress_msg $s
	${vyatta_sbindir}/${s}.init stop
	let status\|=$?
    done
    log_end_msg $status
    log_action_begin_msg "Un-mounting Vyatta Config"
    umount ${vyatta_configdir}
    log_action_end_msg $?
}

case "$action" in
    start) start ;;
    stop)  stop ;;
    restart|force-reload) stop && start ;;
    *)	log_failure_msg "usage: $progname [ start|stop|restart ] [ subinit ... ]" ;
	false ;;
esac

exit $?

# Local Variables:
# mode: shell-script
# sh-indentation: 4
# End: