gluon-packages/net/fastd/files/fastd.init

200 lines
3.6 KiB
Bash

#!/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
}