#!/bin/sh /etc/rc.common # Copyright (C) 2014-2017 - Eloi Carbo # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Extra Service Function to get the Status of the Service # This complements /etc/rc.common functions # Commands ending with *_quiet are meant to be ran in Luci. These # scripts' return minimal output. EXTRA_COMMANDS="status start_quiet stop_quiet restart_quiet status_quiet" EXTRA_HELP=" status Returns service status" BIRD="bird4" BIRD_CONFIG="/etc/${BIRD}.conf" BIRD_LOG="/var/log/${BIRD}.log" BIRD_ERR="/tmp/${BIRD}.err" START=99 STOP=10 SERVICE_DAEMONIZE=1 SERVICE_USE_PID=1 SERVICE_PID_FILE="/var/run/${BIRD}.pid" BIRD_BIN="/usr/sbin/${BIRD}" # Special non-terminal-rich output for Luci calls LUCI="false" . /etc/${BIRD}/init.d/${BIRD}-lib.sh start() { config_load ${BIRD} local use_UCI_config get use_UCI_config 'bird' #Start the service if [ "${LUCI}" == "false" ]; then echo "Starting ${BIRD} Service [ ... ]" fi if [ -f ${BIRD_ERR} ]; then echo -n "" > ${BIRD_ERR} else touch ${BIRD_ERR} fi if [ -z "${use_UCI_config}" -o "${use_UCI_config}" = "0" ]; then # Disable Custom bird-openwrt settings. # Use default behaviour and files ${BIRD_BIN} -d -c ${BIRD_CONFIG} -P ${SERVICE_PID_FILE} -D ${BIRD_LOG} &> ${BIRD_ERR} & else #Set Bird4 configuration location: local UCI_config_file local log_file get UCI_config_file 'bird' get log_file 'global' BIRD_CONFIG="${UCI_config_file:-$BIRD_CONFIG}" BIRD_LOG="${log_file:-$BIRD_LOG}" #Backup previous configuration [ -f ${BIRD_CONFIG} ] && cp ${BIRD_CONFIG} ${BIRD_CONFIG}.bak #Setup the basic configuration prepare_global 'global' # Gather and set all Functions gather_functions # Gather and set all Filters gather_filters # Setup Main Protocols config_foreach prepare_kernel 'kernel' config_foreach prepare_static 'static' config_foreach prepare_device 'device' config_foreach prepare_direct 'direct' config_foreach prepare_pipe 'pipe' #Setup protocol's configuration: BGP config_foreach prepare_bgp_template 'bgp_template' config_foreach prepare_bgp 'bgp' #Setup protocol's configuration: OSPF config_foreach prepare_ospf_instance 'ospf' #Start the service ${BIRD_BIN} -d -c ${BIRD_CONFIG} -P ${SERVICE_PID_FILE} -D ${BIRD_LOG} &>${BIRD_ERR} & fi while [ ! -s ${SERVICE_PID_FILE} ]; do sleep 1 if [ -s ${BIRD_ERR} ]; then if [ "${LUCI}" == "false" ]; then echo -e "${BIRD} Daemon Start Status: \033[0;31m[ FAILED ]\e[m" cat ${BIRD_ERR} cat ${BIRD_ERR} >> ${BIRD_LOG} else echo "${BIRD} - Failed: $(cat ${BIRD_ERR})" cat ${BIRD_ERR} >> ${BIRD_LOG} fi break fi done # PID & ERROR contents are read from their files to avoid an issue # where if [ -s ${SERVICE_PID_FILE} ] and if [ -s ${BIRD_ERR} ] # fails unless a previous command reads its contents making its # behaviour unreliable. SVC_PID="$(cat ${SERVICE_PID_FILE})" BRDERR_TXT="$(cat ${BIRD_ERR})" if [ -n "${SVC_PID}" ]; then if [ -n "${BRDERR_TXT}" ]; then if [ "${LUCI}" == "false" ]; then echo -e "${BIRD} Daemon already started. Status \033[0;32m[ RUNNING ]\e[m" else echo "${BIRD} already started" fi else if [ "${LUCI}" == "false" ]; then echo -e "${BIRD} Daemon Start Status: \033[0;32m[ STARTED ]\e[m" else echo "${BIRD} - Started" fi fi # PID File found (service started correctly) return 0 fi # PID File not found (error while starting service) return 1 } stop() { if [ -s ${SERVICE_PID_FILE} ]; then config_load ${BIRD} local log_file get log_file 'global' BIRD_LOG="${log_file:-$BIRD_LOG}" start-stop-daemon -p ${SERVICE_PID_FILE} -K 2>&1 >> ${BIRD_LOG} if [ $? -eq 0 ]; then if [ "${LUCI}" == "false" ]; then echo -e "${BIRD} Daemon Stop Status: \033[0;32m[ OK ]\e[m" else echo "${BIRD} - Stopped" fi echo -n "" > ${BIRD_ERR} else if [ "${LUCI}" == "false" ]; then echo -e "${BIRD} Daemon Stop Status: \033[0;31m[ FAILED ]\e[m" echo "Check ${BIRD_LOG} file for more information." else echo "${BIRD} Failed to Stop. See Log file: ${BIRD_LOG}" fi fi else if [ "${LUCI}" == "false" ]; then echo -e "${BIRD} Daemon Service already stopped. \033[0;31m[ FAILED ]\e[m" else echo "${BIRD} already stopped" fi fi return 0 } restart() { stop sleep 1 if [ "${LUCI}" == "true" ]; then echo " ... " fi start } reload() { service_reload ${BIRD_BIN} } status() { if [ -s ${SERVICE_PID_FILE} ]; then if [ "${LUCI}" == "false" ]; then echo -e "${BIRD} start status: \033[0;32m[ RUNNING ]\e[m" else echo "${BIRD}: Running" fi return 0 else if [ -s ${BIRD_ERR} ]; then if [ "${LUCI}" == "false" ]; then echo -e "${BIRD} service status: \033[0;31m[ STOPPED ]\e[m" cat ${BIRD_ERR} else echo "${BIRD}: Failed - $(cat ${BIRD_ERR})" fi return 2 else if [ "${LUCI}" == "false" ]; then echo -e "${BIRD} service status: \033[0;31m[ STOPPED ]\e[m" else echo "${BIRD}: Stopped" fi return 1 fi fi } # Luci-specific calls (stripped output). # The following scripts are not meant to be ran using Ash Terminal # Used in: LUCI/model/cbi/bird4/status.lua start_quiet() { LUCI="true" start } stop_quiet() { LUCI="true" stop } restart_quiet() { LUCI="true" restart } status_quiet() { LUCI="true" status }