Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Проблема с обработкой условий Perl (http://forum.oszone.net/showthread.php?t=344008)

Armsinglom 10-02-2020 12:29 2908997

Проблема с обработкой условий Perl
 
Добрый день.

Есть скрипт (вот его часть):
Код:

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 2909090

Armsinglom,

тема выплевывание в csv приведенным фрагментом не раскрыта

Armsinglom 11-02-2020 09:49 2909100

Как то так:

Код:

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 2909201

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 2909263

Попробовал, всё равно подставляется предыдущее значение.

Serguei Kouzmine 13-02-2020 01:16 2909344

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



Время: 14:04.

Время: 14:04.
© OSzone.net 2001-