Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Perl
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2010, 09:21   #1
st01en
Пользователь
 
Регистрация: 06.02.2008
Сообщений: 33
По умолчанию [Perl] плагин для проверки количества процессов для Nagios

Привет,

По традиции, сразу код, потом что мне от него нужно(форум говорит что в одно сообщение все не влезет):

Код:
#!/usr/bin/perl -w
 
use Getopt::Long;
Getopt::Long::Configure('bundling');
 
$version=0.03;
 
$ps = "/bin/ps -A --no-header -o pid,comm,user,euser,cputime,stat,cmd --cols 10000";
 
my %ERRORS = (
              'OK' , '0',
              'WARNING', '1',
              'CRITICAL', '2',
	      'UNKNOWN' , '3');
 
 
#
#              get command line options the regular way
#
GetOptions
        ("V"   => \$opt_V, "version"       => \$opt_V,
         "h"   => \$opt_h, "help"          => \$opt_h,
         "l=s" => \$opt_list, "list=s"     => \$opt_list);
 
#
#              handle the verbose stuff first
#
if ($opt_V) {
        print "\n";
        print "check_proclist nagios plugin version $version\n";
        print "\n";
        mydie('');
} 
 
if ($opt_h) {
        print_help();
        mydie('');
}
 
if(!$opt_list) {
	print_usage();
	mydie('');
}
 
my(@parms) = parse_parms($opt_list);
my($total, %procs) = get_proc_list();
check_counts();
 
sub check_counts {
	my($i, $crit_msg, $warn_msg);
	$crit_msg = '';
	$warn_msg = '';
	for($i = 0; $i <= $#parms; $i++) {
		my($selector, $mode, $name, $w, $c) = split("\t", $parms[$i]);
		my($counter, $pid);
		$counter = 0;
		for $pid (keys %procs) {
			my($proc, $user, $euser, $cputime, $state, $command) = split("\t", $procs{$pid});
			my($found) = 0;
			if($selector eq "P") {
				if(!$proc) {
					next;
				}
				if($mode eq "m") {
					if($name eq $proc) {
						$found = 1;
					}
				} else {
					if(index($proc,$name) >= 0) {
						$found = 1;
					}
				}
			} else {
				if(!$command) {
					next;
				}
				if($mode eq "m") {
					if($name eq $command) {
						$found = 1;
					}
				} else {
				if((index($command,$name) >=0) && ($proc ne "check_proclist")) {
						$found = 1;
					}
				}
			}
			$counter += $found;
		}
		if(($c == -1 && $counter <= 0) ||
		   ($c >=  0 && $counter >= $c)
		) {
			$crit_msg .= ($crit_msg? ", " : "") . $name."($counter)";
		}
		if(($w == -1 && $counter <= 0) ||
		   ($w >=  0 && $counter >= $w)
		) {
			$warn_msg .= ($warn_msg? ", " : "") . $name."($counter)";
		}
	}
	if($crit_msg) {
		print "proclist CRITICAL - [$total/".($#parms + 1)."] Instances: $crit_msg\n";
		exit $ERRORS{"CRITICAL"};
        }
	if ($warn_msg) {
		print "proclist WARNING - [$total/".($#parms + 1)."] Instances: $warn_msg\n";
		exit $ERRORS{"WARNING"};
	}
	print "proclist OK - [$total/".($#parms + 1)."]\n";
	exit $ERRORS{"OK"};
	return;
}
 
sub get_proc_list {
	my($s, %p, $total);
	$total = 0;
	open(P, "$ps|") || mydie("Can't read process list...");
	while($s = <P>) {
		$s =~ s/\n|\r//g;
		if($s =~ /\s*(\d+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S.*)/) {
			my($pid, $proc, $user, $euser, $cputime, $state, $command) = 
			($1, $2, $3, $4, $5, $6, $7);
			$p{$pid} = join("\t", ($proc, $user, $euser, $cputime, $state, $command));
			$total++;
		} else {
			mydie("Process list read error...");
		}
	
	}
	close(P);
	return ($total, %p);
}
 
sub parse_parms {
	my($list) = shift;
	my(@a) = split(",", $list);
	my($i, @l);
	for($i = 0; $i <= $#a; $i++) {
		my($selector, $mode, $prefix) = ("P", "m", '', '');
		my($proc,$w,$c) = split(":", $a[$i]);
		if($proc =~ /(.*?)\#(.*)/) {
			($prefix, $proc) = ($1, $2);
			if($prefix =~ /C/) {
				$selector = "C";
			}
			if($prefix =~ /s/) {
				$mode = "s";
			}
		}
		if(!$proc) {
			mydie("Empty process name(s)...\n");
		}
		$proc =~ s/\\s/ /g;
		$proc =~ s/\\;/,/g;
		if(!defined($w)) {
			$w = -1;
		} elsif (! ($w =~ /\A\d+\Z/)) {
			mydie("'warning' counter must be positive integer\n");
		}
		if(!defined($c)) {
			$c = -1;
		} elsif (! ($c =~ /\A\d+\Z/)) {
			mydie("'critical' counter must be positive integer\n");
		}
		push(@l, join("\t", ($selector, $mode, $proc, $w, $c)));
	}
	return @l;
}
 
sub mydie {
	my($msg) = shift;
	print "proclist UNKNOWN - $msg";
	exit $ERRORS{"UNKNOWN"};
}
 
sub print_usage {
        print "Usage: $0 [-hV] -l <process list>]\n";
}
 
sub print_help {
# Убрал что б сэкономить место, там только описание использования. к делу пожалуй относиться только формат вывода:
        print "     OUTPUT:\n";
        print "     \"proclist <state> - [<total processes>/<controlled names>] <message>\"\n";
        print "     \n";
}
st01en вне форума Ответить с цитированием
Старый 27.10.2010, 09:23   #2
st01en
Пользователь
 
Регистрация: 06.02.2008
Сообщений: 33
По умолчанию

Как некоторые могут догадаться, это плагин для проверки к-ва процессов для нагиоса.
Теперь о том, что мне нужно. Нужно довести этот плагин до нужной мне ф-циональности(пару дополнительных проверок), но учитывая, что в перле я ни в зуб ногой, я решил, что мне легче написать ему замену на питоне и потом уж добавлять необходимое. Учитывая, что формат вывода очень хотелось бы сохранить неизменным, появилась задача:

ф-ция check_counts выводит (в любом случае, но что б меньше текста возьмем вариант когда все ок) такую строку:
Код:
print "proclist OK - [$total/".($#parms + 1)."]\n";
Что такое это $#parms и откуда оно берется.В хелпе оно описано как "controlled names". Был бы благодарен, если б мне объяснили алгоритм его подсчета (например добавили комментарии в коде в нужных местах), но на крайний сойдет и подсказка/ссылка о том, где можно почитать про такую синтаксическую конструкцию.

Заранее спасибо.
st01en вне форума Ответить с цитированием
Старый 27.10.2010, 12:34   #3
ssdm
Форумчанин
 
Регистрация: 20.05.2009
Сообщений: 506
По умолчанию

$#parms - число элементов массиве @parms

а сам @parms хранит в себе параметры переданные в ключе --l или --list

Последний раз редактировалось ssdm; 27.10.2010 в 14:08.
ssdm вне форума Ответить с цитированием
Старый 27.10.2010, 14:37   #4
st01en
Пользователь
 
Регистрация: 06.02.2008
Сообщений: 33
По умолчанию

Как все просто оказывается Теперь все стало на свои места.
Сердечное спасибо.
st01en вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[PascalABC]Создать программу для определения количества гласных среди 5-и введенных пользователем символов. Определение количества destra1j Помощь студентам 5 15.05.2016 09:29
Написать подпрограмму поиска количества K элементов массива, кратных 3. Для проверки подпрограммы создать драйвер, в котором - M Помощь студентам 7 14.05.2015 09:15
Wordpress. Плагин проверки шорткодов. soonner WordPress и другие CMS 6 26.12.2014 13:28
Программа для обработки, проверки и подготовке файлов для импорта в основную программу AlexVN Фриланс 14 17.02.2014 21:14
нужен скрипт на PERL для обработки текстовой информации (1251 кириллица, десетки тысяч строк) PERL newbies Perl 7 03.08.2009 22:25