Developer-Dashboard
view release on metacpan or search on metacpan
lib/Developer/Dashboard/UpdateManager.pm view on Meta::CPAN
package Developer::Dashboard::UpdateManager;
use strict;
use warnings;
our $VERSION = '3.14';
use Capture::Tiny qw(capture);
use Cwd qw(cwd);
use File::Basename qw(dirname);
use File::Spec;
use Developer::Dashboard::Platform qw(command_argv_for_path is_runnable_file);
# new(%args)
# Constructs the updater coordinator.
# Input: config, files, paths, and runner objects.
# Output: Developer::Dashboard::UpdateManager object.
sub new {
my ( $class, %args ) = @_;
my $config = $args{config} || die 'Missing config';
my $files = $args{files} || die 'Missing file registry';
my $paths = $args{paths} || die 'Missing path registry';
my $runner = $args{runner} || die 'Missing collector runner';
return bless {
config => $config,
files => $files,
paths => $paths,
runner => $runner,
}, $class;
}
# updates_dir()
# Returns the directory containing updater scripts.
# Input: none.
# Output: directory path string.
sub updates_dir {
my ($self) = @_;
return File::Spec->catdir( cwd(), 'updates' );
}
# run()
# Executes update scripts in order while stopping and restarting managed collectors.
# Input: none.
# Output: array reference of update step result hashes.
sub run {
my ($self) = @_;
my @running = $self->_running_collectors;
$self->_stop_collectors(@running);
my @results;
my $dir = $self->updates_dir;
return \@results if !-d $dir;
opendir my $dh, $dir or die "Unable to open updates directory $dir: $!";
for my $file ( sort readdir $dh ) {
next if $file eq '.' || $file eq '..';
next if !-f File::Spec->catfile( $dir, $file );
my $path = File::Spec->catfile( $dir, $file );
next if !$self->_is_supported_update_script($path);
my @cmd = command_argv_for_path($path);
print "-" x 40, "\n";
print ">> Run Update: $file...\n";
print "-" x 40, "\n";
print ">> @cmd\n";
print "-" x 40, "\n";
my ( $stdout, $stderr, $exit_code ) = capture {
system @cmd;
return $? >> 8;
};
my $output = $stdout . $stderr;
print $output if defined $output && $output ne '';
print "\n>> Finished.\n\n";
push @results, {
file => $file,
exit_code => $exit_code,
output => $output,
};
}
closedir $dh;
$self->_restart_collectors(@running);
return \@results;
}
# _is_supported_update_script($path)
# Determines whether one update file is a supported runnable update script on this platform.
# Input: update file path string.
# Output: boolean true when the file should be executed by run().
( run in 2.627 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )