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

manchmal ist es NICHT einfach !

Leser: 1


<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten
cc
 2004-03-03 11:55
#80519 #80519
User since
2004-01-09
55 Artikel
BenutzerIn
[default_avatar]
hallo

habe ernsthaftes problem, der ich selber nicht lösen kann:
bekomme 3 files: ein info file und 2 daten (TEXT) files
die files müssen zuerst gemäss info file umbenannt werden,
und per ftp geschickt werden: zuerst erstes und 15 minuten später das zweite file.
wobei wenn das senden von zweiten file nicht gelingt
(remote server down oder ähnliches), sollte 2 mal versucht werden.
diese zeitabstände sind sehr wichtig
und kein file darf 2 mal geschickt werden.
remote server hat nach 3 minuten timeout.
die files werden korrekt umbenannt, aber habe 2 probleme:

1.) wie kann ich ändern, dass zweite file zu einer anderer
remote directory (als der erste file) geschickt wird, z.B zu:
$ftp->cwd("DE/OUT");

2.) obwohl 2 files korrekt geschickt werden,bekomme per mail
nur die fehlermeldung: "files are NOT complete !"
eigentlich müsste ich dort auszug aus dem log über ftp transfer haben
wenn ich die sleep zeit zwischen den beiden ftp transfers
kürzer als timeout von ftp server einstelle,
dann wird der log per mail korrekt geliefert.

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!/usr/bin/perl -w

use strict;
use warnings;
use File::Copy;
use Net::FTP;
use Net::Netrc;

# write the log
BEGIN
{
use CGI::Carp qw(carpout);
my $errorlog = "/var/ftp/log/errorlog.txt";
open(LOG, ">$errorlog") or die("Unable to open $errorlog: $!\n");
print LOG "Errors:\n";
carpout(*LOG);
}

my $recipient = "adress\@domain.de";
my $linux = "root\@domain.de";
my $server = "X.X.X.X";
my $user = "anonymous";
my $passwd = "";

chdir "/var/ftp" or die "/var/ftp: $!\n";

# DO NOT transfer without info file

-f "/var/ftp/info" or die "info file IS MISSING !\n";

# open and read info file
@ARGV = ("info");
my @ren;
while (<>) { # for every line in info
m/^\s*(\S+)\s+(\S+)\s*$/ or next; # That matches like "XXXXXXXX XXXXXXXX"
-f $1 or next; # skip if file to rename does not exist
-f $2 and next; # skip if file to rename does not exist
push @ren, [ $1, $2 ];
}

unless (@ren == 2) {
die "files are NOT complete !\n";
# extend to your feeling
}

# rename files according to info file
foreach my $f (@ren) {
my ($f1, $f2) = @$f;
move ($f1, $f2); # Rename files

# ftp transfer
my $ftp = Net::FTP->new ($server, Timeout => 9000, Debug => 3);
$ftp or die "$server: cannot connect: $@";
# If you don't use ~/.netrc
$ftp->login ($user,$passwd) or
die "$_: Could not login: " . $ftp->message;

# change remote directory for the first file
$ftp->cwd("/DE/IN");

# Put file 2 (not 1) to the ftp server
# server might go down, so retry twice
foreach my $try (0 .. 2) {
$ftp->put ($f2) and last; # Success
if ($try == 2) {

# send mail when transfer of second file failed
open(MAIL, "|/usr/sbin/sendmail -t");
print MAIL "from:$linux\n";
print MAIL "to:$recipient\n";
print MAIL "subject:ftp transfer of second file failed ! !\n";
print MAIL "hi \n\n";
print MAIL "ftp transfer of second file failed !\n\n";
print MAIL "Time: ", scalar localtime, "\n";
close(MAIL);

die "$server: cannot put $f2: " . $ftp->message;
}
print STDERR "Trasfer of $f2 failed: ",$ftp->message, ", retry in 10 minutes\n";
sleep (10 * 60);
}
$ftp->quit;

# And wait 15 minutes
sleep (15 * 60);
}

# read the log file
my $content;
open(FILE, "/var/ftp/log/errorlog.txt") || die "Cant open file. Reason: $!"; # (-:
while(<FILE>) {
$content .=$_; # get all of the file into content including past new lines
}
close(FILE);

# send the mail with log contents, when transfer completed
open(MAIL, "|/usr/sbin/sendmail -t") || die "Cant send mail. Reason: $!";
print MAIL "from:$linux\n";
print MAIL "to:$recipient\n";
print MAIL "subject:transfer was successfully !\n";
print MAIL "hi \n\n";
print MAIL "ftp transfer was successfully ! \n\n";
print MAIL "log file: \n";
print MAIL "$content \n\n";
print MAIL "Time: ", scalar localtime, "\n";
close(MAIL);

exit;
\n\n

<!--EDIT|cc|1078350984-->
havi
 2004-03-03 12:36
#80520 #80520
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Code-Tags eingefuegt...

Gruss
esskar
 2004-03-03 22:36
#80521 #80521
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
würde es mit cronjobs tun...

erst erstes script starten: schickt file1 hoch
15 minuten später, 2. script starten und file2 hoch schicken
dann 3. script starten und prüfen, ob alles auf dem server angekommen ist... dann mail verschicken...

zur unvollst#ndigkeit: sind es text oder binary files? du musst den verschick modus angeben
cc
 2004-03-03 23:41
#80522 #80522
User since
2004-01-09
55 Artikel
BenutzerIn
[default_avatar]
[quote=havi,03.03.2004, 11:36]Code-Tags eingefuegt...

Gruss[/quote]
hallo havi

was meinst du genau mit code-tags ?
kannst du bitte ein beispiel posten ?

gruss
cc\n\n

<!--EDIT|cc|1078392671-->
renee
 2004-03-03 23:43
#80523 #80523
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Hier der Unterschied:

#! /usr/bin/perl
$var_ohne_code_tags;

und
Code: (dl )
1
2
#! /usr/bin/perl
$mit_code_tags;

havi meint damit, dass er den Code, den Du gepostet hast in [code]-Tags gestellt hat.
Diese Tags verbessern die Lesbarkeit des Codes und sollten immer benutzt werden, wenn man Code postet... (aber bitte den schließenden Tag nicht vergessen)\n\n

<!--EDIT|renee|1078350349-->
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/
cc
 2004-03-03 23:49
#80524 #80524
User since
2004-01-09
55 Artikel
BenutzerIn
[default_avatar]
[quote=esskar,03.03.2004, 21:36]würde es mit cronjobs tun...

erst erstes script starten: schickt file1 hoch
15 minuten später, 2. script starten und file2 hoch schicken
dann 3. script starten und prüfen, ob alles auf dem server angekommen ist... dann mail verschicken...

zur unvollst#ndigkeit: sind es text oder binary files? du musst den verschick modus angeben[/quote]
hallo eskar

ich brauche aber ein einziges script.
dieses script wird von cronjob jede 5 minuten scheduled.
ich habe auch nur ein log file vom ganzen process.
mit 3 scripten scheint die ganze sache etwas kompliziert zu werden.
es muss doch eine lösung geben, dieses script abzuändern.

und es sind alles text files.

gruss
cc\n\n

<!--EDIT|cc|1078350892-->
pq
 2004-03-04 11:17
#80525 #80525
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
@cc: es gibt da so tags (tag heisst marke, markierung, kennzeichen),
die hier:
http://board.perl-community.de/cgi-bin....=ibcode
beschrieben sind. die machen das leben leichter. z.B. kann man mit
den code-tags die schrift in courier umwandeln, so dass jeder
buchstabe gleich breit ist. ich nehme an, dass das in deinem editor
auch der fall ist, und es ist einfach besser lesbar, und keiner hat lust,
code in times new roman zu lesen.

ausserdem steht das alles in unserer faq:
http://wiki.perl-community.de/bin....Beitrag
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
cc
 2004-03-04 19:15
#80526 #80526
User since
2004-01-09
55 Artikel
BenutzerIn
[default_avatar]
OK !

mit code-tags alles klar,
aber wie geht es weiter mit meinem problem ?

gruss
cc
kabel
 2004-03-04 21:23
#80527 #80527
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
zu 1)
dazu musst du die einträge im feld @ren erweitern; und zwar kommt als drittes die ftp-location dazu. der punkt ist: woher bekommst du diese information? weisst du das schon vorher oder steht das im info-file? ich gehe mal von ersterem aus:
Code: (dl )
1
2
$ren[0]->[2] = "/DE/IN";
$ren[1]->[2] = "/DE/OUT";

und dann entsprechend:
Code: (dl )
1
2
3
4
my ($f1, $f2, $ftp_upload_location) = @$f
#...
$ftp->cwd ($ftp_upload_location);
#...


zu 2)
Code: (dl )
$ftp->put ($f2) and last; # Success

bist du dir sicher, dass die put methode wirklich genau so arbeitet?

wenn ich die doku lese, weiss ich das nicht wirklich:
Quote
Returns "REMOTE_FILE", or the generated remote file-
name if "REMOTE_FILE" is not given.

NOTE: If for some reason the transfer does not com-
plete and an error is returned then the contents that
had been transfered will not be remove automatically.

das sagt genau gar nix darüber aus. (ja, ich kenne den absatz über true und false, aber hier wird ja offensichtlich von dieser regel abgewichen!)

hier noch mal der ganze code zum durchlesen:
(ok, doch net)
AARRGGHH der perl/code etc. parser schmeisst whitespaces am anfang raus! meine armen augen ...

Code: (dl )
1
2
# change remote directory for the first file
$ftp->cwd("/DE/IN");

@cc: sieht komisch aus, ne? ;)

Code: (dl )
while(<FILE>) { $content .=$_; }

das perl idiom sieht so aus:
Code: (dl )
{ local $/; $content = <FILE>; }


frag doch auch mal bei den monks.
da gibts auch noch mehr idiomatisches perl (tutorials section, AFAIK)

HTH
-- stefan
cc
 2004-03-06 00:39
#80528 #80528
User since
2004-01-09
55 Artikel
BenutzerIn
[default_avatar]
hallo kabel

vielen herzlichen dank für deine zeit und die hilfe,
aber das problem besteht immer noch :
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
@ARGV = ("info");
my @ren;
while (<>) { # for every line in info
m/^\s*(\S+)\s+(\S+)\s*$/ or next; #
-f $1 or next; # skip if file to rename does not exist
-f $2 and next; # skip if file to rename does not exist
push @ren, [ $1, $2 ];
$ren[0]->[2] = "/DE/IN";
$ren[1]->[2] = "/DE/OUT";
}
..............
..............
# ftp transfer
my $ftp = Net::FTP->new ($server, Timeout => 9000, Debug => 3);
$ftp or die "$server: cannot connect: $@";
# If you don't use ~/.netrc
$ftp->login ($user,$passwd) or
die "$_: Could not login: " . $ftp->message;


# change remote directory
my ($f1, $f2, $ftp_upload_location) = @$f
$ftp->cwd ($ftp_upload_location);
..............
..............


dann bekomme folgende fehlermeldungen (vorher keine):
[Fri Mar 5 23:06:35 2004] ftp.cgi: "my" variable $f1 masks earlier declaration in same scope at ftp.cgi line 105.
[Fri Mar 5 23:06:35 2004] ftp.cgi: "my" variable $f2 masks earlier declaration in same scope at ftp.cgi line 105.
[Fri Mar 5 23:06:35 2004] ftp.cgi: Scalar found where operator expected at ftp.cgi line 107, near "$f
[Fri Mar 5 23:06:35 2004] ftp.cgi: #...
[Fri Mar 5 23:06:35 2004] ftp.cgi: $ftp"
[Fri Mar 5 23:06:35 2004] ftp.cgi: (Missing semicolon on previous line?)
[Fri Mar 5 23:06:35 2004] ftp.cgi: syntax error at ftp.cgi line 107, near "$f
[Fri Mar 5 23:06:35 2004] ftp.cgi: #...
[Fri Mar 5 23:06:35 2004] ftp.cgi: $ftp"
[Fri Mar 5 23:06:35 2004] ftp.cgi: Global symbol "$ftp_upload_location" requires explicit package name at ftp.cgi line 107.
[Fri Mar 5 23:06:35 2004] ftp.cgi: Execution of ftp.cgi aborted due to compilation errors.

und wenn ich probiere:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
# ftp transfer
my $ftp = Net::FTP->new ($server, Timeout => 9000, Debug => 3);
$ftp or die "$server: cannot connect: $@";
# If you don't use ~/.netrc
$ftp->login ($user,$passwd) or
die "$_: Could not login: " . $ftp->message;

# change remote directory
my ($f1, $f2, $ftp_upload_location) = @$f;
$ren[0]->[2] = "/DE/IN";
$ren[1]->[2] = "/DE/OUT";
$ftp->cwd ($ftp_upload_location);


dann bekomme diese fehlermeldungen, die
my ($f1, $f2, $ftp_upload_location) = @$f; betreffen,
aber transfer findet statt:
und erstes file wird aber zu der falschen directory geschickt,
der zweite aber richtig:

[Fri Mar 5 23:16:36 2004] ftp.cgi: "my" variable $f1 masks earlier declaration in same scope at ftp.cgi line 104.
[Fri Mar 5 23:16:36 2004] ftp.cgi: "my" variable $f2 masks earlier declaration in same scope at ftp.cgi line 104.

Net::FTP=GLOB(0x81e16f8)<<< 220 szhstorage Microsoft FTP
Net::FTP=GLOB(0x81e16f8)<<< 331 Anonymous access allowed, send identity (e-mail name) as password.
Net::FTP=GLOB(0x81e16f8)>>> PASS ....
Net::FTP=GLOB(0x81e16f8)<<< 230 Anonymous user logged in.
Net::FTP=GLOB(0x81e16f8)>>> CWD /
Net::FTP=GLOB(0x81e16f8)<<< 250 CWD command successful.
Net::FTP=GLOB(0x81e16f8)>>> PORT 192,168,0,1,129,78
Net::FTP=GLOB(0x81e16f8)<<< 200 PORT command successful.
Net::FTP=GLOB(0x81e16f8)>>> STOR SN32002041
Net::FTP=GLOB(0x81e16f8)<<< 150 Opening ASCII mode data connection for SN32002041.
Net::FTP=GLOB(0x81e16f8)<<< 226 Transfer complete.
Net::FTP=GLOB(0x81e16f8)>>> QUIT
Net::FTP=GLOB(0x84c6d5c)<<< 220 szhstorage Microsoft FTP
Net::FTP=GLOB(0x84c6d5c)<<< 331 Anonymous access allowed, send identity (e-mail name) as password.
Net::FTP=GLOB(0x84c6d5c)>>> PASS ....
Net::FTP=GLOB(0x84c6d5c)<<< 230 Anonymous user logged in.
Net::FTP=GLOB(0x84c6d5c)>>> CWD /DE/OUT
Net::FTP=GLOB(0x84c6d5c)<<< 250 CWD command successful.
Net::FTP=GLOB(0x84c6d5c)>>> PORT 192,168,0,1,129,80
Net::FTP=GLOB(0x84c6d5c)<<< 200 PORT command successful.
Net::FTP=GLOB(0x84c6d5c)>>> STOR SW32001456
Net::FTP=GLOB(0x84c6d5c)<<< 150 Opening ASCII mode data connection for SW32001456.
Net::FTP=GLOB(0x84c6d5c)<<< 226 Transfer complete.
Net::FTP=GLOB(0x84c6d5c)>>> QUIT

und ich verstehe deine antworten zu punkt 2 nicht,
was deiner meinung falsch ist.
ich würde gerne korriegieren.
es ist äusserst wichtig, dass diese files immer ankommen
und an richtiger stelle bei remote ftp server.

viele grüsse
cc
<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten



View all threads created 2004-03-03 11:55.