Hallo!
Ich habe folgendes Problem. Ein skript soll eine Zip-Datei aus einer Mail extrahieren und die Datei dann entpacken. Das funktioniert auch alles einwandfrei. Komischerweise bekommen aber die entpackten Dateien immer das aktuelle Datum und nicht das Datum der Dateien im Zip File. Ich habe das Ganze schon mit 2 verschiedenen zip Modulen (Archive::Zip und IO::Uncompress::Inflate) probiert. Könnte es dran liegen dass ich auf einen Windowsshare entpacke (CIFS)? Lokal funktioniert es soweit ich das sehe.
Weiss jemand einen Lösungsansatz oder einen Workaround?
Folgendes Script verwende ich:
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
001:
002: use strict;
003: use MIME::Explode;
004: use File::Path;
005:
006: my $infile = '/scripts/deploy/test.txt';
007: my $deployroot = '/deployshare/_Deployment/02_Deployments';
008: my $ticket = "";
009: my $dateiname = "";
010: my $logfile = "unzip.log";
011:
012:
013:
014: open(IN,">$infile") or die "Konnte Tempdatei $infile nicht öffnen";
015: while(<>){
016: print IN $_;
017: }
018: close IN;
019:
020: open(IN,"<$infile") or die "Konnte Tempdatei $infile nicht öffnen";
021: while(<IN>){
022: $_ =~ m/\[Ticket#(\d+)/;
023: $ticket = $1;
024: }
025: close IN;
026:
027: open(IN,"<$infile") or die "Konnte Tempdatei $infile nicht öffnen";
028: while(<IN>){
029: $_ =~ m/filename\=\"(.*?\.zip)/;
030: $dateiname = $1;
031: }
032: close IN;
033:
034:
035:
036: $dateiname =~ m/^(.*?)\./;
037: my $deployname = $1;
038:
039:
040:
041: $dateiname =~ m/(\d\d)......\.zip$/;
042: my $deployyear = $1;
043:
044:
045:
046: $dateiname =~ m/^(....)/;
047: my $prefix = $1;
048:
049:
050: my $deploypath = $deployroot."/GJ_".$deployyear."/".$deployname;
051: my $input = $deploypath."/".$dateiname;
052: my $output = $deploypath."/".$ticket."/";
053: umask "0000";
054:
055: if (-d $deploypath){
056: anhangkopieren($deploypath);
057:
058: entpacken($input,$output,$logfile);
059: }
060:
061:
062: elsif ($prefix eq "oms_"){
063:
064: mkpath ([$deploypath.'/oms', $deploypath.'/Backup/P/oms',
065: $deploypath.'/Backup/S/oms', $deploypath.'/'.$ticket]);
066:
067: anhangkopieren($deploypath) or die("Anhang konnte nicht aus Mail extrahiert werden");
068: entpacken($input,$output,$logfile);
069: }
070: elsif ($prefix eq "PT5_"){
071:
072: mkpath ([$deploypath.'/website2', $deploypath.'/Backup/P/website2',
073: $deploypath.'/Backup/S/website2', $deploypath.'/'.$ticket]);
074:
075:
076: anhangkopieren($deploypath) or die("Anhang konnte nicht aus Mail extrahiert werden");
077: entpacken($input,$output,$logfile);
078: }
079: elsif ($prefix eq "evo_"){
080:
081: mkpath ([$deploypath.'/admall', $deploypath.'/Backup/P/admall',
082: $deploypath.'/Backup/S/admall', $deploypath.'/'.$ticket]);
083:
084: anhangkopieren($deploypath);
085: entpacken($input,$output,$logfile);
086: }
087: else {
088: die("+++++ $dateiname Deployment kann nicht zugeordnet werden +++++");
089: };
090:
091:
092:
093:
094: sub anhangkopieren{
095: my $explode = MIME::Explode->new(
096: output_dir => "$_[0]",
097: mkdir => 0777,
098: decode_subject => 1,
099: check_content_type => 1,
100: content_types => ["application/x-zip-compressed"],
101: types_action => "include"
102: );
103:
104:
105: open(MAIL, "<$infile") or
106: die("Couldn't open file.mbox for reading: $!\n");
107: open(OUTPUT, ">tmp_file.tmp")
108: or die("Couldn't open file.tmp for writing: $!\n");
109: my $headers = $explode->parse(\*MAIL, \*OUTPUT);
110: close(OUTPUT);
111: close(MAIL);
112: }
113:
114: sub entpacken{
115: use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
116: my $zipfile = Archive::Zip->new($_[0]);
117: if(defined $zipfile){
118: my @members = $zipfile->members();
119: foreach my $member (@members){
120: chdir $_[1];
121: $zipfile->extractMember($member);
122: open (LOG,">$_[2]");
123: print LOG $_[1].$member." erstellt";
124: close LOG;
125: }
126: }
127: }