source: repository/lib/Metabrik/File/Compress.pm

Last change on this file was 901:246044148483, checked in by GomoR <gomor@…>, 7 months ago
  • bugfix: client::elasticsearch::query: use precision_threshold to 100% when counting unique values in unique_term Command
  • new: client::imap: reset_current, read_next_with_an_attachment and save_attachments Commands
  • new: client::smbclient: download_in_background Command
  • bugfix: client::smbclient: download Command to better parse Arguments to easily download files by specifying a full remote Windows path
  • new: email::message: save_attachments Command
  • new: file::compress: handle bzip2 compress/uncompress
  • new: forensic::pcap: show_sessions Command
  • new: forensic::sysmon: use_regex_match Attribute (disables by default)
  • new: forensic::sysmon: clean_ps_from_list Command to accept an optional Argument to only compare from specified sources
  • bugfix: format::latex: copy style file in current directory before compiling Latex
  • update: remote::sandbox: no more imap stuff here.
  • new: remote::sandbox: use_regex_match Attribute, diff_ps_target_filename_created, loop_and_download_created_files and memdump_as_volatility Commands
  • bugfix: xorg::xrandr: added set_output_resolution alias
File size: 5.7 KB
Line 
1#
2# $Id$
3#
4# file::compress brik
5#
6package Metabrik::File::Compress;
7use strict;
8use warnings;
9
10use base qw(Metabrik::Shell::Command Metabrik::System::Package);
11
12sub brik_properties {
13   return {
14      revision => '$Revision$',
15      tags => [ qw(unstable gzip unzip gunzip uncompress) ],
16      author => 'GomoR <GomoR[at]metabrik.org>',
17      license => 'http://opensource.org/licenses/BSD-3-Clause',
18      attributes => {
19         datadir => [ qw(directory) ],
20         input => [ qw(file) ],
21         output => [ qw(file) ],
22      },
23      attributes_default => {
24         datadir => '.', # Uncompress in current directory by default
25      },
26      commands => {
27         install => [ ], # Inherited
28         unzip => [ qw(input|OPTIONAL datadir|OPTIONAL) ],
29         gunzip => [ qw(input|OPTIONAL output|OPTIONAL datadir|OPTIONAL) ],
30         uncompress => [ qw(input|OPTIONAL output|OPTIONAL datadir|OPTIONAL) ],
31         gzip => [ qw(input) ],
32         bunzip2 => [ qw(input output|OPTIONAL datadir|OPTIONAL) ],
33         bzip2 => [ qw(input) ],
34      },
35      require_modules => {
36         'Compress::Zlib' => [ ],
37         'Metabrik::File::Type' => [ ],
38         'Metabrik::File::Write' => [ ],
39      },
40      require_binaries => {
41         unzip => [ ],
42         gzip => [ ],
43         bunzip2 => [ ],
44         bzip2 => [ ],
45      },
46      need_packages => {
47         ubuntu => [ qw(unzip gzip bzip2) ],
48         debian => [ qw(unzip gzip bzip2) ],
49      },
50   };
51}
52
53sub unzip {
54   my $self = shift;
55   my ($input, $datadir) = @_;
56
57   $input ||= $self->input;
58   $datadir ||= $self->datadir;
59   $self->brik_help_run_undef_arg('unzip', $input) or return;
60
61   my $cmd = "unzip -o $input -d $datadir/";
62
63   my $lines = $self->capture($cmd) or return;
64
65   my @files = ();
66   for (@$lines) {
67      if (m{^\s*inflating:\s*([^\s]+)\s*$}) {
68         push @files, $1;
69      }
70   }
71
72   return \@files;
73}
74
75sub gunzip {
76   my $self = shift;
77   my ($input, $output, $datadir) = @_;
78
79   $input ||= $self->input;
80   $output ||= $self->output;
81   $datadir ||= $self->datadir;
82   $self->brik_help_run_undef_arg('gunzip', $input) or return;
83
84   # If no output given, we use the input file name by removing .gz like gunzip command
85   if (! defined($output)) {
86      ($output = $input) =~ s/.gz$//;
87   }
88
89   my $gz = Compress::Zlib::gzopen($input, "rb");
90   if (! $gz) {
91      return $self->log->error("gunzip: gzopen file [$input]: [$Compress::Zlib::gzerrno]");
92   }
93
94   my $fw = Metabrik::File::Write->new_from_brik_init($self) or return;
95   $fw->append(0);
96   $fw->encoding('ascii');
97   $fw->overwrite(1);
98
99   if ($output !~ m{^/}) {  # Concatenare with $datadir only when not full path
100      $output = $datadir.'/'.$output;
101   }
102
103   my $fd = $fw->open($output) or return;
104
105   my $no_error = 1;
106   my $buffer = '';
107   while ($gz->gzread($buffer) > 0) {
108      $self->debug && $self->log->debug("gunzip: gzread ".length($buffer));
109      my $r = $fw->write($buffer);
110      $buffer = '';
111      if (! defined($r)) {
112         $self->log->warning("gunzip: write failed");
113         $no_error = 0;
114         next;
115      }
116   }
117
118   if (! $no_error) {
119      $self->log->warning("gunzip: had some errors during gunzipping");
120   }
121
122   $fw->close;
123
124   return [ $output ];
125}
126
127sub uncompress {
128   my $self = shift;
129   my ($input, $output, $datadir) = @_;
130
131   $input ||= $self->input;
132   $datadir ||= $self->datadir;
133   $self->brik_help_run_undef_arg('uncompress', $input) or return;
134   $self->brik_help_run_file_not_found('uncompress', $input) or return;
135
136   my $ft = Metabrik::File::Type->new_from_brik_init($self) or return;
137   my $type = $ft->get_mime_type($input) or return;
138
139   if ($type eq 'application/gzip'
140   ||  $type eq 'application/x-gzip') {
141      return $self->gunzip($input, $output, $datadir);
142   }
143   elsif ($type eq 'application/zip'
144   ||     $type eq 'application/vnd.oasis.opendocument.text'
145   ||     $type eq 'application/java-archive') {
146      return $self->unzip($input, $datadir);
147   }
148   elsif ($type eq 'application/x-bzip2') {
149      return $self->bunzip2($input, $output, $datadir);
150   }
151
152   return $self->log->error("uncompress: don't know how to uncompress file [$input] with MIME type [$type]");
153}
154
155sub gzip {
156   my $self = shift;
157   my ($input) = @_;
158
159   $self->brik_help_run_undef_arg('gzip', $input) or return;
160   $self->brik_help_run_file_not_found('gzip', $input) or return;
161
162   my $cmd = "gzip \"$input\"";
163
164   $self->execute($cmd) or return;
165
166   return "$input.gz";
167}
168
169sub bzip2 {
170   my $self = shift;
171   my ($input, $output, $datadir) = @_;
172
173   $input ||= $self->input;
174   $output ||= $self->output;
175   $datadir ||= $self->datadir;
176   $self->brik_help_run_undef_arg('bzip2', $input) or return;
177
178   # If no output given, we use the input file name by adding .bz2 like bzip2 command
179   if (! defined($output)) {
180      ($output = $input) =~ s/$/.bz2/;
181   }
182
183   my $cmd = "bzip2 $input";
184
185   my $lines = $self->capture($cmd) or return;
186
187   return [ $output ];
188}
189
190sub bunzip2 {
191   my $self = shift;
192   my ($input, $output, $datadir) = @_;
193
194   $input ||= $self->input;
195   $output ||= $self->output;
196   $datadir ||= $self->datadir;
197   $self->brik_help_run_undef_arg('bunzip2', $input) or return;
198
199   # If no output given, we use the input file name by removing .bz2 like bunzip2 command
200   if (! defined($output)) {
201      ($output = $input) =~ s/.bz2$//;
202   }
203
204   my $cmd = "bunzip2 $input";
205
206   my $lines = $self->capture($cmd) or return;
207
208   return [ $output ];
209}
210
2111;
212
213__END__
214
215=head1 NAME
216
217Metabrik::File::Compress - file::compress Brik
218
219=head1 COPYRIGHT AND LICENSE
220
221Copyright (c) 2014-2017, Patrice E<lt>GomoRE<gt> Auffret
222
223You may distribute this module under the terms of The BSD 3-Clause License.
224See LICENSE file in the source distribution archive.
225
226=head1 AUTHOR
227
228Patrice E<lt>GomoRE<gt> Auffret
229
230=cut
Note: See TracBrowser for help on using the repository browser.