CIVisualisierung

Aus THM-Wiki
Wechseln zu: Navigation, Suche
Important.png
Die Seite wird überarbeitet oder erweitert.
Important.png

Einleitung

Die Ergebnisse der automatisierten Tests des Continuous Intergration Servers des eStudy Projekts sollen auch im Projektraum jederzeit sichtbar sein. Anstatt der normalerweise verwendeten Ambient Orbs, welche in Deutschland nicht zugelassen sind, sollte eine leistungsfähigere Alternative gefunden werden. In einer längeren Forumsdiskussion entstand letztlich die Idee einen Wlan-Router zum Client um zu funktionieren und diesen mit einem DMX-512 Interface zu versehen. Somit kann auf 512 Kanälen Bühnenequipment wie Scheinwerfer, Nebelmaschinen, Scanner, Moving Heads, ... angesteuert werden.

DMX unter Linux auf einem Desktoprechner

Frei nach: http://www.opendmx.net/index.php/LLA,_OpenDMX_USB_and_Q_Light_Controller_Tutorial#Build_and_install_the_usb_kernel_module

Auf einem normalen Desktop gestaltet sich das ganze noch recht unkompliziert:

Kernelmodul runterladen: http://www.erwinrol.com/downloads/software/dmx_usb_module-20060116.tgz

Kernelmodul an kernel 2.6.18 anpassen:

Zeile 47, 48:

//MODULE_PARM(debug, "i"); /MODULE_PARM_DESC(debug, "Debug enabled or not");

Zeile 134:

// .owner = THIS_MODULE,

Wenn insmod über die falsche version magic meckert, ist der kernel mit einem anderen gcc übersetzt worden als dem aktuell eingestellten. Ändert man am schnellsten so (Versionsnummern entsprechend ersetzen):

cd /usr/bin/
rm gcc
ln -s gcc-4.1 gcc

Setup des Asus Routers

Da nur sehr wenige Router über USB Anschlüsse verfügen, war die Auswahl sehr gering. Da das DMX-Interface Kernel 2.6 braucht, die Broadcom Wlan-Karte des Asus Routers aber nur mit 2.4 funktioniert wurde die Karte kurzerhand gegen eine Atheros Karte getauscht. Diese ermöglicht auch eine deutlich bessere Reichweite.

Installation von OpenWRT

Für den Router wird die 'brcm47xx'-Firmware verwendet und diese kann bei openwrt.org runtergeladen werden. Direktlink: openwrt-brcm47xx-squashfs.trx. Zur Installation müssen die folgenden Schritte befolgt werden:

  1. Netzstecker des Routers trennen
  2. LAN-Kabel in Port 1 stecken und mit dem eigenen PC verbinden
  3. Reset-Knopf des Routers gedrückt halten (mit einem Stift), dabei den Netzstecker einstecken und warten bis das Power-LED anfängt zu blinken, erst jetzt den Reset-Knopf wieder loslassen.
  4. Auf der Shell: tftp 192.168.1.1 (eigener Rechner sollte die IP 192.168.1.2 haben)
  5. Innerhalb TFTP-Konsole die folgenden Befehle eingeben und jeden Befehl mit der Return-Taste absenden: binary, trace, put openwrt-brcm47xx-squashfs.trx, quit
  6. Warten (mind. 5 Minuten). Das Image wird in dieser Zeit auf den Router aufgespielt.
  7. Anschließend den Router neu starten (z.B. den Netzstecker ziehen)
  8. Zurück auf der Shell: telnet 192.168.1.1, dort mit passwd ein neues Passwort setzen.
  9. Jetzt ist ein Login per SSH als "root" möglich. Zum Login das zuvor gesetzte Passwort verwenden.

Zusätzlich gibt es jetzt die Möglichkeit, im Browser auf den Router zuzugreifen (http://192.168.1.1). Auf den WAN-Port kann ein reguläres Netzwerkkabel eingesteckt werden, damit der Router auf das Internet zugreifen kann.

Um die notwendige USB-Schnittstelle zu aktivieren, müssen die entsprechenden Module installiert werden: ipkg install kmod-usb2 kmod-usb-uhci

Wlan Client und Kontakt zum Ci-Server

Auf Grund der bescheidenen Einstellmöglichkeiten bei Openwrt muss der WPA-Supplicant von Hand gestartet werden. Hierzu dient ein das init-script /etc/init.d/cissh . Die Daten des CI-Servers werden über einen RSS-Feed übertragen.

/etc/init.d/cissh:

#!/bin/sh /etc/rc.common
# Copyright (C) 2006 OpenWrt.org
START=91
STOP=91

start() {
	# WLAN-Interface verfuegbar oder fehlerhaftes Laden des Kernel-Moduls?
	/etc/dmx/checkinterface.sh

	# WLAN-Einwahl
	wpa_supplicant -B -c /etc/wpa_supplicant.conf -Dwext -iath0

	# Zeit setzen und ersten Build-Status abrufen
       (sleep 20;ntpclient -s -h www.uni-giessen.de;/etc/dmx/getrss.sh) &
}


stop() {
	killall wpa_supplicant
}

boot() {          
        echo boot
        
        start
}

Das Fetchen der Daten erfolgt über das Script /etc/dmx/getrss.sh .

/etc/dmx/getrss.sh:

#!/bin/sh

# Script zum Abholen des RSS-Feeds und Ablegen unter /tmp/rss.xml
# Dieses Script sollte beim Starten des WRTs durch das Startscript S91cissh sowie vom crond aufgerufen werden.

curl -s --connect-timeout 10 -o /tmp/rss.xml http://ci.mni.fh-giessen.de/hudson/plugin/DotFeed/rss

Das Ergebnis wird unter /tmp/rss.xml abgespeichert. Es ist darauf zu achten, dass in der config-Datei /etc/dmx/dmx.ini der gleiche Pfad angegeben wird. Des Weiteren sollte sich der Pfad, zur Entlastung des Flash, im tmpfs befinden.


Mit Hilfe des Scripts /etc/dmx/checkinterface.sh wird überprüft, ob das WLAN-Modul korrekt geladen wurde und das Interface verfügbar ist.

/etc/dmx/checkinterface.sh:

#!/bin/sh

# Script zum ueberpruefen ob das Kernel-Modul fuer die WLAN-Schnittstelle ordnungsgemaess geladen wurde.
# Wenn nicht => reboot nach 23 Sekunden


# WLAN-Interface
INTERFACE=ath0


# Don't change anything here!
IFFOUND=$(ifconfig -a | grep $INTERFACE)
if [ "$IFFOUND" = "" ] ; then
    echo "Interface nicht gefunden."
    echo "Reboote in 23 Sekunden"
    touch /tmp/dmx.kill
    /sbin/reboot -d 23 &
fi

Der Reboot findet absichtlich 23 Sekunden verzögert statt, damit ein Eingreifen in das laufende System per LAN möglich ist. Der Neustart kann in dieser Zeit mit dem Befehl "killall reboot" unterbrochen werden.

DMX unter OpenWrt

DMX muss zunächst auf dem eigenen Rechner mittels den OpenWrt-Quellen kompiliert werden:

  1. Den passende OpenWrt-Quellcode runterladen. Da in diesem Artikel die Version 'Backfire' 10.03.1 verwendet wird, wird hier genau diese aus dem Subversion-Repository ausgecheckt: svn co svn://svn.openwrt.org/openwrt/tags/backfire_10.03.1
  2. Im Backfire-Unterverzeichnis package muss nun das DMX-USB-Modul platziert werden: git clone git://github.com/commana/dmx_usb_module.git
  3. Zurück im Backfire-Hauptverzeichnis wird der Kompiliervorgang mit make menuconfig vorbereitet.
    1. Hier ist es wichtig, als Zielplattform brcm47xx zu wählen. Achtung: Hier ist standardmäßig die Kernel-Version 2.4 ausgewählt, das DMX-USB-Modul benötigt aber Version 2.6.
    2. Des Weiteren muss das dmx_usb_module aktiviert werden. Dieses befindet sich Unter "Kernel Modules" → "USB Support"
  4. Mit make kann schließlich der eigentliche Kompiliervorgang durchgeführt werden.

Auf dem Router kann das erstellte Packet mittels ipkg install dmx_usb_module.ipkg entpackt werden. Installiert wird es schließlich mit dem Befehl insmod /lib/modules/`uname -r`/usb_dmx.ko.

Ansteuerung des DMX-Panels

Das DMX-Interface wird über das Device /dev/dmx? angesteuert. Hierdurch kann die Ansteuerung in einer beliebigen Programmiersprache erfolgen. Aus Konsistenzgründen wurde die eStudy-Sprache php verwendet.

DMX-Datagramme sind wie folgt gestrickt:

Byte Bedeutung
0 Fix 0x00
1 Type-Einstellung
2-4 RGB-Wert für Kanal 1
5-7 RGB-Wert für Kanal 2
8-10 RGB-Wert für Kanal 3
11-13 RGB-Wert für Kanal 4
512 Fix 0x55

Wenn man die Quadranten des Panels nach dem Schema

2 1
4 3

durchnummeriert, so sind für die Type-Einstellung folgende Werte gültig:

Type Kanal Quadrant
0-60 (0x00-0x3C) 1 1,2,3,4
61-121 (0x3D-0x79) 1 1,2
2 3,4
122-182 (0x7A-0xB6) 1 1,4
2 2,3
183-243 (0xB7-0xF3) 1 1,3
2 2,4
244-255 (0xF4-0xFF) 1 1
2 2
3 3
4 4

Beispiele

Färbe alle Quadranten in grün:

Fix Type Kanal 1 ... Fix
0x00 0x00 0x00 0xFF 0x00 ... 0x55

Färbe die obere Reihe in gelb und die untere in blau:

Fix Type Kanal 1 Kanal 2 ... Fix
0x00 0x3D 0xFF 0xFF 0x00 0x00 0xFF 0xFF ... 0x55

Färbe Quadrant 1 in rot:

Fix Type Kanal 1 Kanal 2 Kanal 3 Kanal 4 ... Fix
0x00 0xFF 0xFF 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 ... 0x55

Selfmade Daemon

Alle für das Projekt relevante Dateien, außer den Startscripten, befinden sich im Verzeichnis /etc/dmx/ .

Der Daemon

Der eigens erstellte Daemon dmxdaemon.php wird beim Booten des WRT's automatisch gestartet.

<?php

/*--------------------------------------------------------------------------+
- Beschreibung: Anzeigen des EStudy-Builds auf einem DMX-Panel
- Version:      0.1, 07/30/09
- Autor(en):    Markus Desch, Sebastian Holz, Peter Kolodziej
+---------------------------------------------------------------------------+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or any later version.
+---------------------------------------------------------------------------+
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+--------------------------------------------------------------------------*/


$iniFile = "/etc/dmx/dmx.ini";


function logit($str) // Log-Funktion
{
  global $logfile;

  if (strlen($logfile) == 0) // Logfile nicht gesetzt
    $logfile = "php://stdout";

  $logstream = fopen($logfile, "a+");
  fwrite($logstream, $str."\n");
  fclose($logstream);
}

class dmxclient
{
  
  private $device;
  var $buffer = array();
  
  var $startAddress = 2; // Bytenummer des ersten Kanals des DMX
  
  function dmxclient()
  {
    $this->reset();
  }

  function quit()
  {
    $this->reset();
    $this->send();
    exit();
  }
  

  function setDevice($dev) // DMX-Device setzen
  {
    if (strlen($dev) == 0) // $dev gesetzt?
      {
	logit("Device nicht gesetzt");
	exit();
      }

    while(1) // Warte auf DMX-Device
      {
	clearstatcache(); // File-Cache leeren (fuer stat und file_exists noetig)

	if (file_exists($dev))
	  {
	    $fileStatus = stat($dev);
	    if ($fileStatus['rdev'] == 46272 && $fileStatus['dev'] == 11) // DMX-Device hat rdev = 46272 und dev = 11
	      {
		$this->device = $dev;
		break;
	      }
	    else
	      {
		logit("File ".$dev." geloescht, da kein DMX-Device.");
		unlink($dev);
	      }
	  }
	sleep (1);
      }
  }

  // DMX Datagramm: 1. Byte 0, byte Nummer 512 = 0x55
  
  function reset()
  {
    for ($i = 0; $i < 513; $i++)
      {
	$this->buffer[$i] = chr(0);
      }
    
    $this->buffer[512] = chr(0x55);
  }
  
  function send()
  {
    if (strlen($this->device) == 0) // Device nicht vorhanden => return
      {
	logit("Senden fehlgeschlagen: Device nicht vorhanden/gesetzt");
	return;
      }

    $f = fopen($this->device, "w+");
    fwrite($f, implode("",$this->buffer));
    fclose($f);
  }
  
  function setColor($field, $rgb)
  {
    $this->buffer[$this->startAddress+$field*3] = chr($rgb[0]);   // Rot
    $this->buffer[$this->startAddress+$field*3+1] = chr($rgb[1]); // Gruen
    $this->buffer[$this->startAddress+$field*3+2] = chr($rgb[2]); // Blau
  }

  function setType($type)
  {
    // Type 0: Kanal 1 = Feld 1,2,3,4
    // Type 1: Kanal 1 = Feld 1,2; Kanal 2 = Feld 3,4
    // Type 2: Kanal 1 = Feld 1,4; Kanal 2 = Feld 2,3
    // Type 3: Kanal 1 = Feld 1,3; Kanal 2 = Feld 2,4
    // Type 4: Kanal 1 = Feld 1, Kanal 2 = Feld 2, Kanal 3 = Feld 3, Kanal 4 = Feld 4
    $this->buffer[$this->startAddress-1] = chr(($type+1)*50);
  }
}


class eStudyStatus
{

  var $jobname; // Name des abzufragenden Jobs

  private $dmx;
  private $buildhealth = 0; // Aktuelles Ergebniss
  private $unittesthealth = 0; // Aktuelles Ergebniss
  private $buildresult = ""; // Aktuelles Ergebniss

  private $buildhealthbarrier; // Schwelle fuer ROT->GELB-Uebergang; Erster Wert fuer Gelb
  private $unittesthealthbarrier; // Siehe oben

  private $red; // Array fuer RGB-Farbe rot
  private $yellow; // Siehe oben
  private $green; // Siehe oben

  function eStudyStatus() 
  {
    $this->dmx = new dmxclient();
  }

  function setDevice($dev) // durchrouten des Devices an $dmx
  {
    $this->dmx->setDevice($dev);
  }

  function quit()
  {
    $this->dmx->quit();
  }

  function setHealth($name,$health) // Health-Schwellen setzen
  {
    // Health in einem akzepablen Wertebereich?
    if (   (!is_numeric($health))
	|| ($health < 1)
	|| ($health > 99))
      {
	logit($name." ausserhalb des Wertebereichs ( 1 - 99 )\n".
	    "Nutze Standard: 85");
	$health = 85;
      }

    if ($name == "build")
      $this->buildhealthbarrier = $health;

    if ($name == "unittest")
      $this->unittesthealthbarrier = $health;
  }
  
  function setColor($color, $rgb) // RGB-Wert der Farbe setzen
  {
    for ($i = 0; $i < 3; $i++)
      {
	if (   (!is_numeric($rgb[$i]))
	       || ($rgb[$i] < 0)
	       || ($rgb[$i] > 255))
	  {
	    logit($color." ausserhalb des Wertebereichs ( 0 - 255 )\n".
		  "Nutze Standard: 0");
	    $rgb[$i] = 0;
	  }
      }
    switch ($color)
      {
      case 'red':
	$this->red = $rgb;
	break;
      case 'yellow':
	$this->yellow = $rgb;
	break;
      case 'green':
	$this->green = $rgb;
	break;
      }
  }

  function fatalError()
  {
    $punkt = $this->green; // Farbe des wandernden Punktes
    $background = $this->red; // Farbe des Hintergrundes
    $sleep = 200000; // in ms

    for ($i = 0; $i < 2; $i++)
      {
	$this->dmx->reset();
	// Pannel mit Background fuellen
	for ($j = 0; $j < 4; $j++)
	  {
	    $this->dmx->setColor($j,$background);
	  }
	$this->dmx->setType(4);

	// Punkt wandern lassen
	$this->dmx->setColor(0,$punkt);
	$this->dmx->send();
	
	usleep($sleep);
	
	$this->dmx->setColor(0,$background);
	$this->dmx->setColor(1,$punkt);
	$this->dmx->send();
	
	usleep($sleep);
	
	$this->dmx->setColor(1,$background);
	$this->dmx->setColor(3,$punkt);
	$this->dmx->send();
	
	usleep($sleep);
	
	$this->dmx->setColor(3,$background);
	$this->dmx->setColor(2,$punkt);
	$this->dmx->send();

	usleep($sleep);
      }

  }
  
  function statusNotChanged()
  {
    $unittesthealthDisplay = array(2);
    $buildhealthDisplay = array(0,1,3);

    if ($this->buildresult == "NOTFOUND") // In unterschiedlichen Farben blinken
      {
	$sleep = 500000; // in ms
	$this->dmx->setType(0);

	$this->dmx->setColor(0,array(255,0,0));
	$this->dmx->send();
	usleep($sleep);

  	$this->dmx->setColor(0,array(0,255,0));
	$this->dmx->send();
	usleep($sleep);

  	$this->dmx->setColor(0,array(0,0,255));
	$this->dmx->send();
	usleep($sleep);

  	$this->dmx->setColor(0,array(255,255,0));
	$this->dmx->send();
	usleep($sleep);

  	$this->dmx->setColor(0,array(255,0,255));
	$this->dmx->send();
	usleep($sleep);

  	$this->dmx->setColor(0,array(0,255,255));
	$this->dmx->send();
	usleep($sleep);

  	$this->dmx->setColor(0,array(255,255,255));
	$this->dmx->send();
	usleep($sleep);
	return;
      }

    if ($this->buildresult == "FAILURE") // ROT blinken
      {
	$sleep = 500000; // in ms
	$this->dmx->setType(0);

	$this->dmx->setColor(0,$this->red);
	$this->dmx->send();
	usleep($sleep);

	$this->dmx->setColor(0,array(0,0,0));
	$this->dmx->send();
	usleep($sleep);
	return;
      }

    // Alle andere Stadien, welche unabhaenig von buildresult sind:
    $this->dmx->setType(4);

    // UnitTestHealth
    foreach($unittesthealthDisplay as $curDisplay)
      $this->dmx->setColor($curDisplay,$this->green);
    if ($this->unittesthealth < 100)
      foreach($unittesthealthDisplay as $curDisplay)      
	$this->dmx->setColor($curDisplay,$this->yellow);
      
    if ($this->unittesthealth < $this->unittesthealthbarrier)
      foreach($unittesthealthDisplay as $curDisplay)
	$this->dmx->setColor($curDisplay,$this->red);

    if ($this->unittesthealth < 0)
      foreach($unittesthealthDisplay as $curDisplay)
	$this->dmx->setColor($curDisplay,$this->green);


    // BuildHealth
    foreach($buildhealthDisplay as $curDisplay)
      $this->dmx->setColor($curDisplay,$this->green);
    if ($this->buildhealth < 100)
      foreach($buildhealthDisplay as $curDisplay)      
	$this->dmx->setColor($curDisplay,$this->yellow);
      
    if ($this->buildhealth < $this->buildhealthbarrier)
      foreach($buildhealthDisplay as $curDisplay)
	$this->dmx->setColor($curDisplay,$this->red);

    $this->dmx->send();
    usleep (500000);


  }
  
  function statusChanged() // Zustand hat sich geaendert
  {
    $line = "";
    global $rssFile;

    // Datei lesen
    $handle = fopen($rssFile,"r");
    while (!feof($handle))
      {
	$templine = fgets($handle);
	
	if (stripos($templine, $this->jobname.":"))
	  {
	    $line = $templine;
	    break;
	  }
      }
    fclose($handle);
    
    if (strlen($line) == 0) // Job aus irgendeinem Grund nicht gefunden
      {
	$this->buildresult = "NOTFOUND";
	return;
      }

    // Buildresult abfragen
    preg_match("/BuildResult\=+([A-Z]*)/",$line, $matches);

    // ABORTED nicht aussagefaehig -> Keine Aenderung
    if ($matches[1] == "ABORTED")
      return;

    $this->buildresult = $matches[1];


    // BuildHealth abfragen
    preg_match("/BuildHealth\=+(.[0-9]*)/",$line, $matches);
    $this->buildhealth = $matches[1];

    // UnitTestHealth abfragen
    preg_match("/UnitTestHealth\=+(.[0-9]*)/",$line, $matches);

    if (is_numeric($matches[1])) // Bei "0" wird keine null zurueckgeliefert
      $this->unittesthealth = $matches[1];
    else
      $this->unittesthealth = 0;


  }
  
}

$eStudy = new eStudyStatus();

$rssFileTimeOld = 0;
$rssFileTimeNew = 0;


if (!file_exists($iniFile)) // INI-File vorhanden?
  {
    logit("INI-Datei ( ".$iniFile." ) nicht vorhanden.");
    exit();
  }

// ini-Datei parsen
$iniArray = parse_ini_file($iniFile,TRUE);
$logfile = $iniArray['main']['logfile'];
$rssFile = $iniArray['main']['rssfile'];
$killfile = $iniArray['main']['killfile'];
$eStudy->jobname = $iniArray['main']['jobname'];
$eStudy->setDevice($iniArray['main']['device']);
$eStudy->setHealth('build',$iniArray['build']['RedYellowBarrier']);
$eStudy->setHealth('unittest',$iniArray['unittest']['RedYellowBarrier']);
$eStudy->setColor('red',$iniArray['color']['red']);
$eStudy->setColor('yellow',$iniArray['color']['yellow']);
$eStudy->setColor('green',$iniArray['color']['green']);

while(1)
  {
    clearstatcache(); // File-Cache leeren (fuer filemtime und file_exists noetig)

    if (file_exists($killfile))
      {
	$eStudy->quit();
      }

    if (file_exists($rssFile))
      $rssFileTimeNew = filemtime($rssFile);
      
    if (time() > $rssFileTimeNew + 70) // Datei aus irgendeinem Grund ueber 70 Sekunden nicht aktualisiert
      $eStudy->fatalError(); // Fataler Fehler liegt vor; z.B. keine Internetverbindung

    elseif ($rssFileTimeOld == $rssFileTimeNew)
      $eStudy->statusNotChanged(); // Kein aktualisierter Status vorhanden

    else
      {
	$rssFileTimeOld = $rssFileTimeNew;
	$eStudy->statusChanged(); // Zustand geaendert
      }  
    
    usleep(5000); // CPU entlasten durch kurze Wartezeit
  }


?>

Der RSS-Feed wird über das Script /etc/dmx/getrss.sh abgerufen. Dieses Script wird minütlich durch den cron-daemon sowie einmalig beim Start durch das Script /etc/init.d/cissh ausgeführt.

Die Konfiguration

Die Konfiguration für den Daemon erfolgt über die Datei /etc/dmx/dmx.ini .

Beispielconfig:

; Configuration-file for DMX-daemon
; Comments start with ';', as in php.ini

[main]
jobname = "eStudy.trunk"
rssfile = "/tmp/rss.xml"
device = "/dev/dmx0"
logfile = "/tmp/dmx.log"
killfile = "/tmp/dmx.kill"

[build]
; Unterster Wert fuer Gelb
RedYellowBarrier = "90"

[unittest]
; Unterster Wert fuer Gelb
RedYellowBarrier = "80"

[color]
; Angepasste RGB-Werte der Farben
red[] = "255"
red[] = "0"
red[] = "0"

yellow[] = "255"
yellow[] = "160"
yellow[] = "0"

green[] = "0"
green[] = "255"
green[] = "0"
main-Section
  • jobname: der Name des zu visualisierenden "Jobs" des RSS-Feeds
  • rssfile: Lokale Kopie des aktuellen RSS-Feeds; Es ist darauf zu achten, dass in /etc/dmx/getrss.sh der gleiche Pfad angegeben ist. Diese Datei sollte sich, wie bereits erwähnt, im tmpfs befinden
  • device: Pfad zu dem durch das Kernel-Modul angelegte Device
  • logfile: besondere Vorkommnisse dokumentieren (optional). Falls nicht angegeben: logfile = stdout
  • killfile: Durch anlegen des "killfile" wird das Panel deaktiviert und der daemon beendet. Dieses File sollte sich ebenfalls im tmpfs befinden, damit diese Datei spätestens nach einem Neustart nicht mehr existiert. Es ist hierbei darauf zu achten, dass in /etc/dmx/checkinterface.sh der gleiche Pfad angegeben ist. (optional)
build- und unittest-Section
  • RedYellowBarrier: Unterster prozentualer Wert, bei welchem die entsprechenden Quadranten sich Gelb färben. Alles unter diesem Wert wird mit Rot signalisiert. (Standardwert = 85)
color-Section

Die einzelnen Farben werden durch die RGB-Werte definiert. Hierbei wird als erster Parameter für jede Farbe der Rot-, als zweiter Parameter der Grün- und als dritter Parameter der Blau-Anteil eingestellt.