diff --git a/olsrd/Makefile b/olsrd/Makefile index e64955d..361d8f4 100644 --- a/olsrd/Makefile +++ b/olsrd/Makefile @@ -184,7 +184,7 @@ endef define Package/olsrd/install $(INSTALL_DIR) $(1)/lib/functions - $(INSTALL_DATA) ./files/olsrd.init $(1)/lib/functions/olsrd.sh + $(INSTALL_DATA) ./files/olsrd.sh $(1)/lib/functions/olsrd.sh $(INSTALL_DIR) $(1)/etc/config $(INSTALL_DATA) ./files/olsrd.config $(1)/etc/config/olsrd $(INSTALL_DATA) ./files/olsrd6.config $(1)/etc/config/olsrd6 @@ -193,8 +193,6 @@ define Package/olsrd/install $(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_BIN) ./files/olsrd4.init $(1)/etc/init.d/olsrd $(INSTALL_BIN) ./files/olsrd6.init $(1)/etc/init.d/olsrd6 - $(INSTALL_DIR) $(1)/etc/hotplug.d/iface - $(INSTALL_BIN) ./files/olsrd.hotplug.sh $(1)/etc/hotplug.d/iface/50-olsrd endef define Package/olsrd-mod-arprefresh/install diff --git a/olsrd/files/olsrd.hotplug.sh b/olsrd/files/olsrd.hotplug.sh deleted file mode 100755 index ee41a2e..0000000 --- a/olsrd/files/olsrd.hotplug.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/sh - -olsrd_list_configured_interfaces() -{ - local i=0 - local interface - - while interface="$( uci -q get $OLSRD.@Interface[$i].interface )"; do { - case "$( uci -q get $OLSRD.@Interface[$i].ignore )" in - 1|on|true|enabled|yes) - # is disabled - ;; - *) - echo "$interface" # e.g. 'lan' - ;; - esac - - i=$(( i + 1 )) - } done -} - -olsrd_interface_already_in_config() -{ - # e.g.: 'Interface "eth0.1" "eth0.2" "wlan0"' - if grep -s ^'Interface ' "/var/etc/$OLSRD.conf" | grep -q "\"$DEVICE\""; then - logger -t olsrd_hotplug -p daemon.debug "[OK] already_active: '$INTERFACE' => '$DEVICE'" - return 0 - else - logger -t olsrd_hotplug -p daemon.info "[OK] ifup: '$INTERFACE' => '$DEVICE'" - return 1 - fi -} - -olsrd_interface_needs_adding() -{ - local interface - - # likely and cheap operation: - olsrd_interface_already_in_config && return 1 - - for interface in $(olsrd_list_configured_interfaces); do { - [ "$interface" = "$INTERFACE" ] && { - olsrd_interface_already_in_config || return 0 - } - } done - - logger -t olsrd_hotplug -p daemon.debug "[OK] interface '$INTERFACE' => '$DEVICE' not used for $OLSRD" - return 1 -} - -case "$ACTION" in - ifup) - # only work after the first normal startup - # also: no need to test, if enabled - OLSRD=olsrd - [ -e "/var/etc/$OLSRD.conf" ] && { - # INTERFACE = e.g. 'wlanadhocRADIO1' or 'cfg144d8f' - # DEVICE = e.g. 'wlan1-1' - olsrd_interface_needs_adding && { - . /etc/rc.common /etc/init.d/$OLSRD restart - } - } - - OLSRD=olsrd6 - [ -e "/var/etc/$OLSRD.conf" ] && { - olsrd_interface_needs_adding && { - . /etc/rc.common /etc/init.d/$OLSRD restart - } - } - ;; -esac diff --git a/olsrd/files/olsrd.init b/olsrd/files/olsrd.sh similarity index 94% rename from olsrd/files/olsrd.init rename to olsrd/files/olsrd.sh index 8e562c1..d0fe5c1 100644 --- a/olsrd/files/olsrd.init +++ b/olsrd/files/olsrd.sh @@ -1,11 +1,6 @@ #!/bin/sh /etc/rc.common # Copyright (C) 2008-2017 OpenWrt.org -START=65 - -SERVICE_DAEMONIZE=1 -SERVICE_WRITE_PID=1 - OLSRD_OLSRD_SCHEMA='ignore:internal config_file:internal DebugLevel=0 AllowNoInt=yes' OLSRD_IPCCONNECT_SCHEMA='ignore:internal Host:list Net:list2' OLSRD_LOADPLUGIN_SCHEMA='ignore:internal library:internal Host4:list Net4:list2 Host:list Net:list2 Host6:list Net6:list2 Ping:list redistribute:list NonOlsrIf:list name:list lat lon latlon_infile HNA:list2 hosts:list2 ipv6only:bool' @@ -34,6 +29,54 @@ validate_varname() { return 0 } +olsrd_list_configured_interfaces() +{ + local i=0 + local interface + + while interface="$( uci -q get $OLSRD.@Interface[$i].interface )"; do { + case "$( uci -q get $OLSRD.@Interface[$i].ignore )" in + 1|on|true|enabled|yes) + # is disabled + ;; + *) + echo "$interface" # e.g. 'lan' + ;; + esac + + i=$(( i + 1 )) + } done +} + +olsrd_interface_already_in_config() +{ + # e.g.: 'Interface "eth0.1" "eth0.2" "wlan0"' + if grep -s ^'Interface ' "/var/etc/$OLSRD.conf" | grep -q "\"$DEVICE\""; then + logger -t olsrd_hotplug -p daemon.debug "[OK] already_active: '$INTERFACE' => '$DEVICE'" + return 0 + else + logger -t olsrd_hotplug -p daemon.info "[OK] ifup: '$INTERFACE' => '$DEVICE'" + return 1 + fi +} + +olsrd_interface_needs_adding() +{ + local interface + + # likely and cheap operation: + olsrd_interface_already_in_config && return 1 + + for interface in $(olsrd_list_configured_interfaces); do { + [ "$interface" = "$INTERFACE" ] && { + olsrd_interface_already_in_config || return 0 + } + } done + + logger -t olsrd_hotplug -p daemon.debug "[OK] interface '$INTERFACE' => '$DEVICE' not used for $OLSRD" + return 1 +} + validate_olsrd_option() { local str="$1" [ -z "$str" -o "$str" != "${str%%[! 0-9A-Za-z.%/|:_-]*}" ] && return 1 @@ -769,7 +812,8 @@ olsrd_setup_smartgw_rules() { fi } -start() { +olsrd_generate_config() { + UCI_CONF_NAME="$1" SYSTEM_HOSTNAME= SYSTEM_LAT= SYSTEM_LON= @@ -801,23 +845,4 @@ start() { fi [ -z "$OLSRD_CONFIG_FILE" ] && return 1 - - SERVICE_PID_FILE="$PID" - if service_check /usr/sbin/olsrd; then - error "there is already an instance of $UCI_CONF_NAME running (pid: '$(cat $PID)'), not starting." - return 1 - else - service_start /usr/sbin/olsrd -f "$OLSRD_CONFIG_FILE" -nofork - sleep 1 - service_check /usr/sbin/olsrd || { - log "startup-error: check via: '/usr/sbin/olsrd -f \"$OLSRD_CONFIG_FILE\" -nofork'" - } - fi - - olsrd_setup_smartgw_rules -} - -stop() { - SERVICE_PID_FILE="$PID" - service_stop /usr/sbin/olsrd } diff --git a/olsrd/files/olsrd4.init b/olsrd/files/olsrd4.init index 718b3e0..4aa8b22 100644 --- a/olsrd/files/olsrd4.init +++ b/olsrd/files/olsrd4.init @@ -4,11 +4,37 @@ . $IPKG_INSTROOT/lib/functions/olsrd.sh START=65 - -SERVICE_DAEMONIZE=1 -SERVICE_WRITE_PID=1 - -CONF=/var/etc/olsrd.conf +USE_PROCD=1 +BIN=/usr/sbin/olsrd +OLSRD=olsrd +CONF=/var/etc/$OLSRD.conf PID=/var/run/olsrd.pid -UCI_CONF_NAME=olsrd +start_service() { + olsrd_generate_config $OLSRD + + procd_open_instance + procd_set_param command "$BIN" + procd_append_param command -f ${CONF} + procd_append_param command -nofork + procd_append_param command -pidfile ${PID} + + # restart if olsrd dies + procd_set_param respawn + + # automatically restart olsrd if generated cfg has changed + procd_set_param file $CONF + + procd_set_param pidfile $PID + + procd_close_instance + + olsrd_setup_smartgw_rules +} + +service_triggers() { + # restart on ifup interface events + for n in $(olsrd_list_configured_interfaces $OLSRD); do + procd_add_reload_interface_trigger $n /etc/init.d/$OLSRD reload + done +} diff --git a/olsrd/files/olsrd6.init b/olsrd/files/olsrd6.init index 1dcc4a0..25107d3 100644 --- a/olsrd/files/olsrd6.init +++ b/olsrd/files/olsrd6.init @@ -4,11 +4,38 @@ . $IPKG_INSTROOT/lib/functions/olsrd.sh START=65 - -SERVICE_DAEMONIZE=1 -SERVICE_WRITE_PID=1 - -CONF=/var/etc/olsrd6.conf +USE_PROCD=1 +BIN=/usr/sbin/olsrd +OLSRD=olsrd6 +CONF=/var/etc/$OLSRD.conf PID=/var/run/olsrd6.pid -UCI_CONF_NAME=olsrd6 + +start_service() { + olsrd_generate_config $OLSRD + + procd_open_instance + procd_set_param command "$BIN" + procd_append_param command -f ${CONF} + procd_append_param command -nofork + procd_append_param command -pidfile ${PID} + + # restart if olsrd dies + procd_set_param respawn + + # automatically restart olsrd if generated cfg has changed + procd_set_param file $CONF + + procd_set_param pidfile $PID + + procd_close_instance + + olsrd_setup_smartgw_rules +} + +service_triggers() { + # restart on ifup interface events + for n in $(olsrd_list_configured_interfaces $OLSRD); do + procd_add_reload_interface_trigger $n /etc/init.d/$OLSRD reload + done +}