Backup Cacti cz.2

Część druga to kopia zapasowa bazy danych.

#!/bin/bash
# Database credentials
 user="cacti"
 password="password"
 host="127.0.0.1"
 db_name="cacti"
# Other options
 DESDIR="/home/marcin/cacti"
 TIME=$(date +"%d-%m-%Y")
# Wait 20s for cacti pooling
echo "Wait 20s for cacti pooling"
sleep 20s
# Dump database into SQL file
echo "Dump database into SQL file"
mysqldump --user=$user --password=$password --host=$host $db_name > $DESDIR/$db_name-$TIME.sql
sleep 1s
# gzip database
echo "gzip database"
gzip $DESDIR/$db_name-$TIME.sql
# SCP file to backup server
echo "SCP file to backup server"
scp $DESDIR/$db_name-$TIME.sql.gz cacti@10.0.0.10:/mnt/cacti/$db_name-$TIME.sql.gz
# Log to syslog
logger MySQL Backup Complete

Zapis w crontabie:

0 0 * * * /home/marcin/cactidb.sh

Ścieżkę DESDIR zmienić sobie wg własnego uznania, tak samo jak wysyłanie przez scp i kluczy SSH na serwer w sieci czy internecie. Tak samo jak dane user,password oraz ip hosta gdzie stoi baza danych MySQL.

Backup Cacti cz.1

Backup najlepszym przyjacielem admina. Pierwszym krokiem jest kopia zapasowa plików Cacti. Często dodanie nowych funkcji czy poprawienie istniejących wiąże się z edycją plików w katalogu programu.

Skrypt dodany do crona uruchamia się co dobę, jednak częstotliwość zależna jest od częstotliwości zmian jakie dokonujemy w systemie.

#!/bin/bash
#START
TIME=$(date +"%d-%m-%Y")            # This Command will add date in Backup File Name.
FILENAME=files-$TIME.tar.gz         # Here i define Backup file name format.
SRCDIR=/usr/share/cacti/site/       # Location of Important Data Directory (Source of backup).
DESDIR=/home/marcin/cacti           # Destination of backup file.
# Wait 10s for cacti pooling
echo "Wait 10s for cacti pooling"
sleep 10
# Tar cacti folder
echo "Tar cacti folder"
tar -hcpzf $DESDIR/$FILENAME $SRCDIR
# SCP File to backup server
echo "SCP File to backup server"
scp $DESDIR/$FILENAME cacti@10.0.0.10:/mnt/cacti/$FILENAME
# Log to syslog
logger Cacti Backup Complete
#END

Zapis w crontabie:

0 0 * * * /home/marcin/cacti.sh

Ścieżkę DESDIR zmienić sobie wg własnego uznania, tak samo jak wysyłanie przez scp i kluczy SSH na serwer w sieci czy internecie.

Cacti Dlink oraz MacTrack

Monitoring to podstawa, tak samo jak backup. Każdy chwali swoje narzędzia, to ja pochwalę swoje. Do monitoringu urządzeń, sieci i wszystkiego innego nie znam lepszego narzędzia od Cacti. Wolnego i darmowego oprogramowania tworzonego przez ludzi z zamiłowania a nie dla pieniędzy. Z jednej strony prostota a z drugiej nieograniczone możliwości. Ale nie o tym tak naprawdę ten wpis.

Dodając do Cacti plugin MacTrack do śledzenia maców, ip, i wszystkiego co można wyciągnąć z przełączników czy routerów w sieci natrafiłem na problem. W jednej z sieci mam switche L3 Dlinka, niestety ale po dodaniu Device Type i poprawnym zdefiniowaniu urządzenia na zakładce mactrack -> Interfaces nie otrzymywałem żadnych danych. Problemem okazał się plik /usr/share/cacti/site/plugins/mactrack/lib/mactrack_dlink.php gdzie trzeba dopisać jedną linijkę.

marcin@cacti:~$ diff -c /usr/share/cacti/site/plugins/mactrack/lib/mactrack_dlink.php.bak /usr/share/cacti/site/plugins/mactrack/lib/mactrack_dlink.php
*** /usr/share/cacti/site/plugins/mactrack/lib/mactrack_dlink.php.bak   2016-08-18 09:34:23.106459397 +0200
--- /usr/share/cacti/site/plugins/mactrack/lib/mactrack_dlink.php       2016-08-18 09:38:37.534464556 +0200
***************
*** 55,60 ****
--- 55,61 ----
                $ifInterfaces[$ifIndex]["ifType"] = $ifTypes[$ifIndex];
                $ifInterfaces[$ifIndex]["linkPort"] = @$link_ports[$ifIndex];
        }
+       $if2 = build_InterfacesTable($device, $ifIndexes, TRUE, TRUE);
        mactrack_debug("ifInterfaces assembly complete.");

        get_dlink_l2_dot1dTpFdbEntry_ports($site, $device, $ifInterfaces, "", TRUE, $lowPort, $highPort);

Wrzucam diffa między oryginałem  a zmienionym plikiem.

Po tej małej zmianie zakładka Interfaces wypełniła się trzema tysiącami pozycji.

Okres wakacyjny nie sprzyja poświęcaniu czasu przy komputerze, kilka nowych wpisów o Cacti się pojawi, jak tylko pogoda się popsuje.

Kolejne wyzwanie, bash i snmpwalk w roli głównej

Ostatnio naszła mnie potrzeba sprawdzić jaki firmware posiadają urządzenia sieciowe w sieci. Prosta sprawa, można zalogować się na każde i sprawdzić, jednak przy ilości idącej w dziesiątki urządzeń nie napawa to optymizmem. Raczej nudnym klikaniem po klawiaturze męczącym bardziej niż praca w budowlance. Do pomocy przychodzi nam prosty skrypt, nawet totalny laik poświęci mniej czasu na naukę i napisanie go niż przeklikanie kilkudziesięciu urządzeń.

Potrzebujemy dwa pliki, jeden z IP urządzeń w formie:

192.168.1.1
...
192.168.10.1
192.168.12.1
192.168.13.1
...

Drugi to skrypt bash, który wykona odpowiednie polecenie pobierając sobie IP z podanego pliku:

#!/bin/bash
SNMPWALK="/usr/bin/snmpwalk"
OID1="iso.3.6.1.2.1.16.19.2.0"
OID2="iso.3.6.1.2.1.1.6.0"
LIST=`cat $HOME/ip.list`
COMMUNITY="public"
SNMPVERSION="1"
echo FIRMWARE
for ip in $LIST
do
 echo $ip
 $SNMPGET -c $COMMUNITY -v$SNMPVERSION $ip $OID1
 $SNMPGET -c $COMMUNITY -v$SNMPVERSION $ip $OID2
done

Zmienne są zmienne i można ustawić swoje, OIDy można zmienić, dodać bardzo łatwo idąc schematem przedstawionym w skrypcie. Pozdrawiam

Tryb Compilance Test w antenach serii M5 z firmware 5.6.5

Czasami zdarza się konieczność zmienić trybu pracy anteny po wybraniu ustawień kraju. Nowszy firmware nie pozwala wybrać ustawień Compilance Test, jednak jest na to prosty sposób. Jeżeli mamy ustawiony tryb Poland na antenie, można w prosty sposób logując się do anteny przez SSH zmienić jej tryb na CT. Oczywiście można zmienić z dowolnego kraju, trzeba tylko podmienić jego kod w poleceniach i zamiast 616 wpisać odpowiedni.

sed -i 's/radio.1.countrycode=616/radio.1.countrycode=511/g' /tmp/system.cfg
sed -i 's/radio.countrycode=616/radio.countrycode=511/g' /tmp/system.cfg
touch /etc/persistent/ct
save
reboot

 

Mikrotik i backup codzienny

Tak jak w przypadku The Dude tak samo przydaje się mieć backup ustawień z urządzeń Mikrotik rozsianych po sieci. Po co utrudniać sobie życie jak można ułatwić, wykorzystując do tego samo urządzenie i automatyzując sam proces. Sam backup polega na wygenerowaniu pliku binarnego .backup oraz pliku tekstowego .rsc. Osobiście wolę mieć oba, pierwszy wgrywam, drugi mam do podglądu wszystkich ustawień.

/system script
add name=FTPBackup owner=admin policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive source=":log info \"\
    Starting Automatic Backup Script Configure By cr0c0dil3\"\r\
    \n:log info \"Modyfikowany przez Marcin Morawiec\"\r\
    \n:global thisdate [/system clock get date]\r\
    \n:global datetimestring ([:pick \$thisdate 4 6] .\"-\" . [:pick \$thisdate 0 3\
    ] .\"-\" . [:pick \$thisdate 7 11])\r\
    \n\r\
    \n/system backup save name=\"\$[/system identity get name]_\$datetimestring\" \
    \r\
    \n:log info \"Backup Please wait...!!!\"\r\
    \nexport compact file=\"\$[/system identity get name]_\$datetimestring\"\
    \_\r\
    \n:log info \"Export Please wait...!!!\"\r\
    \n:delay 5s\r\
    \n:log info \"Sending Backup Mikrotik to FTP Server.............\"\r\
    \n/tool fetch address=ip_address src-path=\"\$[/system identity get name]_\$\
    datetimestring.backup\" user=user password=password port=21 upload=yes \
    ascii=no mode=ftp dst-path=\"/backup/\$[/system identity get name]_\$datetimest\
    ring.backup\"\r\
    \n:log info \"Sending Export Mikrotik to FTP Server.............\"\r\
    \n/tool fetch address=ip_address src-path=\"\$[/system identity get name]_\$\
    datetimestring.rsc\" user=user password=password port=21 upload=yes asc\
    ii=no mode=ftp dst-path=\"/backup/\$[/system identity get name]_\$datetimestrin\
    g.rsc\"\r\
    \n:delay 5s\r\
    \n:log info \"Deleting Backup Files\"\r\
    \n/file remove \"\$[/system identity get name]_\$datetimestring.rsc\"\r\
    \n/file remove \"\$[/system identity get name]_\$datetimestring.backup\"\r\
    \n:log info message=\"Successfully removed Temporary Backup Files\"\r\
    \n:delay 1\r\
    \n:log info \"Finished Backup Script...!!!!\""
  
/system scheduler
add interval=1d name=FTPBackupMT on-event="/system script run FTPBackup" policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive start-date=\
    apr/01/2016 start-time=00:00:15

Skrypt wzorowany jest na znalezionym w internecie tutaj. Przejrzysty, składa się z kilku poleceń. Łatwo można dostosować go do siebie. Pamiętać należy o podaniu swojego IP serwera FTP, użytkownika i hasła oraz ścieżki na serwerze gdzie ma być składowany backup. U mnie backup ląduje na serwerze NAS4FREE gdzie w odstępach tygodniowych protokołem rsync wędrują na kolejnego NASa. W planach jest jeszcze opcja szyfrowania archiwum i wysyłania go na pocztę aby mieć kolejną kopię w innej lokalizacji.

DudeRC i backup codzienny

Są admini którzy robią backup, i tacy którzy zaczną robić. Bardzo prawdziwe słowa, doceni je admin z tej drugiej grupy. Straciłem kiedyś bazę danych Mikrotikowego The Dude, normalna w świecie awaria sprzętu, dysk odmówił działania. Monitorowana sieć jest rozmiaru 300 hostów, syslog z kilkunastu urządzeń. Teraz The Dude stoi na maszynie wirtualnej, dysk jest na macierzy. Jednak przezorny zawsze ubezpieczony, w chwili wolnego czasu wolałem zabezpieczyć się przed jakimś błędem, który skasuje mi dane w programie. Zabezpieczenie przez awarią sprzętu to jedno, awaria przed utratą danych to drugie.

/system script
add name=Dude_backup owner=admin policy=\
 ftp,reboot,read,write,policy,test,password,sniff,sensitive source=":log in\
 fo \"Dude Backup Script by Marcin Morawiec\"\r\
 \n:global thisdate [/system clock get date]\r\
 \n:global datetimestring ([:pick \$thisdate 4 6] .\"-\" . [:pick \$thisdat\
 e 0 3] .\"-\" . [:pick \$thisdate 7 11])\r\
 \n\r\
 \n/dude export-db backup-file=\"Dude_\$datetimestring.backup\" \r\
 \n:log info \"Backup Please wait...!!!\"\r\
 \n:delay 30s\r\
 \n:log info \"Sending Dude Backup to FTP Server.............\"\r\
 \n/tool fetch address=10.0.0.10 src-path=\"Dude_\$datetimestring.backup\
 \" user=Dude password=zaq12wsxcde3 port=21 upload=yes ascii=no mode=ftp ds\
 t-path=\"Dude_\$datetimestring.backup\"\r\
 \n:delay 5s\r\
 \n:log info \"Deleting Backup Files\"\r\
 \n/file remove \"Dude_\$datetimestring.backup\"\r\
 \n:log info message=\"Successfully removed Temporary Backup Files\"\r\
 \n:delay 1\r\
 \n:log info \"Finished Backup Script...!!!!\""

Bazę danych na nowym The Dude w wersji na platformę ROS można optymalizować z racji tego, że jest to baza danych SQLite3, codziennie przed północą mam zaplanowaną optymalizację, a 30min później robiony jest export.

/system scheduler
add interval=1d name=Dude_vacuum-db on-event="/dude vacuum-db" policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive start-date=\
    apr/01/2016 start-time=23:00:00
add interval=1d name=Dude_Backup on-event="/system script run Dude_backup" \
    policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive \
    start-date=apr/01/2016 start-time=23:30:00

Wyedytować trzeba sobie tylko skrypt aby łączyć się do swojego serwera FTP, podać IP, użytkownika i hasło. Oraz do jakiego katalogu ma być wrzucany plik.

sysadmin.it-landscape.info

Podzielę się stroną z której często korzystam jak szukam oprogramowania, które potrzebne mi jest aktualnie do pracy. W jednym miejscu mamy uporządkowane oprogramowanie, możemy porównać je między sobą i sprawdzić jakie mamy odpowiedniki. Serwis jest na bieżąco uaktualniany o nowe oprogramowanie.

sysadmin.it-landscape.info

Logowanie za pomocą klucza SSH

Logowanie za pomocą klucza SSH jest o wiele bezpieczniejsze od logowania się zwykłym hasłem, oraz można wykorzystać je do zautomatyzowania procesu logowania. Takiego sposobu logowania używam praktycznie wszędzie. Czy to serwer z Linuksem, FreeBSD czy innym Uniksem wszędzie gdzie mogę loguję się kluczami SSH. No to zaczynamy:

  1. Górne menu i Access -> Users and Groups, klikamy czerwony plus i dodajemy użytkownika do systemu. Podajemy nazwę, pełną nazwę konta i hasło. Wybieramy mu powłokę, Shell -> bash (ja preferuję bash’a ze względu, że wszędzie gdzie pracuję jest podstawową powłoką). Pamiętamy dodać użytkownikowi dodatkową grupę sshd umożliwiającą logowanie się do usługi SSH. Zapisujemy i zatwierdzamy zmiany.
  2. Logujemy się do systemu za pomocą nowego użytkownika.
    Welcome to NAS4Free!
    [sshuser@piecyk ~]$
  3. Tworzymy katalog domowy dla naszego użytkownika gdzie będziemy trzymać nasz klucz SSH oraz przechodzimy od razu do niego. DATA to jest nasz dysk czy macierz z danymi w systemie.
    [sshuser@piecyk ~]$ mkdir -p /mnt/DATA/sshuser/.ssh
    [sshuser@piecyk ~]$ cd /mnt/DATA/sshuser/.ssh
  4. Generujemy parę kluczy, prywatny oraz publiczny.
    [sshuser@piecyk ~/DATA/sshuser/.ssh]$ ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key (/mnt/.ssh/id_rsa): /mnt/DATA/sshuser/.ssh/id_rsa
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /mnt/DATA/sshuser/.ssh/id_rsa.
    Your public key has been saved in /mnt/DATA/sshuser/.ssh/id_rsa.pub.
    The key fingerprint is:
    28:84:8a:0a:e3:5e:d5:50:dc:20:d5:80:ae:82:cd:66 sshuser@piecyk.local
    The key's randomart image is:
    +--[ RSA 2048]----+
    |     .+==        |
    |   . .o. o       |
    |  . o.           |
    |.. . .o.         |
    |*o  o...S        |
    |=oE...           |
    |.+..             |
    |. .              |
    | .               |
    +-----------------+
  5. Tworzymy plik authorized_keys czyli plik z kluczami publicznymi, za pomocą których możemy się logować do systemu. Tutaj akurat tworzymy go z klucza publicznego naszego klucza prywatnego bo za jego pomocą będziemy się logować.
    [sshuser@piecyk ~/DATA/sshuser/.ssh]$ cp id_rsa.pub authorized_keys
  6. Kopiujemy plik z kluczem prywatnym na nasz docelowy komputer za pomocą SCP, FTP, SMB czy jak nam wygodnie.
  7. Przechodzimy jeszcze raz do Access -> Users and Groups i edytujemy naszego użytkownika. Dodajemy mu katalog domowy, u mnie odpowiednio jest to /mnt/DATA/sshuser
  8. Na komputerze z którego łączę się do serwerów korzystam z programu Putty. Nasz klucz należy przekonwertować programem puttygen na odpowiedni. Menu Conversions -> Import Key. Zmieniamy komentarz, możemy klucz zabezpieczyć hasłem jeżeli nie służy do zautomatyzowanych działań. Zapisujemy go przyciskiem Save private key.
  9. Zapisany klucz ppk podajemy w kategorii SSH -> Auth putty
  10. Jeżeli popranie podaliśmy adres IP oraz port to powita nas zapytanie o nazwę użytkownika. Jeżeli podamy nazwę naszego użytkownika to nastąpi automatyczne logowanie za pomocą klucza prywatnego i uzyskamy dostęp do systemu.
    login as: sshuser
    Authenticating with public key "NAS4FREE Piecyk.local"
    Last login: Tue Feb 23 21:06:25 2016 from 10.0.250.2
    Welcome to NAS4Free!
    [sshuser@piecyk ~]$
  11. Możemy zautomatyzować proces podając na zakładce Data  w polu Auto-login username nasz login, to wtedy putty zaloguje nas automatycznie lub jeżeli podaliśmy hasło do klucza, zapyta o nie.

Możliwości jest bardzo wiele, ustawiając sobie wszystko w Puttym, zapisując sesje i logując się do maszyn kluczami bez haseł można uprościć sobie proces do skrótu na pulpicie. Czyli tworzymy skrót do programu Putty np. na pulpicie. Klikamy PPM na niego i dodajemy w wierszu Element docelowy

C:\programy\putty.exe -load "nazwa_sesji"

Zmieniamy sobie nazwę skrótu na dowolny i teraz uruchamiając taki skrót od razu logujemy się do wybranej maszyny.

MRTG FreeBSD Nginx

Potrzebujemy komputer z zainstalowanym FreeBSD 10.2 oraz dostęp do superużytkownika. Moje środowisko to system NAS4FREE uruchamiany z pendrajwa a na nim tworzone “jaile” w których testuję różne rozwiązania, programy czy skrypty.

1.Instalujemy MRTG

pkg update
pkg install mrtg

Pierwsza komenda uaktualnia bazę pakietów, druga instaluje nam mrtg w systemie razem z zależnościami.

Następnie edytujemy plik w programie vi albo nano (jeżeli nie mamy nano instalujemy go tak samo jak mrtg) /etc/rc.conf i dodajemy linijkę:

mrtg_daemon_enable="YES"

Edytujemy crona aby uruchamiał nam MRTG co 5 min i zbierał statystyki.

crontab -e

Wciskamy “i” i potem wklejamy:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /usr/local/bin/mrtg /usr/local/etc/mrtg/mrtg.cfg

Generujemy plik konfiguracyjny programem cfgmaker

/usr/local/bin/cfgmaker --output=/usr/local/etc/mrtg/mrtg.cfg public@192.168.1.1

gdzie public to jest community na urządzeniu, 192.168.1.1 to ip urządzenia na którym chcemy monitorować ruch.

Ważne jest ustawić popranie ścieżkę WorkDir, zmienić język wyświetlania na stronach na polski i w większości operujemy na bitach przy monitorowaniu prędkości interfejsów.

WorkDir: /usr/local/www/nginx
Options[_]: growright, bits
Language: polish

2.Instalujemy Nginx’a

pkg install nginx

Tak jak w przypadku mrtg, instalujemy pakiet razem z zależnościami. Następnie dodajemy do pliku /etc/rc.conf linijkę:

nginx_enable="YES"

Katalog /usr/local/www/nginx jest dowiązaniem symbolicznym do /usr/local/www/nginx-dist dlatego kasuję to dowiązanie i tworzę normalny katalog obok katalogu nginx-dist i nadaje mu prawa dla mrtg.

rm /usr/local/www/nginx
mkdir /usr/local/www/nginx
chown mrtg:mrtg /usr/local/www/nginx

Tak wygląda plik konfiguracyjny nginx,

worker_processes  1;
events {
    worker_connections  256;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;
        location / {
            root   /usr/local/www/nginx;
            index  index.html index.htm;
            }
        }
    }
}

Uruchamiamy serwer www poleceniem

/usr/local/etc/rc.d/nginx start

Następnie na innym komputerze otwieramy przeglądarkę z adresem IP na którym mamy uruchomiony nasz monitoring i:mrtg