Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12268[/thread]

hab probleme einfachen php code in perl nachzubauen



<< >> 6 Einträge, 1 Seite
SLFraggeR
 2008-07-29 10:51
#112847 #112847
User since
2008-07-29
3 Artikel
BenutzerIn
[default_avatar]
Aloha,

hab hier ein kleines PHP Script gebaut, dass je nach Serverload eine gewisse Zahl zurückgibt.
Nun durfte ich feststellen, dass die Loadbalancingsoftware (feedbackd) nur perl Scripte unterstützt. Nun habe ich leider nahezu keinen Peil von Perl und es wäre echt nett, wenn jemand die Zeit hätte, mir das schnell umzuschreiben.

vg und danke im vorraus
Michael

Das Skript tut folgendes
1. IP Adresse des Webservers aus der config holen, inhalt der config:
server.bind = "80.242.135.108"

2. versuchen via http eine datei zu holen, klappt dies nicht, wird 0 ausgegeben, da der webserver wohl nicht läuft

3. die load via uptime feststellen, ausgabe hier
loweb8:/usr/local/sbin# uptime
08:49:34 up 139 days, 20:53, 1 user, load average: 0.10, 0.07, 0.08
wichtig ist hier die 1minuten Load (0.10)

4. die load mal 100 nehmen und dann je nach Wert eine bestimmte Zahl ausgeben, um genau zu sein nach folgendem Schema
bei load von 0-3 => 100
4-7 => 99
8-11 => 98

usw, ist die load >= 400 wird eine 1 ausgegeben

5. falls irgendwas schief läuft, warum auch immer (denke nicht dass es nötig ist) wird am ende eine 0 ausgegeben, weil irgendwas MUSS rauskommen.....

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?
//0 - 100 : 100 = best
$ip = file("/etc/lighttpd/server_ip.conf");
$ip = $ip[0];
$ary = explode('"',$ip);
$ip = $ary[1];
if(!$fp = fopen("http://$ip/ldirector.html","r"))
{
echo 0;
exit();
}
else
{
$uptime = shell_exec("uptime");
$load = substr($uptime,strpos($uptime,"load average:")+strlen("load average:")+1);
$ary = explode(",",$load);
$load = $ary[0] * 100;
if($load >= 400)
{
echo 1;
exit();
}
$h = 100;
for($i = 0; $i < 400; $i+=4)
{
if($load >= $i && $load <= $i+3)
{
echo $h;
exit();
}
$h--;
}
}
echo 0; //fallback, falls irgendwas nicht stimmt
FoolAck
 2008-07-29 11:59
#112851 #112851
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Wir dir vielleicht schon aufgefallen ist (oder vielleicht auch nicht), teilen sich php und perl große Teile ihrer Syntax. Du kannst das fast 1 zu 1 so in perl übernehmen.
Ein paar Tips: Arrays werden @array geschrieben in perl (Zugriff via $array[$index]). Die Funktion explode() sieht für mich nach perls split aus. Statt echo nimm print und statt shell_exec nimmst du backticks.

Und @
Quote
versuchen via http eine datei zu holen, klappt dies nicht, wird 0 ausgegeben, da der webserver wohl nicht läuft

Schau dir mal LWP und deren Untermodule an (Simple, UserAgent, etc.).

ps: ich kann kein Bisschen php, von daher keine Garantie.

edit: ganz vergessen. Bei fragen zu Funktionen oder generell perl ist diese Seite hier ziemlich gut:
perl.perldoc.org
(Das sind einfach die manpages von perl in html-Format.)
SLFraggeR
 2008-07-29 12:15
#112852 #112852
User since
2008-07-29
3 Artikel
BenutzerIn
[default_avatar]
danke erstmal, bin mittlerweile schon recht weit, nur das http zeugs will noch nich.....
nepos
 2008-07-29 12:26
#112854 #112854
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wenn du uns sagst, was da nicht will, dann kann dir vielleicht auch wer weiterhelfen.
SLFraggeR
 2008-07-29 12:37
#112855 #112855
User since
2008-07-29
3 Artikel
BenutzerIn
[default_avatar]
kam nicht wirklich mit dem LWP klar, aber mittlerweile klappts.... bisschen rumgefrickel =)
topeg
 2008-07-29 13:03
#112857 #112857
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Das funktioniert bei mir:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/perl

use strict;
use warnings;
use LWP::Simple;

my $ipconf='/etc/lighttpd/server_ip.conf';
my $site='http://%s/ldirector.html';

open(my $fh, '<', $ipconf) or die($!);
my $ip=<$fh>;
$ip=~s/^.+"([^"]+?)".+$/$1/s;
close($fh);

unless(get(sprintf($site,$ip)))
{print 1; exit;}

my $uptime=`uptime`;
(my $load)=$uptime=~/load average:\s+([\d.]+)/;
$load*=100;

if($load>400)
{print 0; exit;}

print 100-int($load/4);
exit;
<< >> 6 Einträge, 1 Seite



View all threads created 2008-07-29 10:51.