blob: 89db5751353a2492a2848a2c9dfd89092ed2623c [file] [log] [blame]
#!/bin/sh
#
# Copyright (c) 2017, The OpenThread Authors.
# 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.
# 3. Neither the name of the copyright holder nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
#
# Description:
# This script manipulates DHCPv6-PD configuration.
#
#
# Currently solution was verified only on raspbian.
#
if [ $PLATFORM = "ubuntu" ]; then
WAN_INTERFACE="enp0s3"
else
WAN_INTERFACE="eth0"
fi
WLAN_INTERFACE="wlan0"
WPANTUND_INTERFACE="wpan0"
WPANTUND_ENV="/etc/default/wpantund"
DHCPCD_CONF="/etc/dhcpcd.conf"
DHCPCD_CONF_BACKUP="$DHCPCD_CONF.orig"
NCP_STATE_NOTIFIER="/usr/sbin/ncp_state_notifier"
NCP_STATE_DISPATCHER="/etc/ncp_state_notifier/dispatcher.d"
NCP_STATE_NOTIFIER_SERVICE_NAME="ncp_state_notifier.service"
NCP_STATE_NOTIFIER_SERVICE="/etc/systemd/system/${NCP_STATE_NOTIFIER_SERVICE_NAME}"
DHCPCD_RELOADER="${NCP_STATE_DISPATCHER}/dhcpcd_reloader"
without DHCPV6_PD || test $PLATFORM = raspbian || test $PLATFORM = ubuntu || die "DHCPv6-PD is not tested under $PLATFORM."
create_dhcpcd_conf_with_dhcpv6_pd()
{
sudo tee ${DHCPCD_CONF} << EOF
# A sample configuration for dhcpcd.
# See dhcpcd.conf(5) for details.
# Allow users of this group to interact with dhcpcd via the control socket.
#controlgroup wheel
# Inform the DHCP server of our hostname for DDNS.
hostname
# Use the hardware address of the interface for the Client ID.
#clientid
# or
# Use the same DUID + IAID as set in DHCPv6 for DHCPv4 ClientID as per RFC4361.
duid
# Rapid commit support.
# Safe to enable by default because it requires the equivalent option set
# on the server to actually work.
option rapid_commit
# A list of options to request from the DHCP server.
option domain_name_servers, domain_name, domain_search, host_name
option classless_static_routes
# Most distributions have NTP support.
option ntp_servers
# Respect the network MTU.
# Some interface drivers reset when changing the MTU so disabled by default.
#option interface_mtu
# A ServerID is required by RFC2131.
require dhcp_server_identifier
# Generate Stable Private IPv6 Addresses instead of hardware based ones
slaac hwaddr
# A hook script is provided to lookup the hostname if not set by the DHCP
# server, but it should not be run by default.
nohook lookup-hostname
nohook wpa_supplicant
denyinterfaces nat*
noipv6rs
interface $WPANTUND_INTERFACE
nodhcp
nodhcp6
interface $WAN_INTERFACE
iaid 1
ipv6rs
ia_na 2
ia_pd 3/::/63 $WPANTUND_INTERFACE/1
EOF
if [ $PLATFORM = "raspbian" ]; then
sudo tee -a ${DHCPCD_CONF} << EOF
interface $WLAN_INTERFACE
iaid 4
ipv6rs
ia_na 5
ia_pd 6/::/63 $WPANTUND_INTERFACE/1
EOF
fi
}
create_ncp_state_notifier_script()
{
sudo tee ${NCP_STATE_NOTIFIER} << EOF
#!/bin/sh
#
# Copyright (c) 2017, The OpenThread Authors.
# 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.
# 3. Neither the name of the copyright holder nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
#
# Description:
# This script notifies about NCP state changes.
#
PID=\$\$
NAME="ncp_state_notifier"
DISPATCHER_PATH="${NCP_STATE_DISPATCHER}"
echo \${PID} > "/tmp/\${NAME}.pid"
if [ -z \${IFACE} ]; then
IFACE=${WPANTUND_INTERFACE}
fi
WPANTUND_IFACE="com.nestlabs.WPANTunnelDriver"
WPANTUND_NCP_STATE_PATH="/com/nestlabs/WPANTunnelDriver/\${IFACE}/Properties/NCP/State"
WATCH1="type='signal', interface=\${WPANTUND_IFACE}, path=\${WPANTUND_NCP_STATE_PATH}, member='PropertyChanged'"
notify_about_state()
{
logger -t "\${NAME}[\${PID}]" "Notifying about change state to: \${1} on the interface: \${2}"
for SCRIPT in \`find \${DISPATCHER_PATH} -type f\`; do
logger -t "\${NAME}[\${PID}]" "Running script: \${SCRIPT}"
.\${SCRIPT} \${1} \${2}
done
}
process_output()
{
local NEXT_LINE_IS_STATE=0
while read -r LINE; do
if echo \${LINE} | grep -q "NCP:State"; then
NEXT_LINE_IS_STATE=1
continue
fi
if [ \${NEXT_LINE_IS_STATE} -eq 1 ]; then
NEXT_LINE_IS_STATE=1
STATE=\`echo \${LINE} | cut -d'"' -f2\`
notify_about_state \${STATE} \${IFACE}
fi
done
}
dbus-monitor --system "\${WATCH1}" | process_output
EOF
}
create_dhcpcd_reloader_script()
{
sudo tee ${DHCPCD_RELOADER} << EOF
#!/bin/sh
#
# Copyright (c) 2017, The OpenThread Authors.
# 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.
# 3. Neither the name of the copyright holder nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
#
# Description:
# This script reloads dhcpcd.
#
PID=\$\$
NAME="dhcpcd_reloader"
DHCPCD_INTERFACES="/tmp/dhcpcd_interfaces"
STATE=\$1
if [ \${STATE} = "associated" ]; then
if systemctl is-active NetworkManager; then
logger -t "\${NAME}[\${PID}]" "NetworkManager: active"
if ! [ -f \${DHCPCD_INTERFACES} ]; then
exit 1
fi
for interface in \`cat \${DHCPCD_INTERFACES}\`; do
logger -t "\${NAME}[\${PID}]" "dhcpcd: rebind on the interface: \${interface}"
/sbin/dhcpcd -6 -n \${interface}
done
fi
if systemctl is-active dhcpcd; then
logger -t "\${NAME}[\${PID}]" "dhcpcd: reload"
sudo systemctl reload-daemon
sudo systemctl force-reload dhcpcd
fi
fi
EOF
}
create_ncp_state_notifier_service()
{
sudo tee ${NCP_STATE_NOTIFIER_SERVICE} << EOF
[Unit]
Description=Daemon call scripts on every NCP state change
After=wpantund.service
ConditionPathExists=${NCP_STATE_NOTIFIER}
[Service]
ExecStart=/bin/sh ${NCP_STATE_NOTIFIER}
PIDFile=/tmp/ncp_state_notifier.pid
KillMode=control-group
[Install]
WantedBy=multi-user.target
EOF
}
create_wpantund_env_file()
{
echo "WPANTUND_OPTS=-o Daemon:SetDefaultRouteForAutoAddedPrefix true -o IPv6:SetSLAACForAutoAddedPrefix true" | sudo tee $WPANTUND_ENV
}
dhcpv6_pd_install()
{
with DHCPV6_PD || return 0
# Create backup of the default configuration of dhcpcd
sudo mv ${DHCPCD_CONF} ${DHCPCD_CONF_BACKUP}
create_dhcpcd_conf_with_dhcpv6_pd
create_ncp_state_notifier_script
sudo chmod +x ${NCP_STATE_NOTIFIER}
sudo mkdir -p ${NCP_STATE_DISPATCHER}
create_dhcpcd_reloader_script
sudo chmod +x ${DHCPCD_RELOADER}
create_wpantund_env_file
if have systemctl; then
create_ncp_state_notifier_service
sudo systemctl daemon-reload
if systemctl is-active NetworkManager; then
sudo systemctl restart NetworkManager || die "Unable to restart NetworkManager!"
fi
if systemctl is-active dhcpcd; then
sudo systemctl restart dhcpcd || die 'Unable to restart dhcpcd!'
fi
sudo systemctl start ${NCP_STATE_NOTIFIER_SERVICE_NAME} || die "Unable to start ${NCP_STATE_NOTIFIER_SERVICE_NAME}!"
sudo systemctl enable ${NCP_STATE_NOTIFIER_SERVICE_NAME} || die "Unable to enable ${NCP_STATE_NOTIFIER_SERVICE_NAME}!"
fi
}
dhcpv6_pd_uninstall()
{
with DHCPV6_PD || return 0
if have systemctl; then
sudo systemctl disable ${NCP_STATE_NOTIFIER_SERVICE_NAME} || true
sudo systemctl stop ${NCP_STATE_NOTIFIER_SERVICE_NAME} || true
sudo rm ${NCP_STATE_NOTIFIER_SERVICE} || true
fi
sudo rm ${NCP_STATE_NOTIFIER} || true
sudo rm ${DHCPCD_RELOADER} || true
sudo rm ${WPANTUND_ENV} || true
sudo rm -r ${NCP_STATE_DISPATCHER} || true
# Restore backup of the default configuration of dhcpcd
sudo mv ${DHCPCD_CONF_BACKUP} ${DHCPCD_CONF} || true
# Restart dhcpcd or NetworkManager
if have systemctl; then
sudo systemctl daemon-reload
if systemctl is-active NetworkManager; then
sudo systemctl restart NetworkManager || true
fi
if systemctl is-active dhcpcd; then
sudo systemctl restart dhcpcd || true
fi
fi
}