#!/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() { # Clear the config file. __radvd_clear # Write header to the file. __radvd_write "#" __radvd_write "# This is the radvd daemon configuration file." __radvd_write "# THIS FILE IS AUTOMATICALLY GENERATED AND WILL OVERWRITE" __radvd_write "# ANY CUSTOM CHANGES!" __radvd_write "#" __radvd_write "# $(date -u)" __radvd_write "#\n" # Write the configuration for all zones. local zone for zone in $(zones_get_local); do __radvd_config_interface ${zone} done } function radvd_clear() { __radvd_clear } function __radvd_clear() { log DEBUG "Clearing radvd config file." : > ${RADVD_CONFIGFILE} } function __radvd_write() { echo -e "$@" >> ${RADVD_CONFIGFILE} } function __radvd_config_interface() { local zone=${1} shift 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 prefix=$(routing_db_get ${zone} ipv6 local-ip-address) if [ -z "${prefix}" ] || [ "${prefix:0:5}" = "fe80:" ]; then return ${EXIT_OK} fi __radvd_write "interface ${zone} {" __radvd_write " AdvSendAdvert on;" __radvd_write " MinRtrAdvInterval 3;" __radvd_write " MaxRtrAdvInterval 10;" __radvd_write " IgnoreIfMissing on;" __radvd_write "" __radvd_write " prefix ${prefix} {" __radvd_write " AdvOnLink on;" __radvd_write " AdvAutonomous on;" __radvd_write " AdvRouterAddr on;" __radvd_write " };" __radvd_write "};\n" }