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-Key: 266832

Url: https://administrator.de/contentid/266832

Printed on: April 24, 2024 at 09:04 o'clock

Member: Dani
Dani Mar 19, 2015 at 10:14:44 (UTC)
Goto Top
Moin,
wieso nimmst du $remip = $ARGV[4] or die; Du übergibst du doch maximal 2 Argumente oder?


Gruß,
Dani
Member: SlainteMhath
SlainteMhath Mar 19, 2015 at 10:25:00 (UTC)
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
Member: Lochkartenstanzer
Lochkartenstanzer Mar 19, 2015 updated at 11:43:26 (UTC)
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
Member: fredo788
fredo788 Mar 19, 2015 at 11:41:18 (UTC)
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
Member: Lochkartenstanzer
Lochkartenstanzer Mar 19, 2015 at 11:51:25 (UTC)
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
Member: fredo788
fredo788 Mar 19, 2015 at 12:19:34 (UTC)
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?
Member: SlainteMhath
SlainteMhath Mar 19, 2015 at 12:24:10 (UTC)
Goto Top
echo  ${REALDEVICE} ${IPADDR} > /tmp/eine_datei
Member: fredo788
fredo788 Mar 19, 2015 updated at 13:14:05 (UTC)
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
Member: SlainteMhath
SlainteMhath Mar 19, 2015 at 13:25:03 (UTC)
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
Member: fredo788
fredo788 Mar 19, 2015 at 14:01:53 (UTC)
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.
Member: Lochkartenstanzer
Lochkartenstanzer Mar 19, 2015 at 14:06:16 (UTC)
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.
Member: fredo788
fredo788 Mar 20, 2015 at 07:40:29 (UTC)
Goto Top
okay, danke.

Habe mal eine Anfrage in einem CentOS Forum gestellt.
Problemlösung werde ich dann hier aber auch posten.
Member: fredo788
fredo788 Mar 24, 2015 at 07:24:04 (UTC)
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" );