#!/bin/bash ############################################################################### # # # IPFire.org - A linux based firewall # # Copyright (C) 2010 Michael Tremer & Christian Schmidt # # # # This program is free software: you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation, either version 3 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program. If not, see . # # # ############################################################################### RADVD_CONFIGFILE="/etc/radvd.conf" function radvd_update() { # (Re-)write the configuration file radvd_write_config # Reload the radvd service. service_reload radvd } function radvd_write_config() { config_header "radv daemon configuration file" > ${RADVD_CONFIGFILE} # Write the configuration for all zones. local zone for zone in $(zones_get_local); do __radvd_config_interface ${zone} done >> ${RADVD_CONFIGFILE} return ${EXIT_OK} } function __radvd_config_interface() { local zone=${1} assert isset zone log DEBUG "Writing radvd configuration for ${zone}." # If the interface does not provide any routing information, # we can skip this whole stuff. if ! routing_db_exists ${zone} ipv6; then return ${EXIT_OK} fi # Skip if zone is not active. local active=$(routing_db_get ${zone} ipv6 active) [ "${active}" = "0" ] && return ${EXIT_OK} # Skip if there is no prefix or prefix is link-local. local addr=$(routing_db_get ${zone} ipv6 local-ip-address) if [ -z "${addr}" ] || [ "${addr:0:5}" = "fe80:" ]; then return ${EXIT_OK} fi local prefix=$(ipv6_get_network ${addr}) # Check if the subnet is configured by the DHCP server. local dhcpd="false" if dhcpd_subnet_match ipv6 "${prefix}"; then dhcpd="true" fi print "interface ${zone} {" print " AdvSendAdvert on;" print " MinRtrAdvInterval 3;" print " MaxRtrAdvInterval 10;" print " IgnoreIfMissing on;" if enabled dhcpd; then print " AdvManagedFlag on;" print " AdvOtherConfigFlag on;" fi print print " prefix ${prefix} {" print " AdvOnLink on;" if enabled dhcpd; then print " AdvRouterAddr off;" print " AdvAutonomous off;" else print " AdvRouterAddr on;" print " AdvAutonomous on;" fi print " };" print # Add the DNS configuration. __radvd_config_dns ${zone} print "};" print } function __radvd_config_dns() { local zone=${1} # Do nothing, when this option is not enabled. enabled DNS_ADVERTISE_SERVERS || return ${EXIT_OK} # XXX it is kind of difficult to announce our local # resolver. local server servers for server in $(dns_server_list_sorted); do # Filter out non IPv6 addresses. ipv6_is_valid ${server} || continue servers="${servers} ${server}" done # Remove whitespaces. servers=$(echo ${servers}) # If there are no servers to announce, we stop right here. if ! isset servers; then log DEBUG "No servers to announce." return ${EXIT_OK} fi print " RDNSS ${servers} {" print " # Use the defaults here." print " };" print }