#!/bin/sh # # Copyright (c) 2007-2015 Hajimu UMEMOTO # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # PROVIDE: dhcp6c_pd # REQUIRE: mountcritremote # KEYWORD: nojail nostart . /etc/rc.subr name="dhcp6c_pd" rcvar= command="%%_PREFIX_%%/sbin/dhcp6c" start_precmd="dhcp6c_pd_prestart" start_postcmd="dhcp6c_pd_poststart" stop_precmd="dhcp6c_pd_precmd" stop_cmd="dhcp6c_pd_stop" restart_precmd="dhcp6c_pd_precmd" # When dhcp6c gets signal, dhcp6c removes its pidfile immediately but # dhcp6c might not terminate. getpid() { if [ -f "${pidfile}" ]; then read pid junk < ${pidfile} echo ${pid} else pgrep -f "dhcp6c -p ${pidfile}" fi } dhcp6c_pd_precmd() { if [ -z "${dhcp6c_pd_interface}" ]; then warn "\$dhcp6c_pd_interface is not set." return 1 fi } dhcp6c_pd_prestart() { dhcp6c_pd_precmd pid=$(getpid) if [ -n "${pid}" ]; then dhcp6c_pd_stop sleep 2 fi # create dhcp6c.conf sed -e "s/__INTERFACE__/${dhcp6c_pd_interface}/" \ -e "s/__PD_INTERFACE__/${dhcp6c_pd_rtadvd_interface}/" \ < ${dhcp6c_pd_conf_in} > ${dhcp6c_pd_conf}.${dhcp6c_pd_interface} # create dhcp6cctlkey #if [ ! -f %%_PREFIX_%%/etc/dhcp6cctlkey ]; then # /sbin/md5 -q -s $(date "+%Y-%m-%d-%H-%M-%S") \ # > %%_PREFIX_%%/etc/dhcp6cctlkey #fi } dhcp6c_pd_poststart() { if checkyesno dhcp6c_pd_rtadvd_enable; then /sbin/sysctl net.inet6.ip6.accept_rtadv=0 /sbin/sysctl net.inet6.ip6.forwarding=1 /usr/sbin/rtadvd -c ${dhcp6c_pd_rtadvd_conf} \ ${dhcp6c_pd_rtadvd_interface} fi } dhcp6c_pd_stop() { if checkyesno dhcp6c_pd_rtadvd_enable; then if [ -f "/var/run/rtadvd.pid" ]; then read pid junk < "/var/run/rtadvd.pid" kill ${pid} /sbin/sysctl net.inet6.ip6.accept_rtadv=1 /sbin/sysctl net.inet6.ip6.forwarding=0 fi fi pid=$(getpid) if [ -n "${pid}" ]; then kill ${pid} rm -f ${dhcp6c_pd_conf}.${dhcp6c_pd_interface} fi } load_rc_config ${name} dhcp6c_pd_conf_in=${dhcp6c_pd_conf_in:-"%%CONFDIR%%/dhcp6c.conf.in"} dhcp6c_pd_conf=${dhcp6c_pd_conf:-"/var/run/dhcp6c.conf"} dhcp6c_pd_interface=${2:-${dhcp6c_pd_interface}} dhcp6c_pd_localaddr=${3:-${dhcp6c_pd_localaddr}} dhcp6c_pd_rtadvd_enable=${dhcp6c_pd_rtadvd_enable:-"NO"} dhcp6c_pd_rtadvd_interface=${dhcp6c_pd_rtadvd_interface:-"%%PD_INTERFACE%%"} dhcp6c_pd_rtadvd_conf=${dhcp6c_pd_rtadvd_conf:-"%%CONFDIR%%/rtadvd.conf"} required_files="${dhcp6c_pd_conf_in}" pidfile=/var/run/dhcp6c-${dhcp6c_pd_interface}.pid command_args="-p ${pidfile} -c ${dhcp6c_pd_conf}.${dhcp6c_pd_interface} ${dhcp6c_pd_interface}" if [ -n "${dhcp6c_pd_localaddr}" ]; then command_args="-A ${dhcp6c_pd_localaddr} ${command_args}" fi rc_fast=yes run_rc_command "$1"