Плагин для нагиоса

Модератор: Fastman

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Alex_hha
лейтенант
Сообщения: 755
Зарегистрирован: 2005-11-06 18:25:26
Контактная информация:

Плагин для нагиоса

Непрочитанное сообщение Alex_hha » 2009-09-04 17:24:22

Есть плагин под нагиос check_ping, из названия понятно, что "пингует" заданый хост, но есть одно очень неудобная особенность - нельзя задать интерефейс исходящих пакетов. Вот решил допилить, но что то познаний в с не хватает.

Может кто подскажет, что делает этот код

Код: Выделить всё

int c = 1;
int option = 0;
	static struct option longopts[] = {
		STD_LONG_OPTS,
		{"packets", required_argument, 0, 'p'},
		{"nohtml", no_argument, 0, 'n'},
		{"link", no_argument, 0, 'L'},
		{"use-ipv4", no_argument, 0, '4'},
		{"use-ipv6", no_argument, 0, '6'},
		{0, 0, 0, 0}
	};

	while (1) {
		c = getopt_long (argc, argv, "VvhnL46t:c:w:H:p:", longopts, &option);

		switch (c) {
		case '?':	/* usage */
			usage5 ();

		case 'h':	/* help */
			print_help ();
			exit (STATE_OK);
			break;

		case 'V':	/* version */
			print_revision (progname, revision);
			exit (STATE_OK);
			break;

		case 't':	/* timeout period */
			timeout_interval = atoi (optarg);
			break;

		case 'v':	/* verbose mode */
			verbose++;
			break;
Интересует конструкция switch/case. Переменная с вроде имеет тип int, тогда почему в case идет сравнение с символом? Или тут сравнивается asci код символа?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Плагин для нагиоса

Непрочитанное сообщение paradox » 2009-09-04 17:27:32

case работает просто с типом
ты можешь символ 'f' например присвоить int
символ это одно значение

а вот строку из двох символо уже присвоить/сравнить нельзя

Alex_hha
лейтенант
Сообщения: 755
Зарегистрирован: 2005-11-06 18:25:26
Контактная информация:

Re: Плагин для нагиоса

Непрочитанное сообщение Alex_hha » 2009-09-04 17:54:07

ты можешь символ 'f' например присвоить int
я так понял в таком случае присвоится код символа f?


Alex_hha
лейтенант
Сообщения: 755
Зарегистрирован: 2005-11-06 18:25:26
Контактная информация:

Re: Плагин для нагиоса

Непрочитанное сообщение Alex_hha » 2009-09-05 0:15:22

А можешь земляку посоветовать книгу для начинающих? :-D А ля с/с+ для linux или что то типа этого, только на русском. Так сказать основы как компилить из командной строки, как подключать модули, как линковать и т.д. и т.п.

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Плагин для нагиоса

Непрочитанное сообщение paradox » 2009-09-05 0:48:39

даже незнаю
я особо книги не читаю
а темболее для линукса))) спроси на лоре

Аватара пользователя
weec
лейтенант
Сообщения: 948
Зарегистрирован: 2007-07-24 11:17:35
Откуда: Afghanistan
Контактная информация:

Re: Плагин для нагиоса

Непрочитанное сообщение weec » 2009-09-06 9:30:44

Основы программирования в Linux (издательство: BHV-СПб)
ISBN 978-5-9775-0289-4

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Плагин для нагиоса

Непрочитанное сообщение ProFTP » 2009-09-06 9:44:55

а что за плагин, что он делает?
"задать интерефейс исходящих пакетов" какой интерфейс?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Alex_hha
лейтенант
Сообщения: 755
Зарегистрирован: 2005-11-06 18:25:26
Контактная информация:

Re: Плагин для нагиоса

Непрочитанное сообщение Alex_hha » 2009-09-06 13:41:27

Основы программирования в Linux (издательство: BHV-СПб)
мне бы в электронном виде :) Так как покупать не хочется ибо не программист, а для общего развития :) Но все равно спасибо
а что за плагин, что он делает?
Уже сделал. А разве из названия - check_ping не понятно? ;) Проверяет доступность хоста используя системную утилиту ping
"задать интерефейс исходящих пакетов" какой интерфейс?
исходящий :) Вот у меня на сервере 3 прова, 3 исходящих интерфейса. По дефолту все пакеты будут идти через шлюз по умолчанию, что не есть удобно, вот для этого и используется этот параметр

Alex_hha
лейтенант
Сообщения: 755
Зарегистрирован: 2005-11-06 18:25:26
Контактная информация:

Re: Плагин для нагиоса

Непрочитанное сообщение Alex_hha » 2009-09-06 13:45:19

Если кому интересно, выкладываю патч

Код: Выделить всё

# diff -Naur check_ping_orig.c check_ping.c
--- check_ping_orig.c   2008-05-07 13:02:42.000000000 +0300
+++ check_ping.c        2009-09-06 01:42:26.000000000 +0300
@@ -67,6 +67,7 @@
 int max_addr = 1;
 int max_packets = -1;
 int verbose = 0;
+char *interface = NULL;

 float rta = UNKNOWN_TRIP_TIME;
 int pl = UNKNOWN_PACKET_LOSS;
@@ -125,12 +126,12 @@
                /* does the host address of number of packets argument come first? */
 #ifdef PING_PACKETS_FIRST
 # ifdef PING_HAS_TIMEOUT
-               asprintf (&cmd, rawcmd, timeout_interval, max_packets, addresses[i]);
+               asprintf (&cmd, rawcmd, timeout_interval, max_packets, addresses[i], interface);
 # else
-               asprintf (&cmd, rawcmd, max_packets, addresses[i]);
+               asprintf (&cmd, rawcmd, max_packets, addresses[i], interface);
 # endif
 #else
-               asprintf (&cmd, rawcmd, addresses[i], max_packets);
+               asprintf (&cmd, rawcmd, addresses[i], max_packets, interface);
 #endif

                if (verbose >= 2)
@@ -138,7 +139,7 @@

                /* run the command */
                this_result = run_ping (cmd, addresses[i]);
-
+
                if (pl == UNKNOWN_PACKET_LOSS || rta < 0.0) {
                        printf ("%s\n", cmd);
                        die (STATE_UNKNOWN,
@@ -204,6 +205,7 @@
                {"link", no_argument, 0, 'L'},
                {"use-ipv4", no_argument, 0, '4'},
                {"use-ipv6", no_argument, 0, '6'},
+               {"interface", required_argument, 0, 'I'},
                {0, 0, 0, 0}
        };

@@ -218,7 +220,7 @@
        }

        while (1) {
-               c = getopt_long (argc, argv, "VvhnL46t:c:w:H:p:", longopts, &option);
+               c = getopt_long (argc, argv, "VvhnL46t:c:w:H:p:I:", longopts, &option);

                if (c == -1 || c == EOF)
                        break;
@@ -230,6 +232,11 @@
                        print_help ();
                        exit (STATE_OK);
                        break;
+
+               case 'I':       /* interface */
+                       interface = optarg;
+                       break;
+
                case 'V':       /* version */
                        print_revision (progname, revision);
                        exit (STATE_OK);
@@ -401,6 +408,10 @@
                printf (_("<cpl> was not set\n"));
                return ERROR;
        }
+       else if (interface == NULL) {
+               printf (_("<interface> was not set\n"));
+               return ERROR;
+       }
        else if (wrta > crta) {
                printf (_("<wrta> (%f) cannot be larger than <crta> (%f)\n"), wrta, crta);
                return ERROR;
@@ -585,6 +596,10 @@

        printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT);

+  printf (" %s\n", "-I <interface_address>");
+  printf ("    %s\n ", _("Set source address to specified interface address. Argument may be numeric IP address"));
+  printf ("   %s\n ", _("or name of device. When pinging IPv6 link-local address this option is required."));
+
   printf ("\n");
        printf ("%s\n", _("THRESHOLD is <rta>,<pl>% where <rta> is the round trip average travel"));
   printf ("%s\n", _("time (ms) which triggers a WARNING or CRITICAL state, and <pl> is the"));
@@ -609,6 +624,6 @@
 print_usage (void)
 {
   printf (_("Usage:"));
-       printf ("%s -H <host_address> -w <wrta>,<wpl>%% -c <crta>,<cpl>%%\n", progname);
+       printf ("%s -H <host_address> -w <wrta>,<wpl>%% -c <crta>,<cpl>%% -I <interface>\n", progname);
   printf (" [-p packets] [-t timeout] [-4|-6]\n");
 }

Alex_hha
лейтенант
Сообщения: 755
Зарегистрирован: 2005-11-06 18:25:26
Контактная информация:

Re: Плагин для нагиоса

Непрочитанное сообщение Alex_hha » 2009-09-06 13:46:37

Ну и собирать надо с командой

Код: Выделить всё

./configure --with-ping-command="/bin/ping -n -U -w %d -c %d %s -I %s"

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35465
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Плагин для нагиоса

Непрочитанное сообщение Alex Keda » 2009-09-07 8:28:13

интерфейс вкомпилен? :shock:
Убей их всех! Бог потом рассортирует...

Alex_hha
лейтенант
Сообщения: 755
Зарегистрирован: 2005-11-06 18:25:26
Контактная информация:

Re: Плагин для нагиоса

Непрочитанное сообщение Alex_hha » 2009-09-07 17:54:53

Нет, вкомилена возможность задавать интерфейс - "-I %s"

Сейчас я вызываю check_ping так

Код: Выделить всё

# ./check_ping -H google.com -w 100,20% -c 200,40% -p5 -I eth1.3
# ./check_ping -H google.com -w 100,20% -c 200,40% -p5 -I eth1.4
# ./check_ping -H google.com -w 100,20% -c 200,40% -p5 -I eth1.6