Rex
view release on metacpan or search on metacpan
lib/Rex/Commands/Pkg.pm view on Meta::CPAN
This hook is only available for package installations. If you need file hooks, you have to use the L<file()|Rex::Commands::File#file> function.
=item after
This gets executed right before the C<install()> function returns. All original parameters, and any returned results are passed to it.
=back
=cut
sub install {
if ( !@_ ) {
return "install";
}
#### check and run before hook
my @orig_params = @_;
eval {
my @new_args = Rex::Hook::run_hook( install => "before", @_ );
if (@new_args) {
@_ = @new_args;
}
1;
} or do {
die("Before-Hook failed. Canceling install() action: $@");
};
##############################
my $type = shift;
my $package = shift;
my $option;
my $__ret;
if ( $type eq "file" ) {
if ( ref( $_[0] ) eq "HASH" ) {
$option = shift;
}
else {
$option = {@_};
}
Rex::Logger::debug(
"The install file => ... call is deprecated. Please use 'file' instead.");
Rex::Logger::debug("This directive will be removed with (R)?ex 2.0");
Rex::Logger::debug(
"See http://rexify.org/api/Rex/Commands/File.pm for more information.");
my $source = $option->{"source"};
my $need_md5 = ( $option->{"on_change"} ? 1 : 0 );
my $on_change = $option->{"on_change"} || sub { };
my $__ret;
my ( $new_md5, $old_md5 ) = ( "", "" );
if ( $source =~ m/\.tpl$/ ) {
# das ist ein template
my $content = eval { local ( @ARGV, $/ ) = ($source); <>; };
my $vars = $option->{"template"};
my %merge1 = %{ $vars || {} };
my %merge2 = Rex::Hardware->get(qw/ All /);
my %template_vars = ( %merge1, %merge2 );
if ($need_md5) {
eval { $old_md5 = md5($package); };
}
my $fh = file_write($package);
$fh->write(
Rex::Config->get_template_function()->( $content, \%template_vars ) );
$fh->close;
if ($need_md5) {
eval { $new_md5 = md5($package); };
}
}
else {
my $source = Rex::Helper::Path::get_file_path( $source, caller() );
my $content = eval { local ( @ARGV, $/ ) = ($source); <>; };
my $local_md5 = "";
if ( $option->{force} ) {
upload $source, $package;
}
else {
eval {
$old_md5 = md5($package);
chomp $old_md5;
};
LOCAL {
$local_md5 = md5($source);
};
unless ( $local_md5 eq $old_md5 ) {
Rex::Logger::debug(
"MD5 is different $local_md5 -> $old_md5 (uploading)");
upload $source, $package;
}
else {
Rex::Logger::debug("MD5 is equal. Not uploading $source -> $package");
}
eval { $new_md5 = md5($package); };
}
}
if ( exists $option->{"owner"} ) {
chown $option->{"owner"}, $package;
}
if ( exists $option->{"group"} ) {
chgrp $option->{"group"}, $package;
}
if ( exists $option->{"mode"} ) {
chmod $option->{"mode"}, $package;
}
if ($need_md5) {
unless ( $old_md5 && $new_md5 && $old_md5 eq $new_md5 ) {
$old_md5 ||= "";
$new_md5 ||= "";
Rex::Logger::debug(
"File $package has been changed... Running on_change");
Rex::Logger::debug("old: $old_md5");
Rex::Logger::debug("new: $new_md5");
&$on_change;
}
}
}
elsif ( $type eq "package" ) {
if ( ref( $_[0] ) eq "HASH" ) {
$option = shift;
( run in 0.768 second using v1.01-cache-2.11-cpan-364913b4093 )