Perl – führende und nachfolgende Leerzeichen aus einem String entfernen – trim()

Oft sind Eingaben von Anwendern mit führenden oder nachfolgenden Leerzeichen versehen.
Dies ist fast immer unnötig und kann bei Suche und Abgleich zu Problemen führen.
Wenn nicht schon bei der Verarbeitung der Eingabe, so spätestens bei der Suche und beim Abgleich von Daten empfiehlt sich das Abschneiden der Leerzeichen – das Trimmen.

Dazu definiert man folgende Subroutine:

# ################################################
# TRIM A STRING
# ################################################
sub trim() {
  my $str = $_[0];
  $str =~ s/^\s+|\s+$//g;
  return $str;
};

Der Aufruf der Subroutine und damit das Trimmen wie in diesem Beispiel:

my $name="  Klaus Mueller  ";
print ":".$name.":\n";
$name=&trim($name);
print ":".$name.":\n";

Ausgabe:

:  Klaus Mueller  :
:Klaus Mueller:

Linux: RAM Riegel auslesen / Max. RAM ermitteln

Oft steht man vor dem Problem, das ein RAM Riegel defekt ist oder man einfach nur den vorhandenen Speicher beim Server, PC oder Laptop erweitern möchte.
Nur wie findet man heraus, wieviele RAM Slots verfügbar sind bzw. wie diese belegt sind?

Unter Linux geht dies ganz einfach wie folgt:

dmidecode –type memory

Die Ausgabe sollte dann in etwa so aussehen (Daten sind von meinem recht alten Laptop):

SMBIOS 2.4 present.

Handle 0x0007, DMI type 5, 20 bytes
Memory Controller Information
Error Detecting Method: None
Error Correcting Capabilities:
None
Supported Interleave: One-way Interleave
Current Interleave: One-way Interleave
Maximum Memory Module Size: 2048 MB
Maximum Total Memory Size: 4096 MB
Supported Speeds:
Other
Supported Memory Types:
DIMM
SDRAM
Memory Module Voltage: 2.9 V
Associated Memory Slots: 2
0x0008
0x0009
Enabled Error Correcting Capabilities:
Unknown

Handle 0x0008, DMI type 6, 12 bytes
Memory Module Information
Socket Designation: DIMM Slot 1
Bank Connections: 0 3
Current Speed: Unknown
Type: DIMM SDRAM
Installed Size: 512 MB (Double-bank Connection)
Enabled Size: 512 MB (Double-bank Connection)
Error Status: OK

Handle 0x0009, DMI type 6, 12 bytes
Memory Module Information
Socket Designation: DIMM Slot 2
Bank Connections: 4 7
Current Speed: Unknown
Type: DIMM SDRAM
Installed Size: 512 MB (Double-bank Connection)
Enabled Size: 512 MB (Double-bank Connection)
Error Status: OK

Handle 0x0029, DMI type 16, 15 bytes
Physical Memory Array
Location: System Board Or Motherboard
Use: System Memory
Error Correction Type: None
Maximum Capacity: 2 GB
Error Information Handle: Not Provided
Number Of Devices: 2

Handle 0x002A, DMI type 17, 27 bytes
Memory Device
Array Handle: 0x0029
Error Information Handle: No Error
Total Width: 64 bits
Data Width: 64 bits
Size: 512 MB
Form Factor: SODIMM
Set: None
Locator: DIMM 1
Bank Locator: Bank 0/1
Type: DDR2
Type Detail: Synchronous
Speed: Unknown
Manufacturer: Not Specified
Serial Number: Not Specified
Asset Tag: Not Specified
Part Number: Not Specified

Handle 0x002B, DMI type 17, 27 bytes
Memory Device
Array Handle: 0x0029
Error Information Handle: No Error
Total Width: 64 bits
Data Width: 64 bits
Size: 512 MB
Form Factor: SODIMM
Set: None
Locator: DIMM 2
Bank Locator: Bank 2/3
Type: DDR2
Type Detail: Synchronous
Speed: Unknown
Manufacturer: Not Specified
Serial Number: Not Specified
Asset Tag: Not Specified
Part Number: Not Specified

 

 

Raspberry Pi: Festplatte / USB-Stick einbinden Teil 1

a) Bevor man den Stick anschließt, hängt man sich an das Systemlog mit
tail –f /var/log/messages
Wenn man das Gerät (Plate oder Stick) anschließt, werden entsprechende Log-Einträge erzeugt. Hier im Beispiel, das Einstecken eines USB-Stick erzeugt folgende Einträge in /var/log/messages:


Jun 11 21:36:10 raspbox kernel: [ 396.314129] usb 1-1.3: new high-speed USB device number 5 using dwc_otg 
Jun 11 21:36:10 raspbox kernel: [ 396.506619] usb 1-1.3: New USB device found, idVendor=090c, idProduct=1000 
Jun 11 21:36:10 raspbox kernel: [ 396.506650] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 
Jun 11 21:36:10 raspbox kernel: [ 396.506666] usb 1-1.3: Product: Flash Disk 
Jun 11 21:36:10 raspbox kernel: [ 396.506679] usb 1-1.3: Manufacturer: USB 
Jun 11 21:36:10 raspbox kernel: [ 396.506692] usb 1-1.3: SerialNumber: FBH1111180113205 
Jun 11 21:36:10 raspbox kernel: [ 396.518536] scsi1 : usb-storage 1-1.3:1.0 
Jun 11 21:36:12 raspbox kernel: [ 397.774223] scsi 1:0:0:0: Direct-Access USB Flash Disk 1100 PQ: 0 ANSI: 4 
Jun 11 21:36:12 raspbox kernel: [ 397.777883] sd 1:0:0:0: [sda] 7831552 512-byte logical blocks: (4.00 GB/3.73 GiB) 
Jun 11 21:36:12 raspbox kernel: [ 397.778633] sd 1:0:0:0: [sda] Write Protect is off 
Jun 11 21:36:12 raspbox kernel: [ 397.790746] sda: sda1 
Jun 11 21:36:12 raspbox kernel: [ 397.796050] sd 1:0:0:0: [sda] Attached SCSI removable disk

Man erkennt hier im Beispiel sda: sda1, mit anderen Geräten an anderem Port z.B. sdb: sdb1 …diese Angabe benötigen wir später für das Mounten des neuen Gerätes ( unter c) ).
Mit Strg-C löst man das Terminal von der Log-Datei.

b) Als nächster Schritt steht das Einrichten des Mountpoints an. Das ist das Verzeichnis, in dem die angeschlossenen Daten in die bestehende Verzeichnisstruktur eingebunden werden sollen.
Meist wird dafür unter /media ein Mountpoint eingerichtet.
Als Verzeichnisnamen kann man einen passenden Namen z.B. usbdisk wählen

sudo mkdir /media/usbdisk

c) Danach kann das Gerät eingebunden (gemountet) werden, mit folgendem Kommando

sudo mount -t vfat -o uid=pi,gid=pi /dev/sda1 /media/usbdisk/

Dieses Mount-Kommando bindet die auf dem USB-Gerät vorhandene Dateistruktur unterhalb des Mountpoints (hier im Beispiel /media/usbdisk ) ein. Eingebunden ist das Gerät aber nur bis zum nächsten Systemneustart bzw. bis zum „Auswerfen“.

Zunächst testen wir den Zugriff auf unsere gemounteten Daten mit

cd /media/usbdisk (Wechsel in die gemountete Dateistruktur)

ls –las (Anzeige der Dateien)

d) Um das USB-Gerät “auszuwerfen “ / zu trennen, setzt man folgendes Kommando ab:

sudo umount /media/usbdisk

Es ist eigentlich ganz selbstverständlich: USB-Geräte nie bei laufendem System einfach herausziehen! Das führt meist zu Schäden am Dateisystem, besonders wenn gerade Dateien im Zugriff sind.
Dieses Vorgehen ist nur für die temporäre Benutzung, also wenn man mal kurzzeitig für einen Datentransfer eine fremde Platte oder einen unbekannten Stick anschließen möchte, geeignet.
Wer stets „seine“ bekannten Geräte benutzt, für den gibt es in Teil 2 ein komfortableres Verfahren.

RaspberryPi_WLAN3
Abb.: Raspberry Pi Model B mit WLAN-Stick in einem Plexiglas-Gehäuse

NAS für Heimanwender

NAS zu Hause bedeutet ja letzendlich nichts anderes als Festplattenkapazitäten in seinem Heimnetzwerk zur Verfügung zu stellen und von seinem PC oder Notebook darauf zuzugreifen und diese Kapazitäten als Netzwerklaufwerk in seinem Betriebssystem zu nutzen (z.B. mit dem CIFS Protokoll). Anmerkung: Die Definition für NAS findest du unter Storage Management.

Zunächst sollten einige Vorüberlegungen angestellt werden, die als Grundlage der später eingesetzten Lösung dienen sollen.

1. Wofür möchte ich das NAS nutzen – als Datenablage oder für Datensicherung ?

Wenn ich das NAS als Datensicherung für bereits vorhandene Kapazitäten nutzen möchte, dann ist es meiner Meinung nach nicht notwendig sich für eine Lösung zu entscheiden, die eine RAID Absicherung bietet. Als Datensicherungsziel reicht demnach eine einzelne, nicht abgesicherte, Festplatte aus. Sollte diese defekt sein, dann habe ich ja nur meine Datensicherung verloren. Diese kann ich auf einem neuen Medien wieder neu erstellen.

2. Müssen die Daten gesichert werden oder kann ich einen ggf. Verlust verschmerzen ?

Wenn ich das NAS als Datenablage nutze, muß ich mich entscheiden, ob ich die Daten sichern möchte oder nicht. Hier gebe ich zu bedenken, daß eine ggf. vorhandene RAID Absicherung der Festplatten keine Datensicherung ersetzt. RAID hilft letztendlich nur bei einer Hardwarestörung einer Festplatte, nicht jedoch gegen logische Fehler (z.B. duch Viren verursacht).

3. Kann ich z.B. bei einem Festplattendefekt eine gewisse Zeit auf meine Daten verzichten oder muß ich permanent darauf zugreifen können ?

Für Heimanwender ist es i.d.R. kein Problem, wenn mal eine Zeit lang nicht auf die Daten zugegriffen werden kann, das muß aber jeder für sich selbst entscheiden. Wer bei einem Festplattendefekt weiterhin an seine Daten kommen möchte, ist gut beraten seine Festplatte in einem RAID Verbund abzusichern.

Ich persönlich nutze 2 NAS Festplatten zu Hause. Beide für sich sind nicht über RAID abgesichert und Standalone. Platte 1 dient als Ablage für diverse Daten wie Fotos, Dokumente etc. und auf Platte 2 mache ich in regelmäßigen Abständen die Datensicherug von Platte 1. Sollte Platte 1 einen Defekt haben, dann sind die Daten noch auf Platte 2 vorhanden und zugreifbar.

Stor_SANKarte

automatisiertes ssh-Login und Aktion mit expect

Ein ssh-Login zu automatisieren, ist stabil nur durch expect, via Skript, zu realisieren.
Expect ist ein spezialisiertes Tool zur Automatisierung interaktiver Anwendungen auf Unix.
Unter Windows soll es auch einen Clone geben (sourceforge.net ).

Das ssh-Login interaktiv aufgerufen ssh sshusr@server03 fordert zur Eingabe des Passwortes auf.
Mit Hilfe von expect wird nach Absenden (spawn) des Befehls auf den String „password“ gewartet.
Dazu das Skript ssh_loginaction mit folgendem Aufruf und Parametern:

./ssh_loginaction user password server03

#!/usr/local/bin/expect
set timeout 30
set user [lindex $argv 0]
set pass [lindex $argv 1]
set host [lindex $argv 2]
spawn ssh $user@$host
expect {
    "password:" {send "$pass\r"}
  default {puts stdout "\nHat nicht funktioniert!" exit}
}

expect "prompt>" {send "action_command\r"}
expect "prompt>" {send "exit\r"}
puts stdout "\nEND\n"

set timeout 30 – Standard sind 10 Sekunden Timeout. Dann beendet sich expect ohne weitere Warnung. Es soll ja Server geben, die unter Last und nur über ausgiebiges Routing zu erreichen, etwas länger für das Login brauchen. Ich hatte mich gewundert, als ein expect die Aktion meist ausführte, manchmal aber eben nicht. Grund war ein nicht definierter Timeout und dann ist nach 10 Sekunden Schluss.

Perl – FOR Schleife im besonderen Einsatz

Üblicherweise wird eine FOR Schleife in folgender Syntax verwendet
for ($n=0;$n<=5;$i++) { print „$n \n“; }
oder auch mit Laufvariable $_
for (0..5) { print „$_ \n“; }

Im besonderen Fall gibt es eine Liste von Aufträgen, die nicht alle gleichzeitig, sondern nur in bestimmten Abschnitten abgearbeitet werden sollen.

Hier werden aus einem Array von Aufträgen nur die Elemente 4 bis 7 verarbeitet.
for (3..6) {
$auftrag = (10,20,30,40,50,60,70,80,90,100)[$_];
print „Auftrag: „.$auftrag.“\n“;
};

Auftrag 40
Auftrag 50
Auftrag 60
Auftrag 70
 

Projektdiskussion – Private Home NAS

Hier werden wir darüber sprechen, wie ein NAS (Network Attached Storage) im privaten Bereich günstig aufgebaut und zuverlässig betrieben werden kann.

Dabei sollen folgende Anforderungen erfüllt werden.
– Zentrale Datenhaltung und Datensicherung
– Streaming von Medien ( Musik, Filme, Video ) – DLNA

Berücksichtigung von folgenden Parametern:
– Stromverbrauch, weil eigentlich immer online
– Datensicherheit (periodische Syncronisation oder Raid 1, Raid 5)
– Preis ( Beschaffung und Betrieb )
– Standardschnittstellen und Bauteile
– einfache Verwaltung über Weboberfläche

Für private NAS gibt es vorgefertigte Lösungen, oder man bringt eine eigene Architektur an den Start.

Meine erste Idee war tatsächlich, ein „fertiges“ NAS zu kaufen. Zwei Platten Raid 1 gespiegelt, … doch der Preis von 300€ ohne Platten hat mich davon abgehalten.

Welche Lösungen habt Ihr so am Start?
Was sind Eure Überlegungen oder Erfahrungen?
Feel free to post it!

Christian Hover schreibt „NAS für Heimanwender“ – einen Beitrag zu folgenden Fragen:
1. Wofür möchte ich das NAS nutzen – als Datenablage oder für Datensicherung ?
2. Müssen die Daten gesichert werden oder kann ich einen ggf. Verlust verschmerzen ?
3. Kann ich z.B. bei einem Festplattendefekt eine gewisse Zeit auf meine Daten verzichten oder muß ich permanent darauf zugreifen können ?

PowerShell Aliase für Cmdlets

Beim Skripten mit PowerShell gibt es etwas Schreibaufwand, wenn man immer wieder gleiche Cmdlets ansprechen muß und keine Aliase verwendet. Klar wird das Skript durch Aliase nicht leichter lesbar. Über die bereits im Standard definierten Aliase gibt es in der PowerShell die Möglichkeit, eigene Aliase zu definieren, zu importieren, zu speichern.

Auflisten aller aktuell definierten PowerShell Aliase:

Get-Alias oder mit dem entsprechenden Alias 🙂 …
gal | sort Definition

Definieren eigener, neuer PowerShell Aliase
Wenn die definierten Aliase nicht passen, kann man sich eigene, zusätzliche Aliase definieren. Beachte: Die eigenen Aliase gelten nur in der aktuellen Sitzung. Deshalb sollte man die eigenen Definitionen in einem Skript in PSConfiguration-Verzeichnis sichern.

Beispiel: Das Write-Host Cmdlet hat keinen Alias. Wir definieren print als Alias.
>Set-Alias print Write-Host

Hier ein paar von mir definierten und häufig genutzten Aliase:

Get-ChildItem gci Objekte der aktuellen Position (DIR-Befehl)

Invoke-Item ii Öffnen einer Datei, Ausführen eines Programmes

Get-Process gps ps Anzeige der Prozeßliste

Where-Object where Filtern von Daten

 

Hinweis: Keine Aliase für die folgenden Cmdlets auf direktem Weg möglich:

Write-Warning, Write-Host

SCOM 2007 R2 Console über die Command Line mit Parametern starten

Start der SCOM 2007 R2 Console über die Command Line
C:\%programfiles%\System Center Operations Manager 2007\Microsoft.MOM.UI.Console.exe
Parameter /? zeigt dieses Fenster ( sorry, noch WinXP-Layout)

ui_console_exe

/ClearCache Cache-Speicher der vorherigen Session bereinigen
/Server:<ServerName> Console zum Management Server verbinden
/ViewName:<ViewName> Bestimmte View laden und anzeigen
/TaskName:<TaskName> Starte einen Task
/TaskTarget:<ObjectId> in Verbindung mit /TaskName Ziel-Objekt-ID
/ManagementPack:<MpName> In Verbindung mit /TaskName and /ViewName (*)

(*) noch nicht von mir getestet