====== Jak funguje nas poplasny Nagios Majak ====== schema je jednoduche * Client: nagios zavola prikaz "echo "nejaky problem" | netcat 10.0.5.5:6555 * Server s majakem: inetd posloucha na portu 6555 a spousti skript /home/majak/bin/majak.sh, ktery zapise na /dev/ttyUSB0 prikazy "start_blink" nebo "stop_blink" ====== Overit funkcnost majaku ====== na strane serveru muzete na dvou kontrolnich mistech 1. zapsat primo na /dev/ttyUSB0 echo start_blink > /dev/ttyUSB0 2. zapsat na localhost port 6555 root@cerna-ng:~# telnet localhost 6555 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. nagios vola, nejaky CRITICAL problem Connection closed by foreign host. root@cerna-ng:~# root@cerna-ng:/root# telnet localhost 6555 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. libovolny text, neobsahujici slovo c-r-i-t-i-c-a-l ^] telnet> close Connection closed. root@cerna-ng:/etc/init.d# ====== Konfigurace nagiosu ====== define command { command_name notify-by-majak command_line /usr/bin/printf "%b" "Neco je $SERVICESTATE$" | nc 10.0.5.5 6555 } ====== Konfigurace Inetd.conf ====== 6555 stream tcp nowait majak /home/majak/bin/majak.sh noarg ====== Poslouchajici skript majak.sh ======= Musite pridat uzivatele //majak// a napriklad na Debianu ho jeste dat do skupiny 'dialout', protoze jinak nema prava sahat na /dev/ttyUSB0. #!/bin/sh if grep -q CRITICAL; then cmd='start_blink' else cmd='stop_blink' fi echo $cmd >/dev/ttyUSB0 Na ''/dev/ttyUSB0'' je pripojene arduino s timto programem /* Majacek - Nagios */ #define MAX_INPUT_STR 200 #define START_BLINK 0 #define STOP_BLINK 1 #define USER_STOP 2 String input_str = ""; // a string to hold incoming serial data volatile boolean string_complete = false; // whether the string is complete const String cmds[] = { "start_blink", "stop_blink", "user_stop", "", ""}; int relay = 3; int led = 13; void setup() { Serial.begin(9600); pinMode(relay, OUTPUT); pinMode(led, OUTPUT); digitalWrite(relay, HIGH); digitalWrite(led, LOW); // 3x blikni, at vim, ze jsi ok :) digitalWrite(led, HIGH); delay(400); digitalWrite(led, LOW); delay(200); digitalWrite(led, HIGH); delay(400); digitalWrite(led, LOW); delay(200); digitalWrite(led, HIGH); delay(400); digitalWrite(led, LOW); input_str.reserve(MAX_INPUT_STR); // Serial.println("Initialized."); } int parse_input(String s) { int i = 0; while (cmds[i] != "") { // Serial.print("Debug parse_input cmd: "); // Serial.println(cmds[i]); if (s == cmds[i]) break; i++; } return i; } void start_blink() { digitalWrite(relay, LOW); digitalWrite(led, HIGH); } void stop_blink() { digitalWrite(relay, HIGH); digitalWrite(led, LOW); } void loop() { if (string_complete) { // Serial.println(input_str); int cmd = parse_input(input_str); switch (cmd) { case START_BLINK: start_blink(); break; case STOP_BLINK: stop_blink(); break; case USER_STOP: stop_blink(); break; default: // Serial.print("ERROR: Unknown command: "); // Serial.println(input_str); ; } input_str = ""; string_complete = false; } } /* some debug Serial.print("This is the input char:"); int ord = in_char; int enter = '\n'; Serial.print(enter); Serial.println(ord); */ void serialEvent() { while (Serial.available()) { char in_char = (char)Serial.read(); if (in_char == '\n') string_complete = true; else input_str += in_char; } }