Tag: Linux

OpenWrt 18.06.1 + TP-Link WR841N = Czujnik temperatury cz.3

Jak pisałem w części 2 ostatnim krokiem będzie skonfigurowanie usługi SNMP na naszym czujniku abyśmy mogli monitorować temperaturę poprzez sieć.

Zaczynamy od konfiguracji SNMP. Edytujemy plik /etc/config/snmpd, interesuje nas sekcja

root@OpenWrt:~# nano /etc/config/snmpd
~
config system
        option sysLocation      'Monitorowana szafka' # Pole Location opisujące lokalizację czujnika
        option sysContact       'nasz@adres.email' # Pole Contact opisujące adres email, numer telefonu itp.
        option sysName          'OpenWrt_Temp' # Pole Name opisujęce nazwę urządzenia odczytywaną po SNMP
#       option sysServices      72
        option sysDescr         'OpenWrt Temperatura' # Pole Descryption z opisem urządzenia odczytywanym po SNMP
#       option sysObjectID      '1.2.3.4'
config exec
        option name     Temperatura
        option prog     /bin/cat
        option args     /etc/config/temp.txt
#       option miboid   1.2.3.4
~

Pod Windowsem korzystam z programu SNMPWalk od SolarWinds, jest to mały program pozwalający wykonać polecenie snmpwalk na urządzeniu i wynik zapisać do pliku tekstowego.snmpwalkJeżeli już wszystko ustawiliśmy wg. swoich danych zapisujemy i zamykamy edytor. Usługę snmpd uruchamiamy podobnie do usługi cron poleceniami:

root@OpenWrt:~# /etc/init.d/snmpd start
root@OpenWrt:~# /etc/init.d/snmpd enable

Po tych zabiegach możemy przetestować działanie naszego czujnika temperatury. Możemy przeskanować cały zakres OIDów lub tylko gałąź 1.3.6.1.4.1.2021.8.1, która zawiera dane odnośnie temperatury.

.1.3.6.1.4.1.2021.8.1.1.1 = INTEGER: 1
.1.3.6.1.4.1.2021.8.1.2.1 = STRING: "Temperatura"
.1.3.6.1.4.1.2021.8.1.3.1 = STRING: "/bin/cat /etc/config/temp.txt"
.1.3.6.1.4.1.2021.8.1.100.1 = INTEGER: 0
.1.3.6.1.4.1.2021.8.1.101.1 = STRING: "28"
.1.3.6.1.4.1.2021.8.1.102.1 = INTEGER: 0
.1.3.6.1.4.1.2021.8.1.103.1 = STRING: ""

Dalej możemy już dowolnie takimi danymi zarządzać, przetwarzać itp. U siebie mam dodaną taką czujkę jako urządzenie w Cacti, dodatkowo stworzony template odczytujący dany OID. Utworzony również template w pluginie Thold, monitorujący i alarmujący jeżeli temperatura wychodzi poza górny lub dolny zakres.

Cacti Tempratura SNMP

Cacti Tempratura SNMP

OpenWrt 18.06.1 + TP-Link WR841N = Czujnik temperatury cz.2

Witam w części drugiej, w niej zajmiemy się modyfikacją sprzętową. Dodamy jeden czujnik na jednej z dostępnych linii GPIO. Dostępne linie GPIO sprawdzimy poleceniem:

root@OpenWrt:~# cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 0-31, parent: platform/ath79-gpio, ath79-gpio:
 gpio-3   (                    |tp-link:green:qss   ) out hi
 gpio-4   (                    |tp-link:green:wan   ) out hi
 gpio-11  (                    |tp-link:green:lan4  ) out hi
 gpio-12  (                    |Reset button        ) in  hi
 gpio-13  (                    |tp-link:green:wlan  ) out hi
 gpio-14  (                    |tp-link:green:lan3  ) out hi
 gpio-15  (                    |tp-link:green:lan2  ) out hi
 gpio-16  (                    |tp-link:green:lan1  ) out hi
 gpio-17  (                    |WIFI button         ) in  hi

gpiochip1: GPIOs 494-511, parent: platform/qca953x_wmac, ath9k-phy0:
 gpio-495 (                    |ath9k-phy0          ) in  lo

Sprawdzone i dostępne linie to 11,13,14,15,16. Testowałem linię GPIO3 ale router nie uruchamia się wcale. Innych jeszcze nie miałem czasu przetestować, choć planuję to w najbliższej przyszłości.

Ale wracamy do czujnika temperatury. Potrzebujemy czujnik temperatury DS18B20, zamieszczam kartę produktu: https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf. Do tego rezystor 3.3k przewlekany oraz kilka przewodów do podłączenia.

WR841N_V9 Top

WR841N_V9 Top

WR841N_V9 Bottom

WR841N_V9 Bottom

Wykorzystamy GPIO13 od diody WLAN, jest to druga dioda od lewej patrząc od dołu PCB. Na początek musimy usunąć diodę, można pomóc sobie małą ilością nowej cyny. Potrzebne są też trzy przewody o odpowiedniej długości, które cynujemy po obu stronach. Wszystko łączymy jak na zdjęciu poniżej:

WR841N_V9 DB18B20Jeżeli wszystko mamy przylutowane możemy złożyć router. Podpinamy zasilanie oraz łączymy się z naszym routerem po SSH. Teraz kilka poleceń aby odzyskać linie GPIO używane przez system i wykorzystać je do własnych celów.

Na początek dodajemy zawartość do pliku /etc/rc.local który jest uruchamiany przy starcie:

root@OpenWrt:~# cat /etc/rc.local
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.
/bin/sh /etc/config/leds.sh
exit 0

Tworzymy plik /etc/config/leds.sh i wklejamy do niego zawartość oraz nadajemy mu bit wykonywalności:

root@OpenWrt:~# touch /etc/config/leds.sh
root@OpenWrt:~# cat /etc/config/leds.sh
/bin/echo "leds-gpio" > /sys/bus/platform/drivers/leds-gpio/unbind
/bin/sleep 5
/sbin/insmod w1-gpio-custom bus0=0,13,0
root@OpenWrt:~# chmod +x /etc/config/leds.sh

Plik ten będzie uruchamiany przy starcie systemu. Restartujemy nasz router. Jeżeli wszystko poszło ok to w katalogu /sys/bus/w1/drivers/w1_slave_driver/ powinien pojawić się katalog o nazwie XX-YYYYYYYYYY w moim przypadku jest to:

root@OpenWrt:~# ls -l /sys/bus/w1/drivers/w1_slave_driver/
lrwxrwxrwx    1 root     root             0 Sep 30 12:51 28-00ff984302e5 -> ../../../../devices/w1_bus_master1/28-00ff984302e5
--w-------    1 root     root          4096 Sep 30 13:11 bind
--w-------    1 root     root          4096 Sep 30 13:11 uevent
--w-------    1 root     root          4096 Sep 30 13:11 unbind

Temperaturę odczytujemy drugim skryptem, dodatkowo skrypt tworzy plik tekstowy temp.txt z aktualną temperaturą. Skrypt ten dodany został do crona i jest uruchamiany co pięć minut, częstotliwość można zmienić wg. własnego upodobania.

root@OpenWrt:~# touch /etc/config/temp.sh
root@OpenWrt:~# cat /etc/config/temp.sh
awk -F= '/t=/ {printf "%.0f\n", $2/1000}' /sys/bus/w1/drivers/w1_slave_driver/28-00ff984302e5/w1_slave > /etc/config/temp.txt
root@OpenWrt:~# chmod +x /etc/config/temp.sh

root@OpenWrt:~# touch /etc/crontabs/root
root@OpenWrt:~# cat /etc/crontabs/root
*/5 * * * * /etc/config/temp.sh
root@OpenWrt:~# /etc/init.d/cron start
root@OpenWrt:~# /etc/init.d/cron enable

W tym momencie możemy sprawdzić poprawność skryptów. Możemy uruchomić skrypt ręcznie lub poczekać pięć minut i sprawdzić czy pojawił się plik /etc/config/temp.txt i poleceniem cat /etc/config/temp.txt sprawdzić jego zawartość.

root@OpenWrt:~# cat /etc/config/temp.txt
28

W tym momencie kończymy drugą część, trzecia część będzie już krótka i opisywać będzie uruchomienie usługi SNMP. Konfiguracja i sprawdzenie poleceniem snmpwalk poprawności ustawień.

OpenWrt 18.06.1 + TP-Link WR841N = Czujnik temperatury cz.1

Ostatnio wpadł mi pomysł do głowy na monitorowanie kilku lokalizacji. Chodziło głównie o temperaturę w pomieszczeniu, szafie serwerowej czy wewnątrz skrzyni powieszonej na ścianie czy maszcie. Przeglądając internet i szukając trafiłem na sondy temperatury odczytywanej po SNMP, jednak koszt 300zł był dla mnie mało atrakcyjny. Ilość jakiej potrzebowałem to kilkanaście sztuk, może i więcej. Zainteresowałem się tematem, zmalałem wiele opisów takich sond opartych o routery z wgranym OpenWrt i podpiętym pod USB konwerterem na RS232 i do tego czujnik DS18B20 1-wire. Gra warta świeczki bo koszt takiej czujki spadł nam już w okolice 100zł. Jest o co walczyć, w cenie jednej sondy mamy trzy. Ale dalej wgłębiałem się w temat. OpenWrt jest projektem o wielu możliwościach, może być nie tylko routerem ale też dyskiem sieciowym czy kontrolerem z podpiętymi przekaźnikami na liniach GPIO. Zgłębiając dalej temat znalazłem informację, że na linii GPIO mogę również podłączyć czujnik 1-wire. Zapaliła się lampka w mojej głowie, mam jeden wolny router w szufladzie, jest to wspomniany w temacie WR841N.

Pierwszą sprawą było przygotowanie sobie obrazu OpenWrt dla tego modelu routera. Można skorzystać z gotowego obrazu, jednak nie ma on w standardzie paczek 1-wire a ilość wolnego miejsca jest bardzo skromna. Router jaki posiadam to v9.1, 550MHz, 4MB FLASH oraz 32MB RAM.

Do stworzenia takiego obrazu potrzebujemy środowiska Linuksowego x64. Czy jest to fizyczna maszyna czy wirtualna nie ma znaczenia. Jak zapewnić sobie takie środowisko odsyłam do źródła: Image Builder

Przechodzimy do katalogu ze źródłami. Do budowania obrazów OpenWrt posiłkuję się skryptem:

make -j2 image PROFILE=tl-wr841-v9 PACKAGES="kmod-w1 kmod-w1-master-gpio kmod-w1-gpio-custom kmod-w1-slave-therm terminfo libnetsnmp snmpd libncurses nano base-files busybox dnsmasq dropbear -firewall fstools -ip6tables -iptables kernel kmod-ath9k kmod-gpio-button-hotplug libc libgcc logd mtd netifd -odhcp6c -odhcpd-ipv6only opkg -ppp -ppp-mod-pppoe swconfig uboot-envtools uci uclient-fetch wpad-mini"

Krótkie wyjaśnienie parametrów w skrypcie:

  • -j2 oznacza kompilowanie w dwóch wątkach jednocześnie, w zależności od ilości rdzeni/procesorów na maszynie gdzie budujemy obrazy
  • image PROFILE=tl-wr841-v9 oznacza pod jaki router budujemy obraz, bez tego parametru będziemy budować obrazy dla każdego rodzaju routera co znacząco wydłuży czas budowy i będzie marnotrawieniem czasu
  • lista PACKAGES zawiera jakie pakiety będą dodane lub usunięte (te z – na początku nazwy) z budowanego obrazu

W katalogu bin/targets/ar71xx/tiny/ znajdują się nasze obrazy:

marcin@openwrt:~/openwrt1806_wr841n$ ls -l bin/targets/ar71xx/tiny/
razem 22012
-rw-r--r-- 1 marcin users    1678 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-device-tl-wr841-v9.manifest
-rw-r--r-- 1 marcin users 2490368 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-root.squashfs
-rw-r--r-- 1 marcin users 3932160 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-tl-wr841-v9-squashfs-factory.bin
-rw-r--r-- 1 marcin users 3538948 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-tl-wr841-v9-squashfs-sysupgrade.bin
-rw-r--r-- 1 marcin users 1348203 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-uImage-lzma.bin
-rwxr-xr-x 1 marcin users 4234996 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-vmlinux.bin
-rwxr-xr-x 1 marcin users 4240120 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-vmlinux.elf
-rw-r--r-- 1 marcin users 1376256 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-vmlinux.lzma
-rwxr-xr-x 1 marcin users 1358324 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-vmlinux-lzma.elf
-rw-r--r-- 1 marcin users    1027 wrz 28 14:31 sha256sums

Jeżeli mamy router z fabrycznym oprogramowaniem to wybieramy obraz *-factory.bin, jeżeli mamy już wgranego OpenWrt to wybieramy obraz *-sysupgrade.bin. W nowych fabrycznych firmware jest ograniczenie ilości znaków w nazwie wgrywanego obrazu, przed wybraniem go trzeba sobie skrócić jego nazwę. Jeżeli dodajemy jakieś paczki do budowanego obrazu to przed wgrywaniem go na router należy sprawdzić jego rozmiar, powinien być zawsze 3932160, jeżeli jest więcej to przesadziliśmy z ilością pakietów i taki obraz nie wgra się poprawnie.

Jeżeli wszystko poszło ok to router rozdziela adresy IP na portach LAN, na porcie WAN jest klient DHCP czekający na adres. Po instalacji router ma aktywny telnet. Należy za jego pomocą zalogować się jako root do routera, nie ma hasła, i ustawić hasło poleceniem passwd. Jeżeli ustawimy hasło, serwer telnet zostanie wyłączony i zarządzamy naszym routerem poprzez klienta SSH.

Dla ww. wersji użycie pamięci FLASH ma się jak poniżej:

root@OpenWrt:~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                 2.0M      2.0M         0 100% /rom
tmpfs                    13.6M     60.0K     13.6M   0% /tmp
/dev/mtdblock3          512.0K    240.0K    272.0K  47% /overlay
overlayfs:/overlay      512.0K    240.0K    272.0K  47% /
tmpfs                   512.0K         0    512.0K   0% /dev

Mamy przygotowany system do pracy z sensorami na 1-wire, w tym czujnikiem temperatury DS18B20. W części drugiej będzie o tym jak podłączyć czujnik pod jedną diodę LED routera i wykorzystać GPIO do odczytu temperatury z czujnika.

Debian 9.0 oraz AirControl 2.1 Beta6

Ostatnio miałem potrzebę przenieść instalację AC2 z jednej maszyny na drugą. Dodatkowo zrobić uaktualnienie do najnowszej wersji beta.

Potrzebujemy maszynę z zainstalowanym podstawowym systemem Debian 9.0, jest to najnowsze stabilne wydanie na obecną chwilę.

Logujemy się na konto root i wydajemy polecenie zainstalowania potrzebnych zależności:

apt-get install default-jdk iperf

W drugim kroku pobieramy binarny pakiet AirControl2.

wget https://fw-download.ubnt.com/data/airControl/680a-unix64-v2.1.0-beta6-7a3591a4c8f646988255f12caa6dac58.bin
mv 680a-unix64-v2.1.0-beta6-7a3591a4c8f646988255f12caa6dac58.bin aircontrol2.1-beta6.bin
chmod +x aircontrol2.1-beta6.bin

Uruchamiamy binarkę i przystępujemy do instalacji serwera AirControl2.

./aircontrol2.1-beta6.bin

Na większość pytań odpowiadamy w domyślnych ustawieniach, instalujemy załączoną bazę danych Postgresql, podajemy hasło dla bazy danych oraz nazwę użytkownika i hasło.

Aby przenieść kopię zapasową ze starej instalacji na nową, na starym serwerze z poziomu klienta AC2 wykonujemy kopię zapasową. Znajduje się ona w folderze

/opt/Ubiquiti/AirControl2/lib/db/

Przenosimy ją za pomocą scp na drugą maszynę i kopiujemy do takiego samego katalogu. Ustawiamy prawa dla pliku aby AC2 ją widział.

chown root:root /opt/Ubiquiti/AirControl2/lib/db/dbbackups/v2.1.0.BETA6_*.pgdmp

Łączymy się za pomocą klienta do nowego serwera i przywracamy za jego pomocą przesłaną kopię zapasową. Serwer AC2 uruchomi się ponownie z przywróconymi danymi.

Cacti 1.0.4 + Spine 1.0.4 na Ubuntu 16.04 LTS

Jakiś czas temu wydano Cacti 1.0. Poczekałem chwilę aby wszystkie bolączki wieku dziecięcego zostały usunięte i przystąpiłem do aktualizacji już posiadanych.

Każda aktualizacja wygląda inaczej dlatego przedstawię instalację nowego Cacti + kompilacja Spine.

Jest to instalacja manualna z racji, że cacti mamy 0.8.8f a spine 0.8.8b.

Potrzebne pakiety na nowej czystej instalacji Ubuntu 16.04 LTS:

apt install gcc apache2 libapache2-mod-php snmpd snmp snmp-mibs-downloader libsnmp-base libsnmp-dev libssl-dev libc-dev libc6-dev make php php-snmp php-xml php-gd php-common php-gmp php-ldap php-mbstring php-mysql mysql-server mysql-client libmysqlclient-dev help2man rrdtool git

Po instalacji php ustawiamy timezone

timedatectl set-timezone Europe/Warsaw
nano /etc/php/7.0/apache2/php.ini
date.timezone = Europe/Warsaw

Pobieramy Cacti z oficjalnej strony cacti.net i nadajemy uprawnienia dla serwera Apache

wget http://www.cacti.net/downloads/cacti-1.0.4.tar.gz
tar xvzf cacti-1.0.4.tar.gz
mv cacti-1.0.4 /var/www/html/cacti
chown -R www-data:www-data /var/www/html/cacti

Dodajemy konfigurację dla serwera www

nano /etc/apache2/conf-enabled/cacti.conf

Zawartość pliku:

Alias /cacti /var/www/html/cacti
<Directory /var/www/html/cacti>
        Options +FollowSymLinks
        AllowOverride None
        <IfVersion >= 2.3>
                Require all granted
        </IfVersion>
        <IfVersion < 2.3>
                Order Allow,Deny
                Allow from all
        </IfVersion>

        AddType application/x-httpd-php .php

        <IfModule mod_php.c>
                php_flag magic_quotes_gpc Off
                php_flag short_open_tag On
                php_flag register_globals Off
                php_flag register_argc_argv On
                php_flag track_vars On
                # this setting is necessary for some locales
                php_value mbstring.func_overload 0
                php_value include_path .
        </IfModule>

        DirectoryIndex index.php
</Directory>

Ustawiamy bazę mysql, użytkownika i hasło. Pierwszy krok to ustawienie hasła mysql dla root’a

mysqladmin password
cd /var/www/html/cacti
nano include/config.php
mysql -p

logujemy się ustawionym przed chwilą hasłem do serwera mysql i wydajemy polecenia

> CREATE DATABASE cacti
> grant all privileges on cacti.* to user@'localhost' identified by 'password';
> grant select on mysql.time_zone_name to user@'localhost' identified by 'password';

Edytujemy plik konfiguracyjny serwera mysql i dodajemy w sekcji [mysqld]

#
# Cacti Server
#

collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4
max_heap_table_size = 256M
max_allowed_packet = 16777216
tmp_table_size = 64M
join_buffer_size = 64M
innodb_file_per_table = on
innodb_doublewrite = off
innodb_buffer_pool_size = 512M
innodb_flush_log_at_trx_commit = 2

Tworzymy strukturę bazy danych oraz dodajemy strefy czasowe do bazy danych

mysql -p cacti < cacti.sql
mysql_tzinfo_to_sql  /usr/share/zoneinfo | mysql -p mysql

Na koniec pobieramy i kompilujemy spine, kompilacja powinna potrwać chwilę.

wget http://www.cacti.net/downloads/spine/cacti-spine-1.0.4.tar.gz
tar xvzf cacti-spine-1.0.4.tar.gz
cd cacti-spine-1.0.4
./configure
make
make install

Teraz kończymy instalację przez przeglądarkę wchodząc na stronę http://adres.ip/cacti/ i akceptujemy warunki licencji, przechodzimy dalej, jeżeli brakuje nam wymienionych modułów dodajemy je poprzez apt.

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.