[gelöst]dhclient Bashscript - Problem Verarbeitung Variablen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
DynaBlaster
Beiträge: 958
Registriert: 25.03.2004 18:18:57
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: DF0://dynablaster.adf

[gelöst]dhclient Bashscript - Problem Verarbeitung Variablen

Beitrag von DynaBlaster » 16.06.2014 22:35:53

Hoi,

ich hab mir schon ziemlich einen abgebrochen und krieg das irgendwie nicht sauber hin. Ich habe das Problem, das ich auf einem Debian 2 Kabel Deutschland-Asnchlüsse parallel betreiben muss. Leider bietet KD keine festen IP-Adressen an und so kann ich die notwendigen ip route und ip rule-Kommandos nicht statisch über die ip-up und ip-down-Kommandos in der /etc/network/interfaces setzen. Letzteres klappt bei einem weiteren SDSL-Anschluss mit fester IP problemlos.

Folglich muss ich die Kommandos also irgendwie dynamisch erzeugen, sobald der DHCP-Client eine (neue) IP zugewiesen bekommt (zumindest auf einem der Anschlüsse, der andere wird als Standard-Gateway ins Internet genutzt und diese Manipulation ist da nicht nötig).

Als DHCP-Client wird der Debian-Standard dhclient genutzt. Im Verzeichnis /etc/dhcp/dhclient-enter-hooks.d habe ich dann ein eigenes Script angelegt, das auch ausgeführt wird. Allerdings nicht ganz so, das es sinnvoll nutzbar wäre. Als Vorlage habe ich das bereits vorhande debug-Script genutzt und meine Anpassung sieht folgendermassen aus:

Code: Alles auswählen

if [ "$interface" = "eth1" ]; then
        echo $(date): entering ${0%/*}, Starting Multinet-Configuration for eth1. \

        echo $(date): Show Variables Old IP: "$old_ip_address", Old Router: "$old_routers", New IP: "$new_ip_address", New Router: "$new_routers" \

        echo $(date): deleting old ip-commands-settings. \

        ip route del [b]$old_network_number/$old_subnet_mask[/b] dev $interface src $old_ip_address table kabeldeutschland_eth1
        ip route del default via $old_routers table kabeldeutschland_eth1
        ip rule del from $old_ip_address table kabeldeutschland_eth1

        echo $(date): configuring new ip-commands-setting. \

        ip route add [b]$new_network_number/$new_subnet_mask[/b] dev $interface src $new_ip_address table kabeldeutschland_eth1
        ip route add default via $new_routers table kabeldeutschland_eth1
        ip rule add from $new_ip_address table kabeldeutschland_eth1

        echo '-------------------------- done'
fi
Die Variablen werden von dhclient zur Verfügung gestellt und sind grundsätzlch auch da. Welche Variablen es gibt, habe ich über das debug-Script rausbekommen. Das Problem sind meine mangelnden Bash/Shell-Scripting-Kenntnisse. Der fett markierte Teil macht Probleme und das Kommando wird wegen Syntax-Problemen nicht korrekt ausgeführt. Mit einer echo-Anweisung vor der Zeile, wird die Zeile syntaktisch korrekt ausgegeben, ohne echo scheint sich die Bash an dem "/" zwischen den Variablen $new_network_number und $new_subnet_mask zu stören. Das Problem ist vermutlich, das die Shell $new_network_number/$new_subnet_mask als eine einzige Variable interpretiert, die es so natürlich nicht gibt. Wie muss ich das Kommando also abwandeln, damit die Shell das "Ende" der Variable $new_network_number "mitbekommt". Ziel ist also sowas hier:

Code: Alles auswählen

ip route add [b]192.168.0.0/255.255.255.0[/b] dev eth1 src 192.168.0.1 table kabeldeutschland_eth1
Im zweiten Schritt würde ich auch gerne die if-Anweisung am Anfang optimieren. Die scheint auch noch nicht so zu greifen, wie sie soll. Das Script soll eigentlich nur ausgeführt werden, sobald eth1 beteiligt ist. Das scheint aber im momentanen Zustand auch nicht so recht zu funktionieren. Wenn der andere Anschluss eine andere IP bekommt oder seinen Lease verlängert bekommt, wird das Script trotzdem ausgfeührt und macht Sachen, die es nicht machen soll. Vermutlich fehlt da irgendwas in Richtung else oder elseif.

Danke für jegliche Hinweise.

PS: Oh, die B-Code-Tags werden innerhalb der Code-Tags ignoriert. Naja. Sollte trotzdem klar sein, was gemeint ist. Die "B's" einfach wegdenken ;-)
Zuletzt geändert von DynaBlaster am 20.06.2014 17:14:59, insgesamt 1-mal geändert.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: dhclient Bashscript - Problem Verarbeitung Variablen

Beitrag von rendegast » 17.06.2014 05:11:55

Wie muss ich das Kommando also abwandeln, damit die Shell das "Ende" der Variable $new_network_number "mitbekommt".
zBsp. Quoting.

Aber hier scheint der Syntax eigentlich korrekt, denn

Code: Alles auswählen

$ cat ./test
#!/bin/sh

aaa=AA
bbb=BB
echo 1 $aaa/$bbb
echo 2 $aaa.$bbb
echo 3 $aaa$bbb
echo 4 "$aaa"text$bbb
echo 5 ${aaa}text$bbb
echo 6 $aaatext$bbb

$ ./test
1 AA/BB
2 AA.BB
3 AABB
4 AAtextBB
5 AAtextBB
6 BB
Auch die backslash am Ende der echo scheinen unproblematisch, solange die Folgezeile leer bleibt.

Eventuell sind bei der fehlerhaften Ausführung nicht alle verwendeten Variablen definiert?
Bsp. dhclient-exit-hooks.d/ntpdate:

Code: Alles auswählen

ntp_servers_setup() {
        case $reason in
                BOUND|RENEW|REBIND|REBOOT)
                        ntp_servers_setup_add
                        ;;
                EXPIRE|FAIL|RELEASE|STOP)
                        ntp_servers_setup_remove
                        ;;
        esac
}


ntp_servers_setup
resp. dhclient-enter-hooks.d/samba

Code: Alles auswählen

        case $reason in
        BOUND|RENEW|REBIND|REBOOT|EXPIRE|FAIL|RELEASE|STOP)
Es gibt demnach zumindest die Situationen reason=
BOUND RENEW REBIND REBOOT
EXPIRE FAIL RELEASE STOP
Dein Skript dürfte nicht immer Sinn machen.

ip route del ...
ip route del default ...
ip rule del from ...

ip route add ...
ip route add default ...
ip rule add from ...
Vielleicht sollte das Entfernen in umgekehrter Reihenfolge stattfinden?

Code: Alles auswählen

        ip rule del from ...
        ip route del default ...
        ip route del ...




------------------------------------------------------------
if [ "$interface" = "eth1" ]; then
würde ich

Code: Alles auswählen

if [ "x$interface" = "xeth1" ]; then
... table kabeldeutschland_eth1
würde ich sowas

Code: Alles auswählen

TBL=kabeldeutschland_$interface
... table $TBL
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
DynaBlaster
Beiträge: 958
Registriert: 25.03.2004 18:18:57
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: DF0://dynablaster.adf

Re: dhclient Bashscript - Problem Verarbeitung Variablen

Beitrag von DynaBlaster » 20.06.2014 11:31:19

Vielen vielen Dank rendegast. Das hat mch ein ganzes Stück weitergebracht.

Problem war auch tatsächlich nicht das "/" sondern grundsätzlich die doppelte und dreifache Ausführung von Kommandos. Das ganze sieht jetzt so aus und scheint zu funktionieren. Sicherheitshalber habe ich noch ifmetric installiert und über die /etc/network/interfaces der Karte des 2. Kabel Deutschland-Anschlusses eine niedrigere metric mitgegeben, um immer das "richtige" Standard-Gateway zu haben. Slebst wenn das Löschen der Route über das dhclient-script mal fehlschlagen sollte.

Code: Alles auswählen

if [ "$interface" = "eth1" ]; then
                case ${reason} in

                        BOUND)
                                echo $(date): entering ${0%/*}, Starting Multinet-Configuration for eth1. \

                                echo $(date): Show Variables Old IP: "$old_ip_address", Old Router: "$old_routers", New IP: "$new_ip_address", New Router: "$new_routers" \

                                echo $(date): configuring new ip-commands-setting. \

                                ip route add $new_network_number/$new_subnet_mask dev $interface src $new_ip_address table kabeldeutschland_$interface
                                ip route add default via $new_routers table kabeldeutschland_$interface
                                ip rule add from $new_ip_address table kabeldeutschland_$interface
                                ip rule add fwmark 0x400 table kabeldeutschland_$interface
                                ip route del default dev $interface
                                echo 'configuring new ip-commands-setting ... done'
                                ;;

                        RELEASE)
                                echo $(date): Shutting down Multinet-Configuration for eth1. \

                                echo $(date): Show Variables Old IP: "$old_ip_address", Old Router: "$old_routers"  \

                                echo $(date): deleting old ip-commands-settings. \

                                ip rule del fwmark 0x400 table kabeldeutschland_$interface
                                ip rule del from $old_ip_address table kabeldeutschland_$interface
                                ;;

                        EXPIRE)
                                echo $(date): Shutting down Multinet-Configuration for eth1. \

                                echo $(date): Show Variables Old IP: "$old_ip_address", Old Router: "$old_routers"  \

                                echo $(date): deleting old ip-commands-settings. \

                                ip rule del fwmark 0x400 table kabeldeutschland_$interface
                                ip rule del from $old_ip_address table kabeldeutschland_$interface
                                ;;

                        RENEW)
                                echo $(date): Re-newing Multinet-Configuration for eth1. \

                                echo $(date): Show Variables Old IP: "$old_ip_address", Old Router: "$old_routers", New IP: "$new_ip_address", New Router: "$new_routers" \

                                echo $(date): deleting old ip-commands-settings. \

                                ip rule del fwmark 0x400 table kabeldeutschland_$interface
                                ip rule del from $old_ip_address table kabeldeutschland_$interface
                                ip route del default via $old_routers table kabeldeutschland_eth1
                                ip route del $old_network_number/$old_subnet_mask dev $interface src $old_ip_address table kabeldeutschland_eth1
                                ip route del default dev $interface

                                echo $(date): configuring new ip-commands-setting. \

                                ip route add $new_network_number/$new_subnet_mask dev $interface src $new_ip_address table kabeldeutschland_$interface
                                ip route add default via $new_routers table kabeldeutschland_$interface
                                ip rule add from $new_ip_address table kabeldeutschland_$interface
                                ip rule add fwmark 0x400 table kabeldeutschland_$interface
                                ;;

                        REBIND)
                                echo $(date): Re-newing Multinet-Configuration for eth1. \

                                echo $(date): Show Variables Old IP: "$old_ip_address", Old Router: "$old_routers", New IP: "$new_ip_address", New Router: "$new_routers" \

                                echo $(date): deleting old ip-commands-settings. \

                                ip rule del fwmark 0x400 table kabeldeutschland_$interface
                                ip rule del from $old_ip_address table kabeldeutschland_$interface
                                ip route del default via $old_routers table kabeldeutschland_eth1
                                ip route del $old_network_number/$old_subnet_mask dev $interface src $old_ip_address table kabeldeutschland_eth1
                                ip route del default dev $interface

                                echo $(date): configuring new ip-commands-setting. \

                                ip route add $new_network_number/$new_subnet_mask dev $interface src $new_ip_address table kabeldeutschland_$interface
                                ip route add default via $new_routers table kabeldeutschland_$interface
                                ip rule add from $new_ip_address table kabeldeutschland_$interface
                                ip rule add fwmark 0x400 table kabeldeutschland_$interface
                                ;;
                        *)
                                ;;

                esac
fi

Benutzeravatar
DynaBlaster
Beiträge: 958
Registriert: 25.03.2004 18:18:57
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: DF0://dynablaster.adf

Re: [gelöst]dhclient Bashscript - Problem Verarbeitung Varia

Beitrag von DynaBlaster » 20.06.2014 17:21:43

Nachtrag:

Um das Problem mit der doppelten Default-Route zu umgehen und ggf. mögliche Verbindungsabbrüche zu verhindern, weil ggf. die eine Kabel Deutschland-Leitung mit ihrem Default-Gateway die andere "überschreibt", habe ich jetzt ein weiteres Script in /etc/dhcp/dhclient-enter-hooks plaziert, um das Setzen der Default Route nur für die Standard-Leitung zu erlauben. Da ich aber diese Router-IP aber im exit-Hools-Script benötige, wird der Inhalt aus $new_routers vor dem "Deaktivieren" in eine Zwischenvaraiable geschrieben. Diese steht glüchklicherweise im exit-hooks-Script auch zur Verfügung und ich habe tatsächlich nur die Standard-Route vom Hauptanschluss:

Code: Alles auswählen

cat /etc/dhcp/dhclient-enter-hooks.d/no-default-route
## Only the DHCP server talking to eth0 is allowed to give us a default
## route.  Other interfaces only get local-segment configuration.
case ${interface} in
  eth3)
    ;;
  *)
    cached_routers=$new_routers
    unset new_routers
    echo "Cached Router: $cached_routers"
    ;;
esac

Code: Alles auswählen

cat /etc/dhcp/dhclient-exit-hooks.d/multinet
# Multinet Configuration
# To enable this script set the following variable to "yes"
#RUN="yes"
#interface="eth1"

if [ "$interface" = "eth1" ]; then
                case ${reason} in

                        BOUND)
                                echo $(date): entering ${0%/*}, Starting Multinet-Configuration for eth1. \

                                echo $(date): Show Variables Old IP: "$old_ip_address", Old Router: "$old_routers", New IP: "$new_ip_address", Cached Router: "$cached_routers" \

                                echo $(date): configuring new ip-commands-setting. \

                                ip route add $new_network_number/$new_subnet_mask dev $interface src $new_ip_address table kabeldeutschland_$interface
                                ip route add default via $cached_routers table kabeldeutschland_$interface
                                ip rule add from $new_ip_address table kabeldeutschland_$interface
                                ip rule add fwmark 0x400 table kabeldeutschland_$interface
                                echo 'configuring new ip-commands-setting ... done'
                                ;;

                        RELEASE)
                                echo $(date): Shutting down Multinet-Configuration for eth1. \

                                echo $(date): Show Variables Old IP: "$old_ip_address", Old Router: "$old_routers"  \

                                echo $(date): deleting old ip-commands-settings. \

                                ip rule del fwmark 0x400 table kabeldeutschland_$interface
                                ip rule del from $old_ip_address table kabeldeutschland_$interface
                                ;;

                        EXPIRE)
                                echo $(date): Shutting down Multinet-Configuration for eth1. \

                                echo $(date): Show Variables Old IP: "$old_ip_address", Old Router: "$old_routers"  \

                                echo $(date): deleting old ip-commands-settings. \

                                ip rule del fwmark 0x400 table kabeldeutschland_$interface
                                ip rule del from $old_ip_address table kabeldeutschland_$interface
                                ;;

                        RENEW)
                                echo $(date): Re-newing Multinet-Configuration for eth1. \

                                echo $(date): Show Variables Old IP: "$old_ip_address", Old Router: "$old_routers", New IP: "$new_ip_address", Cached Router: "$cached_routers" \

                                echo $(date): deleting old ip-commands-settings. \

                                ip rule del fwmark 0x400 table kabeldeutschland_$interface
                                ip rule del from $old_ip_address table kabeldeutschland_$interface
                                ip route del default via $old_routers table kabeldeutschland_eth1
                                ip route del $old_network_number/$old_subnet_mask dev $interface src $old_ip_address table kabeldeutschland_eth1

                                echo $(date): configuring new ip-commands-setting. \

                                ip route add $new_network_number/$new_subnet_mask dev $interface src $new_ip_address table kabeldeutschland_$interface
                                ip route add default via $cached_routers table kabeldeutschland_$interface
                                ip rule add from $new_ip_address table kabeldeutschland_$interface
                                ip rule add fwmark 0x400 table kabeldeutschland_$interface
                                ;;

                        REBIND)
                                echo $(date): Re-newing Multinet-Configuration for eth1. \

                                echo $(date): Show Variables Old IP: "$old_ip_address", Old Router: "$old_routers", New IP: "$new_ip_address", Cached Router: "$cached_routers" \

                                echo $(date): deleting old ip-commands-settings. \

                                ip rule del fwmark 0x400 table kabeldeutschland_$interface
                                ip rule del from $old_ip_address table kabeldeutschland_$interface
                                ip route del default via $old_routers table kabeldeutschland_eth1
                                ip route del $old_network_number/$old_subnet_mask dev $interface src $old_ip_address table kabeldeutschland_eth1

                                echo $(date): configuring new ip-commands-setting. \

                                ip route add $new_network_number/$new_subnet_mask dev $interface src $new_ip_address table kabeldeutschland_$interface
                                ip route add default via $cached_routers table kabeldeutschland_$interface
                                ip rule add from $new_ip_address table kabeldeutschland_$interface
                                ip rule add fwmark 0x400 table kabeldeutschland_$interface
                                ;;
                        *)
                                ;;

                esac
fi
Der ifmetric-Workaround ist also nicht mehr nötig und die Sache erzeugt jetzt eine saubere Routing-Tabelle.

Antworten