Annotation of embedaddon/quagga/solaris/quagga.init.in, revision 1.1.1.1

1.1       misho       1: #!/sbin/sh
                      2: #
                      3: # Copyright 2007 Sun Microsystems, Inc. All rights reserved.
                      4: # Use is subject to license terms.
                      5: #
                      6: # This file is part of Quagga.
                      7: #
                      8: # Quagga is free software; you can redistribute it and/or modify it
                      9: # under the terms of the GNU General Public License as published by the
                     10: # Free Software Foundation; either version 2, or (at your option) any
                     11: # later version.
                     12: #
                     13: # Quagga is distributed in the hope that it will be useful, but
                     14: # WITHOUT ANY WARRANTY; without even the implied warranty of
                     15: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     16: # General Public License for more details.
                     17: #
                     18: # You should have received a copy of the GNU General Public License
                     19: # along with Quagga; see the file COPYING.  If not, write to the Free
                     20: # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
                     21: # 02111-1307, USA.
                     22: #
                     23: # Starts/stops the given daemon
                     24: 
                     25: SMFINCLUDE=/lib/svc/share/smf_include.sh
                     26: ROUTEADMINCLUDE=/lib/svc/share/routing_include.sh
                     27: GLOBAL_OPTIONS="PAfiug"
                     28: DAEMON_PATH=@sbindir@
                     29: USER=@enable_user@
                     30: GROUP=@enable_group@
                     31: 
                     32: # handle upgrade of daemon-args SMF property to new routeadm properties
                     33: # used during upgrade too by routeadm.
                     34: # relevant to S10U4+ only.
                     35: handle_routeadm_upgrade () {
                     36:        GLOBAL_OPTIONS="PAfiug"
                     37:        
                     38:        daemon_args=`get_daemon_args $SMF_FMRI`
                     39:        
                     40:        if [ -n "$daemon_args" ]; then
                     41:                set_daemon_value_property "$SMF_FMRI" "$daemon_args" \
                     42:                        "$GLOBAL_OPTIONS" "P" vty_port 0
                     43:                set_daemon_value_property "$SMF_FMRI" "$daemon_args" \
                     44:                        "$GLOBAL_OPTIONS" "A" vty_address
                     45:                set_daemon_value_property "$SMF_FMRI" "$daemon_args" \
                     46:                        "$GLOBAL_OPTIONS" "f" config_file
                     47:                set_daemon_value_property "$SMF_FMRI" "$daemon_args" \
                     48:                        "$GLOBAL_OPTIONS" "i" pid_file
                     49:                set_daemon_value_property "$SMF_FMRI" "$daemon_args" \
                     50:                        "$GLOBAL_OPTIONS" "u" user
                     51:                set_daemon_value_property "$SMF_FMRI" "$daemon_args" \
                     52:                        "$GLOBAL_OPTIONS" "g" group
                     53:                
                     54:                case "$1" in
                     55:                zebra)
                     56:                        set_daemon_boolean_property "$SMF_FMRI" "$daemon_args" \
                     57:                                "${GLOBAL_OPTIONS}b" "b" batch true false
                     58:                        ;;
                     59:                ripd|ripngd)
                     60:                        set_daemon_boolean_property "$SMF_FMRI" "$daemon_args" \
                     61:                                "${GLOBAL_OPTIONS}r" "r" retain true false
                     62:                        ;;
                     63:                bgpd)
                     64:                        set_daemon_boolean_property "$SMF_FMRI" "$daemon_args" \
                     65:                                "${GLOBAL_OPTIONS}rnp" "r" retain true false
                     66:                        set_daemon_boolean_property "$SMF_FMRI" "$daemon_args" \
                     67:                                "${GLOBAL_OPTIONS}rnp" "n" no_kernel true false
                     68:                        set_daemon_value_property "$SMF_FMRI" "$daemon_args" \
                     69:                                "${GLOBAL_OPTIONS}rnp" "p" bgp_port
                     70:                esac
                     71:                clear_daemon_args $SMF_FMRI
                     72:        fi
                     73: }
                     74: 
                     75: upgrade_config () {
                     76:        DAEMON=$1
                     77:        # handle upgrade of SUNWzebra to Quagga
                     78:        if [ -d "/etc/quagga" -a ! -f "/etc/quagga/${DAEMON}.conf" ] ; then
                     79:                if [ -f "/etc/sfw/zebra/${DAEMON}.conf" ] ; then
                     80:                        cp "/etc/sfw/zebra/${DAEMON}.conf" \
                     81:                                "/etc/quagga/${DAEMON}.conf.upgrade" \
                     82:                                || exit $SMF_EXIT_ERR_FATAL
                     83:                        chown "${USER}:${GROUP}" "/etc/quagga/${DAEMON}.conf.upgrade" \
                     84:                                || exit $SMF_EXIT_ERR_FATAL
                     85:                        chmod 0600 "/etc/quagga/${DAEMON}.conf.upgrade" \
                     86:                                || exit $SMF_EXIT_ERR_FATAL
                     87:                        mv "/etc/quagga/${DAEMON}.conf.upgrade" "/etc/quagga/${DAEMON}.conf" \
                     88:                                || exit $SMF_EXIT_ERR_FATAL
                     89:                fi
                     90:        fi
                     91: 
                     92:        if [ ! -f "/etc/quagga/${DAEMON}.conf" ] ; then
                     93:                touch "/etc/quagga/${DAEMON}.conf.new" \
                     94:                        || exit $SMF_EXIT_ERR_FATAL
                     95:                chown "${USER}:${GROUP}" "/etc/quagga/${DAEMON}.conf.new" \
                     96:                        || exit $SMF_EXIT_ERR_FATAL
                     97:                chmod 0600 "/etc/quagga/${DAEMON}.conf.new" \
                     98:                        || exit $SMF_EXIT_ERR_FATAL
                     99:                mv "/etc/quagga/${DAEMON}.conf.new" "/etc/quagga/${DAEMON}.conf" \
                    100:                        || exit $SMF_EXIT_ERR_FATAL
                    101:        fi
                    102: }
                    103: 
                    104: # Relevant to S10+
                    105: quagga_is_globalzone () {
                    106:        if [ "${QUAGGA_INIT_ZONENAME:=`/sbin/zonename`}" = "global" \
                    107:                -o `/sbin/zonename -t` = "exclusive" ]; then
                    108:                return 0
                    109:        else
                    110:                return 1
                    111:        fi
                    112: }
                    113: 
                    114: routeadm_daemon_args () {
                    115:        # globals
                    116:        args="`get_daemon_option_from_property $SMF_FMRI config_file f`"
                    117:        args="${args} `get_daemon_option_from_property $SMF_FMRI vty_port P`"
                    118:        args="${args} `get_daemon_option_from_property $SMF_FMRI vty_address A`"
                    119:        args="${args} `get_daemon_option_from_property $SMF_FMRI pid_file i`"
                    120:        
                    121:        # user and group we need for config file upgrade..
                    122:        SMF_USER=`get_routeadm_property $SMF_FMRI user`
                    123:        SMF_GROUP=`get_routeadm_property()$SMF_FMRI group`
                    124:        if [ "${SMF_USER}" ] ; then
                    125:                USER="${SMF_USER}"
                    126:                args="${args} -u ${SMF_USER}"
                    127:        fi
                    128:        if [ "${SMF_GROUP}" ] ; then 
                    129:                GROUP="${SMF_GROUP}"
                    130:                args="${args} -g ${SMF_GROUP}"
                    131:        fi
                    132: 
                    133:        case $1 in
                    134:        zebra)
                    135:                args="${args} `get_daemon_option_from_boolean_property $SMF_FMRI batch -b true`"
                    136:                ;;
                    137:        ripd|ripngd)
                    138:                args="${args} `get_daemon_option_from_boolean_property $SMF_FMRI retain -r true`"
                    139:                ;;
                    140:        bgpd)
                    141:                args="${args} `get_daemon_option_from_boolean_property $SMF_FMRI retain -r true`"
                    142:                args="${args} `get_daemon_option_from_boolean_property $SMF_FMRI no_kernel -n true`"
                    143:                args="${args} `get_daemon_option_from_property $SMF_FMRI bgp_port p 179`"
                    144:                ;;
                    145:        esac
                    146:        echo ${args}
                    147: }
                    148: 
                    149: # certain daemons need zebra
                    150: routeadm_zebra_enable () {
                    151: 
                    152:        if [ "$DAEMON" = "zebra" ]; then
                    153:                return
                    154:        fi
                    155:        
                    156:        enable_zebra=`/usr/bin/svcprop -p \
                    157:                routing/enable_zebra $SMF_FMRI 2> /dev/null`
                    158:        if [ "$enable_zebra" != "false" ]; then
                    159:                zenabled=`/usr/bin/svcprop -p general/enabled zebra:quagga`
                    160:                zenabledt=`/usr/bin/svcprop -p general_ovr/enabled zebra:quagga`
                    161:                if [ "$zenabled" = "true" -o "$zenabledt" = "true" ]; then
                    162:                        /usr/sbin/svcadm disable zebra:quagga
                    163:                        /usr/sbin/svcadm enable -st zebra:quagga
                    164:                else
                    165:                        /usr/sbin/svcadm enable -st zebra:quagga 
                    166:                fi
                    167:                if [ "$?" != "0" ]; then
                    168:                        echo "Could not enable zebra:quagga"
                    169:                        exit $SMF_EXIT_ERR_FATAL
                    170:                fi
                    171:        fi
                    172: }
                    173: 
                    174: # Include smf functions, if available. If not, define smf_present to indicate
                    175: # there is no SMF. Should allow this script to work pre-S10.
                    176: if [ -f "$SMFINCLUDE" ] ; then
                    177:        . "$SMFINCLUDE";
                    178:        
                    179:        # source the SMF-routeadm include if present..
                    180:        if [ -f "$ROUTEADMINCLUDE" ] ; then
                    181:                . "$ROUTEADMINCLUDE"
                    182:        fi
                    183: else
                    184:        # pre-SMF system, fake up any functions and exit codes
                    185:        # which SMFINCLUDE usually provides.
                    186:        smf_present () {
                    187:                return 1
                    188:        }
                    189:        SMF_EXIT_OK=0;
                    190:        SMF_EXIT_ERR_CONFIG=96;
                    191:        SMF_EXIT_ERR_FATAL=95;
                    192: fi
                    193:        
                    194: # if there's no SMF, set some default DAEMON_ARGS
                    195: smf_present || DAEMON_ARGS=""
                    196: 
                    197: usage () {
                    198:        if smf_present ; then
                    199:                echo "Usage: $0 <daemon>";
                    200:        else
                    201:                echo "Usage: $0 <stop|start> <daemon> <daemon arguments>";
                    202:        fi
                    203:        echo "The --pid_file argument is implied";
                    204:        echo "This help message: $0 <help|usage>";
                    205: }
                    206: 
                    207: # parse arguments, different according to SMF or not.
                    208: case $1 in
                    209:        'help' | 'usage')
                    210:                usage
                    211:                exit $SMF_EXIT_OK
                    212:                ;;
                    213: esac
                    214: 
                    215: if smf_present ; then
                    216:        QUAGGA_METHOD="start"
                    217: else
                    218:        QUAGGA_METHOD="$1"
                    219:        shift;
                    220: fi
                    221: 
                    222: DAEMON="$1"
                    223: 
                    224: # daemon path must be given
                    225: if [ -z "$DAEMON_PATH/$DAEMON" ]; then
                    226:        usage
                    227:        exit $SMF_EXIT_ERR_FATAL
                    228: fi
                    229: 
                    230: # only bgpd is suitable for running in a non-global zone, at this
                    231: # time.
                    232: case "${DAEMON}" in
                    233:        bgpd)
                    234:        ;;
                    235:        zebra | ospfd | ospf6d | ripd | ripngd )
                    236:                quagga_is_globalzone || exit $SMF_EXIT_OK
                    237:        ;;
                    238:        *)
                    239:                usage
                    240:                exit $SMF_EXIT_ERR_CONFIG;
                    241:        ;;
                    242: esac
                    243: 
                    244: # Older Quagga SMF packages pass daemon args on the commandline
                    245: # Newer SMF routeadm model uses properties for each argument
                    246: # so we must handle that.
                    247: if [ smf_present -a -f "$ROUTEADMINCLUDE" ]; then
                    248:        handle_routeadm_upgrade $DAEMON;
                    249:        DAEMON_ARGS=`routeadm_daemon_args`;
                    250:        routeadm_zebra_enable $DAEMON;
                    251: else
                    252:        if [ $# -gt 0 ] ; then
                    253:                shift
                    254:                DAEMON_ARGS="$@"
                    255:        fi
                    256: fi
                    257: 
                    258: upgrade_config "$DAEMON"
                    259: 
                    260: if [ ! -f "@sysconfdir@/${DAEMON}.conf" ] ; then
                    261:        echo "Could not find config file, @sysconfdir@/${DAEMON}.conf"
                    262:        exit $SMF_EXIT_ERR_CONFIG
                    263: fi
                    264: 
                    265: # we need @quagga_statedir@ to exist, it probably is on tmpfs.
                    266: if [ ! -d @quagga_statedir@ ] ; then
                    267:        mkdir -p @quagga_statedir@
                    268:        chown @enable_user@:@enable_group@ @quagga_statedir@
                    269:        chmod 751 @quagga_statedir@
                    270: fi
                    271: 
                    272: PIDFILE="@quagga_statedir@/${DAEMON}.pid"
                    273: 
                    274: start () {
                    275:        if [ ! -x "$DAEMON_PATH/$DAEMON" ] ; then
                    276:                echo "Error, could not find daemon, $DAEMON_PATH/$DAEMON"
                    277:                exit $SMF_EXIT_ERR_FATAL
                    278:        fi
                    279:        eval exec $DAEMON_PATH/$DAEMON $DAEMON_ARGS --pid_file ${PIDFILE} &
                    280: }
                    281: 
                    282: stop_by_pidfile () {
                    283:        if [ -f "${PIDFILE}" ]; then
                    284:                /usr/bin/kill -TERM `/usr/bin/cat "${PIDFILE}"`
                    285:        fi
                    286: }
                    287: 
                    288: case "$QUAGGA_METHOD" in
                    289: 'start')
                    290:        start
                    291:        ;;
                    292: 'stop')
                    293:        stop_by_pidfile
                    294:        ;;
                    295: 
                    296: *)
                    297:        usage
                    298:        exit $SMF_EXIT_ERR_FATAL
                    299:        ;;
                    300: esac   
                    301: 
                    302: exit $SMF_EXIT_OK;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>