fredo788
Goto Top

Perl Scripting routen

Hallo,

ich habe Probleme mit einem Perl Script.
Anmerken muss ich, dass ich sehr unerfahren mit Perl bin.
Auf einem Ubuntu Server läuft das script (bis auf kleine Änderungen in der letzten Zeile) fehlerfrei.
Auf einem CentOS 5.11 Server läuft es nicht.

Hintergrund:
Immer wenn eine ppp verbindung zu stande kommt, soll das Script ausführen und eine route setzen, dass der Traffic in dem Netzbereich der pppX Schnittstelle über diese geht.
also route add -net 192.168.0.0/26 dev ppp0 zum Beispiel.
Da die pppX unterschiedlich ist und unterschiedlichste IP-Bereiche verwendet werden muss das sehr variable geschrieben sein.
Anbei das Script:
#!/usr/bin/perl
$device = $ARGV or die;
$remip = $ARGV[4] or die;
$device =~ /^ppp(\d+)$/ or die;
($network,$ip) = $remip =~ /^192\.168\.(\d+)\.(\d+)$/ or die;
$ip = $ip - 1;
$network = "192.168.$network.$ip/26";  
system( "/sbin/route add -net $network dev $device" );  


Wenn ich /sbin/ifup-DIESES_SCRIPT ppp0 ausführe sagt er mir folgendes:
/sbin/ifup-DIESES_SCRIPT ppp0
Died at /sbin/ifup-surfsitter line 3.

Automatisch gestartet wird das Script über die /etc/sysconfig/network-scripts/ifup-ppp
mit folgenden Zeilen:
if [ -x /sbin/ifup-DIESES_SCRIPT ]; then
    /sbin/ifup-DIESES_SCRIPT ${DEVICE}
fi
Kann mir da einer von euch helfen? Wäre super. Komme nicht mehr weiter...

Vielen Dank.


Liebe Grüße

Content-ID: 266832

Url: https://administrator.de/forum/perl-scripting-routen-266832.html

Ausgedruckt am: 27.12.2024 um 02:12 Uhr

Dani
Dani 19.03.2015 um 11:14:44 Uhr
Goto Top
Moin,
wieso nimmst du $remip = $ARGV[4] or die; Du übergibst du doch maximal 2 Argumente oder?


Gruß,
Dani
SlainteMhath
SlainteMhath 19.03.2015 um 11:25:00 Uhr
Goto Top
Moin

Du übergibst du doch maximal 2 Argumente oder?
/sbin/ifup-DIESES_SCRIPT ${DEVICE} 
Sogar nur eins. Das Script macht als in Zeile 3 genau das was es soll face-smile

lg,
Slainte
Lochkartenstanzer
Lochkartenstanzer 19.03.2015 aktualisiert um 12:43:26 Uhr
Goto Top
Moin,

Nachdem Du das Skript mit nur einem Parameter aufrufst, tut es genau das was es soll, nämoich in Zeile 3 sterben.

Wenn Du das Skript debuggen willst, würde ich einfach die übergebenen Parameter in eine Logdatei, z.B. /var/log/DIESES-SKRIPT.log, schreiben udn mal nachschauen, mit welchen Parametern das Skript vom System aufgerufen wird.

lks
fredo788
fredo788 19.03.2015 um 12:41:18 Uhr
Goto Top
Einen verständnisfehler gefunden.

im ifup-ppp script steht nun folgendes:
if [ -x /sbin/ifup-DIESES_SCRIPT ]; then
/sbin/ifup-DIESES_SCRIPT ${REALDEVICE} ${IPADDR}
fi

${REALDEVICE} soll pppX übergeben
${IPADDR} soll die IP-Adresse der pppX Schnittstelle (192.168.0.1 zum Beispiel übergeben)

Im DIESES_SCRIPT steht jetzt folgendes:
#!/usr/bin/perl
$device = $ARGV or die;
$remip = $ARGV[1] or die;
$device =~ /^ppp(\d+)$/ or die;
($network,$ip) = $remip =~ /^192\.168\.(\d+)\.(\d+)$/ or die;
$ip = $ip - 1;
$network = "192.168.$network.$ip/26";
system( "/sbin/route add -net $network dev $device" );

Ist REALDEVICE und IPADDR denn der richtige Wert, der übergeben werden soll?

Danke für eure Antworten! face-smile
Lochkartenstanzer
Lochkartenstanzer 19.03.2015 um 12:51:25 Uhr
Goto Top
Zitat von @fredo788:

$device = $ARGV or die;
$remip = $ARGV[1] or die;

Die Nummerrierung ist "off-by-one" face-smile

Aber normalerweise ruft man die up-down-skripten nich tdirekt auf, sondern packt sie in den ordner /etc/ppp/ip-up.d bzw. /etc/ppp/ip-down.d

Dort werden sie dann vom System aufgerufen mudn haben folgende Parameter:

  1. $1 the interface name used by pppd (e.g. ppp3)
  2. $2 the tty device name
  3. $3 the tty device speed
  4. $4 the local IP address for the interface
  5. $5 the remote IP address
  6. $6 the parameter specified by the 'ipparam' option to pppd

lks
fredo788
fredo788 19.03.2015 um 13:19:34 Uhr
Goto Top
Zitat von @Lochkartenstanzer:

> Zitat von @fredo788:
>
> $device = $ARGV or die;
> $remip = $ARGV[1] or die;

Die Nummerrierung ist "off-by-one" face-smile

Aber normalerweise ruft man die up-down-skripten nich tdirekt auf, sondern packt sie in den ordner /etc/ppp/ip-up.d bzw.
/etc/ppp/ip-down.d

Dort werden sie dann vom System aufgerufen mudn haben folgende Parameter:

  1. $1 the interface name used by pppd (e.g. ppp3)
  2. $2 the tty device name
  3. $3 the tty device speed
  4. $4 the local IP address for the interface
  5. $5 the remote IP address
  6. $6 the parameter specified by the 'ipparam' option to pppd

lks

Diese Pfade sind aber bei CentOS 5.11 nicht vorhanden.

Wie kann ich denn einfach die Zeile /sbin/ifup-DIESES_SCRIPT ${REALDEVICE} ${IPADDR} in eine Log schreiben mit den vom System selber eingetragenen Infos also den Realdevice und die ipadd?
SlainteMhath
SlainteMhath 19.03.2015 um 13:24:10 Uhr
Goto Top
echo  ${REALDEVICE} ${IPADDR} > /tmp/eine_datei
fredo788
fredo788 19.03.2015 aktualisiert um 14:14:05 Uhr
Goto Top
/etc/sysconfig/network-scripts/ifup-ppp:
if [ -x /sbin/ifup-SCRIPT ]; then
echo ${REALDEVICE} ${IPADDR} > /var/log/ifup.log
/sbin/ifup-SCRIPT ${REALDEVICE} ${IPADDR}
fi

es wird nix in die Logs geschrieben.


/etc/sysconfig/network-scripts/ifup-post:
if [ -x /sbin/ifup-SCRIPT ]; then
echo ${REALDEVICE} ${IPADDR} > /var/log/ifup.log
/sbin/ifup-SCRIPT ${REALDEVICE} ${IPADDR}
fi

Es wird nur eth1 und die IP-Adresse von eth1 beim booten in die log geschrieben. wenn eine ppp Verbindung über l2tp zu Stande kommt wird nix rein geschrieben.

Wenn ich /sbin/ifup-SCRIPT ppp0 102.168.0.1 ausführe läuft das script richtig durch und setzt auch richtig die Route.

Habt ihr vielleicht noch eine idee? Wäre super. face-smile
SlainteMhath
SlainteMhath 19.03.2015 um 14:25:03 Uhr
Goto Top
Jo, in /var/log darf mitunter nur root (oder syslog) schreiben, weswegen ich dir auch /tmp als Pfad genannt hatte. face-smile
Ansonsten musst du evtl. mal in CentOS Foren nachfragen
fredo788
fredo788 19.03.2015 um 15:01:53 Uhr
Goto Top
Ja, aber wenn eine neue Schnittstelle hinzukommt wird das script doch als root ausgeführt. Sprich root müsste auch in die log schreiben.
Lochkartenstanzer
Lochkartenstanzer 19.03.2015 um 15:06:16 Uhr
Goto Top
Zitat von @SlainteMhath:

Jo, in /var/log darf mitunter nur root (oder syslog) schreiben, weswegen ich dir auch /tmp als Pfad genannt hatte. face-smile

ein
<code type0plain>
sudo touch /var/log/ifup.log
sudo chomod a+rw /var/log/ifup.log


sollte dias mit den Schreibrechten erldedigen.

Aber wenn das Skript beim Booten für eth0 etwas schreibt aber für l2tp nicht, bedeutet das für mich. daß es bei l2tp gar nicht aufgerufen wird. Dann sollte man nachforschen, warum das nicht der Fall ist. Da ich aber seit "potato" auf debian und (später ergänzend noch Ubuntu) migriert bin, kann ich bei CentOS da im speziellen nicht weiterhelfen. Da wären dann spezielle CentOS-Foren vermutlch bessere Informationsquellen.
fredo788
fredo788 20.03.2015 um 08:40:29 Uhr
Goto Top
okay, danke.

Habe mal eine Anfrage in einem CentOS Forum gestellt.
Problemlösung werde ich dann hier aber auch posten.
fredo788
fredo788 24.03.2015 um 08:24:04 Uhr
Goto Top
Problem gelöst unten sind die funktionierenden Scripts für euch zur Info:

/etc/ppp/ip-up.local:
#!/bin/bash

PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH

LOGDEVICE=$6
REALDEVICE=$1
IPADDR=$5

if [ -x /sbin/ifup-my_script ]; then
/sbin/ifup-my_script ${REALDEVICE} ${IPADDR}
fi

exit 0


/sbin/ifup-my_script:
#!/usr/bin/perl
$device = $ARGV or die;
$remip = $ARGV[1] or die;
$device =~ /^ppp(\d+)$/ or die;
($network,$ip) = $remip =~ /^192\.168\.(\d+)\.(\d+)$/ or die;
$ip = $ip - 1;
$network = "192.168.$network.$ip/26";
system( "/sbin/route add -net $network dev $device" );