#!/bin/sh # # Author: kamikaze # Contact: kamikaze@bsdforen.de # # If vpnc_conf is defined, it will be treated as a list of configuration files # in vpnc_conf_dir. This managed mode is useful where where vpnc tunnels have # to be established through other vpnc tunnels. # You can pass further command line options to vpnc by specifying # them in vpnc_flags. # # PROVIDE: vpnc # REQUIRE: LOGIN # KEYWORD: shutdown # Default settings - don't change this. : ${vpnc_enable="NO"} : ${vpnc_pid_dir="/var/run"} : ${vpnc_pid_file="vpnc/pid"} : ${vpnc_conf_dir="%%PREFIX%%/etc"} : ${vpnc_record="$vpnc_pid_dir/vpnc.record"} . /etc/rc.subr name="vpnc" rcvar=vpnc_enable command="%%PREFIX%%/sbin/$name" vpnc_start() { if [ -z "$vpnc_conf" ]; then #No configuration files given, run unmanaged. $command $vpnc_flags return $? fi # A list of configurations is present. Connect managing # what is required for a clean shutdown later. for config in $vpnc_conf; do # The current configuration file. current="$vpnc_conf_dir/$config" # Start vpnc. $command --local-port 0 $current $vpnc_flags status=$? if [ $status -ne 0 ]; then # VPNC does not print a newline after an error. echo echo "Running 'vpnc $current --local-port 0 $vpnc_flags' failed." return $status fi # Wait for the system to catch up. /bin/sleep 1 # Copy files to allow a clean shutdown # of multiple connections. /bin/cp "$vpnc_pid_dir/$vpnc_pid_file" "$vpnc_pid_dir/vpnc.$config.pid" /bin/cp "$vpnc_pid_dir/vpnc.defaultroute" "$vpnc_pid_dir/vpnc.$config.defaultroute" 2> /dev/null /bin/cp "$vpnc_pid_dir/vpnc.resolv.conf-backup" "$vpnc_pid_dir/vpnc.$config.resolv.conf-backup" 2> /dev/null echo "$config" >> "$vpnc_record" done } vpnc_stop() { if [ ! -e "$vpnc_record" ]; then /bin/sleep 1 # There's no record of connections, assume unmanaged shutdown. $command-disconnect return $? fi # A record of vpnc connections is present. Attempt a # managed shutdown. for config in `/usr/bin/tail -r "$vpnc_record"`; do # Wait to give the system a chance to catch up with # recent changes. /bin/sleep 1 # Move the vpnc files back into position. /bin/mv "$vpnc_pid_dir/vpnc.$config.pid" "$vpnc_pid_dir/$vpnc_pid_file" /bin/mv "$vpnc_pid_dir/vpnc.$config.defaultroute" "$vpnc_pid_dir/vpnc.defaultroute" 2> /dev/null /bin/mv "$vpnc_pid_dir/vpnc.$config.resolv.conf-backup" "$vpnc_pid_dir/vpnc.resolv.conf-backup" 2> /dev/null # Run the disconnect command. $command-disconnect done # Remove the connection record. /bin/rm "$vpnc_record" } start_cmd=vpnc_start stop_cmd=vpnc_stop load_rc_config $name run_rc_command "$1"