Raspberry Pi B+ nach Raspberry Pi 3 umziehen

Folgende Schritte sind notwendig:
Auf dem „alten“ System alle aktuellen Upgrades installieren…
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install rpi-update
sudo rpi-update
SD-Karten-Image speichern
MicroSD-Karten-Image schreiben
Booten, läuft …

Hier die Schritte im einzelnen:

sudo apt-get update
migration_01amigration_01b
sudo apt-get dist-upgrade
migration_02amigration_02b
sudo apt-get install rpi-update
migration_03
sudo rpi-update
migration_04
– „altes“ System herunterfahren (sudo halt)
– SD-Karte / Image mit z.B. Win32DiskImager auslesen
– Image auf MicroSD-Karte schreiben
– In den neuen Rapberry Pi 3 einstecken, starten ….
… hier sieht man noch das Herunterfahren und das Neustarten im Putty-Fenster
migration_05
Aufräumwen mit:
sudo apt-get install rpi-update
sudo apt-get autoremove
migration_06

 

 

SCOM Monitor für externes String-Skript

Häufig bekommt man vorgefertigte Skripte, die in das SCOM-Monitoring eingebunden werden sollen. Ein Two-State-VBScript-Monitor erhält von einer Batch-Datei Statusmeldungen als String über StdOut übergeben.

Vorzugsweise sollte so eine Batch Datei den String „OK“ (Healthy) oder einen String mit Fehlermeldung „Fehler XYZ aufgetreten“ (Unhealthy) zurückgeben. Diese Rückgabe eines String über StdOut wird als Parameter status via PropertyBag des SCOM-Monitors zu einem Healthy/Unhealthy-Status verarbeitet und entsprechend eskaliert.
In diesem Beispiel-Script wird zusätzlich geprüft, ob die externe Datei existiert und im Fehlerfall eine entsprechende Nachricht an die PropertyBag übergeben.

Hier das im SCOM-Monitor eingebundene VBScript mit der PropertyBag:

'SCOM-Monitorscript fuer Aufruf externes String-Script
Dim oAPI, oBag, objShell, objExec, fso, line, s

Const FileName = "c:\meinebatch.bat“

Set oAPI = CreateObject("MOM.ScriptAPI“)

Set fso = CreateObject("Scripting.FileSystemObject“)

If (fso.FileExists(FileName)) Then

    Set objShell = WScript.CreateObject("WScript.Shell“)

    Set objExec = objShell.Exec(FileName)

    Doline = objExec.StdOut.ReadLine()

        s = s & lineLoop While Not objExec.Stdout.atEndOfStream

Else

    s = "File “ & FileName & “ does not exist“

End If
Set oBag = oAPI.CreatePropertyBag()

Call oBag.AddValue("status“,s)

Call oAPI.Return(oBag)

 

Programmbeschreibung zeilenweise
1 Definition der Variablen
2 Definition Stringkonstante für das aufzurufende externe Programm. Es muss der absolute Pfad und Dateiname angegeben werden.
3 Zuweisen Objekt MOM.ScriptAPI für die PropertyBag zur Übergabe von Parametern an den SCOM-Monitor.
4 Zuweisen FileSystemObject für die Methode FileExists
5 Bedingung mit FileExists, wenn auszuführendes externes Programm existiert, dann …bis Zeile 12 folgenden Code ausführen.
6 Objektdefinition WScript.Shell
7 Auf das Objekt WScript.Shell die Methode Exec mit dem Parameter „externes Programm“ anwenden.
8 Loop, fußgesteuerte Schleife bis 11
9 Die aktuelle Zeile von StdOut wird gelesen und der Variable line zugewiesen.
10 Die aktuelle Zeile wird ohne(!) Zeilenvorschub der Variable s für den gesamten Output hinzugefügt.
11 Ende der fußgesteuerten Schleife wenn EndOfLine in StdOut erreicht ist.
12 Wenn externes Programm nicht vorhanden ist … bis Zeile 14
13 Fehlermeldung der Variable s zuweisen
14 End If
15 Erzeugen einer PropertyBag
16 Zuweisen (Add) des Ergebnis von s zum Parameter „status“ in der PropertyBag
17 Return zum SCOM mit PropertyBag im „Schlepptau“
TheCloudOnAWall

The Cloud will watch You! – Wand am S-Bahnhof „Düsseldorf-Derendorf“

 

 

 

 

 

 

 

 

 

 

 

 

UMTS-Webstick an einem Raspberry Pi installieren

Heutige USB-Geräte werden immer zunächst als Massenspeicher erkannt, damit z.B. im Windows die mitgelieferten Treiber installiert werden können und nicht als CD ausgeliefert werden müssen. Danach wird, initiert durch den nun installierten Treiber, in den jeweiligen Gerätemodus umgeschaltet.
Das funktioniert unter Linux so nicht und damit bleibt das Gerät im Modus Massenspeicher „hängen“ und funktioniert nicht, hier sichtbar in /var/log/messages:

kernel: [ 3118.534964] usb 1-1.3.2: new high-speed USB device number 7 using dwc_otg
kernel: [ 3118.637196] usb 1-1.3.2: New USB device found, idVendor=0e8d, idProduct=0002
kernel: [ 3118.637236] usb 1-1.3.2: New USB device strings: Mfr=2, Product=3, SerialNumber=4
kernel: [ 3118.637256] usb 1-1.3.2: Product: Product
kernel: [ 3118.637273] usb 1-1.3.2: Manufacturer: MediaTek Inc
kernel: [ 3118.637291] usb 1-1.3.2: SerialNumber: 683694200106600
kernel: [ 3118.648352] usb-storage 1-1.3.2:1.0: USB Mass Storage device detected
kernel: [ 3118.656676] scsi host2: usb-storage 1-1.3.2:1.0
kernel: [ 3119.656031] scsi 2:0:0:0: CD-ROM MEDIATEK FLASH DISK 6225 PQ: 0 ANSI: 0 CCS

Hier wird versucht, ein MEDION / ALDI TALK Webstick S4222 (MD 99079) am Raspberry Pi zu betreiben. Wir sehen idVendor=0e8d, idProduct=0002 des Chipherstellers MediaTek Inc..

Anmerkung und Vorbereitung
Der Medion Webstick, kann wie viele andere USB-Geräte nicht zuverlässig direkt am Raspberry Pi betrieben werden. Es ist ein USB-Hub mit eigener Stromversorgung notwendig. Ebenso sollte die SIM-Karte vorher in einem Handy so konfiguriert werden, dass keine SIM-PIN Eingabe erforderlich ist.
Weiteres Vorgehen nach ausführlicher und weitergehender Beschreibung auf http://www.draisberghof.de Dank an Josua Dietze!
Hier die für den Medion Webstick erforderlichen Schritte:

a) Laden und Entpacken
wget http://www.draisberghof.de/usb_modeswitch/usb-modeswitch-2.2.5.tar.bz2
tar -xvjf usb-modeswitch-2.2.5.tar.bz2

wget http://www.draisberghof.de/usb_modeswitch/usb-modeswitch-data-20150627.tar.bz2
tar -xvjf usb-modeswitch-data-20150627.tar.bz2

Es wurde in zwei neue Verzeichnisse entpackt. Die tar-Dateien können entfernt werden.

drwxr-xr-x 3 pi   4096 Jun 27 23:56 usb-modeswitch-data-20150627
-rw-r--r-- 1 pi  29918 Jun 27 23:58 usb-modeswitch-data-20150627.tar.bz2
drwxr-xr-x 3 pi   4096 Jul 16 23:37 usb-modeswitch-2.2.5
-rw-r--r-- 1 pi 263335 Jul 16 23:37 usb-modeswitch-2.2.5.tar.bz2

b) Installation von libusb
sudo apt-get install libusb-1.0-0-dev

c) Installieren von usb-modeswitch und usb-modeswitch-data

cd usb-modeswitch-2.2.5

pi@raspberrypi ~/usb-modeswitch-2.2.5 $ sudo make install
sed 's_!/usr/bin/tclsh_!'"/usr/bin/tclsh"'_' < usb_modeswitch.tcl > usb_modeswitch_dispatcher
install -D --mode=755 usb_modeswitch /usr/sbin/usb_modeswitch
install -D --mode=755 usb_modeswitch.sh /lib/udev/usb_modeswitch
install -D --mode=644 usb_modeswitch.conf /etc/usb_modeswitch.conf
install -D --mode=644 usb_modeswitch.1 /usr/share/man/man1/usb_modeswitch.1
install -D --mode=644 usb_modeswitch_dispatcher.1 /usr/share/man/man1/usb_modeswitch_dispatcher.1
install -D --mode=755 usb_modeswitch_dispatcher /usr/sbin/usb_modeswitch_dispatcher
install -d /var/lib/usb_modeswitch
test -d /etc/init -a -e /sbin/initctl && install --mode=644 usb-modeswitch-upstart.conf /etc/init || test 1
test -d /etc/systemd/system -a \( -e /usr/bin/systemctl -o -e /bin/systemctl \) && install --mode=644 usb_modeswitch@.service /etc/systemd/system || test 1

cd usb-modeswitch-data-20150627

pi@raspberrypi ~/usb-modeswitch-data-20150627 $ sudo make install
install -d /usr/share/usb_modeswitch
install -d /etc/usb_modeswitch.d
install -D --mode=644 40-usb_modeswitch.rules /lib/udev/rules.d/40-usb_modeswitch.rules
install --mode=644 -t /usr/share/usb_modeswitch ./usb_modeswitch.d/*

Nun kann man schauen, ob die für unseren Vendor und die Product-ID geforderten Daten vorhanden sind.
Config-Dateien:
$ ls -l /usr/share/usb_modeswitch/0e8d:0002*
-rw-r–r– 1 root root 165 Aug 21 22:18 /usr/share/usb_modeswitch/0e8d:0002:uPr=MT
-rw-r–r– 1 root root 179 Aug 21 22:18 /usr/share/usb_modeswitch/0e8d:0002:uPr=Product
Udev-Rules:
$ vi  /lib/udev/rules.d/40-usb_modeswitch.rules und suche nach 0e8d
# MediaTek/Medion S4222 and probably others, MediaTek MT6276M and others
ATTR{idVendor}==“0e8d“, ATTR{idProduct}==“0002″, RUN+=“usb_modeswitch ‚%b/%k'“

Reboot des Raspberry Pi, aber den UMTS-Stick noch nicht einstecken!
Anmelden und sich mit tail -f /var/log/messages „an das Log hängen“ .
Stick einstecken …

tail -f /var/log/messages
kernel: [  121.213918] usb 1-1.3: new high-speed USB device number 4 using dwc_otg
kernel: [  121.314835] usb 1-1.3: New USB device found, idVendor=1a40, idProduct=0101
kernel: [  121.314875] usb 1-1.3: New USB device strings: Mfr=0, Product=1, SerialNumber=0
kernel: [  121.314895] usb 1-1.3: Product: USB 2.0 Hub
kernel: [  121.325893] hub 1-1.3:1.0: USB hub found
kernel: [  121.326862] hub 1-1.3:1.0: 4 ports detected
kernel: [  150.333925] usb 1-1.3.3: new high-speed USB device number 5 using dwc_otg
kernel: [  150.436066] usb 1-1.3.3: New USB device found, idVendor=0e8d, idProduct=0002
kernel: [  150.436107] usb 1-1.3.3: New USB device strings: Mfr=2, Product=3, SerialNumber=4
kernel: [  150.436131] usb 1-1.3.3: Product: Product
kernel: [  150.436150] usb 1-1.3.3: Manufacturer: MediaTek Inc
kernel: [  150.436167] usb 1-1.3.3: SerialNumber: 683694200106600
kernel: [  150.447454] usb-storage 1-1.3.3:1.0: USB Mass Storage device detected
kernel: [  150.456456] scsi host0: usb-storage 1-1.3.3:1.0
kernel: [  151.455108] scsi 0:0:0:0: CD-ROM MEDIATEK FLASH DISK 6225 PQ: 0 ANSI: 0 CCS
kernel: [  151.535748] sr 0:0:0:0: [sr0] scsi3-mmc drive: 0x/0x caddy
kernel: [  151.535792] cdrom: Uniform CD-ROM driver Revision: 3.20
usb_modeswitch: switch device 0e8d:0002 on 001/005
kernel: [  151.895582] usb 1-1.3.3: USB disconnect, device number 5
kernel: [  152.643968] usb 1-1.3.3: new high-speed USB device number 6 using dwc_otg
kernel: [  152.745374] usb 1-1.3.3: New USB device found, idVendor=0e8d, idProduct=00a5
kernel: [  152.745415] usb 1-1.3.3: New USB device strings: Mfr=9, Product=10, SerialNumber=0
kernel: [  152.745435] usb 1-1.3.3: Product: Product
kernel: [  152.745455] usb 1-1.3.3: Manufacturer: MediaTek Inc
kernel: [  152.760018] usb-storage 1-1.3.3:1.6: USB Mass Storage device detected
kernel: [  152.766154] scsi host1: usb-storage 1-1.3.3:1.6
kernel: [  152.955635] usbcore: registered new interface driver cdc_ncm
logger: usb_modeswitch: switched to 0e8d:00a5 on 001/006
kernel: [  152.994591] usbcore: registered new interface driver cdc_wdm
kernel: [  153.027917] usbcore: registered new interface driver usbserial
kernel: [  153.028085] usbcore: registered new interface driver usbserial_generic
kernel: [  153.028228] usbserial: USB Serial support registered for generic
kernel: [  153.045616] cdc_mbim 1-1.3.3:1.0: cdc-wdm0: USB WDM device
kernel: [  153.073849] cdc_mbim 1-1.3.3:1.0 wwan0: register 'cdc_mbim' at usb-bcm2708_usb-1.3.3, CDC MBIM, 62:0f:8f:c1:29:e8
kernel: [  153.075371] usbcore: registered new interface driver cdc_mbim
kernel: [  153.127876] usbcore: registered new interface driver option
kernel: [  153.128065] usbserial: USB Serial support registered for GSM modem (1-port)
kernel: [  153.129538] option 1-1.3.3:1.2: GSM modem (1-port) converter detected
kernel: [  153.157877] usb 1-1.3.3: GSM modem (1-port) converter now attached to ttyUSB0
kernel: [  153.161188] option 1-1.3.3:1.3: GSM modem (1-port) converter detected
kernel: [  153.166561] usb 1-1.3.3: GSM modem (1-port) converter now attached to ttyUSB1
kernel: [  153.167841] option 1-1.3.3:1.4: GSM modem (1-port) converter detected
kernel: [  153.194807] usb 1-1.3.3: GSM modem (1-port) converter now attached to ttyUSB2
kernel: [  153.195658] option 1-1.3.3:1.5: GSM modem (1-port) converter detected
kernel: [  153.201407] usb 1-1.3.3: GSM modem (1-port) converter now attached to ttyUSB3
kernel: [  153.765075] scsi 1:0:0:0: Direct-Access     MEDIATEK  FLASH DISK      6225 PQ: 0 ANSI: 0 CCS
kernel: [  153.768166] sd 1:0:0:0: Attached scsi generic sg0 type 0
kernel: [  153.847826] sd 1:0:0:0: [sda] 3842048 512-byte logical blocks: (1.96 GB/1.83 GiB)
kernel: [  153.848819] sd 1:0:0:0: [sda] Write Protect is off
kernel: [  153.860054]  sda:
kernel: [  153.863441] sd 1:0:0:0: [sda] Attached SCSI removable disk

$ ifconfig
eth0      Link encap:Ethernet  HWaddr b8:27:eb:c0:a5:67
inet addr:192.168.2.22  Bcast:192.168.2.255  Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:3709 errors:0 dropped:174 overruns:0 frame:0
TX packets:1387 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:423132 (413.2 KiB)  TX bytes:229988 (224.5 KiB)

lo        Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0
UP LOOPBACK RUNNING  MTU:65536  Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1104 (1.0 KiB)  TX bytes:1104 (1.0 KiB)

wwan0     Link encap:Ethernet  HWaddr 62:0f:8f:c1:29:e8
          UP BROADCAST RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:83 errors:44 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:4294965375 (3.9 GiB)

In einem nächsten Artikel wird die Aktivierung der Internetverbindung via UMTS-Modem-Stick beschrieben.

VBScript – RegExp und das Arbeiten mit regulären Ausdrücken

Um mit regulären Ausdrücken in VBScript zu arbeiten, gibt es den Objekttype RegExp. Objekte diesen Types ermöglichen es uns, in Strings nach regulären Ausdrücken zu suchen (match) oder durch andere Strings zu ersetzen (replace).
Objekte mit RegExp, sind sehr einfach in der Verwendung; Objekt definieren, regulären Ausdruck angeben und dann einfach suchen oder ersetzen.
Für RegExp gibt es die vier Objekteigenschaften Pattern, Global, IgnoreCase und Multiline, sowie die drei Methoden Test, Execute und Replace

1
2
3
4
Set RExpression = New RegExp
RExpression.Pattern = "regulaerer Ausdruck"
RExpression.Global = True
RExpression.IgnoreCase = True

Der Eigenschaft .Pattern des RegExp Objektes wird der reguläre Ausdruck gegeben.

Wenn nicht nur beim ersten Auftreten des regulären Ausdrucks, sondern jedes Vorkommen gefunden oder ersetzt werden soll, so ist die Eigenschaft .Global auf True zu setzen.

Wenn die Groß/Kleinschreibung unbeachtet bleiben soll, so ist .IgnoreCase mit True zu verwenden.

Falls der untersuchte String aus mehreren Zeilen besteht kann die .Multiline Eigenschaft zum Einsatz kommen. Bei .Multiline = True können ^ (Start) und $ (Ende) für die Untersuchung jeder Zeile bverwendet werden, bei False beziehen sie sich dann auf den gesamten mehrzeiligen String.

Die Methode Test benötigt nur einen Parameter, den mit dem regulären Ausdruck zu untersuchenden String. Es wird True zurückgegeben, wenn der Ausdruck enthalten ist und False wenn nicht.

Die  Methode Execute braucht auch nur den zu untersuchenden String als Parameter, liefert aber ein Objekt vom Typ MatchCollection zurück.
MatchCollection.Count enthält die Anzahl der Fundstellen bei RegExp.Global = True. Wenn RegExp.Global = False wird bei einem oder mehreren Vorkommen Matchcollection.Count = 1 sein. MatchCollection.Count = 0 bedeutet, der reguläre Ausdruck kommt nicht im zu untersuchenden String vor. MatchCollection selber enthält abhängig von RegExp.Global nur den ersten Treffer oder alle gefundenen Ausdrücke.

Die Replace Methode benötigt neben den zu untersuchenden String auch den ersetzenden String. Diese Methode liefert den untersuchten String, ersetzt mit dem zweiten String zurück. Je nach RegExp.Global wird nur an der Stelle des ersten Vorkommens ersetzt (False), oder jedes Vorkommen (True).
Wenn man als ersetzenden String einen Leerstring mitgibt, so wird an den Fundstellen des regulären Ausdrucks dieser gelöscht.

Kurzmitteilung

PHP – Anzahl der Elemente in einem Array count()

Merkzettel PHP

Die Funktion count gibt die Anzahl der Elemente in einem Array zurück.
int count($array [, int $mode = COUNT_NORMAL ])

Wenn der Parameter $array kein Array ist oder kein Objekt mit implementierter zählbarer Schnittstelle ist,
wird count = 1 zurück gegeben. Nur wenn das Objekt NULL ist, wird count = 0 zurück gegeben.
Dies bedeutet auch, das für Variablen die nicht initialisiert sind 0 zurück gegeben wird! Prüfe dies mit isset() !!

Beispiel:

$B = list(2,4,6,8);
$C = count($B);
// $C == 4

$B[0] = 3;
$B[2] = 5;
$B[4] = „ABC“;
$B[6] = 1;
$C = count($B);
// $C == 4

Beispiel für die Verwendung von $mode = COUNT_RECURSIVE

$B = array(‚Brot‘ => array(‚Weizen‘, ‚Roggenmisch‘, ‚Roggen‘),
           ‚Broetchen‘ => array(‚Normal‘, ‚Mohn‘, ‚Koerner‘));

$C = count($B, COUNT_RECURSIVE);
// $C == 8
$D = count($B);
// $C == 2

VBScript – letztes Element in einem String-Array

Beispiel: Es soll aus einem absoluten Pfad der Dateiname herausgeschnitten werden.
Diese Anforderung stellt sich oft bei der Verwendung von object.Files .
Es liefert meist etwas wie „C:\Dir1\Dir2\Dir3\Dateiname.Ext“ .
Wie kann man aus diesem String den Dateinamen herausschneiden?
a) Split den String an „\“ in ein Array
b) ermittle das letzte Element des Array mit der Funktion UBound

1
2
3
4
5
Set objFolder = objFSO.GetFolder("C:\Dir1\Dir2\Dir3")
For Each absFilePath in objFolder.Files
 arrFile = split(absFilePath,"\")
 FileName = arrFile(UBound(arrFile))
Next

liefert aus „C:\Dir1\Dir2\Dir3\Dateiname.Ext“ -> „Dateiname.Ext“

 

Schneetreiben1

Schneetreiben – Arbeit am Gleis in Düsseldorf-Derendorf

 

VB Monitorscript – Alter von Dateien in Verzeichnissen

Visual Basic Script (VB Script) für einen Monitor (z.B. SCOM)

Aufgabe: Es soll in mehreren Verzeichnissen nach nicht verarbeiteten Dateien gesucht werden. Dabei soll bei einer Schwellwertüberschreitung das Script „ERROR“ liefern, sonst „OK“.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
' Dieses Monitorscript prueft auf ein maximales Alter von Dateien
' in mehreren Foldern - Return ist "OK" oder "ERROR"
' Detailiertes LOG fuer Schwellwertueberschreitungen in LogDatei
Option Explicit
Dim objFSO, objFile, objFolder, objLogFile, objAlter, maxtoleranz, Status, Folder, jetzt
Dim FolderArray, FStream, strFile, Alter, LogMsg
 
' Schwellwert für die Fehlerausloesung (LastModified-Alter in Sekunden)
maxtoleranz = 300
 
'ARRAY der Folder 
'entweder hier ReDim oder unter Dim direkt Groesse vereinbaren
ReDim FolderArray(2)
FolderArray(0) = "c:\Folder_1\"
FolderArray(1) = "c:\Folder_2\"
FolderArray(2) = "c:\Folder_3\"
 
Status = "OK"
 
For Each Folder in FolderArray
	jetzt = now
	Set objFSO = CreateObject("Scripting.FileSystemObject")
	Set objFolder = objFSO.GetFolder(Folder)
 
	For Each strFile in objFolder.Files
		Set objFile = objFSO.GetFile(strFile)
		Alter = Datediff("s",objFile.DateLastModified,jetzt)
		If (Alter &gt; maxtoleranz) Then
			Status = "ERROR"
			LogMsg = jetzt &amp; " " &amp; Alter &amp; " " &amp; strFile 
			Set objLogFile = objFSO.OpenTextFile("C:\log\fileage.log", 8, True)
			objLogFile.WriteLine(LogMsg)
			objLogFile.Close
		End If
	Next
Next
 
Wscript.echo Status

Raspberry Pi als passives Flugzeugradar mit dump1090 und DVB-T USB-Stick

Ein grauer Endnovembertag, eine geschlossene tiefhängende Wolkendecke, irgendwo da oben säuseln die Turbinen der Flugzeuge.
Urlaub wäre gut, aber die fliegen ohne mich. Doch wohin und wer fliegt da?
Flugzeuge senden ein Transpondersignal auf 1090MHz. Dieses Signal enthält Standort,Geschwindigkeit, Höhe, usw. und wird von einem DVB-T-Stick empfangen. Mit Dump1090 von  MalcomRobb werden die Daten mit dem Raspberry Pi verarbeitet und im integrierten Webserver grafisch dargestellt. Das sieht dann so aus:

flightradar_01Vorraussetzungen:
– DVB-T-Stick inkl. Antenne
– fertig konfigurierter Raspberry Pi mit Netzwerk und Internetzugang
– cmake zum Kompilieren der SW-Komponenten RTL-SDR und Dump 1090 herunterladen und installieren:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
$ sudo apt-get -fym install git cmake libusb-1.0-0-dev build-essential
Reading package lists... Done
Building dependency tree
Reading state information... Done
build-essential is already the newest version.
git is already the newest version.
git set to manually installed.
The following extra packages will be installed:
cmake-data emacsen-common libxmlrpc-core-c3
The following NEW packages will be installed:
cmake cmake-data emacsen-common libusb-1.0-0-dev libxmlrpc-core-c3
0 upgraded, 5 newly installed, 0 to remove and 14 not upgraded.
Need to get 5,950 kB of archives.
After this operation, 14.6 MB of additional disk space will be used.
Get:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libxmlrpc-core-c3 armhf 1.16.33-3.2 [146 kB]
Get:2 http://mirrordirector.raspbian.org/raspbian/ wheezy/main emacsen-common all 2.0.5 [20.9 kB]
Get:3 http://mirrordirector.raspbian.org/raspbian/ wheezy/main cmake-data all 2.8.9-1 [1,359 kB]
Get:4 http://mirrordirector.raspbian.org/raspbian/ wheezy/main cmake armhf 2.8.9-1 [4,240 kB]
Get:5 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libusb-1.0-0-dev armhf 2:1.0.11-1 [184 kB]
Fetched 5,950 kB in 9s (637 kB/s)
Selecting previously unselected package libxmlrpc-core-c3.
(Reading database ... 72831 files and directories currently installed.)
Unpacking libxmlrpc-core-c3 (from .../libxmlrpc-core-c3_1.16.33-3.2_armhf.deb) ...
Selecting previously unselected package emacsen-common.
Unpacking emacsen-common (from .../emacsen-common_2.0.5_all.deb) ...
Selecting previously unselected package cmake-data.
Unpacking cmake-data (from .../cmake-data_2.8.9-1_all.deb) ...
Selecting previously unselected package cmake.
Unpacking cmake (from .../cmake_2.8.9-1_armhf.deb) ...
Selecting previously unselected package libusb-1.0-0-dev.
Unpacking libusb-1.0-0-dev (from .../libusb-1.0-0-dev_2%3a1.0.11-1_armhf.deb) ...
Processing triggers for man-db ...
Setting up libxmlrpc-core-c3 (1.16.33-3.2) ...
Setting up emacsen-common (2.0.5) ...
Setting up cmake-data (2.8.9-1) ...
Install cmake-data for emacs
Setting up cmake (2.8.9-1) ...
Setting up libusb-1.0-0-dev (2:1.0.11-1) ...
1
2
3
4
5
6
7
$ git clone git://git.osmocom.org/rtl-sdr.git
Cloning into 'rtl-sdr'...
remote: Counting objects: 1587, done.
remote: Compressing objects: 100% (681/681), done.
remote: Total 1587 (delta 1160), reused 1213 (delta 898)
Receiving objects: 100% (1587/1587), 341.27 KiB | 655 KiB/s, done.
Resolving deltas: 100% (1160/1160), done.
1
$ cd rtl-sdr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ ls -lotr
total 152
-rw-r--r-- 1 pi 17987 Nov 30 16:05 COPYING
-rw-r--r-- 1 pi  6031 Nov 30 16:05 CMakeLists.txt
-rw-r--r-- 1 pi   129 Nov 30 16:05 AUTHORS
-rw-r--r-- 1 pi   211 Nov 30 16:05 README
-rw-r--r-- 1 pi  1121 Nov 30 16:05 Makefile.am
-rw-r--r-- 1 pi 72355 Nov 30 16:05 Doxyfile.in
-rwxr-xr-x 1 pi  5440 Nov 30 16:05 git-version-gen
-rw-r--r-- 1 pi  2194 Nov 30 16:05 configure.ac
drwxr-xr-x 3 pi  4096 Nov 30 16:05 cmake
drwxr-xr-x 2 pi  4096 Nov 30 16:05 include
-rw-r--r-- 1 pi  5687 Nov 30 16:05 rtl-sdr.rules
drwxr-xr-x 2 pi  4096 Nov 30 16:05 m4
-rw-r--r-- 1 pi   267 Nov 30 16:05 librtlsdr.pc.in
drwxr-xr-x 4 pi  4096 Nov 30 16:05 src
1
$ mkdir build
1
$ cd build
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ cmake ../ -DINSTALL_UDEV_RULES=ON
-- The C compiler identification is GNU 4.6.3
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Build type not specified: defaulting to release.
-- Extracting version information from git describe...
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.26")
-- checking for module 'libusb-1.0'
--   found libusb-1.0, version 1.0.11
-- Looking for libusb_handle_events_timeout_completed
-- Looking for libusb_handle_events_timeout_completed - found
-- Looking for libusb_error_name
-- Looking for libusb_error_name - found
-- Found libusb-1.0: /usr/include/libusb-1.0, /usr/lib/arm-linux-gnueabihf/libusb-1.0.so
-- Looking for include file pthread.h
-- Looking for include file pthread.h - found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Building with kernel driver detaching disabled, use -DDETACH_KERNEL_DRIVER=ON...
-- Building for version: v0.5.3-6-gd447 / 0.5git
-- Using install prefix: /usr/local
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/rtl-sdr/build
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
$ sudo make install
Scanning dependencies of target convenience_static
[  5%] Building C object src/CMakeFiles/convenience_static.dir/convenience/convenience.c.o
Linking C static library libconvenience_static.a
[  5%] Built target convenience_static
Scanning dependencies of target rtlsdr_shared
[ 10%] Building C object src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o
[ 15%] Building C object src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o
[ 20%] Building C object src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o
[ 25%] Building C object src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o
[ 30%] Building C object src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o
[ 35%] Building C object src/CMakeFiles/rtlsdr_shared.dir/tuner_r82xx.c.o
Linking C shared library librtlsdr.so
[ 35%] Built target rtlsdr_shared
Scanning dependencies of target rtl_adsb
[ 40%] Building C object src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o
Linking C executable rtl_adsb
[ 40%] Built target rtl_adsb
Scanning dependencies of target rtl_eeprom
[ 45%] Building C object src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o
Linking C executable rtl_eeprom
[ 45%] Built target rtl_eeprom
Scanning dependencies of target rtl_fm
[ 50%] Building C object src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o
Linking C executable rtl_fm
[ 50%] Built target rtl_fm
Scanning dependencies of target rtl_power
[ 55%] Building C object src/CMakeFiles/rtl_power.dir/rtl_power.c.o
Linking C executable rtl_power
[ 55%] Built target rtl_power
Scanning dependencies of target rtl_sdr
[ 60%] Building C object src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o
Linking C executable rtl_sdr
[ 60%] Built target rtl_sdr
Scanning dependencies of target rtl_tcp
[ 65%] Building C object src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o
Linking C executable rtl_tcp
[ 65%] Built target rtl_tcp
Scanning dependencies of target rtl_test
[ 70%] Building C object src/CMakeFiles/rtl_test.dir/rtl_test.c.o
Linking C executable rtl_test
[ 70%] Built target rtl_test
Scanning dependencies of target rtlsdr_static
[ 75%] Building C object src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o
[ 80%] Building C object src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o
[ 85%] Building C object src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o
[ 90%] Building C object src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o
[ 95%] Building C object src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o
[100%] Building C object src/CMakeFiles/rtlsdr_static.dir/tuner_r82xx.c.o
Linking C static library librtlsdr.a
[100%] Built target rtlsdr_static
Install the project...
-- Install configuration: "Release"
-- Installing: /etc/udev/rules.d/rtl-sdr.rules
-- Installing: /usr/local/lib/pkgconfig/librtlsdr.pc
-- Installing: /usr/local/include/rtl-sdr.h
-- Installing: /usr/local/include/rtl-sdr_export.h
-- Installing: /usr/local/lib/librtlsdr.so.0.5git
-- Installing: /usr/local/lib/librtlsdr.so.0
-- Installing: /usr/local/lib/librtlsdr.so
-- Installing: /usr/local/lib/librtlsdr.a
-- Installing: /usr/local/bin/rtl_sdr
-- Removed runtime path from "/usr/local/bin/rtl_sdr"
-- Installing: /usr/local/bin/rtl_tcp
-- Removed runtime path from "/usr/local/bin/rtl_tcp"
-- Installing: /usr/local/bin/rtl_test
-- Removed runtime path from "/usr/local/bin/rtl_test"
-- Installing: /usr/local/bin/rtl_fm
-- Removed runtime path from "/usr/local/bin/rtl_fm"
-- Installing: /usr/local/bin/rtl_eeprom
-- Removed runtime path from "/usr/local/bin/rtl_eeprom"
-- Installing: /usr/local/bin/rtl_adsb
-- Removed runtime path from "/usr/local/bin/rtl_adsb"
-- Installing: /usr/local/bin/rtl_power
-- Removed runtime path from "/usr/local/bin/rtl_power"
1
$ sudo ldconfigcat
1
$ cd
1
$ sudo cp ./rtl-sdr/rtl-sdr.rules  /etc/udev/rules.d/

DVB-T-Treiber nicht laden:

1
$ sudo nano /etc/modprobe.d/rtlsdr.conf

blacklist dvb_usb_rtl28xxu                eintragen und speichern

1
$ sudo reboot

Installation von Dump1090

1
2
3
4
5
6
7
$ git clone git://github.com/MalcolmRobb/dump1090.git
Cloning into 'dump1090'...
remote: Counting objects: 1401, done.
remote: Compressing objects: 100% (546/546), done.
remote: Total 1401 (delta 842), reused 1401 (delta 842)
Receiving objects: 100% (1401/1401), 4.12 MiB | 46 KiB/s, done.
Resolving deltas: 100% (842/842), done.
1
$ cd dump1090
1
2
3
4
5
6
7
8
9
10
$ make
gcc -O2 -g -Wall -W `pkg-config --cflags librtlsdr`  -c dump1090.c
gcc -O2 -g -Wall -W `pkg-config --cflags librtlsdr`  -c anet.c
gcc -O2 -g -Wall -W `pkg-config --cflags librtlsdr`  -c interactive.c
gcc -O2 -g -Wall -W `pkg-config --cflags librtlsdr`  -c mode_ac.c
gcc -O2 -g -Wall -W `pkg-config --cflags librtlsdr`  -c mode_s.c
gcc -O2 -g -Wall -W `pkg-config --cflags librtlsdr`  -c net_io.c
gcc -g -o dump1090 dump1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o `pkg-config --libs librtlsdr` -lpthread -lm
gcc -O2 -g -Wall -W `pkg-config --cflags librtlsdr`  -c view1090.c
gcc -g -o view1090 view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o `pkg-config --libs librtlsdr` -lpthread -lm
1
$ ./dump1090 --interactive  --net

flightradar_04

 

 

BMC BEM: Wie kann man Daten aus externen Programmen im Regelwerk nutzen?

Bei der Eventverarbeitung im Regelwerk ist es manchmal notwendig, zusätzliche Daten aus externen Quellen zu beschaffen. Um externe Programme auszuführen und deren Daten zurück in das Regelwerk zu leiten, nutzt man Interfaces.

a) BAROC Datei für die Interface Daten-Struktur:
Die Struktur eines Interface wird in einer BAROC-Datei definiert, mit dem Schlüsselwort  MC_INTERFACE :

1
2
3
4
5
6
7
8
MC_INTERFACE: AUSSENSENSOR
DEFINES {
    ort:            STRING;
    temperatur:     STRING;
    rel_feuchte:    STRING;
    abs_feuchte:    STRING;
};
END

Nach dem Laden der Definitionen (mcontrol -n CELL_NAME reload kb ) steht die Daten-Struktur in der Zelle zur Verfügung.

b) Das externe Programm:
Die durch das externe Programm zu liefernden Daten, werden an die Interface-Instanz übergeben. Diese Instanz ist leider keine FIFO, sondern eine ASCII-Datei, die nur über einen kurzen Zeitraum existiert. Konkret nur während die aufrufende Refine-Regel aktiv ist und auf die Daten aus dem externen Programm wartet. Als Beispiel liefert das externe Programm /usr/bin/get_sensor_data.pl folgende Daten an das Interface/FIFO und damit in das Regelwerk:

1
2
3
4
5
6
AUSSENSENSOR;
     ort = "Terrasse";
     temperatur = "23.45 °C";
     rel_feuchte = "66.4 %";
     abs_feuchte = "71.2 %";
END

In dem Output des externen Programms finden wir die Struktur unseres definierten Interface wieder.

c) Im Regelwerk:
Mit einer Refine-Rule wird mit get_external das externe Programm aufgerufen und die externen Daten in der definierten Interface-Struktur dem Regelwerk zur Verfügung gestellt:

1
2
3
4
get_external('/usr/bin/get_sensor_data.pl',['Sensor_Terrasse'],AUSSENSENSOR,$SEN);
$EV.sensorort = $SEN.ort;
$EV.value_temperatur = $SEN.temperatur;
$EV.value_feuchte = $SEN.rel_feuchte;

Nur während der Ausführung der Refine-Rule stehen die Daten aus der Interface-Struktur zur Verfügung. Hier wurden sie in einem Event zugeordnet und gespeichert.
Ebenso ist es im weiteren möglich, die Daten in einem global record zu speichern und zu einem späteren Zeitpunkt darauf zuzugreifen.

Interface Instances – siehe auch die Handbücher:
BMC Knowledge Base Development Reference Guide,
BMC Impact Solutions Knowledge Base Development Reference Guide

schnelle Hilfe - Dank bester Eventverarbeitung und gezielter Eskalation ( Ticket & Alarmierung )

schnelle Hilfe – Dank bester Eventverarbeitung und gezielter Eskalation ( Ticket & Alarmierung )

SCOM Monitor zur Überwachung eines Prozesses

Hier bearbeiten wir die Thematik der Überwachung eines Prozesses.
Es soll ein Critical Alert erzeugt werden und der Status des Systems auf Unhealthy gesetzt werden, wenn der zu überwachende Prozess nicht mehr läuft.
Ebenso ist denkbar, dass ein Prozess in einer bestimmten Anzahl auf dem gemonitorten System laufen soll, z.B.weil genau zwei Webservices laufen müssen.
Wir nutzen einen Script-Monitor und holen die gewünschte Information aus dem WMI durch ein VB-Skript.
Für denjenigen der einen Skript-Monitor blind einrichten kann, hier nur eine Variante eines möglichen VB-Skriptes. Danach eine detailierte Vorgehensweise zur Einrichtung des Monitors im SCOM Authoring.

Hier zuerst das VB-Skript am Beispiel von „notepad.exe“ als zu überwachender Prozess.

'Script ProcessCounter.vbs
Dim oAPI, oBag, oWMI, oProcess, sProcessname
 
sProgramname="notepad.exe"
Set oWMI = GetObject("winmgmts:\\.\root\cimv2")
Set oProcess = oWMI.ExecQuery("select name from win32_process where name='" & sProgramname & "' ")
Set oWMI = Nothing
 
Set oAPI = CreateObject("MOM.ScriptAPI")
Set oBag = oAPI.CreatePropertyBag()
 
Call oBag.AddValue("ProcessCount",oProcess.count)
Call oBag.AddValue("ProcessName",sProgramname)
 
Call oAPI.Return(oBag)

Das Skript schreibt die Variablen ProcessCount und ProcessName in PropertyBag und dort kann der Monitor zugreifen.
ProcessCount ist für die Anzahl der aktuell laufenden Prozesse von „notepad.exe“ und ProcessName kann für die Message des Alerts verwendet werden.

Einrichten des Monitors im SCOM
a) Authoring

b) Management Pack Objects

c) Start des Wizzard „Create a Monitor“

d) Auswahl „Unit Monitor …“

e) Monitor Type : Scripting – Generic – Timed Script Two State Monitor und Auswahl eines geeigneten Management Pack oder erstellen eines neuen leeren Management Pack.
CreateScriptMonitor_01

f) General: Name – Name des Monitors

g) Beschreibung – kurze Beschreibung was der Monitor überwacht

h) Monitor target – Allgemeines Ziel, wie z.B „Windows Server Operating System“ oder „Computer“

i) Parent monitor – hier wählen wir „Availability“ und disablen den Monitor, da wir ihn sicher nicht auf allen angegebenen Monitor target laufen lassen wollen. Dort wo er laufen soll spezifizieren wir später über Overrides.

j) Schedule: Schedule lässt mehr vermuten, aber es geht hier nur um die Angabe des Meßintervalls, z.b. 5 Minuten. Mit „Synchronize at“ könnte man einen exakten Zeitpunkt initieren.
CreateScriptMonitor_02

k) Script: File Name – Angabe des Dateinamens unter dem das folgende VB-Skript auf den Zielsystemen gespeichert wird
Timeout – max. Laufzeit unseres Skriptes
Und hier fügen wir unseren Skriptcode wie oben angegeben ein. Der Skriptcode wird unter dem angegeben Dateinamen auf den Zielsystemen gespeichert und in den angegeben Meßintervallen ausgeführt.

l) Unhealthy Expression: Hier werden die Bedingungen für den „Unhealthy“ Zustand definiert. In unserem Fall gilt dies, wenn die Anzahl des zu überwachenden Prozesses gleich Null ist. Wir tragen Property[@Name=’ProcessName‘] equals 0 ein.

m) Healthy Expression: Und hier definieren wir die „Healthy“ Bedingung, z.B. soll die Anzahl unseres zu überwachenden Prozesses größer 0 sein.
Wir tragen Property[@Name=’ProcessName‘] greater than 0 ein.

n) Configure Health:
CreateScriptMonitor_03

o) Configure Alerts:
CreateScriptMonitor_04

Ein weiteres Beispiel für einen Messagetext (Alert Description) unter Verwendung von ProcessCount und ProcessName aus dem PropertyBag:
Process $Data/Context/Property[@Name=’ProcessName‘]$ does not run! Runs $Data/Context/Property[@Name=’ProcessCount‘]$ times.
Gut verwendbar, wenn z.B. mehr als ein Prozess laufen muss und nur 1 von X laufenden Prozessen bereits einen Alert auslöst.