Показать полную графическую версию : Проблема с обработкой условий Perl
Armsinglom
10-02-2020, 12:29
Добрый день.
Есть скрипт (вот его часть):
unless(`smartctl -a /dev/sdb | grep Power_On_Hours` =~ m/- ([0-9a-zA-Z\ \:\-\+\.\,]+)/) {
console( COLOR => 'red', MESSAGE => 'Ошибка Hourse sdb' ); }
my $smart_h_sdb = $1;
unless(`smartctl -a /dev/sda | grep Temperature_Celsius` =~ m/- ([0-9a-zA-Z\ \:\-\+\.\,]+)/) {
console( COLOR => 'red', MESSAGE => 'Ошибка Temp sda' );}
my $smart_t_sda = $1;
Он выполняет некие команды для опроса устройств на удаленном ПК (hdd, процессор и т.д.) и результат выводит в csv файлик. Проблема в том что если устройство не доступно (например сгорел жесткий диск) и запрошенная команда не получает ожидаемый результат, то скрипт выплевывает в csv результат предыдущей успешно выполненной команды. Можно ли написать условие, в случае если команда не выполняется, то вернуть "NOT_INFO" например.
Serguei Kouzmine
11-02-2020, 07:04
Armsinglom,
тема выплевывание в csv приведенным фрагментом не раскрыта
Armsinglom
11-02-2020, 09:49
Как то так:
use strict;
use utf8;
use Term::ANSIColor;
use Time::Piece;
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";
our $inventory_host = '127.0.0.1';
our $inventory_port = 8080;
print "\n";
sub console {
my %args = ( COLOR => 'white' , MOMENT => localtime->strftime('%Y/%m/%d %H:%M:%S') , MESSAGE => 'Нет сообщения' , @_ );
print STDERR color($args{COLOR}) , $args{MOMENT} . ' ' , color('bold') , $args{MESSAGE} , color('reset') , "\n";
}
sub request {
my %args = ( DBASE => '', REQUEST => '', @_ );
if( $args{DBASE} eq '' ) { die "Пустое имя БД"; }
if( $args{REQUEST} eq '' ) { die "Пустой запрос"; }
my %dictionary = ();
my @linez = `psql -c "copy ($args{REQUEST}) to stdout with (format csv,header false);" $args{DBASE} postgres`;
foreach my $line(@linez) {
chomp $line; unless($line =~ m/^([^,]+),(.*)$/) { next; }
$dictionary{$1} = [ split ',', $2 ];
}
return %dictionary;
}
unless(`smartctl -a /dev/sdb | grep Power_On_Hours` =~ m/- ([0-9a-zA-Z\ \:\-\+\.\,]+)/) {
console( COLOR => 'red', MESSAGE => 'Ошибка Hourse sdb' ); }
my $smart_h_sdb = $1;
unless(`smartctl -a /dev/sda | grep Temperature_Celsius` =~ m/- ([0-9a-zA-Z\ \:\-\+\.\,]+)/) {
console( COLOR => 'red', MESSAGE => 'Ошибка Temp sda' );}
my $smart_t_sda = $1;
console( MESSAGE => "SMART T SDb: $smart_t_sda" );
console( MESSAGE => "SMART H SDb: $smart_h_sdb" );
if($inventory_host ne '') { `echo '"$smart_t_sda","$smart_h_sdb"' | nc -w 16 $inventory_host $inventory_port`; }
Serguei Kouzmine
12-02-2020, 04:29
Armsinglom, для того чтобы не передавалось куда не надо $smart_h_sdb и $smart_t_sda
надо их обнулять перед соответвтсущим тестом
типа
our $smart_t_sda = 'NO INFO';
unless(`smartctl -a /dev/sda | grep Temperature_Celsius` =~ m/- ([0-9a-zA-Z\ \:\-\+\.\,]+)/) {
console( COLOR => 'red', MESSAGE => 'Ошибка Temp sda' );
}
# MATCH HAPPENED -> $1 DEFINED
$smart_t_sda = $1;
И аналогично с $smart_h_sdb
Armsinglom
12-02-2020, 14:51
Попробовал, всё равно подставляется предыдущее значение.
Serguei Kouzmine
13-02-2020, 01:16
Armsinglom, не могу поверить я так вам посоветовал
вот хорошая
our $cnt = 0;
while ($cnt != 10 ) {
$res = 0;
$str = "counter: ${cnt}";
unless($str =~ m/counter: ([246])/) {
print "this is \"error\" - skip capture\n";
$res = 0;
} else {
$res = $1;
}
$cnt++;
# print $cnt;
print "cnt=${cnt}\tres= ${res}\n";
}
~
this is "error" - skip capture
cnt=1 res= 0
this is "error" - skip capture
cnt=2 res= 0
cnt=3 res= 2
this is "error" - skip capture
cnt=4 res= 0
cnt=5 res= 4
this is "error" - skip capture
cnt=6 res= 0
cnt=7 res= 6
this is "error" - skip capture
cnt=8 res= 0
this is "error" - skip capture
cnt=9 res= 0
this is "error" - skip capture
cnt=10 res= 0
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.