Font
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;

cgi skript umschreiben: Kann kein CGI nutzen.

[thread]665[/thread]


hide all open all
<< |< 1 2 >| >> 11 entries, 2 pages
Earl_Mobilee  2006-02-02 12:36 #6834 #6834
User since
2006-02-02
10 articles
[default_avatar]  
Hallo allerseits,

ich bin neu hier und neu im Umgang mit Perl/CGI.

Ich will mailgraph nutzen. Ein Programm zum erstellen von Grafiken
mit dem eMail-Traffic. Das Programm laeuft super. Es gibt eine
mailgraph.pl Datei und eine mailgraph.cgi Datei.
Die .pl Datei erstellt die RRA und sammelt die Daten.
Die.cgi erstellt die Grafiken. Allerdings muss es dazu in einem
cgi-bin Verzeichnis liegen. Ich kann aber kein webserver auf dem
Rechner gebrauchen. Also muss ich die Grafiken irgendwie
anders erstellen. Nur weiss ich nicht wie.

Wenn ich das cgi auf der Konsole aufrufe bekomme ich den html
code angezeigt. Es werden aber nicht die Grafiken erstellt die ich
benoetige. Die werden nur temporaer erstellt wenn ich mit Mozilla
auf die Site gehe. Sie werden auch NICHT erstellt wenn ich z.B. mit
lynx oder wget die Seite lade.

Ich probiere schon so einige Sachen in dem Skript zu aendern, allerdings ohne Erfolg. send_image

Ich schick mal etwas Code mit. Vielleicht weiss ja jemand ne Loesung.

Code:
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
35
36
37
38
39
40
41
42
43
44
45
46
sub send_image($)
{
       my ($file)= @_;

       -r $file or do {
               print "Content-type: text/plain\n\nERROR: can't find $file\n";
               exit 1;
       };

       print "Content-type: image/png\n";
       print "Content-length: ".((stat($file))[7])."\n";
       print "\n";
       open(IMG, $file) or die;
       my $data;
       print $data while read(IMG, $data, 16384)>0;
}

sub main()
{
       my $uri = $ENV{REQUEST_URI} || '';
       $uri =~ s/\/[^\/]+$//;
       $uri =~ s/\//,/g;
       $uri =~ s/(\~|\%7E)/tilde,/g;
       mkdir $tmp_dir, 0777 unless -d $tmp_dir;
       mkdir "$tmp_dir/$uri", 0777 unless -d "$tmp_dir/$uri";

       my $img = $ENV{QUERY_STRING};
       if(defined $img and $img =~ /\S/) {
               if($img =~ /^(\d+)-n$/) {
                       my $file = "$tmp_dir/$uri/mailgraph_$1.png";
                       graph($graphs[$1]{seconds}, $file);
                       send_image($file);
               }
               elsif($img =~ /^(\d+)-e$/) {
                       my $file = "$tmp_dir/$uri/mailgraph_$1_err.png";
                       graph_err($graphs[$1]{seconds}, $file);
                       send_image($file);
               }
               else {
                       die "ERROR: invalid argument\n";
               }
       }
       else {
               print_html;
       }
}

MfG Torsten\n\n

<!--EDIT|renee|1138877886-->
renee  2006-02-02 12:43 #6835 #6835
User since
2003-08-04
12979 articles
[Homepage]
[default_avatar]  
Du muesstest den Code, der die Grafiken generiert einfach in ein eigenes Skript stecken. Mit dem oben geposteten Code kann man nicht wirklich viel anfangen...
Earl_Mobilee  2006-02-02 12:50 #6836 #6836
User since
2006-02-02
10 articles
[default_avatar]  
Ja da hapert es aber schon. Vielleicht kannst Du mir erklaeren
was hier passiert. Ich denke das ist der wichtige Teil in dem Skript.
Denn das tmp_dir habe ich als Variable definiert. Das kann ich schon. und die png's beginnen auch mit mailgraph.

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my $img = $ENV{QUERY_STRING};
      if(defined $img and $img =~ /\S/) {
              if($img =~ /^(\d+)-n$/) {
                      my $file = "$tmp_dir/$uri/mailgraph_$1.png";
                      graph($graphs[$1]{seconds}, $file);
                      send_image($file);
              }
              elsif($img =~ /^(\d+)-e$/) {
                      my $file = "$tmp_dir/$uri/mailgraph_$1_err.png";
                      graph_err($graphs[$1]{seconds}, $file);
                      send_image($file);
              }
              else {
                      die "ERROR: invalid argument\n";
              }
\n\n

<!--EDIT|renee|1138877918-->
renee  2006-02-02 12:57 #6837 #6837
User since
2003-08-04
12979 articles
[Homepage]
[default_avatar]  
Die wichtigen Teile duerfte wohl eher in den Methoden graph und graph_err liegen, denn die werden hier einfach aufgerufen. Also in diesem Code-Ausschnitt wird keine Grafik erstellt...
renee  2006-02-02 13:02 #6838 #6838
User since
2003-08-04
12979 articles
[Homepage]
[default_avatar]  
Also, als erstes bitte ich Dich, das naechste mal die [code_]-Tags (ohne den Unterstrich) zu verwenden (so wie ich das jetzt nachtraeglich bei Deinen Code-Snippets eingefuegt habe).

Wenn Du das CGI aufrust, wird es wohl so geschehen: www.DeineDomain.tld/cgi-bin/mailgrah.cgi?23847-n

Das Skript parst diese Zahl heraus und je nachdem, ob nach der Zahl ein -n folgt oder ein -e wird die Methode graph oder graph_err aufgerufen. Dort wird dann die Grafik erzeugt...
Earl_Mobilee  2006-02-02 13:05 #6839 #6839
User since
2006-02-02
10 articles
[default_avatar]  
Dann sende ich mal ein sub graph.

mir ist es wichtig das ich die Grafiken statisch erstellt werden und ohne
dem Aurfuf des cgi-skripts in einem cgi-bin Verzeichnis.
Code:
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
sub graph($$)
{
       my ($range, $file) = @_;
       my $step = $range*$points_per_sample/$xpoints;
       rrd_graph($range, $file, $ypoints,
               "DEF:sent=$rrd:sent:AVERAGE",
               "DEF:msent=$rrd:sent:MAX",
               "CDEF:rsent=sent,60,*",
               "CDEF:rmsent=msent,60,*",
               "CDEF:dsent=sent,UN,0,sent,IF,$step,*",
               "CDEF:ssent=PREV,UN,dsent,PREV,IF,dsent,+",
               "AREA:rsent#$color{sent}:Sent    ",
               'GPRINT:ssent:MAX:total\: %8.0lf msgs',
               'GPRINT:rsent:AVERAGE:avg\: %5.2lf msgs/min',
               'GPRINT:rmsent:MAX:max\: %4.0lf msgs/min\l',

               "DEF:recv=$rrd:recv:AVERAGE",
               "DEF:mrecv=$rrd:recv:MAX",
               "CDEF:rrecv=recv,60,*",
               "CDEF:rmrecv=mrecv,60,*",
               "CDEF:drecv=recv,UN,0,recv,IF,$step,*",
               "CDEF:srecv=PREV,UN,drecv,PREV,IF,drecv,+",
               "LINE2:rrecv#$color{received}:Received",
               'GPRINT:srecv:MAX:total\: %8.0lf msgs',
               'GPRINT:rrecv:AVERAGE:avg\: %5.2lf msgs/min',
               'GPRINT:rmrecv:MAX:max\: %4.0lf msgs/min\l',
       );
}


Kann man hier das gesamte Skript als zip anhaengen?

MfG\n\n

<!--EDIT|renee|1138878694-->
renee  2006-02-02 13:11 #6840 #6840
User since
2003-08-04
12979 articles
[Homepage]
[default_avatar]  
Nee, Anhaenge koennen nur Moderatoren und Admins...

Genau hier wird Dein Graph erzeugt (RRD scheint in letzter Zeit immer mehr in Mode zu kommen ;) )...

Was ist das fuer ein Array mit dem namen @graphs??

Edit:
Damit hast Du schonmal eine Methode von dem Perlskript. Mit graph_err hast Du die zweite Methode.

Du musst Dich noch drum kuemmern, was in dem Array @graphs steht. Und dann steht das Skript schon fast...\n\n

<!--EDIT|renee|1138878886-->
Earl_Mobilee  2006-02-02 13:14 #6841 #6841
User since
2006-02-02
10 articles
[default_avatar]  
my @graphs = (
{ title => 'Day Graphs', seconds => 3600*24, },
{ title => 'Week Graphs', seconds => 3600*24*7, },
{ title => 'Month Graphs', seconds => 3600*24*31, },
{ title => 'Year Graphs', seconds => 3600*24*365, },
renee  2006-02-02 13:24 #6842 #6842
User since
2003-08-04
12979 articles
[Homepage]
[default_avatar]  
Ok, das ist dann nicht so schwer...

(ungetestet)
Code:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/usr/bin/perl

use strict;
use warnings;
use RRDs;

my @graphs = (
      { title => 'Day Graphs',   seconds => 3600*24,        },
      { title => 'Week Graphs',  seconds => 3600*24*7,      },
      { title => 'Month Graphs', seconds => 3600*24*31,     },
      { title => 'Year Graphs',  seconds => 3600*24*365, },

my ($number,$option) = $ARGV[0] =~ /^(\d+)-(\w)$/;
my $uri = $ARGV[1];
my ($xpoints,$ypoints,$points_per_sample) = (); # werte musst Du noch eintragen

# hier noch variablen wie $rrd, %colors,etc. definieren

die "Falscher Aufruf" unless($number && $option && $uri);

my $path = '/meineBilder/';

my $filepath = $path.$uri.'/mailgraph-'.$number.'.png';

if($option eq 'n'){
 my $filepath = $path.$uri.'/mailgraph-'.$number.'.png';
 graph($filepath,$graphs[$number]->{seconds});
}
elsif($option eq 'e'){
 my $filepath = $path.$uri.'/mailgraph-'.$number.'_error.png';
 graph_err($filepath,$graphs[$number]->{seconds});
}


#hier die sub graph_err einfuegen

sub graph{
      my ($range, $file) = @_;
      my $step = $range*$points_per_sample/$xpoints;
      rrd_graph($range, $file, $ypoints,
              "DEF:sent=$rrd:sent:AVERAGE",
              "DEF:msent=$rrd:sent:MAX",
              "CDEF:rsent=sent,60,*",
              "CDEF:rmsent=msent,60,*",
              "CDEF:dsent=sent,UN,0,sent,IF,$step,*",
              "CDEF:ssent=PREV,UN,dsent,PREV,IF,dsent,+",
              "AREA:rsent#$color{sent}:Sent    ",
              'GPRINT:ssent:MAX:total\: %8.0lf msgs',
              'GPRINT:rsent:AVERAGE:avg\: %5.2lf msgs/min',
              'GPRINT:rmsent:MAX:max\: %4.0lf msgs/min\l',

              "DEF:recv=$rrd:recv:AVERAGE",
              "DEF:mrecv=$rrd:recv:MAX",
              "CDEF:rrecv=recv,60,*",
              "CDEF:rmrecv=mrecv,60,*",
              "CDEF:drecv=recv,UN,0,recv,IF,$step,*",
              "CDEF:srecv=PREV,UN,drecv,PREV,IF,drecv,+",
              "LINE2:rrecv#$color{received}:Received",
              'GPRINT:srecv:MAX:total\: %8.0lf msgs',
              'GPRINT:rrecv:AVERAGE:avg\: %5.2lf msgs/min',
              'GPRINT:rmrecv:MAX:max\: %4.0lf msgs/min\l',
      );
}


Aufruf waere dann ungefaehr so:
Skript.pl 4-n DasWasInRequestURIStehenWuerde\n\n

<!--EDIT|renee|1138879586-->
Earl_Mobilee  2006-02-02 13:41 #6843 #6843
User since
2006-02-02
10 articles
[default_avatar]  
[quote=renee,02.02.2006, 12:24][/quote]
>Ok, das ist dann nicht so schwer...

Naja, ich find schon. Aber schon mal vielen Dank.
Werd mich gleich an die Arbeit machen.

Ich hab mich nie gross mit programmieren befasst,
weil es gibt doch schon fuer alles ein Prog.
Aber jetzt bin ich eines besseren belehrt.

>Skript.pl 4-n DasWasInRequestURIStehenWuerde

Das versteh ich noch nicht ganz.
<< |< 1 2 >| >> 11 entries, 2 pages


View all threads created 2006-02-02.

[Powered by Battie]
Powered by Perl
Powered by Pound
Some Icons are from
Fugue Icons
Impressum