#!/bin/sh /etc/rc.common # Copyright (C) 2012 OpenWrt.org START=95 EXTRA_COMMANDS="up down show_key" LIST_SEP=" " TMP_FASTD=/tmp/fastd FASTD_COMMAND=/usr/sbin/fastd append_opt() { local v="$1"; local p="$2" OPTS="$OPTS --${p//_/-} '${v//'/\\'}'" } append_opt_bool() { local p="$1" OPTS="$OPTS --${p//_/-}" } append_opts() { local p; local v; local s="$1"; shift for p in $*; do config_get v "$s" "$p" [ -n "$v" ] && append_opt "$v" "$p" done } append_opts_bool() { local p; local v; local s="$1"; shift for p in $*; do config_get_bool v "$s" "$p" 0 [ "$v" == 1 ] && append_opt_bool "$p" done } append_opts_list() { local p; local s="$1"; shift for p in $*; do config_list_foreach "$s" "$p" append_opt "$p" done } section_enabled() { config_get_bool enabled "$1" 'enabled' 0 [ $enabled -gt 0 ] } error() { echo "${initscript}:" "$@" 1>&2 } start_instance() { local s="$1" section_enabled "$s" || return 1 SERVICE_PID_FILE="/var/run/fastd.$s.pid" OPTS="" config_get interface "$s" interface if [ -z "$interface" ]; then error "$s: interface is not set" return 1 fi if ifconfig "$interface" &>/dev/null; then error "$s: interface '$interface' is already in use" return 1 fi config_get secret "$s" secret if [ -z "$secret" ]; then error "$s: secret is not set" return 1 fi append_opts_list "$s" config config_peer_dir bind method append_opts "$s" syslog_level mode interface mtu append_opts_bool "$s" forward mkdir -p "$TMP_FASTD" echo "secret \"$secret\";" > "$TMP_FASTD/secret.$s.conf" eval service_start "'$FASTD_COMMAND'" --daemon --pid-file "'$SERVICE_PID_FILE'" --syslog-level info $OPTS --config "'$TMP_FASTD/secret.$s.conf'" if ! ifconfig "$interface" >/dev/null 2>&1; then error "$s: startup failed" return 1 fi config_get up "$s" up [ -n "$up" ] && sh -c "$up" - "$interface" } stop_instance() { local s="$1" section_enabled "$s" || return 1 SERVICE_PID_FILE="/var/run/fastd.$s.pid" config_get interface "$s" interface if [ -z "$interface" ]; then error "$s: interface is not set" return 1 fi if ! ifconfig "$interface" &>/dev/null; then error "$s: interface '$interface' does not exist" return 1 fi config_get down "$s" down [ -n "$down" ] && sh -c "$down" - "$interface" service_stop "$FASTD_COMMAND" rm -f "$TMP_FASTD/secret.$s.conf" } show_key_instance() { local s="$1" config_get secret "$s" secret if [ -z "$secret" ]; then error "$s: secret is not set" return 1 fi mkdir -p "$TMP_FASTD" echo "secret \"$secret\";" > "$TMP_FASTD/secret.$s.conf" "$FASTD_COMMAND" --config "$TMP_FASTD/secret.$s.conf" --show-key --machine-readable } reload_instance() { local s="$1" section_enabled "$s" || return 1 SERVICE_PID_FILE="/var/run/fastd.$s.pid" service_reload "$FASTD_COMMAND" } start() { config_load 'fastd' config_foreach start_instance 'fastd' } stop() { config_load 'fastd' config_foreach stop_instance 'fastd' } reload() { config_load 'fastd' config_foreach reload_instance 'fastd' } up() { local exists local instance config_load 'fastd' for instance in "$@"; do config_get exists "$instance" 'TYPE' if [ "$exists" == "fastd" ]; then start_instance "$instance" fi done } down() { local exists local instance config_load 'fastd' for instance in "$@"; do config_get exists "$instance" 'TYPE' if [ "$exists" == "fastd" ]; then stop_instance "$instance" fi done } show_key() { local exists local instance config_load 'fastd' for instance in "$@"; do config_get exists "$instance" 'TYPE' if [ "$exists" == "fastd" ]; then show_key_instance "$instance" fi done }