You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
3.3 KiB
142 lines
3.3 KiB
#!/bin/bash |
|
# --- SDE-COPYRIGHT-NOTE-BEGIN --- |
|
# This copyright note is auto-generated by ./scripts/Create-CopyPatch. |
|
# |
|
# Filename: package/.../rocknet/rocknet.sh |
|
# Copyright (C) 2004 - 2006 The T2 SDE Project |
|
# |
|
# More information can be found in the files COPYING and README. |
|
# |
|
# 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; version 2 of the License. A copy of the |
|
# GNU General Public License can be found in the file COPYING. |
|
# --- SDE-COPYRIGHT-NOTE-END --- |
|
|
|
rocknet_debug=0 |
|
rocknet_base="/lib/network" |
|
rocknet_config="/etc/conf" |
|
rocknet_tmp_base="/var/run/rocknet" |
|
|
|
[ -d $rocknet_tmp_base ] || mkdir -p $rocknet_tmp_base |
|
|
|
unset code_snipplets_idx code_snipplets_dat code_snipplets_counter |
|
declare -a code_snipplets_idx='()' |
|
declare -a code_snipplets_dat='()' |
|
code_snipplets_counter=0 |
|
|
|
lineno=0 |
|
ignore=0 |
|
global=1 |
|
|
|
if [ "$3" != "up" -a "$3" != "down" ]; then |
|
echo "Usage: $0 { profile | default } { interface | auto } { up | down }" |
|
exit 1 |
|
fi |
|
|
|
if [ ! -f $rocknet_config/network ]; then |
|
echo "Configuration file \"$rocknet_config/network\" missing." |
|
exit 2 |
|
fi |
|
|
|
profile=$1 |
|
interface=$2 |
|
mode=$3 |
|
|
|
pmatched=0 # some profile matched ? |
|
imatched=0 # some interface matched ? |
|
|
|
# |
|
# addcode mode major-priority minor-priority code1 |
|
# |
|
addcode() { |
|
[ "$mode" != "$1" ] && return |
|
[ "$ignore" -gt 0 ] && return |
|
if [ "$1" = "up" ]; then udo="+"; else udo="-"; fi |
|
code_snipplets_idx[code_snipplets_counter]="` |
|
printf '%04d.%04d.%04d' $((5000$udo$2)) $((5000$udo$lineno)) \ |
|
$((5000$udo$3))` $code_snipplets_counter" |
|
code_snipplets_dat[code_snipplets_counter]="$4" |
|
(( code_snipplets_counter++ )) |
|
} |
|
|
|
# |
|
# isfirst unique-id |
|
# |
|
isfirst() { |
|
[ "$ignore" -gt 0 ] && return 0 |
|
eval "\$isfirst_$1" |
|
eval "isfirst_$1='return 1'" |
|
return 0 |
|
} |
|
|
|
# |
|
# error error-message |
|
# |
|
error() { |
|
echo "$*" |
|
} |
|
|
|
status() { |
|
echo "$*" |
|
} |
|
|
|
# |
|
# register / unregister active interfaces for user input validation |
|
# |
|
|
|
register() { |
|
echo -n "${1}," >> $rocknet_tmp_base/active-interfaces |
|
} |
|
|
|
unregister () { |
|
active_interfaces="`cat $rocknet_tmp_base/active-interfaces 2>/dev/null`" |
|
active_interfaces="${active_interfaces//${1},/}" |
|
echo -n "$active_interfaces" > $rocknet_tmp_base/active-interfaces |
|
} |
|
|
|
for x in $rocknet_base/*.sh; do . "$x"; done |
|
|
|
errno=0 |
|
while read cmd para |
|
do |
|
(( lineno++ )) |
|
if [ -n "$cmd" ]; then |
|
cmd="${cmd//-/_}" |
|
para="$( echo "$para" | sed 's,[\*\?],\\&,g' )" |
|
if declare -f public_$cmd > /dev/null |
|
then |
|
# optimization: Only execute commands when they are |
|
# inside an unignored interface section ... |
|
if [ $cmd = "interface" ] ; then |
|
public_$cmd $para |
|
global=0 ip= |
|
elif [ $ignore -eq 0 -o $global -gt 0 ] ; then |
|
public_$cmd $para |
|
fi |
|
else |
|
error "Unknown statement in config file: $cmd" |
|
fi |
|
fi |
|
done < <( sed 's,\(^\|[ \t]\)#.*$,,' < $rocknet_config/network ) |
|
|
|
while read id1 id2; do |
|
if [ "$rocknet_debug" = 1 ]; then |
|
echo ">> $id1 -> $id2: ${code_snipplets_dat[id2]}" |
|
fi |
|
eval "${code_snipplets_dat[id2]}" |
|
done < <( |
|
for x in "${code_snipplets_idx[@]}"; do echo "$x" |
|
done | sort |
|
) |
|
|
|
if [ "$pmatched" = 0 -a "$profile" != "default" ]; then |
|
error "Unknown profile: '$profile'" |
|
errno=1 |
|
fi |
|
if [ "$imatched" = 0 ]; then |
|
error "Unknown interface for profile: '$interface'" |
|
errno=1 |
|
fi |
|
exit $errno |
|
|
|
|