Monitoring systemu operacyjnego Linux z wykorzystaniem modemu GSM Huawei E3372

(wysyłanie komunikatów SMS do Administratora o wybranych zdarzeniach w systemie)

 

 

 

Spis treści

1 Cel i zakres projektu

1.1 Wymagania

1.2 Monitoring systemu operacyjnego Linux z możliwością wysyłania komunikatów SMS do Administratora

1.2.1 Konfiguracja skryptów

1.2.2 Zasada działania skryptów „w przykładzie”

1.2.3 Monitorowanie obciążenia systemu operacyjnego

1.2.4 Monitoring zasobów systemu plików w systemie operacyjnym

1.2.5 ) dysku twardego na sekundę

1.2.6 Monitoring dysku twardego mechanizmem S.M.A.R.T

1.2.7 Monitoring temperatury dysku twardego

1.2.8 Monitoring dostępności uczestnika sieci

1.2.9 Monitoring wykorzystania pamięci RAM

1.2.10 Monitoring wybranych procesów w systemie operacyjnym

1.2.11 Monitoring z wykorzystaniem pakietu lm_sensors

1.2.12 Uruchomienie skryptów w systemie Linux

1.2.13 Komunikacja z modemem GSM

1.2.14 Przykłady generowanych i wysyłanych komunikatów SMS

1.2.15 Instalacja i uruchomienie skryptów

2 Podsumowanie

3 Archiwum: sms_huawei.tar.gz

 

1 Cel i zakres projektu

Monitoring wybranych aspektów w systemie Linux, z możliwością wysyłania powiadomień SMS do Administratora systemu.

Zakres projektu:

 

W przedstawionym rozwiązaniu wykorzystano:

1. Oprogramowanie:

2. Platformę sprzętową:

1.1 Wymagania

Wybór technologii GSM/LTE oraz platformy sprzętowej HUAWEI E3372 umożliwia wysyłanie komunikatów SMS protokołem http. Ta funkcjonalność umożliwia budowę prostego systemu monitorowania i powiadamiania, który może dotyczyć monitorowania zasobów sprzętowych platformy Linux. Warto podkreślić, że w tym przypadku wszystkie niezbędne komponenty umożliwiające budowę systemu powiadamiania komunikatami SMS znajdują się w systemie operacyjnym GNU/Linux z dystrybucji CentOS 7.3. Są to:

 

W przedstawionym opracowaniu monitoring wybranych aspektów (z możliwością wysyłania alertów SMS) będzie dotyczył:

 

 

# lsusb | grep Huawei

Bus 001 Device 004: ID 12d1:1f01 Huawei Technologies Co., Ltd. E353/E3131 (Mass storage mode)

 

Lokalna instalacja modemu w systemie Linux tworzy interfejs sieciowy za pośrednictwem menadżera sieci NM (Network Manager) o nazwie enp0s20u1, który otrzymuje z serwera dhcp modemu GSM/LTE adres logiczny z sieci: 192.168.8.x/24 w tym przypadku 192.168.8.100. Następnie w modemie GSM/LTE należy włączyć transmisję danych:

# usb_modeswitch -J -v 0x12d1 -p 0x1f01

 

Poprawną instalację i komunikację z modemem oraz tablicę rutingu przedstawiono poniżej:

 

# ping -c1 192.168.8.1

PING 192.168.8.1 (192.168.8.1) 56(84) bytes of data.

64 bytes from 192.168.8.1: icmp_seq=1 ttl=64 time=26.5 ms

 

--- 192.168.8.1 ping statistics ---

1 packets transmitted, 1 received, 0% packet loss, time 0ms

rtt min/avg/max/mdev = 26.547/26.547/26.547/0.000 ms

 

# ip route

default via 192.168.8.1 dev enp0s20u1  proto static  metric 100

192.168.2.0/24 dev enp3s0  proto kernel  scope link  src 192.168.2.1  metric 100

192.168.8.0/24 dev enp0s20u1  proto kernel  scope link  src 192.168.8.100  metric 100

 

Niezależnie od tego czy modem w systemie Linux jest zainstalowany lokalnie czy na innej maszynie w sieci IP, komunikacja z urządzeniem odbywa się z wykorzystaniem protokołu http na porcie TCP/80 wykorzystującym adres logiczny 192.168.8.1.

 

1.2 Monitoring systemu operacyjnego Linux z możliwością wysyłania komunikatów SMS do Administratora

 

Zgodnie z literaturą: Wydawnictwa Naukowego „Słownik języka polskiego PWN” słowo „monitoring” oznacza:

1. stała obserwacja i kontrola jakichś procesów lub zjawisk

2. stały nadzór nad jakimś obiektem chronionym

Realizacja celu i dobór środków technicznych stanowi istotny punkt samego monitoringu. Coraz częściej „monitoring”, jest realizowany z wykorzystaniem komunikatów Short Message Service (SMS), które służą do przesyłania wiadomości zawierających określony stan usługi biznesowej lub technicznej w relacji maszyna – człowiek. Urządzenie HUAWEI E3372 wykorzystane w niniejszej pracy, oprócz funkcjonalności typowego zastosowania, jakim jest transmisja danych, oferuje również możliwość wysyłania wiadomości tekstowych SMS. Realizacja tej funkcjonalności odbywa się przez protokół http oraz wbudowany serwer WWW, którym dysponuje to urządzenie. Ta zaleta może zostać wykorzystana do monitoringu zasobów systemowych i uruchomionych procesów w systemie operacyjnym GNU/Linux. W tym celu, na potrzeby niniejszej pracy, przygotowano archiwum sms_huawei.tar.gz, zawierające zbiór skryptów powłoki bash służących do monitorowania wybranych aspektów pracy systemu operacyjnego Linux, z możliwością wysyłania powiadomień komunikatami SMS o zdefiniowanych wcześniej zdarzeniach.

Archiwum składa się z następujących skryptów:

 

Zawartość archiwum sms_huawei.tar.gz po rozpakowaniu do /opt/sms_huawei/ została przedstawiona poniżej:

# tree /opt/sms_huawei/

.

├── cpu.m

├── hdd.free.m

├── hdd.io.m

├── hdd.smart.m

├── hdd.temperature.m

├── host.m

├── huawei.conf

├── huawei.sh

├── lmsensors.m

├── memory.m

├── process.m

├── README

├── run

└── send.sh

0 directories, 14 files

 

Wymienione skrypty zawarte w archiwum sms_huawei.tar.gz, zostały  napisane na potrzeby tego projektu.

1.2.1 Konfiguracja skryptów

Archiwum sms_huawei.tar.gz posiada dwa pliki konfiguracyjne takie jak: plik  huawei.conf oraz plik run. Zawartość pliku huawei.conf przedstawiono poniżej:

# cat /opt/sms_huawei/huawei.conf

 

# PLIK KONFIGURACJI

# adres IP lub nazwa 'hosta' (modem Huawei)

IP=192.168.8.1

#

# port serwera www modemu

port=80

#

# numery telefonów na które mają być wysyłane SMSy (maksymalnie 3 telefony)

telefon1=503446411

# telefon2=508378300

# telefon3=503123456

#

# ilość wysyłanych powiadomień (minimum 1)

ilosc_sms=2

#

# czy licznik wysłanych sms'ów ma być automatycznie wyzerowany

# jeśli system powróci do prawidłowego stanu (tak / nie)

licznik_reset=tak

#

# plik w którym będą zapisywane logi wysłanych SMS'ów

logi=/var/log/sms_alert.log

#

# domyślna lokalizacja zainstalowanego pakietu 'smartmontools'

smt=/usr/sbin/smartctl

#

# domyślna lokalizacja zainstalowanego pakietu 'lm_sensors'

lms=/usr/bin/sensors

#

# domyślna lokalizacja pliku 'sensors-detect' z pakietu 'lm_sensors'

lmsdetect=/usr/sbin/sensors-detect

#

# domyślna lokalizacja pliku konfiguracyjnego 'lm_sensors'

lmsconfig=/etc/sysconfig/lm_sensors

#

 

Plik huawei.conf zawiera trzy główne parametry konfiguracyjne:

Pozostałe parametry konfiguracyjne mają wpisane ustawienia domyślne, których nie należy zmieniać. Domyślne ustawienia mogą się różnić w zależności od dystrybucji systemu operacyjnego Linux.

Skrypt run służy do uruchamiania skryptów monitoringu z rozszerzeniem *.m. W pliku run należy wskazać ścieżkę do katalogu w którym archiwum zostało rozpakowane. Zawartość pliku run przedstawiono poniżej:

# cat /opt/sms_huawei/run

 

#!/bin/bash

# -----------------------------------

# lokalizacja rozpakowanego pakietu

lokalizacja=/opt/sms_huawei

#------------------------------------

source $lokalizacja/huawei.conf

cd $lokalizacja

function --monitor

{

for x in *.m

do

    ./$x

done

echo

}

function --reset

{

echo

rm -f *.alert

echo "W katalogu '$lokalizacja' skasowano pliki '*_alert'"

echo

}

if [ -z $1 ]; then

echo

echo "Wybierz parametr uruchamiania skryptu '--help'"

echo

elif [ $1 = "--monitor" ]; then

source $lokalizacja/huawei.sh

--monitor

elif [ $1 = "--reset" ]; then

--reset

elif [ $1 = "--help" ]; then

echo

echo "--monitor         uruchamia skrypty monitoringu"

echo "--reset           resetuje liczniki w plikach '*_alert'"

echo

else

echo

echo "Błędny parametr uruchamiania '--help'"

echo

fi

 

 

Instalacja dodatkowych opcjonalnych pakietów

 

Instalacja repozytorium w dystrybucji Linux CentOS

# yum install epel-release

 

Instalacja pakietu odpowiedzialnego za monitoring podzespołów „hardware”

# yum install lm_sensors

 

Instalacja pakietu odpowiedzialnego za monitoring dysków twardych mechanizmem SMART

# yum install smartmontools

 

 

1.2.2 Zasada działania skryptów „w przykładzie”

Każdy skrypt monitoringu z rozszerzeniem *.m tworzy własny indywidualny skrypt pomocniczy, który przyjmuje rozszerzenie *.alert. W plikach *.alert jest przechowywana wartość liczbowa wysłanych komunikatów SMS. Uruchomienie skryptu na przykład o nazwie skrypt.m  utworzy plik o nazwie skrypt.alert. Jeżeli wartość liczbowa przechowywana w pliku skrypt.alert jest identyczna z wartością zdefiniowaną parametrem (ilosc_sms) w pliku huawei.conf, komunikaty SMS za pośrednictwem skryptu skrypt.m nie będą wysyłane. W takim przypadku należy skasować plik skrypt.alert lub zapisać wartość liczbową 0. Każdy wysłany komunikat SMS przez  skrypt.m zwiększa wartość liczbową +1, której liczba jest zapisywana w pliku skrypt.alert, aż osiągnie liczbę maksymalną zdefiniowaną parametrem (ilosc_sms) w pliku huawei.conf.

Ustawienie wartości (licznik_reset=TAK) w pliku huawei.conf powoduje, że liczba wysłanych komunikatów SMS, zapisanych w formie liczbowej w pliku skrypt.alert, jest zerowana automatycznie – o ile skrypt skrypt.m nie wykryje zdarzeń. Ustawienie wartości parametru (licznik_reset=NIE) powoduje, że w przypadku wykrycia zdarzenia licznik wysłanych komunikatów SMS nie będzie zerowany.

Każde wysłanie komunikatu SMS, jest zapisywane w pliku /var/log/sms_alert.log. Skrypty monitoringu zapisują następujące dane: data, godzina, rodzaj zdarzenia (treść komunikatu SMS), numery telefonów, na który zostały wysłane komunikaty SMS oraz fakt czy wysłanie komunikatu SMS się powiodło. Archiwum sms_huawei.tar.gz może również pracować autonomicznie w systemie operacyjnym Linux bez pośrednictwa urządzenia Huawei E3372. Wykryte zdarzenie zostanie jedynie odnotowane w pliku dziennika zdarzeń /var/log/sms_alert.log.

 

1.2.3 Monitorowanie obciążenia systemu operacyjnego

Nazwa skryptu: cpu.m, który zapewnia monitorowanie obciążenia systemu wykorzystując uśrednione wartości load average. Skrypt monitoruje obciążenie systemu na podstawie wartości odczytanej z pliku /proc/loadavg systemu operacyjnego Linux, przy czym jako parametr brany jest pod uwagę odczyt z ostatnich 5 minut. Odczytana wartość jest porównywana z wartością max zapisaną w sekcji konfiguracyjnej skryptu. Odczytanie większej wartości z pliku /proc/loadavg powoduje wysłanie komunikatu SMS. Zawartość skryptu została przedstawiona poniżej, w którym parametr max został zdefiniowany na 80, co odpowiada load average 0.80

# cat /opt/sms_huawei/cpu.m

 

#!/bin/bash

# MONITORING OBCIĄŻENIA SYSTEMU OPERACYJNEGO

# NA PODSTAWIE WARTOŚCI 'LOAD AVERAGE' Z OSTATNICH 5 MINUT

# --------------------------------------------------------

#[sekcja konfiguracyjna]

# definiowanie jednostki 'max' ( max = load average * 100)

# przykłady:

# wartość 'load average = 0.05' = 5

# wartość 'load average = 0.85' = 85

# wartość 'load average = 1' = 100

# wartość 'load average = 12' = 1200

max=80

# -------------------------------------------------------------

source huawei.conf

cpu=`cat /proc/loadavg`

load_average=`echo $cpu | cut -d ' ' -f2`

load_average2=`echo $cpu | cut -d ' ' -f2 | cut -c1,3-4`

ap=$0

test -e "$ap".alert || echo 0 > "$ap".alert

alert="$ap".alert

z3=`cat $alert`

z4=`hostname`

if [ $z3 -ge $ilosc_sms ]; then

echo "(ALERT!) Zarejestrowano obciążenie systemu '$z4' powyżej ustalonej wartości, zresetuj licznik w '$alert'"

else

    if [ $max -ge $load_average2 ]; then

    echo "(OK) Obciążenie systemu '$z4' z ostatnich 5 min wynosi: load average '$load_average'"

    test $licznik_reset = "nie" || echo 0 > $alert

    else

    komunikat="(ALERT!) Obciążenie systemu '$z4' z ostatnich 5 min wynosi: load average '$load_average'"

    echo $komunikat

    licznik=$(($z3+1))

    echo "Wysyłam $licznik SMS..."

    tresc_sms=$komunikat

    source send.sh

    fi

fi

 

 

1.2.4 Monitoring zasobów systemu plików w systemie operacyjnym

Nazwa skryptu: hdd.free.m, który zapewnia monitoring zasobów systemu plików wybranego wolumenu logicznego. Skrypt monitoruje zajętą przestrzeń wykorzystując polecenie systemowe df -H, w systemie operacyjnym Linux. Zawartość skryptu przedstawiono poniżej:

# cat /opt/sms_huawei/hdd.free.m

 

#!/bin/bash

# MONITORING WYKORZYSTANIA PRZESTRZENI SYSTEMU PLIKÓW

# -----------------------------------------------------

# [sekcja konfiguracyjna]

# wolumen logiczny który ma być monitorowany

wolumen=/dev/sda1

#dopuszczalne wykorzystanie wolumenu w procentach %

max=80

# -----------------------------------------------------

source huawei.conf

vol=`df -H | grep $wolumen`

nazwa=`echo $vol | cut -d ' ' -f1`

rozmiar=`echo $vol | cut -d ' ' -f2`

uzyte=`echo $vol | cut -d ' ' -f3`

dostepne=`echo $vol | cut -d ' ' -f4`

uzyteprocent=`echo $vol | cut -d ' ' -f5`

calkowita=`echo $vol | cut -d ' ' -f5 | cut -d '%' -f1`

zamontowany=`echo $vol | cut -d ' ' -f6`

if [ -z $nazwa ]; then

    echo "Wolumen '$wolumen' nie istnieje."

else

    ap=$0

    test -e "$ap".alert || echo 0 > "$ap".alert

    alert="$ap".alert

    z3=`cat $alert`

    z4=`hostname`

    if [ $z3 -ge $ilosc_sms ]; then

        echo "(ALERT!) Wolumen '$nazwa' w systemie '$z4' zajęty powyżej ustalonej wartości, zresetuj licznik w '$alert'"

    else

        if [ $max -ge $calkowita ]; then

        echo "(OK) Wolumen '$nazwa' ('$zamontowany') w systemie '$z4' jest zajęty powyżej $uzyteprocent ($uzyte) pozostało $dostepne."

        test $licznik_reset = "nie" || echo 0 > $alert

        else

        komunikat="(ALERT!) Wolumen '$nazwa' w systemie '$z4'('$zamontowany') jest zajęty powyżej $uzyteprocent ($uzyte) pozostało $dostepne."

        echo $komunikat

        licznik=$(($z3+1))

        echo "Wysyłam $licznik SMS..."

        tresc_sms=$komunikat

        source send.sh

        fi

    fi

fi

 

Parametr max=80 oznacza, że wykorzystanie danych we wskazanym systemie plików powyżej 80%, spowoduje wysłanie komunikatu SMS. Zmienna wolumen=/dev/sda1 wskazuje, który system plików ma być monitorowany.

 

1.2.5 Monitoring operacji wejścia-wyjścia (I/O) dysku twardego na sekundę

Nazwa skryptu: hdd.io.m, który monitoruję liczbę operacji wejścia-wyjścia na sekundę wybranego dysku twardego. Skrypt wykorzystuje polecenie systemowe iostat -x systemu operacyjnym Linux. Zawartość skryptu przedstawiono poniżej:

# cat /opt/sms_huawei/hdd.io.m

 

#!/bin/bash

# MONITORING OPERACJI I/O DYSKU TWARDEGO

# -----------------------------------------------------

# [sekcja konfiguracyjna]

# dysk który chcemy monitorować

urzadzenie=sda

# maksymalna wartość 'await' w ms (milisekundy)

maxawait=300

# maksymalna wartość '%util' w procentach %

maxutil=80

# -----------------------------------------------------

source huawei.conf

iostat=`iostat -x -d | grep -v "Linux" | grep -v "Device" | grep $urzadzenie`

iostat2=`iostat -x -d | grep -v "Linux" | grep -v "Device" | cut -d ' ' -f1`

iostat3=`echo $iostat2`

await=`echo $iostat | cut -d ' ' -f10`

await2=`echo $await | tr -d ','`

maxawait2=$(($maxawait*100))

util=`echo $iostat | cut -d ' ' -f14`

util2=`echo $util | tr -d ','`

maxutil2=$(($maxutil*100))

z4=`hostname`

if [ -z "$iostat" ]; then

    echo "Wpisz urządzenie w formie wyświetlanej przez 'iostat'"

    echo "Dostępne urządzenia w systemie '$z4':   $iostat3"

else

    ap=$0

    test -e "$ap".alert || echo 0 > "$ap".alert

    alert="$ap".alert

    z3=`cat $alert`

    if [ $z3 -ge $ilosc_sms ]; then

        echo "(ALERT!) Zarejestrowano I/O urządzenia '$urzadzenie' w systemie '$z4' powyżej normy, zresetuj licznik w '$alert'"

    else

        if [ $maxawait2 -ge $await2 ] && [ $maxutil2 -ge $util2 ]; then

        echo "(OK) Operacje I/O urządzenia '$urzadzenie' w systemie '$z4' wynoszą: await $await ms, %util $util %"

        test $licznik_reset = "nie" || echo 0 > $alert

        else

        komunikat="(ALERT!) Operacje I/O urządzenia '$urzadzenie' w systemie '$z4' wynoszą: await $await ms, %util $util %"

        echo $komunikat

        licznik=$(($z3+1))

        echo "Wysyłam $licznik SMS..."

        tresc_sms=$komunikat

        source send.sh

        fi

    fi

fi

 

Parametr urzadzenie=sda określa dysk, który chcemy monitorować. Parametr maxawait=300, definiuje maksymalny dopuszczalny czas (w milisekundach) na wykonanie żądania przez dysk twardy. Dodatkowo parametr maxutil=80, określa procent czasu jaki urządzenie może poświęcić na realizację żądania. Odczytanie wyższych wartości (powyżej zdefiniowanych) poleceniem iostat -x,  powoduje wysłanie komunikatu SMS.

 

1.2.6 Monitoring dysku twardego mechanizmem S.M.A.R.T

Nazwa skryptu: hdd.smart.m

S.M.A.R.T. (Self-Monitoring, Analysis, and Reporting Technology) jest standardem monitoringu dysku twardego i powiadomienia o błędach w jego działaniu. Wymieniona technologia zapewnia możliwość przewidywania przyszłej awarii, tym samym może zwiększyć bezpieczeństwo składowanych danych.

Wymieniony skrypt wykorzystuje pakiet smartmontools dostępny w dystrybucji CentOS 7.3 systemu operacyjnego Linux. Monitoring dysku jest realizowany na podstawie wartości odczytanej poleceniem: smartctl -l error /dev/sda, przy czym wartość /dev/sda oznacza nazwę dysku twardego, który chcemy monitorować. Dysk twardy, który ma być monitorowany definiujemy w pliku. Przykład sprawdzenia dysku twardego oprogramowaniem smartmontools na wypadek występujących błędów przedstawiono poniżej:

# smartctl -l error /dev/sda

smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.10.0-514.26.2.el7.x86_64] (local build)

Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===

SMART Error Log Version: 1

No Errors Logged

 

W założonym rozwiązaniu przyjęto, że zwrócona wartość No Errors Logged oznacza poprawne działanie dysku. Parametr skryptu dysk=/dev/sda określa nazwę dysku, który chcemy monitorować. Zawartość skryptu została przedstawiona poniżej:

 

# cat /opt/sms_huawei/hdd.smart.m

 

#!/bin/bash

# MONITORING DYSKU TWARDEGO NA PODSTAWIE ODCZYTU Z SYSTEMU S.M.A.R.T

# ------------------------------------------------------------------

# [sekcja konfiguracyjna]

# monitorowany dysk

dysk=/dev/sda

# ------------------------------------------------------------------

source huawei.conf

zainstalowany=`ls $smt | wc -l`

if [ $zainstalowany -gt 0 ]; then

if [ -e $dysk ]; then

    smart=`$smt --info $dysk | grep "Available" | cut -d ' ' -f4`

    if [ -z $smart ]; then

        echo "Dysk '$dysk' nie wspiera systemu S.M.A.R.T"

    else

        ap=$0

        test -e "$ap".alert || echo 0 > "$ap".alert

        alert="$ap".alert

        z1=`$smt -l error $dysk | grep "No Errors Logged"`

        z2=`echo $z1 | tr -d ' '`

        z3=`cat $alert`

        z4=`hostname`

        if [ $z3 -ge $ilosc_sms ]; then

            echo "(ALERT!) S.M.A.R.T w systemie '$z4' zarejestrował możliwe uszkodzenie dysku '$dysk', zresetuj licznik w '$alert'"

        else

            if [ $z2 = "NoErrorsLogged" ]; then

            echo "(OK) S.M.A.R.T w systemie '$z4' nie zarejestrował błędów dysku '$dysk' ($z1)"

            test $licznik_reset = "nie" || echo 0 > $alert

            else

            komunikat="(ALERT!) S.M.A.R.T w systemie '$z4' zarejestrował możliwe uszkodzenie dysku '$dysk'"

            echo $komunikat

            licznik=$(($z3+1))

            echo "Wysyłam $licznik SMS..."

            tresc_sms=$komunikat

            source send.sh

            fi

        fi

    fi

else

echo "Nie ma takiego dysku '$dysk'"

fi

else

echo "Pakiet 'smartmontools' nie jest zainstalowany."

fi

 

 

1.2.7 Monitoring temperatury dysku twardego

Nazwa skryptu: hdd.temperature.m

Skrypt wykorzystuje pakiet smartmontools dostępny w dystrybucji CentOS 7.3 systemu operacyjnego Linux. Monitoring temperatury dysku jest realizowany na podstawie wartości odczytanej poleceniem: smartctl -l scttemp /dev/sda, przy czym wartość /dev/sda oznacza nazwę dysku twardego, który chcemy monitorować. Zawartość skryptu przedstawiono poniżej:

 

# cat /opt/sms_huawei/hdd.temperature.m

 

#!/bin/bash

# MONITORING TEMPERATURY DYSKU TWARDEGO

# -------------------------------------

# [sekcja konfiguracyjna]

# monitorowany dysk

dysk=/dev/sda

# maksymalna dopuszczalna temperatura dysku (wartość w skali C)

max_temperatura=40

# --------------------------------------

source huawei.conf

zainstalowany=`ls $smt | wc -l`

if [ $zainstalowany -gt 0 ]; then

if [ -e $dysk ]; then

    smart=`$smt --info $dysk | grep "Available" | cut -d ' ' -f4`

    if [ -z $smart ]; then

        echo "Dysk '$dysk' nie wspiera systemu S.M.A.R.T"

    else

        ap=$0

        test -e "$ap".alert || echo 0 > "$ap".alert

        alert="$ap".alert

        z1=`$smt -l scttemp $dysk | grep Current`

        z2=`echo $z1 | cut -d ' ' -f3`

        z3=`cat $alert`

        z4=`hostname`

        if [ $z3 -ge $ilosc_sms ]; then

            echo "(ALERT!) Zarejestrowano temperaturę dysku '$dysk' w systemie '$z4' powyżej normy, zresetuj licznik w '$alert'"

        else

            if [ -z $z2 ]; then

                echo "Błąd odczytu temperatury z dysku '$dysk'"

            else

                if [ $z2 -lt $max_temperatura ]; then

                echo "(OK) Temperatura dysku '$dysk' w systemie '$z4' wynosi $z2 C."

                test $licznik_reset = "nie" || echo 0 > $alert

                else

                komunikat="(ALERT!) Temperatura dysku '$dysk' w systemie '$z4', wynosi $z2 C"

                echo $komunikat

                licznik=$(($z3+1))

                echo "Wysyłam $licznik SMS..."

                tresc_sms=$komunikat

                source send.sh

                fi

            fi

        fi

    fi

else

echo "Nie ma takiego dysku '$dysk'"

fi

else

echo "Pakiet 'smartmontools' nie jest zainstalowany."

fi

 

Parametr max_temperatura=40 określa maksymalną dopuszczalną temperaturę dysku twardego. Przekroczenie temperatury dysku powyżej 40°C powoduje wysłanie komunikatu SMS. Parametr dysk=/dev/sda definiuje dysk, który chcemy monitorować.

 

 

1.2.8 Monitoring dostępności uczestnika sieci

Nazwa skryptu: host.m

Skrypt monitoruje dostępność uczestnika sieci poleceniem ping, przy czym wybrany uczestnik może być określony na podstawie adresu IP lub nazwy DNS. Parametr adresip=192.168.2.1 definiuje adres IP uczestnika, którego chcemy monitorować. Zawartość skryptu przedstawiono poniżej:

# cat /opt/sms_huawei/host.m

 

#!/bin/bash

# MONITORING DOSTĘPNOŚCI HOSTA PROGRAMEM 'PING'

# --------------------------------------------

#[sekcja konfiguracyjna]

# adres IP lub nazwa 'hosta'

adresip=192.168.2.1

# -------------------------------------------

source huawei.conf

host1=`ping -c 2 $adresip &> /dev/null && echo ok || echo error`

ap=$0

test -e "$ap".alert || echo 0 > "$ap".alert

alert="$ap".alert

z3=`cat $alert`

z4=`hostname`

if [ $z3 -ge $ilosc_sms ]; then

echo "(ALERT!) Zarejestrowano niedostępność hosta, zresetuj licznik w '$alert'"

else

    if [ $host1 = "ok" ]; then

    echo "(OK) Host '$adresip' jest dostępny."

    test $licznik_reset = "nie" || echo 0 > $alert

    else

    komunikat="(ALERT!) Host '$adresip' jest niedostępny brak odpowiedzi 'ping'"

    echo $komunikat

    licznik=$(($z3+1))

    echo "Wysyłam $licznik SMS..."

    tresc_sms=$komunikat

    source send.sh

    fi

fi

 

1.2.9 Monitoring wykorzystania pamięci RAM

Nazwa skryptu: memory.m, który monitoruje wykorzystanie pamięci RAM w systemie operacyjnym Linux, poleceniem systemowym free -m. Zawartość skryptu została przedstawiona poniżej:

 

# cat /opt/sms_huawei/memory.m

 

#!/bin/bash

# MONITORING WYKORZYSTANIA W SYSTEMIE OPERACYJNYM PAMIĘCI RAM

# ------------------------------------------------------

#[sekcja konfiguracyjna]

# maksymalne dopuszczalne wykorzystanie pamięci w procentach %

max_ram=80

# --------------------------------------------------------

source huawei.conf

ram=`free -m | grep Mem`

ram2=`free -h | grep Mem`

total=`echo $ram | cut -d ' ' -f2`

total2=`echo $ram2 | cut -d ' ' -f2`

used=`echo $ram | cut -d ' ' -f3`

used2=`echo $ram2 | cut -d ' ' -f3`

ap=$0

test -e "$ap".alert || echo 0 > "$ap".alert

alert="$ap".alert

z3=`cat $alert`

z4=`hostname`

procent=$(($used*100/$total))

if [ $z3 -ge $ilosc_sms ]; then

echo "(ALERT!) Zarejestrowano w systemie '$z4' wykorzystanie pamięci RAM powyżej normy, zresetuj licznik w '$alert'"

else

    if [ $max_ram -ge $procent ]; then

    echo "(OK) Pamięci RAM ($total2) w systemie '$z4' jest zajęta: ($used2) $procent%"

    test $licznik_reset = "nie" || echo 0 > $alert

    else

    komunikat="(ALERT!) Pamięć RAM ($total2) w systemie '$z4' jest zajęta: ($used2) $procent%"

    echo $komunikat

    licznik=$(($z3+1))

    echo "Wysyłam $licznik SMS..."

    tresc_sms=$komunikat

    source send.sh

    fi

fi

 

Parametr max_ram=80 definiuje maksymalny procent pamięci RAM jaka może zostać wykorzystana w systemie operacyjnym Linux. Pod uwagę jest brana tylko pamięć fizyczna. Przekroczenie wykorzystana pamięci RAM powyżej 80%, powoduje wysłanie komunikatu SMS. Wartość procentowa jest wyliczana na podstawie wartości total i used zwróconej poleceniem free -m.

 

1.2.10 Monitoring wybranych procesów w systemie operacyjnym

Nazwa skryptu: process.m, który monitoruje wybrany proces o podanej nazwie poleceniem systemowym ps -C, w systemie operacyjnym Linux. Na podstawie przyjętych założeń:

1. Sam fakt uruchomienia procesu

2. Liczba PID uruchomionego procesu

Liczba PID uruchomionego procesu jest określona jako: liczba minimalna i liczba maksymalna, jaka może być uruchomiona w systemie operacyjnym Linux. Nazwę procesu oraz dopuszczalną ich liczbę - maksymalną i minimalną, należy zdefiniować w skrypcie. Przykład skonfigurowanego skryptu przedstawiono poniżej:

 

 

# cat /opt/sms_huawei/process.m

 

#!/bin/bash

# MONITORING WYBRANEGO 'PROCESU' W SYSTEMIE OPERACYJNYM

# -----------------------------------------------------

# [sekcja konfiguracyjna]

# nazwa procesu który ma być monitorowany

proces=httpd

# minimalna dopuszczalna liczba PID procesu w systemie

min_procesow=1

# maksymalna dopuszczalna liczba PID procesu w systemie

max_procesow=7

# -------------------------------------------------

source huawei.conf

ap=$0

test -e "$ap".alert || echo 0 > "$ap".alert

alert="$ap".alert

z1=`ps -C $proces | grep $proces | wc -l`

z3=`cat $alert`

z4=`hostname`

test $z1 -ge $min_procesow

min_proc=$?

test $z1 -le $max_procesow

max_proc=$?

let minmax=min_proc+max_proc

if [ $z3 -ge $ilosc_sms ]; then

echo "(ALERT!) W systemie '$z4' zarejestrowano liczbę PID procesu '$proces' poza ustalonym zakresem, zresetuj licznik w $alert"

else

    if [ $minmax -eq 0 ]; then

    echo "(OK) Liczba PID procesu '$proces' w systemie '$z4' wynosi '$z1' dopuszczalny zakres '$min_procesow-$max_procesow'"

    test $licznik_reset = "nie" || echo 0 > $alert

    else

    komunikat="(ALERT!) Liczba procesów '$proces' w systemie '$z4' wynosi '$z1' dopuszczalny zakres '$min_procesow-$max_procesow'"

    echo $komunikat

    licznik=$(($z3+1))

    echo "Wysyłam $licznik SMS..."

    tresc_sms=$komunikat

    source send.sh

    fi

fi

 

Zaprezentowany listing skryptu prosess.m przedstawia zdefiniowany proces o nazwie httpd. Liczba PID procesów httpd jaka może zostać uruchomiona w systemie operacyjnym Linux została określona odpowiednio na: minimum 1 proces do maksimum 7 uruchomionych procesów httpd. Przekroczenie określonych wartości liczbowych (liczby uruchomionych procesów httpd) odpowiednio: poniżej 1 lub powyżej 7 powoduje wysłanie komunikatu SMS.

 

1.2.11 Monitoring z wykorzystaniem pakietu lm_sensors

Nazwa skryptu: lmsensors.m, który monitoruje poprawność działania zasobów sprzętowych komputera w systemie operacyjnym Linux. Mogą to być na przykład: temperatura procesora, temperatura płyty głównej, obroty wentylatorów. Skrypt wykorzystuje oprogramowanie lm_sensors dostępne w repozytorium dystrybucji CentOS 7.3, systemu operacyjnego Linux. Zasada działania skryptu polega na odczycie wartości zwróconych poleceniem sensors z oprogramowania  lm_sensors. Odczytanie wartości zawierającej parametrem ALARM uruchamia procedurę wysłania komunikatu SMS. Pierwsze uruchomienie skryptu  lmsensors.m powoduje wykonanie polecenia sensors-detect –-auto, celem utworzenia pliku konfiguracyjnego. Pakiet lm_sensors przechowuje domyślnie plik konfiguracyjny w katalogu /etc/sysconfig/. Zawartość skryptu została przedstawiona poniżej:

# cat /opt/sms_huawei/lmsensors.m

 

#!/bin/bash

source huawei.conf

zainstalowany=`ls $lms | wc -l`

if [ $zainstalowany -gt 0 ]; then

    if [ -e $lmsconfig ]; then

    echo -n

    else

        echo "Pierwsze uruchomienie 'lm_sensors' zostanie wygenerowany plik konfiguracji 'sensors-detect --auto'"

        sleep 5

        $lmsdetect --auto

        echo "Poleceniem 'sensors-detect --auto' został wygenerowany plik konfiguracji '$lmsconfig'"

    fi

    lm=`$lms | grep "ALARM"`

    ap=$0

    test -e "$ap".alert || echo 0 > "$ap".alert

    alert="$ap".alert

    z3=`cat $alert`

    z4=`hostname`

    if [ $z3 -ge $ilosc_sms ]; then

        echo "(ALERT!) W systemie '$z4' zarejestrowano lm_sensors ALARM, zresetuj licznik w '$alert'"

    else

        if [ -z "$lm" ]; then

        echo "(OK) W systemie '$z4' brak alarmów 'lm_sensors'"

        test $licznik_reset = "nie" || echo 0 > $alert

        else

        komunikat="(ALERT!) W systemie '$z4' 'lm_sensors' wykrył ALARM treść: '$lm'"

        echo $komunikat

        licznik=$(($z3+1))

        echo "Wysyłam $licznik SMS..."

        tresc_sms=$komunikat

        source send.sh

        fi

    fi

else

echo "Pakiet 'lm_sensors' nie jest zainstalowany."

fi

 

1.2.12 Uruchomienie skryptów w systemie Linux

Archiwum zostało rozpakowane do katalogu /opt/sms_huawei/ przy czym jest to domyślna lokalizacja przewidziana dla skryptów zawartych w archiwum. Archiwum zawiera pliki wykonywalne (tzw. skrypty monitoringu) z rozszerzeniem *.m, które monitorują zdefiniowane zdarzenia w systemie operacyjnym Linux. Nazwę tych skryptów za wyjątkiem rozszerzenia *.m można zmienić, dostosowując nazewnictwo do własnych potrzeb. Skrypty te można powielić definiując na przykład kilka dysków twardych, celem ich monitoringu. Wszystkie skrypty monitoringu zawierające rozszerzenie *.m należy uruchamiać za pośrednictwem skryptu run. Skrypt run ma dwa parametry uruchamiania takie jak:

run –-monitor, który służy do cyklicznego uruchamiania skryptów monitoringu

run –-reset, który jest przewidziany do kasowania plików z rozszerzeniem *.alert

Przykład uruchomienia skryptów monitoringu w systemie operacyjnym Linux z dystrybucji CentOS 7.3, przedstawiono poniżej:

# /opt/sms_huawei/run --monitor

 

(INFO) Wykryto urządzenie: Bus 001 Device 005: ID 12d1:14dc Huawei Technologies Co., Ltd.

(INFO) Aktualny 'ID 12d1:14dc' (transmisja danych).

(OK) Obciążenie systemu 'Linux6' z ostatnich 5 min wynosi: 0.09 load average.

(OK) Wolumen '/dev/sda1' ('/boot/efi') w systemie 'Linux6' zajęty 5% (10M) pozostało 200M.

(OK) Operacje I/O urządzenia 'sda' w systemie 'Linux6' wynoszą: 'await 61,08 ms' '%util 1,33 %'

(OK) S.M.A.R.T w systemie 'Linux6' brak błędów '/dev/sda' (No Errors Logged)

(OK) Temperatura dysku '/dev/sda' w systemie 'Linux6' wynosi 33 C.

(OK) Host '192.168.2.1' jest dostępny.

(OK) W systemie 'Linux6' brak alarmów 'lm_sensors'

(OK) Pamięci RAM '3,6G' w systemie 'Linux6' zajęta w 4% (159M).

(OK) Liczba procesów 'sshd' w systemie 'Linux6' wynosi '2' ustalony zakres '1-7'

 

1.2.13 Komunikacja z modemem GSM

Skrypt send.sh odpowiada za wysyłanie komunikatów SMS, komunikując się z API modemu Huawei, przy czym do komunikacji wykorzystuje bibliotekę curl. Biblioteka curl umożliwia komunikację protokołem http. Kod skryptu send.sh przedstawiono poniżej:

# cat /opt/sms_huawei/send.sh

 

czas=`date +%Y-%m-%d:%H:%M:%S`

echo $czas $tresc_sms >> $logi

sm=`ping -c 2 $IP &> /dev/null && echo ok || echo error`

if [ $sm = "ok" ]; then

echo "Host '$IP:$port' dostępny."

echo $licznik > $alert

echo $czas "Wysłano $licznik z $ilosc_sms SMS na numer: $telefon1, $telefon2, $telefon3" >> $logi

# ----------------------------------

# komunikacja http z modemem GSM/LTE

#-----------------------------------

sti=`curl -s -X GET http://$IP:$port/api/webserver/SesTokInfo`

idsesji=`echo "$sti"| grep SessionID=| cut -b 10-147`

token=`echo "$sti"| grep TokInfo| cut -b 10-41`

pakiet="<request><Index>-1</Index><Phones><Phone>$telefon1</Phone><Phone>$telefon2</Phone><Phone> \$telefon3</Phone></Phones><Sca/><Content>$tresc_sms</Content> \

<Length>-1</Length><Reserved>1</Reserved><Date>-1</Date></request>"

curl -v -b $idsesji -c $idsesji -H "X-Requested-With: \

XMLHttpRequest" –data  "$pakiet" http://$IP:$port/api/sms/send-sms --header "__RequestVerificationToken: $token" --header "Content-Type:text/xml"

sleep 8

# ------------------------------------------

# koniec komunikacji http z modemem GSM/LTE

# ------------------------------------------

else

alert="(ALERT!) Modem niedostępny, brak odpowiedzi 'ping', sms nie został wysłany."

echo $czas $alert >> $logi

echo $alert

fi

 

 

Skrypt huawei.sh odpowiada za włączenie transmisji danych, jego zawartość przedstawiono poniżej:

 

 

# cat /opt/sms_huawei/huawei.sh

 

modem=`lsusb | grep Huawei`

msm=`echo $modem | cut -d '(' -f2 | cut -d ')' -f1`

msm2=`echo $msm | tr -d ' '`

idmodem=`echo $modem | cut -d ' ' -f5-6`

idmodem2=`echo $idmodem | tr -d ' '`

if [ -z $idmodem2 ]; then

echo

echo "(INFO) Modem Huawei nie jest lokalnie zainstalowany."

else

    if [ $msm2 = "Massstoragemode" ]; then

    echo $modem

    echo "Aktualny '$idmodem', urządzenie w trybie '$msm'"

    echo "Przełączam w tryb transmisji danych ..."

    /usr/sbin/usb_modeswitch -J -v 0x12d1 -p 0x1f01

    sleep 10

    else

    echo

    echo "(INFO) Wykryto urządzenie: $modem"

    echo "(INFO) Aktualny '$idmodem' (transmisja danych)."

    fi

fi

 

 

 

 

1.2.14 Przykłady generowanych i wysyłanych komunikatów SMS

 

Przedstawione skrypty monitoringu zawarte w archiwum sms_huawei.tar.gz, generują komunikaty SMS, które następnie mogą zostać wysyłane do administratora systemu operacyjnego Linux. Przykłady generowanych komunikatów SMS przedstawiono w tabeli poniżej:

 

 

Nazwa skryptu

Przykład wygenerowanego komunikatu SMS

cpu.m

ALERT! Obciążenie systemu ‘linux6’ z ostatnich z ostatnich 5min wynosi: load average ‘0.88’

hdd.free.m

ALERT! Wolumen ‘/dev/sda2’ (‘/home’) w systemie ‘linux6’ jest zajęty powyżej 83% (850M) pozostało 166M.

hdd.io.m

ALERT! Operacje I/O urządzenia ‘sda’ w systemie ‘linux6’ wynoszą: await 311,34 ms, %util 82,12 %

hdd.smart.m

ALERT! S.M.A.R.T w systemie ‘linux6’ zarejestrował możliwe uszkodzenie dysku ‘/dev/sda’

hdd.temperature.m

ALERT! Temperatura dysku ‘/dev/sda’ w systemie ‘linux6’ wynosi ‘45 C’

host.m

ALERT! Host ‘192.168.2.2’ jest niedostępny, brak odpowiedzi ‘ping’.

lmsensors.m

ALERT! W systemie linux6’ ‘lm_sensors’ wykrył ALARM treść:  ‘Core 0: +81°C (high = +80.0°C, crit = 90.0°C) ALARM’

memory.m

ALERT! Pamięć RAM (3,6G) w systemie ‘linux6’ jest zajęta: (3,2G) 84%

process.m

ALERT! Liczba PID procesu ‘httpd’ w systemie ‘linux6’ wynosi ‘0’ dopuszczalny zakres ‘1-7’

 

 

1.2.15 Instalacja i uruchomienie skryptów

 

Przedstawione skrypty zawarte w archiwum sms_huawei.tar.gz można pobrać z tej strony – link na końcu opracowania.

Archiwum należy skopiować do katalogu /opt w systemie operacyjnym Linux, a następnie rozpakować:

# cd /opt | tar -xvf sms_huawei.tar.gz

sms_huawei/

sms_huawei/huawei.conf

sms_huawei/huawei.sh

sms_huawei/run

sms_huawei/send.sh

sms_huawei/cpu.m

sms_huawei/hdd.free.m

sms_huawei/hdd.io.m

sms_huawei/hdd.smart.m

sms_huawei/hdd.temperature.m

sms_huawei/host.m

sms_huawei/lmsensors.m

sms_huawei/memory.m

sms_huawei/process.m

sms_huawei/README

 

Rozpakowane archiwum posiada konfigurację domyślną, którą można zmienić według własnych założeń. Warunkiem wysyłania komunikatów SMS jest poprawa komunikacja http z adresem logicznym IP 192.168.8.1, który jest przypisany na stałe do modemu Huawei E3372. Jeżeli chcemy aby skrypty monitoringu były cyklicznie uruchamiane w systemie operacyjnym Linux, należy dodać plik run do menadżera zadań czasowych cron. Przykład dodania skryptów monitoringu do cron’a przedstawiono poniżej:

# echo "*/15 * * * * /opt/sms_huawei/run --monitor" >> /var/spool/cron/root

2 Podsumowanie

 

Serwery pracujące pod kontrolą systemu operacyjnego Linux mogą być monitorowane i kontrolowane na wiele sposobów. W przedstawionym opracowaniu do Administratora takiego serwera mogą być wysyłane komunikaty SMS o wybranych aspektach pracy systemu. W tym celu został wykorzystany modem Huawei E3372 LTE USB Stick (jako bramka) oraz opracowane skrypty w powłoce systemowej bash. Dodatkowo przedstawione skrypty monitoringu zapisują wszelkie wykryte nieprawidłowości (niezależnie) oraz treść komunikatów SMS w logach systemowych.

 

3 Archiwum: sms_huawei.tar.gz

 

Archiwum zawierające skrypty monitoringu do pobrania:  sms_huawei.tar.gz

 

Autor: Szymon Urbańczyk, 02-10-2017 r.