Browsed by
Tag: Debian

Domácí server s Debianem a Libvirtem s VLAN

Domácí server s Debianem a Libvirtem s VLAN

Úvod

Asi každý potřebuje v dnešní době mít doma nějaký ten server, se síťovými službami jako je NAS, DLNA, kamerový systém a mnoho dalších. Jak už tomu v oblasti IT bývá, možností, jak to zajistit je víc. Velké množství lidí sáhne po hotových řešení v podobě různých NAS serverů od Synology, QNAP, apod. Já bych vám rád představil jinou cestu, která je mnohem více flexibilní a přitom není finančně náročná.
Jedná se o využití serveru s virtualizační technologií, openvswitchem s podporou VLAN (případně bez, pokud váš router / switch VLANy nepodporuje). Výhoda je právě ta flexibilita. Na serveru máte virtualizační technologii, která vám umožňuje vytvářet dílčí virtuální servery podle potřeby a navíc v různých segmentech VLAN. To umožní odseparovat od sebe jednotlivé síťové služby s ohledem na bezpečnost.
Virtualizačních technologií je spousta. Já jsem jich postupně vyzkoušel několik. Za zmínku stojí:

  • VMware vSphere Hypervisor – dost striktní z pohledu potřebného HW. Na mém serveru bohužel nefungovalo PCI Passthrough, takže jsem ho rychle zavrhl
  • Xenserver – Toto řešení je sice na první pohled hezké, ale … Ideální pro provoz v clusteru. Jako samostatný server se mi neosvědčilo. Často vydávané aktualizace vedou k pravidelným restartům, což se v případě clasterového řešení vyřeší převodem virtuálního serveru z jednoho Xenserveru na jiný v rámci clasteru a následnému restartu.
  • Qemu (KVM) – To je cesta, která se mi ve spojení s Libvirtem osvědčila a tedy ji dále rozvedu

Server

V podstatě lze použít jakýkoliv stroj, který má v sobě procesor s podporou VT-x (v postatě všechny dnešní procesory Intel a AMD)
Pokud budete chtít virtuálnímu serveru předat z fyzického nějakou PCI kartu, budete potřebovat ještě VT-d. Zde pozor, VT-d už taková samozřejmost není a je třeba zkontrolovat podporu u procesoru, čipové sady a díky občasné chybné implementaci BIOSu MB i to nemusí být zárukou, i když v poslední době se to hodně zlepšilo. USB lze předávat i bez VT-d.
Co se týče zvoleného CPU a množství RAM, je třeba to uvážit na základě toho, kolik virtuálů budete provozovat a jak náročné na výkon procesoru budou. Raději volit rezervu.
Pro představu:

  • Já mám doma 3 roky starou I5 4670T a 32 GB RAM. Aktuálně provozuji 13 virtuálních serverů.
  • Vloni jsem kamarádovi postavil servřík na MB s integrovaným intelem N3150 s 16GB RAM a provozuje bez problémů 5 virtuálů.
  • Soused si vloni koupil repasovaný server od HP s XEONem 2. generace a 32 GB RAM za cca 7000,-. Dokoupil 3 TB WD Red a taky na tom má nějakých 10 virtuálů.

Ještě je vhodné, aby server měl 2 síťové rozhraní, jedno pro správu a jedno pro vswitch – není ale podmínkou
Počet SATA portů podle počtu HDD, které chcete připojit.
Jako disky se mi osvědčili WD Red

Systém

Jako systém budeme v našem návodu předpokládat Debian 9 Stretch, kterého určitě doporučuji pro jeho stabilitu …
Návod by měl být do jisté míry kompatibilní s debianími deriváty (Ubuntu, Mint, …), nicméně u těchto systémů nejsem v případě dotazů schopen zaručit 100% podporu z mé strany.
Debiana si nainstalujeme bez grafického prostředí, protože to samozřejmě nebudeme potřebovat.

Libvirt

Nejprve si nainstalujeme Libvirt a Openvswitch(OvS):

sudo apt-get install libvirt-daemon-system openvswitch-switch

Konfigurace OvS

Zkontrolujeme existenci patche v /etc/init.d/openvswitch-switch

sudo nano /etc/init.d/openvswitch-switch

Musí existovat řádek SYSTEMCTL_SKIP_REDIRECT=yes za _SYSTEMCTL_SKIP_REDIRECT=yes

### END INIT INFO

(test -x /usr/sbin/ovs-vswitchd && test -x /usr/sbin/ovsdb-server) || exit 0

_SYSTEMCTL_SKIP_REDIRECT=yes
SYSTEMCTL_SKIP_REDIRECT=yes

. /usr/share/openvswitch/scripts/ovs-lib

Nejprve zjistíme jaká síťová rozhraní máme v systému:

ip a

Něco takového nám vyjede. V ukázce jsou 2 fyzické síťové rozhraní eth0 a eth1

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master ovs-system state UP group default qlen 1000
    link/ether 01:01:01:01:01:54 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 01:01:01:01:01:7a brd ff:ff:ff:ff:ff:ff
    inet 192.168.xxx.xxx/24 brd 192.168.xxx.255 scope global eno1
       valid_lft forever preferred_lft forever

Musíme se rozhodnout, jak které rozhraní použijeme. Jedno pro management a jedno pro OvS. Pokud máme jen jedno, není co rozhodovat. Bude sloužit pro obojí.
Nyní si upravíme nastavení sítě.

sudo nano /etc/network/interfaces

eth0 a eth1 si nahraďte svými hodnotami
Případ pro 1 LAN (eth0):

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

#allow-hotplug eth0
#iface eth0 inet dhcp

# OvS
allow-ovs br0
iface br0 inet static
    address 192.168.1.2
    netmask 255.255.255.0
    gateway 192.168.1.1
    ovs_type OVSBridge
    ovs_ports eth0

allow-br0 eth0
iface eth0 inet manual
    ovs_bridge br0
    ovs_type OVSPort

Pokud přidělujeme adresu pomocí DHCP, zadáme v řádku iface br0 inet static namísto static hodnotu dhcp a následně vynecháme řádky address, netmask a gateway

Případ pro 2 rozhraní (eth0 a eth1):

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
    address 192.168.1.2
    netmask 255.255.255.0
    gateway 192.168.1.1

# OvS
allow-ovs br0
iface br0 inet manual
    ovs_type OVSBridge
    ovs_ports eth1

allow-br0 eth1
iface eth1 inet manual
    ovs_bridge br0
    ovs_type OVSPort

V případě DHCP u eth0 analogicky stejně jako u 1 rozhraní.

Nyní restarujeme systém.

sudo reboot

Konfigurace Libvirt

Nejprve se přidáme do skupin libvirt a libvirt-qemu (username nahraďte svým):

sudo adduser <username> libvirt
sudo adduser <username> libvirt-qemu

Obecné info

Konfigurační soubory jsou uloženy v /etc/libvirt a postupně se tam přidávají definice síťí, virtuálů, …
Data jsou uložena ve /var/lib/libvirt
V cestě pro data je třeba mít dost prostoru, protože tam budou i diskové img virtuálů, pokud se nerozhodnete využívat LVM (to v tomto návodu ale není popsáno).
Pokud vám umístění dat nevyhovuje, lze adresáře /var/lib/libvirt přenést jinam a udělat na něj link z /var/lib/libvirt na nové umístění.
Konfigurace se provádí z příkazového řádku pomocí příkazu virsh. Připojení k libvirtu se provádí pomocí příkazu

virsh --connect qemu:///system

v případě lokálního libvirtu, nebo

virsh -c qemu+ssh://<username>@<ip_address>/system

Dále existuje grafický nástroj Virtual Manager (balíček virt-manager), který ovšem je vždy trošičku pozadu v podpoře nových technologií. Virtual Manager bohužel neexistuje pro Windows.

Definování sítě s VLANy

OvS již máme nakonfigurovaný, a tak nyní provedeme konfiguraci v libvirtu. Nejprve si připravíme konfigurační XML soubor:

cd
nano ovs-vlan.xml

Vložíme následující, s úpravami dle místních potřeb. Jeden segment by měl být defaultní:

<network>
  <name>ovs-vlan</name>
  <forward mode='bridge'/>
  <bridge name='br0'/>
  <virtualport type='openvswitch'/>
  <portgroup name='vlan-100' default='yes'>
    <vlan>
      <tag id='100'/>
    </vlan>
  </portgroup>
  <portgroup name='vlan-200'>
    <vlan>
      <tag id='200'/>
    </vlan>
  </portgroup>
  <portgroup name='vlan-300'>
    <vlan>
      <tag id='300'/>
    </vlan>
  </portgroup>
  <portgroup name='vlan-400'>
    <vlan>
      <tag id='400'/>
    </vlan>
  </portgroup>
  <portgroup name='vlan-500'>
    <vlan>
      <tag id='500'/>
    </vlan>
  </portgroup>
</network>

Pokud VLAN nechceme, použijeme následují XML:

<network>
  <name>ovs-vlan</name>
  <forward mode='bridge'/>
  <bridge name='br0'/>
  <virtualport type='openvswitch'/>
  <portgroup name='default' default='yes'>
  </portgroup>
</network>

Nyní se připojíme k libvirtu:

virsh --connect qemu:///system

a vytvoříme síť, spustíme jí, nastavíme jí jako automaticky spouštěnou a opustíme virsh:

net-define /home/<username>/ovs-vlan.xml
net-start ovs-vlan
net-autostart ovs-vlan
quit

Definování virtuálního serveru

Protože v případě virtuálních serverů narozdíl od virtuálních pracovních stanic nové technologie typu GPU Passthrough, Virtio-GPU, … obvykle nepotřebujeme, doporučuji nainstalovat si někam Debianí desktop s Virtual Managerem (případně lze vyřešit pomocí VM ve Windows pomocí VirtualBoxu, …) a nakonfigurovat si virtuální servery pomocí něho.

Storage

Po instalaci libvirtu je aktivní storage repositář “default”, který odkazuje do /var/lib/libvirt/images
Je možné přidat další. Já např. přidávám “iso”, který odkazuje na /var/lib/libvirt/iso a do něj si dávám CD instalační image Debiana, případně něčeho dalšího, co budu instalovat vícekrát. Stáhnout cd image z internetu můžete pomocí příkazu wget .

Defaultně je jako disk využíván image QCOW2. Pomocí příkazu qemu-img lze vytvořit image qcow2, který se automaticky zvětšuje dle obsazeného místa, neboli určujete maximální velikost a image v reálu zabere pouze tolik místa, kolik dosud maximálně obsahoval. Image pak přiřadíte v průvodci při vytvoření VM ve Virtual Manageru.
Vytvoření 50GB image test.qcow2:

cd /var/lib/libvirt/images
qemu-img create -f qcow2 test.qcow2 50G

Maximální velikost image lze pozdějí zvětšit. Zmenšit nelze.
Zvětšení o 20GB:

qemu-img resize test.qcow2 +20G

Další možnosti příkazu qemu-img si zobrazíte pomocí qemu-img –help

Zdroje informací

https://libvirt.org/
https://www.qemu.org/
https://www.openvswitch.org/
https://www.debian.org/

MBUSD – sw modbus gateway jako náhrada za Modbus extension

MBUSD – sw modbus gateway jako náhrada za Modbus extension

Úvod

Pokud potřebujete v Loxone komunikovat se zařízeníma pomocí Modbus RTU protokolu, máte několik možností, jak daný problém vyřešit. Buď koupit drahý Modbus extension, nebo si koupit převodník Modbus RTU <-> TCP, nebo využít svého domácího servříku a zprovoznit sw gateway. S ohledem na cenu a kybernetickou bezpečnost je volba jasná. Sw gateway, která má otevřený zdrojový kod. K provozování budeme potřebovat nějaký stroj s linuxem a převodník USB-RS485. V našem návodu použijeme stroj s nainstalovaným Debianem. Není třeba instalovat grafické prostředí – zbytečně zabírá operační paměť a reálně ho vůbec nepotřebujeme. Převodník propojíme se zařízeníma, ze kterých chcete číst, připadně zapisovat modbus registry a zasuneme do USB portu linuxového stroje. Pokud doma ještě nemáme linuxový server, může posloužit i obyčejné raspbery, banán, orange, … Převodník USB-RS485 se dá koupit na Aliexpressu od jednoho do několika $.

Update 31.03.2018: Nově jsem vytvořil plugin do LoxBerry, takže kdo má LoxBerry, tak pouze nainstaluje plugin a má hotovo. Konfigurace je jednoduchá přes Webové rozhraní pluginu. http://www.loxwiki.eu/display/LOXBERRY/Modbus+Gateway

MBUSD

Nyní nainstalujeme potřebné náležitosti, stáhneme MBUSD a provedeme kompilaci:

sudo -s
apt-get install git linux-headers-`uname -r` build-essential uucp eclipse-cdt-autotools
cd /usr/local/src/
git clone https://github.com/3cky/mbusd.git mbusd.git
cd mbusd.git
mkdir -p build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make
make install

Po úspěšné kompilaci můžeme vyzkoušet spuštěním příkazu mbusd s patřičnými parametry. Použil jsem následující:

sudo mbusd -d -p /dev/ttyUSB0 -s 9600 -P 502 -v2

kde:

  • /dev/ttyUSB0 je port na kterém máte převodník
  • 9600 je přenosová rychlost RS485 a tedy i modbus zařízení (tu je třeba mít stejnou s tou, která je na zařízeních – většina zařízení ji umožňuje měnit)
  • 502 je TCP Port
  • V2 je úroveň ukecanosti logu

Parametry si upravíte podle svých potřeb.

Příkaz mbusd –help vyjede komplexnější popis, nicméně vám pravděpodobně bude stačit to, co jsem uvedl.
Při ladění je dobré využít parametr -d, který zabrání spuštění na pozadí, případně můžete zvýšit ukecanost až na -v9.

Autoři dodělali podporu systemd, takže lze všechno krásně provozovat jako 1 – n služeb.
Službu spustíte příkazem sudo systemctl start [email protected] kde ttyUSBx je port s převodníkem. Služba se spustí s konfigurací dle /etc/mbusd/mbusd-ttyUSBx.conf
Příklad konfigurace s převodníkem jako ttyUSB0:

sudo nano /etc/mbusd/mbusd-ttyUSB0.conf

Vložíme a uložíme:

########## Serial port settings #############

# Serial port device name
device = /dev/ttyUSB0

# Serial port speed
speed = 9600

# Serial port mode
mode = 8n1

# RS-485 data direction control type (addc, rts, sysfs_0, sysfs_1)
trx_control = addc

# Sysfs file to use to control data direction
# trx_sysfile =

############# TCP port settings #############

# TCP server port number
port = 502

# Maximum number of simultaneous TCP connections
maxconn = 32

# Connection timeout value in seconds
timeout = 60

######### Request/response settings #########

# Maximum number of request retries
retries = 3

# Pause between requests in milliseconds
pause = 100

# Response wait time in milliseconds
wait = 500

Po uložení spustíme službu a nastavíme její automatické spouštění:

sudo systemctl start [email protected]
sudo systemctl enable [email protected]

A analogicky stejně si můžeme vytvořit n dalších slžeb pro další převodníky třeba s jinými paremetry v konfiguračním souboru.
Je třeba pamatovat, že co služba, to samostatný převodník.

V loxone je třeba přidat modbus server. Stoupnete si na Komunikace Miniserveru a kliknete na ikonku Modbusserver.
Vyplníte název – např.: MBUSD
Adresa – <IP_stroje_s_mbusd>:<port_mbusd> (např.: 192.168.1.10:502)
Čekající doba startu jsem dal 5
Timeout jsem dal 500

Dále již zbývá pouze vložit modbus zařízení a jeho senzory (čtení), případně aktory (zápisy), nebo vybrat z předdefinovaných zařízení.

Já čtu elektroměry Eastron SDM630 (třífázový) a SDM120 (jednofázový). Loxone má SDM630 předdefinovaný a SDM120 funguje na tu samou konfiguraci, akorát si vyházíte senzory pro 2. a 3. fázi. Oproti použití s Modbus extension jsem ve všech senzorech elektroměru musel zaškrtnout parametr Pořadí registru. SDM630 se dá na Aliexpressu koupit za necelých 80$, SDM120 za 22$. Pozor, vyrábí se i verze bez modbus!

Autor článku: Zmáťa

Logování – vzdálený syslog

Logování – vzdálený syslog

Úvod

Loxone nabízí možnost využití vzdáleného logu, tedy odesílání zpráv logu do logu na jiném zařízení. Výhoda je jasná – logování na SD kartu Loxone snižuje životnost SD karty a navíc na vzdáleném stroji si můžete log analyzovat. K tomu, aby šlo vzdálený log využít, potřebujeme nějaký stroj s Linuxem, nainstalovaným balíčkem rsyslog, webovým serverem s PHP (volitelně s databází). V našem návodu použijeme stroj s nainstalovaným Debianem. Není třeba instalovat grafické prostředí – zbytečně zabírá operační paměť a reálně ho vůbec nepotřebujeme. Já osobně používám virtuální server na svém domácím serveru.

LoxBerry plugin

Od 4.4.2018 je celé řešení k dispozici jako plugin Syslog Server do LoxBerry.

Rsyslog

V Debianu by měl být rsyslog defaultně nainstalovaný. Pokud není, nainstaluje se pomocí:

sudo apt-get install rsyslog

Následně provedeme konfiguraci:

sudo nano /etc/rsyslog.conf

Odkomentujeme řádky týkající se přístupu přes UDP a TCP:

# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

Dále pak zakomentujeme řádek s definicí formátu datumu, abychom měli plný timestamp:

#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
#$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

Dále vytvoříme konfiguraci pro Loxone:

sudo nano /etc/rsyslog.d/loxone.conf

A vložíme do ní konfiguraci přesměrování zpráv z Loxone do samostatného Log souboru.
192.168.1.10 nahradíme adresou Loxone miniserveru:

# změnit skupinu vytvořeného logu na www-data, aby ji mohl číst LogAnalyzer
$FileGroup www-data

# zpracuj zprávy z Loxone do separátního souboru
:fromhost-ip, isequal, "192.168.1.10" /var/log/loxone.log
& ~
# pouze zprávy odjinud než z Loxone budou pokračovat dál

# Vrátit skupinu pro ostatní Logy na default
$FileGroup adm

Restartujeme Rsyslog:

sudo service rsyslog restart

Nastavení Loxone

V Loxone Configu si ve stromu rozbalíme položku Miniserveru, stoupneme na “Zprávy” a klikneme na ikonku Logger. Tím vložíme nový Logger. Přidělíme mu jméno dle libosti a adresu /dev/syslog/<ip_log_serveru>
Pak již běžně přiřazujeme Logger

Analyzování

Adiscon Log Analyzer

K provozování potřebujeme nainstalovat na logserver webserver a php:
(pokud používáte již existující stroj s PHP, zkontrolujte, že máte v apache2 nainstalovaný a aktivovaný mode php; na čisté instalaci se vše provede samo)

sudo apt-get install apache2 php

Stáhneme z oficiálních stránek: http://loganalyzer.adiscon.com/ Cestu za příkazem wget samozřejmě změníme na aktuální. Adekvátně k tomu pak všechny příkazy s loganalyzer-4.1.6 upravit na adekvátní název souboru / adresáře.
Pak rozbalíme a obsah adresáře src zkopírujeme do /var/www/loganalyzer
Pak změníme vlastníka:

wget http://download.adiscon.com/loganalyzer/loganalyzer-4.1.6.tar.gz
sudo tar -xvzf loganalyzer-4.1.6.tar.gz
sudo rm loganalyzer-4.1.6.tar.gz
sudo mkdir /var/www/loganalyzer
sudo cp -r loganalyzer-4.1.6/src/* /var/www/loganalyzer
sudo chown -Rv www-data:www-data /var/www/loganalyzer

Nyní si zkonfigurujeme webserver pro loganalyzer. Vytvoříme soubor /etc/apache2/conf-available/loganalyzer.conf:

sudo nano /etc/apache2/conf-available/loganalyzer.conf

a vložíme do něho následující:

Alias /loganalyzer "/var/www/loganalyzer/"

<Directory /var/www/loganalyzer/>
  Options +FollowSymlinks
  AllowOverride All
  Satisfy Any

 <IfModule mod_dav.c>
  Dav off
 </IfModule>

 SetEnv HOME /var/www/loganalyzer
 SetEnv HTTP_HOME /var/www/loganalyzer

</Directory>

Uděláme link pro aktivaci a restartneme webserver:

sudo ln -s /etc/apache2/conf-available/loganalyzer.conf /etc/apache2/conf-enabled/loganalyzer.conf
sudo service apache2 restart

Upravíme parser “misc” pro potřeby Loxone. Jedná se o upravený standardní parser pro syslog. Pro každý ze sedmi typů řádku v syslogu jsem přidal MESSAGETYPE Loxone1 – 7, aby bylo jednoduché určit, která část parseru je případně třeba upravit. V současné době je upravena Loxone2 a Loxone6 – to je log s jednoduchým datumem a precisním datumem, oba odpovídající tomu, co mi posílá Loxone. Pokud se někomu objeví jiný MESSAGETYPE, je třeba odladit další část parseru

sudo nano /var/www/loganalyzer/classes/logstreamlineparsermisc.class.php

A celý obsah nahradíme tímto:

<?php
/*
        *********************************************************************
        * LogAnalyzer - http://loganalyzer.adiscon.com
        * -----------------------------------------------------------------     *
        * Loxone Smart Home Miniserver Log Parser Class 
        *********************************************************************
*/

// --- Avoid directly accessing this file! 
if ( !defined('IN_PHPLOGCON') )
{
        die('Hacking attempt');
        exit;
}
// --- 

// --- Basic Includes
require_once($gl_root_path . 'classes/enums.class.php');
require_once($gl_root_path . 'include/constants_errors.php');
require_once($gl_root_path . 'include/constants_logstream.php');
// --- 


class LogStreamLineParsermisc extends LogStreamLineParser {
//      protected $_arrProperties = null;

        // Constructor
        public function __construct () {
                return; // Nothing
        }
        public function LogStreamLineParsermisc() {
                self::__construct();
        }

        /**
        * ParseLine
        *
        * @param arrArguments array in&out: properties of interest. There can be no guarantee the logstream can actually deliver them.
        * @return integer Error stat
        */
       public function ParseLine($szLine, &$arrArguments)
        {
                // Sample (Syslog): Mar 10 14:45:44 debandre anacron[3226]: Job `cron.daily' terminated (mailing output)
                if ( preg_match("/(...)(?:.|..)([0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}) ([a-zA-Z0-9_\-\.]{1,256}) ([A-Za-z0-9_\-\/\.]{1,32})\[(.*?)\]:(.*?)$/", $szLine, $out ) )
                {
                        $arrArguments[SYSLOG_MESSAGETYPE] = 'Loxone1';
                        // Copy parsed properties!
                        $arrArguments[SYSLOG_DATE] = GetEventTime($out[1] . " " . $out[2]);
                        $arrArguments[SYSLOG_HOST] = $out[3];
                        $arrArguments[SYSLOG_SYSLOGTAG] = $out[4];
                        $arrArguments[SYSLOG_PROCESSID] = $out[5];
                        $arrArguments[SYSLOG_MESSAGE] = $out[6];
                }
                // Sample (Syslog): Mar 10 14:45:39 debandre syslogd 1.4.1#18: restart
                else if ( preg_match("/(...)(?:.|..)([0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}) ([a-zA-Z0-9_\-\.]{1,256}) ([A-Za-z0-9_\-\/\.]{1,32}):(.*?)$/", $szLine, $out ) )
                {
                        $arrArguments[SYSLOG_MESSAGETYPE] = 'Loxone2';
                        $loxone = $out[3]. ';'. $out[4].':'.  $out[5]. $out[6];
                        $loxone = str_replace(': ',':',$loxone);
                        $loxone = str_replace('#015','',$loxone);
                        $loxone = str_replace('#01','',$loxone);
                        $loxout = explode(';',$loxone);
                        // Copy parsed properties!
                        $arrArguments[SYSLOG_DATE] = GetEventTime($loxout[0]. ' '. $loxout[1]);
                        $arrArguments[SYSLOG_PROCESSID] = $loxout[2];
                        $arrArguments[SYSLOG_MESSAGE] = $loxout[3];
                }
                // Sample (Syslog): Mar 10 14:45:39 debandre syslogd restart
                else if ( preg_match("/(...)(?:.|..)([0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}) ([a-zA-Z0-9_\-\.]{1,256}) ([A-Za-z0-9_\-\/\.]{1,32}) (.*?)$/", $szLine, $out ) )
                {
                        $arrArguments[SYSLOG_MESSAGETYPE] = 'Loxone3';
                        // Copy parsed properties!
                        $arrArguments[SYSLOG_DATE] = GetEventTime($out[1] . " " . $out[2]);
                        $arrArguments[SYSLOG_HOST] = $out[3];
                        $arrArguments[SYSLOG_SYSLOGTAG] = $out[4];
                        $arrArguments[SYSLOG_MESSAGE] = $out[5];
                }
                // Sample (Syslog): Mar 7 17:18:35 debandre exiting on signal 15
                else if ( preg_match("/(...)(?:.|..)([0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}) (.*?) (.*?)$/", $szLine, $out ) )
                {
                        $arrArguments[SYSLOG_MESSAGETYPE] = 'Loxone4';
                        // Copy parsed properties!
                        $arrArguments[SYSLOG_DATE] = GetEventTime($out[1] . " " . $out[2]);
                        $arrArguments[SYSLOG_HOST] = $out[3];
                        $arrArguments[SYSLOG_MESSAGE] = $out[4];
                }
                // Sample (RSyslog): 2008-03-28T11:07:40+01:00 localhost rger: test 1
                else if ( preg_match("/([0-9]{4,4}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}.[0-9]{1,2}:[0-9]{1,2}) (.*?) (.*?):(.*?)$/", $szLine, $out ) )
                {
                        $arrArguments[SYSLOG_MESSAGETYPE] = 'Loxone5';
                        // Copy parsed properties!
                        $arrArguments[SYSLOG_DATE] = GetEventTime($out[1]);
                        $arrArguments[SYSLOG_HOST] = $out[2];
                        $arrArguments[SYSLOG_SYSLOGTAG] = $out[3];
                        $arrArguments[SYSLOG_MESSAGE] = $out[4];
                }
                // Sample (RSyslog): 2017-10-24T10:37:48.680031+02:00 2017-10-24 10:37:50;Kotel - spínání;Off#015
                else if ( preg_match("/([0-9]{4,4}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\.[0-9]{1,6}.[0-9]{1,2}:[0-9]{1,2}) (.*?) (.*?):(.*?)$/", $szLine, $out ) )
                {
                        $arrArguments[SYSLOG_MESSAGETYPE] = 'Loxone6';
                        $loxone = $out[2]. ';'. $out[3].':'.  $out[4]. $out[5];
                        $loxone = str_replace(': ',':',$loxone);
                        $loxone = str_replace('#015','',$loxone);
                        $loxone = str_replace('#01','',$loxone);
                        $loxout = explode(';',$loxone);
                        // Copy parsed properties!
                        $arrArguments[SYSLOG_DATE] = GetEventTime($loxout[0]. ' '. $loxout[1]);
                        $arrArguments[SYSLOG_PROCESSID] = $loxout[2];
                        $arrArguments[SYSLOG_MESSAGE] = $loxout[3];
                }
                // Sample: 2008-03-28T15:17:05.480876+01:00,**NO MATCH**
                else if ( preg_match("/([0-9]{4,4}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\.[0-9]{1,6}.[0-9]{1,2}:[0-9]{1,2}),(.*?)$/", $szLine, $out ) )
                {
                        $arrArguments[SYSLOG_MESSAGETYPE] = 'Loxone7';
                        // Some kind of debug message or something ...
                        $arrArguments[SYSLOG_DATE] = GetEventTime($out[1]);
                        $arrArguments[SYSLOG_MESSAGE] = $out[2];
                }
                else
                {
                        if ( isset($arrArguments[SYSLOG_MESSAGE]) && strlen($arrArguments[SYSLOG_MESSAGE]) > 0 ) 
                                OutputDebugMessage("Unparseable syslog msg - '" . $arrArguments[SYSLOG_MESSAGE] . "'", DEBUG_ERROR);
                }

                // If SyslogTag is set, we check for MessageType!
                if ( isset($arrArguments[SYSLOG_SYSLOGTAG]) )
                {
                        if ( strpos($arrArguments[SYSLOG_SYSLOGTAG], "EvntSLog" ) !== false ) 
                                $arrArguments[SYSLOG_MESSAGETYPE] = IUT_NT_EventReport;
                }

                // Return success!
                return SUCCESS;
        }


}
?>

Na závěr provedeme konfiguraci. Spustíme v prohlížeči http://<log_server>/loganalyzer Načte se stránka Critical Error occured, s odkazem Click here to Install Adiscon LogAnalyzer! Kliknete na “here” a spustí se průvodce. Během konfigurace zvolíme Logline type na Miscellaneous Logfiles a Syslog file na náš Log soubor z Loxone.
Konfigurace se uloží do souboru /var/www/loganalyzer/config.php Pokud chceme udělat celý proces konfigurace znovu, stačí tento soubor vymazat a znovu jít na stránku. Po konfiguraci je třeba pro podporu českých znaků změnit v config.php parametr $CFG[‘HeaderDefaultEncoding’] na ENC_UTF8 .

Autor článku: Zmáťa