Daemon-Shutdown

 view release on metacpan or  search on metacpan

lib/Daemon/Shutdown/Monitor/hdparm.pm~  view on Meta::CPAN


How long to sleep between each test

Default: 60 (1 minute)

=item disks <ArrayRef>

An array of disks to be tested.  e.g. /dev/sda

Default: [ '/dev/sda' ]

=item trigger_time <Int>

The time to wait after discovering that all disks are spun down before returning (trigger a shutdown).

Default: 3600 (1 hour)

=item use_sudo 1|0

Use sudo for hdparm
 
sudo hdparm -C /dev/sda

Default: 0

=back

=head3 Example configuration
 
monitor:
  hdparm:
    trigger_time: 1800
    loop_sleep: 1
    use_sudo: 0
    disks: 
      - /dev/sdb
      - /dev/sdc
      - /dev/sdd

=cut

sub new {
    my $class  = shift;
    my %params = @_;

    # Validate the config file
    %params = validate_with(
        params => \%params,
        spec   => {
            loop_sleep => {
                regex   => qr/^\d*$/,
                default => 60,
            },
            trigger_time => {
                regex   => qr/^\d*$/,
                default => 3600,
            },
            disks => {
                type      => ARRAYREF,
                default   => [ '/dev/sda' ],
                callbacks => {
                    'Disks exist' => sub {
                        my $disks_ref = shift();
                        foreach my $disk ( @{$disks_ref} ) {
                            return 0 if !-e $disk;
                        }
                        return 1;
                    },
                },
            },
            use_sudo => {
                default => 0,
                regex   => qr/^[1|0]$/,
            },
        },
    );
    my $self = {};
    $self->{params} = \%params;

    $self->{trigger_pending} = 0;

    bless $self, $class;
    my $logger = Log::Log4perl->get_logger();
    $self->{logger} = $logger;
    $logger->debug( "Monitor hdparm params:\n" . Dump( \%params ) );

    return $self;
}

=head2 run

Run the hdparm spindown Monitor

=cut

sub run {
    my $self = shift;

    my $logger = $self->{logger};

    $logger->info( "Monitor started running: hdparm" );

    my $conditions_met = 1;

    # Test each disk
    foreach my $disk ( @{ $self->{params}->{disks} } ) {
        $logger->debug( "Monitor hdparm testing $disk" );
        my @cmd = ( qw/hdparm -C/, $disk );
        if ( $self->{params}->{use_sudo} ) {
            unshift( @cmd, 'sudo' );
        }
        $logger->debug( "Monitor hdparm CMD: " . join( ' ', @cmd ) );
        my ( $in, $out, $err );
        if ( not IPC::Run::run( \@cmd, \$in, \$out, \$err, IPC::Run::timeout( 10 ) ) ) {
            $logger->warn( "Could not run '" . join( ' ', @cmd ) . "': $!" );
        }
        if ( $err ) {
            $logger->error( "Monitor hdparm: $err" );
            $conditions_met = 0;
        }



( run in 0.480 second using v1.01-cache-2.11-cpan-39bf76dae61 )