Viewing file:      status_monitor.pl (3.09 KB)      -rwxr-xr-x Select action/file-type:    (+) |   (+) |   (+) | Code (+) | Session (+) |   (+) | SDB (+) |   (+) |   (+) |   (+) |   (+) |   (+) |
 
 do 'smart-status-lib.pl';
  # status_monitor_list() # Just one type is supported sub status_monitor_list { if (&has_command($config{'smartctl'})) {     return ( [ "smart", $text{'monitor_type'} ] );     } else {     return ( );     } }
  # status_monitor_status(type, &monitor, from-ui) # Check the drive status sub status_monitor_status { local @drives = &list_smart_disks_partitions(); local ($d) = grep { ($_->{'device'} eq $_[1]->{'drive'} ||              $_->{'id'} eq $_[1]->{'drive'}) &&             $_->{'subdisk'} eq $_[1]->{'subdisk'} } @drives; if (!$d) {     # Not in list?!     return { 'up' => -1,          'desc' => $text{'monitor_nosuch'} };     } local $st = &get_drive_status($d->{'device'}, $d);
  # Record number of errors since last time local %errors; local $errors_file = "$module_config_directory/last-errors"; &read_file($errors_file, \%errors); local %lasterrors = %errors; $errors{$_[1]->{'drive'}} = $st->{'errors'}; &write_file($errors_file, \%errors);
  if (!$st->{'support'} || !$st->{'enabled'}) {     # SMART not enabled on device     return { 'up' => -1,          'desc' => $text{'monitor_nosmart'} };     } elsif (!$st->{'check'}) {     # Check failed     return { 'up' => 0 };     } elsif ($st->{'errors'} && $_[1]->{'errors'} == 1) {     # Errors found, and failing on any errors     return { 'up' => 0,          'value' => $st->{'errors'},          'desc' => &text('monitor_errorsfound', $st->{'errors'}) };     } elsif ($st->{'errors'} && $_[1]->{'errors'} == 2 &&        $st->{'errors'} > $lasterrors{$_[1]->{'drive'}}) {     # Errors found and have increased     return { 'up' => 0,          'value' => $st->{'errors'},          'desc' => &text('monitor_errorsinced', $st->{'errors'},                  $lasterrors{$_[1]->{'drive'}}) };     } else {     # All OK!     return { 'up' => 1,          'value' => $st->{'errors'} };     } }
  # status_monitor_dialog(type, &monitor) # Return form for selecting a drive sub status_monitor_dialog { local $rv; local @drives = &list_smart_disks_partitions(); local ($inlist) = grep { ($_->{'device'} eq $_[1]->{'drive'} ||               $_->{'id'} eq $_[1]->{'drive'}) &&                  $_->{'subdisk'} eq $_[1]->{'subdisk'} } @drives; $inlist = 1 if (!$_[1]->{'drive'}); $rv .= &ui_table_row($text{'monitor_drive'},       &ui_select("drive",          !$_[1]->{'drive'} ? $drives[0]->{'device'} :          $inlist ? ($inlist->{'id'} || $inlist->{'device'}).':'.                  $inlist->{'subdisk'} :                undef,          [ (map { [ ($_->{'id'} || $_->{'device'}).':'.$_->{'subdisk'},                $_->{'desc'}.($_->{'model'} ?                 " ($_->{'model'})" : "") ] } @drives),            [ "", $text{'monitor_other'} ] ]).       &ui_textbox("other", $inlist ? "" : $_[1]->{'drive'}, 15), 3);
  $rv .= &ui_table_row($text{'monitor_errors'},     &ui_radio("errors", $_[1]->{'errors'} || 0,         [ [ 1, $text{'yes'} ], [ 0, $text{'no'} ],           [ 2, $text{'monitor_errorsinc'} ] ])); return $rv; }
  # status_monitor_parse(type, &monitor, &in) # Parse form for selecting a rule sub status_monitor_parse { if ($_[2]->{'drive'}) {     ($_[1]->{'drive'}, $_[1]->{'subdisk'}) = split(/:/, $_[2]->{'drive'});     } else {     $_[1]->{'drive'} = $_[2]->{'other'};     $_[1]->{'subdisk'} = undef;     $_[1]->{'drive'} =~ /^\S+$/ || &error($text{'monitor_edrive'});     } $_[1]->{'errors'} = $_[2]->{'errors'}; }
  1;
  
  |