diff options
Diffstat (limited to 'scripts/rl-system.init')
-rwxr-xr-x | scripts/rl-system.init | 349 |
1 files changed, 349 insertions, 0 deletions
diff --git a/scripts/rl-system.init b/scripts/rl-system.init new file mode 100755 index 00000000..21851ef0 --- /dev/null +++ b/scripts/rl-system.init @@ -0,0 +1,349 @@ +#!/bin/bash +# **** License **** +# Version: VPL 1.0 +# +# The contents of this file are subject to the Vyatta Public License +# Version 1.0 ("License"); you may not use this file except in +# compliance with the License. You may obtain a copy of the License at +# http://www.vyatta.com/vpl +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# This code was originally developed by Vyatta, Inc. +# Portions created by Vyatta are Copyright (C) 2007 Vyatta, Inc. +# All Rights Reserved. +# +# Author: Tom Grennan <tgrennan@vyatta.com> +# Description: Vyatta Router system setup +# this is an indirect init sub-script executed by ofr.init +# +# **** End License **** + +ACTION=$1 + +[[ $PATH == *${ofr_bindir}* ]] || PATH+=:${ofr_bindir} +[[ $PATH == *${ofr_sbindir}* ]] || PATH+=:${ofr_sbindir} + +export PATH + +. /lib/lsb/init-functions + +IPROUTE2IP=ip +INIT_PID=$$ +IFTAB=/etc/iftab + +## BOOTFILE is provided by ofr.init +: ${BOOTFILE:=$prefix/etc/config/config.boot} + +declare -a cfg_eth_hwid +declare -a sys_eth_mac +declare -a sys_vmnets + +# load hwid array from config file as follows +# interface { +# ... +# ethernet eth# { +# ... +# hw-id: XX:XX:XX:XX:XX:XX +# ... +# } +# } +# +# cfg_eth_hwid[#]=xx:xx:xx:xx:xx:xx + +load_cfg_eth_hwid () +{ + eval $( sed -n ' + /^interfaces {/,/^}/ { + /^ *ethernet eth[0-9]* {/,/^ $/ { + /^ *ethernet/ { + s/.* eth\([0-9]\+\) {$/cfg_eth_hwid[\1]=/ +# hold interface name + h + } + /^.*hw-id:/ { +# translate field name + s/.*hw-id: *// +# tolower hex mac address + y/ABCDEF/abcdef/ +# exchange hold and pattern space + x +# concatenate hold and pattern + G + s/\n//p + } + } + }' $BOOTFILE ) +} + +# load system eth mac tabled from ip link + +load_sys_eth_mac () +{ + eval $( ip link show | sed -n ' + /^[0-9]*: eth[0-9]*: /,+1 { +# combine 2 line interface output... +# 2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000 +# link/ether 00:13:72:57:48:f9 brd ff:ff:ff:ff:ff:ff + h + n + x + G + s/\n// +# translate to: +# #=00:13:72:57:48:f9 + s/^.*eth\([0-9]\+\):.*link\/ether \([0-9A-Fa-f:]\+\) .*$/sys_eth_mac[\1]=\2/p + }' ) +} + +load_sys_vmnets () +{ + sys_vmnets=( $( ip link show | + sed -n 's/^[0-9]*: \(vmnet[0-9]*\).*$/\1/p' ) ) +} + + +have_cfg_eth_hwid () +{ + local mac=$1 + + for hwid in ${cfg_eth_hwid[@]} ; do + [ $hwid == $mac ] && return 0 + done + false +} + +have_sys_eth_mac () +{ + local hwid=$1 + + for mac in ${sys_eth_mac[@]} ; do + [ $hwid == $mac ] && return 0 + done + false +} + +# update cfg table with results from system mac detection +# first remove cfg itfs that are no longer in sys table +# if sys mac is already in cfg table, use cfg itf assignment; +# if sys mac isnot in cfg table but given index has hwid of +# another sys itf, add to cfg table in first available slot +# otherwise, [re-]assign cfg eth hwid with sys mac + +update_cfg_eth_hwid () +{ + local -i i + + for i in ${!cfg_eth_hwid[@]} ; do + if ! have_sys_eth_mac ${cfg_eth_hwid[$i]} ; then + unset cfg_eth_hwid[$i] + fi + done + for i in ${!sys_eth_mac[@]} ; do + if ! have_cfg_eth_hwid ${sys_eth_mac[$i]} ; then + if [ -n "${cfg_eth_hwid[$i]}" ] ; then + # cfg[#] has mac of another sys itf; + # so, add another cfg itf for this mac + # to the first available slot + for (( j=0 ; true ; j++ )) ; do + if [ -z "${cfg_eth_hwid[$j]}" ] ; then + cfg_eth_hwid[$j]=${sys_eth_mac[$i]} + break 1 + fi + done + else + cfg_eth_hwid[$i]=${sys_eth_mac[$i]} + fi + fi + done +} + +write_iftab () +{ + local -i i + + rm -f $IFTAB + for i in ${!cfg_eth_hwid[@]} ; do + echo "eth$i mac ${cfg_eth_hwid[$i]}" >> $IFTAB + done +} + +mod_bootfile_eth_hwid () +{ + local eth=$1 hwid=$2 + + sed -i '/^interfaces {$/,/^}/ { + /^ ethernet '"$eth"' {$/,/^ }$/ { + /^ *hw-id/c\ + hw-id: '"$hwid"' + }}' $BOOTFILE +} + +add_bootfile_eth_hwid () +{ + local eth=$1 hwid=$2 + + sed -i '/^interfaces {$/,/^}$/ { + /^}$/i\ + ethernet '"$eth"' {\ + hw-id: '"$hwid"'\ + } + }' $BOOTFILE +} + +update_bootfile_eth_hwid () +{ + local -i i + + for i in ${!cfg_eth_hwid[@]} ; do + if grep -q "ethernet eth$i {" $BOOTFILE ; then + mod_bootfile_eth_hwid eth$i ${cfg_eth_hwid[$i]} + else + add_bootfile_eth_hwid eth$i ${cfg_eth_hwid[$i]} + fi + done +} + +add_bootfile_vmnet () +{ + local vmnet=$1 + + sed -i '/^interfaces {/,/^}$/ { + /^}$/i\ + ethernet '"$vmnet"' {\ + } + }' $BOOTFILE +} + +update_bootfile_vmnets () +{ + for vmnet in ${sys_vmnets[@]} ; do + if ! grep -q "ethernet $vmnet {" $BOOTFILE ; then + add_bootfile_vmnet $vmnet + fi + done +} + +itfmess () +{ + load_cfg_eth_hwid + load_sys_eth_mac + load_sys_vmnets + update_cfg_eth_hwid + write_iftab + update_bootfile_eth_hwid + update_bootfile_vmnets +} + +maybe_ifrename () { + if [ -e $IFTAB ] ; then + ifrename -d -p -t + fi +} + +search_config_if_wan () { + grep "\<serial\>.*\<$1\>" $BOOTFILE >/dev/null +} + +add_new_serial_if () { + __config_additions=/tmp/__config_additions + rm -f $__config_additions + ip link show | + sed -n '/^[0-9]*: wan[0-9]*:/ s/.* \([^:]*\):.*$/\1/p' | + while read wan ; do + if ! search_config_if_wan $wan ; then + echo " serial $wan" >> $__config_additions + fi + done + if [ -e $__config_additions ]; then + rm -f /tmp/__bootfile + sed '/^interfaces {$/ r '$__config_additions \ + $BOOTFILE > /tmp/__bootfile + mv /tmp/__bootfile $BOOTFILE + rm -f $__config_additions + fi +} + +reset_promiscous_arp_response () { + echo 1 > /proc/sys/net/ipv4/conf/default/arp_filter +} + +set_ip_forwarding () { + echo 1 > /proc/sys/net/ipv4/ip_forward +} + +## if a primary address is removed from an interface promote and +## secondary available +set_promote_secondaries () { + echo 1 > /proc/sys/net/ipv4/conf/all/promote_secondaries +} + +## if present use hostname from config file +maybe_hostname () { + hn=$(sed -n '/^system {$/,/^}$/ { + /^ \+host-name:/ { + s/^[^:]*: *// + s/"//g + p + } + }' $BOOTFILE ) + test -n "$hn" && hostname ${hn} +} + +## Update the version information +update_version_info () { + if [ -f ${ofr_sysconfdir}/version.master ]; then + cp ${ofr_sysconfdir}/version.master ${ofr_sysconfdir}/version + fi +} + +## Clear out apt config file--it will be filled in by rtrmgr +clear_apt_config() +{ + >/etc/apt/sources.list +} + +## snmp should be a separate package, +## but for now load the kernel module here +add_snmp_stats_module() +{ + modprobe ipt_rlsnmpstats +} + +set_reboot_on_panic() +{ + echo 1 > /proc/sys/kernel/panic_on_oops + echo 60 > /proc/sys/kernel/panic +} + +start () { + set_reboot_on_panic + itfmess + maybe_ifrename + add_new_serial_if + reset_promiscous_arp_response + set_ip_forwarding + set_promote_secondaries + maybe_hostname + update_version_info + clear_apt_config + add_snmp_stats_module +} + +case "$ACTION" in + start) start ;; + stop|restart|force-reload) true ;; # nothing to stop/restart + *) log_failure_msg "action unknown: $ACTION" ; + false ;; +esac + +exit $? + + +# Local Variables: +# mode: shell-script +# sh-indentation: 4 +# End: |