a04d81a40e
git-svn-id: svn://svn.openwrt.org/openwrt/packages@29168 3c298f89-4303-0410-b956-a3cf2f4a3e73
142 lines
2.7 KiB
Bash
142 lines
2.7 KiB
Bash
#!/bin/sh /etc/rc.common
|
|
# Copyright (C) 2010-2011 OpenWrt.org
|
|
|
|
# Partly taken the OpenVPN init script (Copyright (C) 2008 Jo-Philipp Wich)
|
|
# This is free software, licensed under the GNU General Public License v2.
|
|
# See /LICENSE for more information.
|
|
|
|
START=95
|
|
|
|
SERVICE_DAEMONIZE=1
|
|
SERVICE_WRITE_PID=1
|
|
|
|
EXTRA_COMMANDS="up down"
|
|
|
|
LIST_SEP="
|
|
"
|
|
|
|
append_opt() {
|
|
local p="$1"; local v="$2"; local p_uc
|
|
|
|
p_uc=$(echo "$p" | tr '[a-z]' '[A-Z]')
|
|
OPTS="$OPTS \"$p_uc=$v\""
|
|
}
|
|
|
|
append_opts() {
|
|
local p; local v; local s="$1"; shift
|
|
for p in $*; do
|
|
config_get v "$s" "$p"
|
|
[ -n "$v" ] && append_opt "$p" "$v"
|
|
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/quicktun-$s.pid"
|
|
OPTS=""
|
|
|
|
config_get interface "$s" interface
|
|
if [ -z "$interface" ]; then
|
|
error "$s: interface '$interface' is not set"
|
|
return 1
|
|
fi
|
|
|
|
if ifconfig "$interface" &>/dev/null; then
|
|
error "$s: interface '$interface' is already in use"
|
|
return 1
|
|
fi
|
|
|
|
append_opts "$s" interface local_address local_port remote_address remote_port \
|
|
protocol private_key public_key time_window
|
|
|
|
config_get_bool tun_mode "$s" tun_mode 0
|
|
[ "$tun_mode" == 1 ] && append_opt tun_mode 1
|
|
|
|
config_get_bool remote_float "$s" remote_float 0
|
|
[ "$remote_float" == 1 ] && append_opt remote_float 1
|
|
|
|
eval env $OPTS service_start /usr/sbin/quicktun
|
|
|
|
while ! ifconfig "$interface" >/dev/null 2>&1; do
|
|
if ! service_check /usr/sbin/quicktun; then
|
|
error "$s: startup failed"
|
|
return 1
|
|
fi
|
|
|
|
sleep 1
|
|
done
|
|
|
|
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/quicktun-$s.pid"
|
|
|
|
config_get interface "$s" interface
|
|
if [ -z "$interface" ]; then
|
|
error "$s: interface '$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 /usr/sbin/quicktun
|
|
}
|
|
|
|
start() {
|
|
config_load 'quicktun'
|
|
config_foreach start_instance 'quicktun'
|
|
}
|
|
|
|
stop() {
|
|
config_load 'quicktun'
|
|
config_foreach stop_instance 'quicktun'
|
|
}
|
|
|
|
up() {
|
|
local exists
|
|
local instance
|
|
config_load 'quicktun'
|
|
for instance in "$@"; do
|
|
config_get exists "$instance" 'TYPE'
|
|
if [ "$exists" == "quicktun" ]; then
|
|
start_instance "$instance"
|
|
fi
|
|
done
|
|
}
|
|
|
|
down() {
|
|
local exists
|
|
local instance
|
|
config_load 'quicktun'
|
|
for instance in "$@"; do
|
|
config_get exists "$instance" 'TYPE'
|
|
if [ "$exists" == "quicktun" ]; then
|
|
stop_instance "$instance"
|
|
fi
|
|
done
|
|
}
|