Schrift
[thread]665[/thread]

cgi skript umschreiben: Kann kein CGI nutzen.

Leser: 2


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Earl_Mobilee
 2006-02-02 12:36
#6834 #6834
User since
2006-02-02
10 Artikel
BenutzerIn
[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: (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
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
14371 Artikel
ModeratorIn
[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...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Earl_Mobilee
 2006-02-02 12:50
#6836 #6836
User since
2006-02-02
10 Artikel
BenutzerIn
[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: (dl )
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
14371 Artikel
ModeratorIn
[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...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2006-02-02 13:02
#6838 #6838
User since
2003-08-04
14371 Artikel
ModeratorIn
[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...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Earl_Mobilee
 2006-02-02 13:05
#6839 #6839
User since
2006-02-02
10 Artikel
BenutzerIn
[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: (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
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
14371 Artikel
ModeratorIn
[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-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Earl_Mobilee
 2006-02-02 13:14
#6841 #6841
User since
2006-02-02
10 Artikel
BenutzerIn
[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
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ok, das ist dann nicht so schwer...

(ungetestet)
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
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-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Earl_Mobilee
 2006-02-02 13:41
#6843 #6843
User since
2006-02-02
10 Artikel
BenutzerIn
[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 Einträge, 2 Seiten



View all threads created 2006-02-02 12:36.