what to do, if you locked yourself out from Mac OS?

a wood with a chain and a padlock

Yesterday I found myself in a strange situation:

Every Shell Command I tried to use ended up with a “command not found“. This happened with sudo, nano … you name it.

After a short time, I figured out that the folder /usr/bin (where all these programs are stored) had only executable rights for the owner (so admin:wheel).

As a normal user I was not able to use them.

So how to change this if you cannot sudo ?

As always in MacOS, the best way to fix this, is to boot into Singe User Mode (restart and press the Apple/Command Key + “S”).
After you got into the Terminal view you have to scan the filesystem for errors:

/sbin/fsck -fy 

And then remount it as writable:

/sbin/mount -wu /

Now, you can alter the user rights for /usr/bin with:

chmod 755 /usr/bin

After a reboot you are again able to execute the commands.
If you still have problems you should control your PATH-settings.

echo $PATH 

It should contain /usr/bin near the beginning.

sophisticated Backups mit Rsync

Backups sind wichtig.
Jeder der einmal vor einer kaputten, ratternden Festplatte gesessen hat, weiß wie frustrierend das Wissen ist, alle seine Daten ins informationstechnische Nirwana entschwinden zu sehen.
Ist ein Backup der persönlichen Daten noch mit relativ geringem Aufwand möglich (so es denn regelmäßig veranstaltet wird), so wird ein Backup eines Server-Systems in vielen Dingen anspruchsvoller.
Dies fängt damit an, dass reinen Datenmengen oftmals das Vielfache eines Ein-Benutzer-Systems betragen. Okay in heutige Zeit, wo ein jeder zig GBs an Musik und Videos auf dem Rechner hat, muss man das natürlich relativieren.
In diesem Beitrag möchte ich ein Bash-Script vorstellen, welches folgende Dinge leistet:

  1. Sichern von N-Hosts über RSYNC
  2. Sichern von N-Verzeichnissen auf jedem Host
  3. Inkrementelles Sichern (es werden nur Unterschiede gesichert/übertragen)
  4. Zusammenführen von täglichen (inkrementellen) Backups zu wöchentlichen Vollbackups.
  5. die aktuellen Backups sind jeweils unter einem Hardlink “latest” erreichbar.

Nachfolgend erfolgt eine Beschreibung über den Ablauf des Scriptes.
Es wird Momentan durch eine Sicherung von 3 Serversystemen und ca. 20 GB an reinen Nutzdaten getestet.

  1. Stelle sicher, dass alle notwendigen Verzeichnisse vorhanden sind:
    • Verzeichnis “log” für log-Dateien der Sicherungen
    • Verzeichnis “backup” für die eigentlichen Sicherungen
    • Je Backupquelle ein Verzeichnis
    • Innerhalb jedes Quellverzeichnisses ein Verzeichnis für tägliche und eines für wöchentliche Sicherungen
  2. Stelle sicher, dass alle Config-Dateien vorhanden sind:
    • sources.txt mit den Namen der zu sichernden Hosts/Verzeichnisse
    • exclude.txt mit den Dateien, welche nicht gesichert werden sollten (z.B. Thumbs.db)
    • innerhalb jedes Quellverzeichnisses eine Datei namens src-root.txt (mit dem ROOT der Sicherung)
      und src-folders.txt (mit den einzelnen Verzeichnissen)

Der Aufbau des Root-Verzeichnisses sieht nun wie folgt aus.

ROOT
|
|-log
|-sources.txt
|-exclude.txt
|-backup
|-host1.de
|-host2.de
|-src-root.txt
|-src-folders.txt
|-daily
|-weekly

Ein Beispiel für eine sources.txt sieht wie folgt aus:

host1.de
host2.de

Ein Beispiel für eine exclude.txt sieht wie folgt aus:

Thumbs.db
.DS_Store

Eine src-root.txt könnte so aussehen:

user@host1.de:

Eine src-folders.txt könnte so aussehen:

/home
/etc
/var/log
/var/www

Ablauf der Sicherung:

  • Generiere Log-Datei.
  • Iteriere über alle Quellen aus sources.txt
  • Überprüfe ob alle Quellen Verzeichnisse zum Sichern enthalten.
  • Überprüfe ob lokal Verzeichnisse für die Sicherung existieren – wenn nicht lege sie an.
  • Erstelle tägliches Backup – existiert ein vorheriges Backup, so sichere nur die Änderungen.

Dies passiert mit folgendem Befehl:

rsync -zrva –exclude-from=exclude.txt –link-dest=<hardlink-zu-altem-backup>  <sourcefolder>/ <backupfolder>/daily/<tag>/<zu-sicherndes-Verzeichnis>
Hierbei werden alle Benutzerrechte mitgesichert.
Setzte Hardlink vom letztem täglichen Backup auf aktuelles tägliches Backup.
Überprüfe ob Sonntag ist ( date +%w = 0)
Wenn ja, synchronisiere letztes tägliches Backup mit wöchentlichem (neuen) Backup.
Setzte Hardlink vom letztem wöchentlichen Backup auf aktuelles wöchentliches Backup.
Lösche alle täglichen Backups.
Setzte Hardlink vom letztem täglichen Backup auf aktuelles wöchentliches Backup.
So werden maximal 7 tägliche inkrementelle Backups erstellt und pro Jahr 52 wöchentliche Full-Backups.

#!/bin/sh

# Philipp's backup-scripte version 2

ROOT=/tank/backup/server
BACKDIR=$ROOT/backup
D=`eval date +%Y-%m-%d`
W=`eval date +%Y-%W`
w=`eval date +%w`
LATEST=latest
EXCLUDE=$ROOT/exclude.txt
SOURCES=$ROOT/sources.txt

LOG=$ROOT/log/$D.log

# Array of all needed folders
folders=( $ROOT/log $ROOT/sources )
files=( $EXCLUDE $SOURCES $LOG)

for folder in ${folders[@]}; do
    if [ ! -d $folder  ] ; then mkdir -p $folder; fi
done

for file in ${files[@]}; do
    if [ ! -f $file  ] ; then touch $file; fi
done

log () {
    if [  -z "$1" ] ; then echo "" > $LOG ; fi
    echo $1
    echo $1 >> $LOG    
}

# Ab hier gehts dann richtig los :-)

log

log "STARTING BACKUP..."
log "date: $D"

#stopping start time
#TIME0= expr `date +%s`;

# backup following sources
for SOURCE in `cat $SOURCES`; do
    log ""
    log "=================================================================="
    log "====== backup: $SOURCE "
    if [ ! -d $BACKDIR/$SOURCE/daily/$D  ] ; then mkdir -p $BACKDIR/$SOURCE/daily/$D; fi    
    if [ ! -f $BACKDIR/$SOURCE/src-root.txt  ] ; then touch $BACKDIR/$SOURCE/src-root.txt; fi    
    if [ ! -f $BACKDIR/$SOURCE/src-folders.txt  ] ; then touch $BACKDIR/$SOURCE/src-folders.txt; fi      
    #Logindaten lesen
    LOGINDATA=`cat $BACKDIR/$SOURCE/src-root.txt`
    if [ ! "$LOGINDATA" = "" ]; then
        log "====== benutze $LOGINDATA" 
        log "=================================================================="
        log ""
        for FOLDER in `cat $BACKDIR/$SOURCE/src-folders.txt`; do
            log "backup up... $FOLDER"
            mkdir -p $BACKDIR/$SOURCE/daily/$D/$FOLDER
            ### wenn schon latest-day vorhanden, dann sichere nur ânderungen
            if [ ! -d $BACKDIR/$SOURCE/daily/$LATEST  ] ; then 
                rsync -zrva $OLD --exclude-from=$EXCLUDE --link-dest=$BACKDIR/$SOURCE/daily/$LATEST/$FOLDER  $LOGINDATA/$FOLDER/ $BACKDIR/$SOURCE/daily/$D/$FOLDER | tee -a $LOG
            else
                rsync -zrva $OLD --exclude-from=$EXCLUDE $LOGINDATA/$FOLDER/ $BACKDIR/$SOURCE/daily/$D/$FOLDER | tee -a $LOG
            fi   
        done
        ### setze latest-day von altem Stand auf aktuelles Backup
        if [ -d $BACKDIR/$SOURCE/daily/$D ] ; then
            if [ -d $BACKDIR/$SOURCE/daily/$LATEST ] ; then rm $BACKDIR/$SOURCE/daily/$LATEST; fi
            ln -s $BACKDIR/$SOURCE/daily/$D $BACKDIR/$SOURCE/daily/$LATEST    
        fi

        ## wenn ende der Woche, dann erstelle Snapshot der Woche
        if [ "$w" = "0" ]; then
            log "create week-backup for $W"
            for FOLDER in `cat $BACKDIR/$SOURCE/src-folders.txt`; do
                mkdir -p $BACKDIR/$SOURCE/weekly/$W/$FOLDER
                rsync -zrva $OLD --exclude-from=$EXCLUDE $BACKDIR/$SOURCE/daily/$D/$FOLDER/ $BACKDIR/$SOURCE/weekly/$W/$FOLDER | tee -a $LOG
            done
            ### setze latest-week von altem Stand auf aktuelles Backup
            if [ -d $BACKDIR/$SOURCE/weekly/$LATEST ] ; then rm $BACKDIR/$SOURCE/weekly/$LATEST; fi
            ln -s $BACKDIR/$SOURCE/weekly/$W $BACKDIR/$SOURCE/weekly/$LATEST | tee -a $LOG 
            log "updating weekly latest"

            ### lââsche alte Backups
            log "delete all daily folders"
            rm -R $BACKDIR/$SOURCE/daily/*

            ### setze latest-day von altem Stand auf aktuelles Backup
            if [ -d $BACKDIR/$SOURCE/daily/$LATEST ] ; then rm $BACKDIR/$SOURCE/daily/$LATEST; fi
            ln -s $BACKDIR/$SOURCE/weekly/$W $BACKDIR/$SOURCE/daily/$LATEST | tee -a $LOG
            log "updating daily latest"
        fi
    fi
done

#stopping end time
#TIME1= expr `date +%s`;
#ERG = expr `$TIME1 - $TIME0`;

log "=================================================================="
log "DONE"
#log "using $ERG seconds"
log "=================================================================="

Safari, Spotlight Craches after Timemachine Restore

So i almost gave up with solving some strange Software Crashes
For Example:

Spotlight wasn’t active. There was even no Spotlight icon.
Safari Crashes when i type the second word into a google search field.

After a while i browsed through my folder-tree and so i detected, that the tmp folder.
I remember that i set /tmp to be excluded during TM-Backups so save so Disk Space.
So after i restored this folder with

   cd /
   sudo ln -s /private/tmp /tmp
   sudo chmod 1777 /tmp

everything works fine again. IMHO it is a bug in the TM-System-Restore Workflow.

Blogged with the Flock Browser

patch File for compiling storeGPU on Macos with CUDA 2.0

I am currently working with a middleware-App Demonstration using Nvidia’s CUDA.
After some time i make the example to work on MacOS 10.5.

You will need:

CUDA SDK and Toolkit for MacOS (you need to add the kext driver manually when installing the Toolkit)

the StoreCPU Sources

 

If you try to compile the source you will get some errors like this:

 

    ./storeGPU.h:41:19: error: cutil.h: No such file or directory
        (you need to include your inc path)

    

    ld: library not found for -lcutil
        (you need to include your lib path)

 

    storeGPU.cu:491:19: error: macro “CUT_DEVICE_INIT” requires 2 arguments, but only 1 given

        (with version 2.0 of CUDA there is another CUT_DEVICE_INIT-Method)

    

    Undefined symbols:

    “sg_init()”, referenced from:

    run_md5_overlap_test()     in main.o

    run_sha1_overlap_test()     in main.o

        (here you need to add parameter to match with the new CUT_DEVICE_INIT-Call)

 

All Settings are done with the following Patch.

If your CUDE-SDK is installed in /Developer/CUDA  (normal setup path)

You may use the following patches to make the storeGPU-Demo to run:

storegpu-diff

Telegramm eines iPhone Kaufs

In guter alter Tradition, möchte ich hier noch einmal in kurzen Worten die Gegebenheiten am vorigen “iPhone 3G Freitag” beschreiben:

08:00: Der Wecker schellt. In froher Erwartung schwinge ich mich aus dem Bett und heize den Kaffeeautomaten an. In Anbetracht der letzten iPhone-Einführung in Deutschland gehe ich den Morgen gelassen an. Mein Mitstreiter des Tages hat vorsorglich ja zwei iPhöne reservieren lassen.
09:00: Nach Kaffee und Duschen fahre ich mit dem Auto zur U-Bahn und mit der U-Bahn weiter in die Stadt… Wer weiß, vielleicht gibt es doch Andrang und die Stadt ist dicht.
09:15: Nachricht vom Mitstreiter, bei ihm wird es wohl doch 09:30. Ich kämpfe mich (Müdigkeit) zum T-Punkt vor. Ich sehe eine _kleine_ Schlange von 5 Leuten, davon ist einer ein hyperaktiv-telefonierender und vor-der-Tür-parkender Audi A4 Fahrer, ein anderer trägt ein dezent S/W Apple-T-Shirt. Im Lauf der nächsten 10min wächst die Schlange um zwei weitere Kunden, die wild gestikulierend mit einer – scheinbar falschen – Telefonrechnung herumfuchteln. 
09:25:  Entwarnung. Ich entschließe mich dazu, einen Kaffee nachzutanken. Ich begebe mich zum nahen Stern-Bock und bestelle einen regular Cafe Mocá.
09:27: Sie sind heute schnell. Ich erhalte einen tall Cafe Mocá. War wohl ein Missverständnis. Ich beschließe, dass der Tag gut werden wird und steuere wieder das T an.
09:35:  Der Mitstreiter trifft ein. Lagebesprechung. Wir betrachten argwöhnisch den schon gefüllten T-Punkt. Beschließen was zu tun ist und legen uns eine Schlangen-ansteh-Strategie zurecht.
09:45:  Der T-Punkt ist nicht pber das normale Maß gefüllt, dennoch scheint der wohlige Geruch von Stress und Sonderaktion in er Luft zu liegen und Verkäuferinnen und Verkäufer hetzen mit gehetzten Blicken vom Lager zum Verkaufsraum. Wir entscheiden uns für eine Zwei-Schlangen-Strategie (okay für mehr fehlen uns eh die Leute :-D).
09:55:  Der große Moment. Wir haben unsere eigene Telekommunikationsfachkraft. Die gute Frau ist voll Echtzeitmultitasking-fähig und scheint mindestens über 10 Kerne zu verfügen.
10:00:  Wir ordern. Die Vorbestellungen scheinen – natürlich – nicht mehr auffindbar zu sein. Anscheinend hat jeder Verkäufer seine eigene Hitlist erstellt und mit nach Hause genommen. Dennoch erhalten wir zwei schwarze 16GB Modelle.
10:25: Ich bin an der Reihe. Ich erhalte (nach Aussage der threaded-Verkäuferin) das letzte iPhone des Ladens (ob das jetzt nur die 16GB Version betrifft steht noch im Raum). Die Verpackung ist aus unerfindlichen Gründen vor-geöffnet worden. Egal. Nach kurzer Sichtkontrolle greife ich zu. Ich muss doch keine 25 EUR Bereitstellung zahlen (Aktion! 🙂 ), allerdings kann ich JETZT meine alte Nummer nicht übernehmen (Aktion! 🙁 ). Wenn ich das wollte müsste ich nächste Woche Dienstag wiederkommen. Ich betrachte die sanft-glänzende Apple-Verpackung und erinnere mich daran als ich das letzte Mal wegen Klein-Foo in einen T-Punkt gehen wollte. Ich entschließe mich dazu, die logistische Herausforderung einer neuen-Nummer-Verteilung in meinem Social-Network in Kauf zu nehmen. 
10:45: Ich ordere eine Multi-SIM Karte mit dem Plan, den iPhone Tarif auch mit anderen Devices nutzen zu können. Ich werde gefühlte 100 Mal darauf aufmerksam gemacht, dass die zusätzliche SIM einmalig 30 EUR kostet. Bestellung fertig: 

    Ich erhalte: 

  • 1 EA iPhone (ohne DOCK!)
  • 2 EA SIM-Karten
  • 1 neue Nummer (Juhu es ist eine 0151er – ich habe heute erfahren, dass die aus dem alten C-Netz stammen)
11:00: I  Ich zahle. Und erhalte zusätzlich zwei Karten für das Fußballspiel Bayern gegen Bor. Dortmund am 23. Juli. Leider bin ich an dem Tag nicht in Deutschland, aber ich bin sicher, dass ich dafür Abnehmer finden werde. Ich entscheide mich gegen die durchsichtige Silikon-Schutzhülle. Ich möchte etwas dunkleres… Gibt es fürs alte iPhone (hehe wie schnell die Technik veraltet). Ich zahle nur das iPhone. DIe Multi-SIM scheint vergessen. Ich schaue in mein Shopping-Bag, sehe zwei Umschläge und verlasse schmunzelnd den Laden. ich beschließe das der Tag gut wird.
11:30: Wir lassen uns im Edwards nieder. In Erwartung von freiem WiFi, bestellen wir unsere Getränke und entpacken unsere iPhöne. Dummerweise scheint grade heute das WiFi ausgefallen zu sein (Verschwörung!!!!). Wir leeren unser Bestelltes und schlagen den Weg nach Hause ein.
12:15:  Wir erreichen Home, Sweet Home. Das WiFi ist vorhanden und stabil. Wir füllen den Tisch mit Apple-Devotionalien. Wir verbinden iPhone mit Macbook (pro), Macbook (pro) mit WiFi und starten iTunes.
12:30:  Nach einem – nervenden – iTunes-Update beginnt die Aktivierung des iPhones. Schnell die neue Nummer rausgesucht und mit iTunes Account abgeglichen.
12:45:  Ich erhalte meinen ersten Anruf auf meinen iPhone. Ein Herr Maier oder Müller. Wunder sich, dass ich ich bin. Komisch. Meine Nummer scheint noch nicht lange ungenutzt zu sein.
13:00:  Wir Updaten unsere iPhone-Firmware. Ich erkenne, dass mein iPhone mit meinen Kontakten kämpft. Ich schaue nach – nein keine großen Dateien. Nach gefühlten 30 min synchronisieren nun Email- und Browsereinstellungen. Done. Ich buche mein iPhone in mein heimatliche WiFi ein. Nettes Teil. Ich beschließe, dass der Tag gut ist.
14:00:  Wir entdecken den AppStore. Wir installieren uns zahlreiche (hmmm 10?) der kostenlosen Anwendungen. Remote ist cool. Auch LifeGame lässt den Programmierer in mir aufleben. Freudig entdecke ich den AIM-Client.
14:30:  Wir beschließen nun die Dev-Tools zu testen. Wir installieren “the latest iPhone-SDK”.
15:15: Der Hunger meldet sich. Wir gehen zu dem Chinesen gegenüber. Der schließt leider um 15h. Wir müssen hungrig aussehen. Aus Mitleid wird uns angeboten, dass wir uns etwas Bestellen können und es dann mitnehmen können. Netter Laden, toller Service. Wir bestellen beide das gleiche (schlechtes Gewissen ^^), geben Trinkgeld und verlassen das Lokal gen Heimat.
15:30: Wir essen. iPhone-Display ist “Fett”-proofed!
15:45:  Ich teste den HW-Modes der Dev-Tools. XCode-Organizer schlägt vor, die aktuelle Firmware aufs iPhone zu spielen. Ich stimme zu (noch ist der Tag gut)
16:00:  Mein iPhone ist wieder im Auslieferungszustand und möchte sich wieder neu aktivieren lassen. Ich starte iTunes und beginne den Vorgang. Ich erhalte wahlweise Fehler -9838 oder -4 (negativere Fehlernummer sind die schlechteren?). Ich fluche ein wenig. Stelle mich darauf ein, am morgigen Samstag mich in einen T-Punkt zu kämpfen. Ich lade noch einmal manuell per iTunes die Firmware aufs iPhone. Kein Erfolg. SIM-Lock weg und iTunes bockt? Ich schmeiße Google an. Finde den netten Thread auf FSCKLOG. Ich lese mich durch die 200 Kommentare und stelle fest, dass ich nicht alleine bin. Hatten wir morgens wohl sehr viel Glück und nun Pech.
17:30: -9838 … -4
17:30: -9838 … -4
18:00: -9838 … -4
18:15: -4 (Fehler -9838 scheint behoben – erkommt jedenfalls nicht mehr). Ich beschließe meine iPhone-Playlist zu füllen.
18:30: Aus Frust fahre ich Auto. Ich bringe meinen Mitstreiter zum abendlichen Workout.
19:00: Mache Dinge die mich ablenken. (Fotos scannen)
21:00: -4
21:15: -4
22:30: -4
23:15: Kein Fehler. “Kann iTunes Store nicht erreichen”.
23:30: Aktivierung geht. Der Tag findet ein gutes Ende. Ich kann mein iPhone wieder einrichten. Synchronisiere abermals Kontakte (30min), Musik, Bilder und Videos (20min).
00:00: Ich sehe mir noch ein paar der DEV-Videos an und schlafe ein.
Blogged with the Flock Browser

subversion problem: svn: Can’t move ‘xyz/.svn/tmp/entries’ to ‘xyz/.svn/entries’: Operation not permitted

svn: Can't move 'xyz/.svn/tmp/entries' to 'xyz/.svn/entries': Operation not permitted

Diese Fehler sprang mir grade entgegen, nachdem ich mal wieder ein

svn up

machen wollte.
Nach genauerer Betrachtung, stellte ich dann fest, dass

xyz/.svn/entries

nur Lesesrechte hat.
Ein

   sudo chmod 777 xyz/.svn/entries 

half leider auch nichts:

chmod: ./xyz/.svn/entries: Operation not permitted

Das fand ich dann schon ziemlich dreist irgendwie :-D.
Letztendlich half mir ein:

 
cp xyz/.svn/entries xyz/.svn/entries2
sudo rm xyz/.svn/entries
cp xyz/.svn/entries2 xyz/.svn/entries
sudo chmod 777  xyz/.svn/entries

Was zwar auf dem ersten Blick ein wenig aufwendig erscheint, aber in Form eines bash-scriptes angenehm die Arbeit übernimmt.
Allerdings weiß ich jetzt immer noch nicht WARUM dieser Fehler kommt.
Letztendlich habe ich mich ja daran gewöhnt, dass subversion meint, . hätte ein Lock….
Wenn mir da jemand mal erklären könnte, ob ich da was falsch mache oder wie… das fände ich mal toll :-).

update macos ipmitool

During my experiences with IPMI i figured out, that there is an issue with the build in ipmitool for MacOs.
If you want to use the IPMI 2.0 protocol (needed for Serial over Lan (SOL) ), you have to add an “-I lanplus” to the ipmitool command.
The problem is, that there is no such parameter in the original MacOs version.

So you have to recompile your own version:

Go to
http://ipmitool.sourceforge.net and download the source code.
You have to make sure, that you already have installed the common build enviroment (xCode).

You have to find out where the original version of ipmitool is:

    # whereis ipmitool
    # /usr/bin/ipmitool

So after you extracted the ipmitool source you have to configure it with the right path:
    # ./configure –prefix=/usr/

This tells the compiler, that binary should be placed in /usr/bin/ and the libs should be go to /usr/lib/

You finish with:
    # make
    # sudo make install

After that you will find your parameter in the help message:

    # ipmitool -h
    pmitool version 1.8.9
   
    usage: ipmitool [options…] <command>
   
           -h             This help
           -V             Show version information
           -v             Verbose (can use multiple times)
           -c             Display output in comma separated format
           -d N           Specify a /dev/ipmiN device to use (default=0)
           -I intf        Interface to use
           -H hostname    Remote host name for LAN interface
           -p port        Remote RMCP port [default=623]
           -U username    Remote session username
           -f file        Read remote session password from file
           -S sdr         Use local file for remote SDR cache
           -a             Prompt for remote password
           -e char        Set SOL escape character
           -C ciphersuite Cipher suite to be used by lanplus interface
           -k key         Use Kg key for IPMIv2 authentication
           -L level       Remote session privilege level [default=ADMINISTRATOR]
                          Append a ‘+’ to use name/privilege lookup in RAKP1
           -A authtype    Force use of auth type NONE, PASSWORD, MD2, MD5 or OEM
           -P password    Remote session password
           -E             Read password from IPMI_PASSWORD environment variable
           -m address     Set local IPMB address
           -b channel     Set destination channel for bridged request
           -l lun         Set destination lun for raw commands
           -t address     Bridge request to remote target address
           -o oemtype     Setup for OEM (use ‘list’ to see available OEM types)
           -O seloem      Use file for OEM SEL event descriptions
   
    Interfaces:
        lan           IPMI v1.5 LAN Interface [default]
        lanplus       IPMI v2.0 RMCP+ LAN Interface
   
    Commands:
        raw           Send a RAW IPMI request and print response
        i2c           Send an I2C Master Write-Read command and print response
        spd           Print SPD info from remote I2C device
        lan           Configure LAN Channels
        chassis       Get chassis status and set power state
        power         Shortcut to chassis power commands
        event         Send pre-defined events to MC
        mc            Management Controller status and global enables
        sdr           Print Sensor Data Repository entries and readings
        sensor        Print detailed sensor information
        fru           Print built-in FRU and scan SDR for FRU locators
        sel           Print System Event Log (SEL)
        pef           Configure Platform Event Filtering (PEF)
        sol           Configure and connect IPMIv2.0 Serial-over-LAN
        tsol          Configure and connect with Tyan IPMIv1.5 Serial-over-LAN
        isol          Configure IPMIv1.5 Serial-over-LAN
        user          Configure Management Controller users
        channel       Configure Management Controller channels
        session       Print session information
        sunoem        OEM Commands for Sun servers
        kontronoem    OEM Commands for Kontron devices
        picmg         Run a PICMG/ATCA extended cmd
        fwum          Update IPMC using Kontron OEM Firmware Update Manager
        firewall      Configure Firmware Firewall
        exec          Run list of commands from file
        set           Set runtime variable for shell and exec
        hpm           Update HPM components using PICMG HPM.1 file

Blogged with the Flock Browser

Multicast – genauer Nachgeschaut

Da das ja heute bei der Tafelrunde eher etwas zusammengesucht war, habe ich mich noch mal hingesetzt und mir die Dinge an-/eingelesen.
Ich werde einfach mal versuchen die Fragen, die da aufkamen wiederzugeben und dann mit passenden Texten beantworten:

  1. Was ist Multicast?
    Multicast ist eine Nachrichtenübertragung von einem Punkt zu einer Gruppe von Empfängern (auch Mehrpunktverbindung genannt).
    Daneben gibt es noch weitere Arten von Übertragungen:

    • Unicast: eine Punkt-zu-Punkt-Verbindung (klassische Client<->Server Verbindung)
    • Broadcast- und die Anycast-Übertragung (“ich bin da – wer noch?” – ping an x.x.x.255)
    • Geocast, ein besonderer Multicast, der räumlich begrenzt ist.
  2. Was sind die Vorteile von Multicast gegenüber Unicast?
    Es sind gleichzeitige Nachrichten an mehrere Teilnehmer möglich, ohne dass sich die Bandbreite des Senders verändert (für den Sender ist es als würde man eine Nachricht an einen Empfänger senden).
    Handelt es sich um paketorientierte Datenübertragung, findet die Vervielfältigung der Pakete an jedem Verteiler (Switch, Router) auf der Route statt.
  3. Wie geht das nun genau?
    Multicast ist die übliche Bezeichnung für IP-Multicast, das es ermöglicht, in IP-Netzwerken effizient Daten an viele Empfänger zur gleichen Zeit zu senden. Das passiert mit einer speziellen Multicast-Adresse. In IPv4 ist hierfür der Adress-Bereich 224.0.0.0 bis 239.255.255.255 (Klasse D), in IPv6 jede mit FF00::/8 beginnende Adresse reserviert.
    Bei der Übertragung über Ethernet werden die IPv4- bzw. IPv6-Multicastadressen auf bestimmte Pseudo-MAC-Adressen abgebildet, um bereits durch die Netzwerkkarte eine Filterung nach relevantem Traffic zu ermöglichen.
  4. Okaaaaay…. Wer macht sowas? Ist sowas nützlich?
    Ja ist es. Bekannte Anwendungen sind:

    • Audio- und Videoübertragungen (Protokolle wie RTP)
    • Verwendung beim Clustering und beim Routing nach dem Routing Information Protocol (RIP) Version 2.
    • ist für ein funktionierendes AppleTalk-Netzwerk notwendig.
    • Als Service Location Protocol und Multicast DNS wird als Teilimplementierung von Zeroconf Multicast (Rendezvous – inzwischen Bonjour) betrieben
      • automatische Zuweisung von IP-Adressen ohne DHCP-Server
      • übersetzen von Hostnamen in IP-Adressen ohne DNS-Server
      • automatisches Finden von Diensten im lokalen Netzwerk ohne einen zentralen Directory-Server
    • In Windows wird es im Simple Service Discovery Protocol benutzt
    • Weitere Multicast-Protokolle
      • Internet Relay Chat (IRC) bildet Netzwerke, welche einen einfachen TCP-basierten Multicast-Baum realisieren – wer hätte das gedacht ^^
      • Es wird überlegt in Jabber Multicast nach zurüsten.
  5. Und das geht jetzt auch über das Internet oder wie jetzt?
    Jein… also:
    Multicast-Pakete werden von den meisten Routern im Internet nicht verarbeitet. Deswegen werden multicastfähige Teilnetze über Tunnel zu Multicast Backbones (MBones) verbunden.
    Um Multicast-Pakete zwischen mehreren Netzen zu koordinieren, werden spezielle Multicast-Routing-Protokolle verwendet.
  6. Ahja… sehr schön – kann da nix passieren / durcheinander kommen?
    Es existieren bei der Verwendung bestimmter Adressbereiche einiger Switches Probleme bei der Weiterleitung von Multicastnachrichten.
    Die Adressen von 224.0.0.0 bis 224.255.255.255 sind für Routingprotokolle reserviert und für diese Adressen sendet der Router keine IP-Multicast-Datagramme. Die Adressen von 239.0.0.0 bis 239.255.255.255 sind für scoping reserviert, eine Weiterleitung innerhalb dieses Adressbereichs ist ebenfalls Switch abhängig. Adressen im Bereich 225.x.x.x bis 238.x.x.x sind frei verfügbar.
  7. Nachwort:
    Multicasting wird wieder populär, weil IPTV darauf basiert.
    Für verteilte Chat-Netzwerke wurde mittlerweile allgemein eingesehen, dass sie nicht mittels IP-Multicast realisiert werden können.
    Der Einsatz weiterer Multicast-Protokolle ist daher unumgänglich.  Na da haben wirs!

Schamlos kopiert von http://de.wikipedia.org/wiki/Multicast – teiweise gekürtzt und ein wenig angepasst.
Die Formulierungen sind auf die frühe Stunde zurück zu führen.
Anschließend zur Entspannung noch ein wenig Java – ein einfacher Chat-Server:
Zuerst der “Server” – Der ja eigentlich auch Teil jedes Clients ist:

public class NameServer{
        // the multicast group address sent to new members
        private static final String GROUP_HOST = "228.5.6.7";  
        private static final int PORT = 1234;      // for this server
        private static final int BUFSIZE = 1024;   // max size of a message
        private DatagramSocket serverSock;
   
        // holds the names of the current members of the multicast group
        private ArrayList groupMembers; 
        try {  // try to create a socket for the server
          serverSock = new DatagramSocket(PORT);
        }catch(SocketException se){
            System.out.println(se);
            System.exit(1);
        }
        groupMembers = new ArrayList();
        waitForPackets();
       
        // das ist dann hier wieder die typische Server-While-Schleifen-Methode
        private void waitForPackets(){
            DatagramPacket receivePacket;
            byte data[];
            System.out.println("Ready for client messages");
            try {
              while (true) {
                data = new byte[BUFSIZE];  // set up an empty packet
                receivePacket = new DatagramPacket(data, data.length);
                serverSock.receive( receivePacket );  // wait for a packet
       
                // extract client address, port, message
                InetAddress clientAddr = receivePacket.getAddress();
                int clientPort = receivePacket.getPort();
                String clientMsg = new String( receivePacket.getData(), 0, receivePacket.getLength() ).trim();
                processClient(clientMsg, clientAddr, clientPort);
              }
            }catch(IOException ioe){ 
                System.out.println(ioe); 
            }
        }
        ...
    }

Und hier dann noch mal der “Client”-Anteil:
   

public class MultiChat {
   
      // timeout used when waiting in receive()
      private static final int TIME_OUT = 5000;   // 5 secs
     
      // max size of a message
      private static final int PACKET_SIZE = 1024;
      // NameServer address and port constants
      private static final String SERVER_HOST = "localhost";
      private static final int SERVER_PORT = 1234; 
      /* The multicast port. The multicast group address is
      obtained from the NameServer object. */
      private static final int GROUP_PORT = 5555; 
      // for communication with the NameServer
      private DatagramSocket clientSock;
      private InetAddress serverAddr; 
      // for communication with the multicast group
      private MulticastSocket groupSock;
      private InetAddress groupAddr;  
      public MultiChat(String nm){
         /* Attempt to register name and get multicast group
         address from the NameServer */
         makeClientSock();
         waitForPackets();
      } // end of MultiChat();
     
      private void makeClientSock(){
        try {   // try to create the client's socket
          clientSock = new DatagramSocket();
          clientSock.setSoTimeout(TIME_OUT);  // include a time-out
        }catch( SocketException se ) {
          se.printStackTrace();
          System.exit(1);
        } 
        try {  // NameServer address string --> IP no.
          serverAddr = InetAddress.getByName(SERVER_HOST);
        }catch( UnknownHostException uhe) {
          uhe.printStackTrace();
          System.exit(1);
        }
      }  // end of makeClientSock()
     
      private void waitForPackets(){
        DatagramPacket packet;
        byte data[];
        try {
          while (true) {
           data = new byte[PACKET_SIZE];    // set up an empty packet
            packet = new DatagramPacket(data, data.length);
            groupSock.receive(packet);  // wait for a packet
            processPacket(packet);
          }
        }catch(IOException ioe){ 
            System.out.println(ioe); 
            }
      }  // end of waitForPackets() 
    }

Wie man ziemlich gut erkennen kann, ist es auch nicht wesentlich anders, als wenn man sich direkt Sockets erstellt. Gefunden habe ich das Ganze in dem Buch “Killer Game Programming in Java” – heißt wirklich so – hin und wieder finden sich da wirklich interessante Dinge besprochen (Link: hier!).
So das wars.
Die Tage wollte ich noch mal bissel was zu OSGi schreiben – so denn das schöne Buch ankommt.
Und aus – leider aktuellem Anlass – zu IPMI und wieso es eigentlich schon fast unverschämt ist, dass ein _mitgelieferetes_ Linux-Tool fehlerhaft ist und deswegen vom Hersteller empfohlen wird, extra dafür ein Windows aufzusetzen. Nichts gegen Windows, aber wieso liefert man ein fehlerhaftes Tool dann mit?
P.S.: Schreibt mal wieder 😉

Splines mit dem HTML Canvas Tag

Splines innerhalb eines Canvas Tags sind mit ein wenig Javascript recht schnell machbar! (drumherum dann noch den ganzen HTML-Kram denken):

<canvas width=”150″ height=”150″ id=”myCanvas1″></canvas>
<script type=”text/javascript”>
function draw1(){
    var myCanvas1 = document.getElementById(‘myCanvas1′);
    myCanvas1.style.border = “1px black dashed”;   

    var ctx = myCanvas1.getContext(’2d’);

    ctx.beginPath();   
    ctx.strokeStyle = “#dedede”;
    for (i=1;i<15;i++){
        ctx.moveTo(i10,0);
        ctx.lineTo(i10,150);
    }
    for(j=1;j<15;j++){
        ctx.moveTo(0,j10);
        ctx.lineTo(150,j10);
    }
    ctx.stroke();   

    //Steuerpunkte malen (nur zur Verdeutlichung)
    ctx.beginPath();
    ctx.lineWidth = 2;
    ctx.strokeStyle = “rgb(0,200,0)”;
    ctx.moveTo(0,135);
    ctx.lineTo(60, 130);
    ctx.arc(60,130,3,0,360, false);
    ctx.lineTo(75,75);
    ctx.lineTo(90,20);
    ctx.arc(90,20,3,0,360, false);
    ctx.lineTo(150, 15);
    ctx.stroke();

    //quadraticCurveTo malen
    ctx.beginPath();
    ctx.strokeStyle = “#000000″;
    ctx.moveTo(0,135);
    ctx.lineWidth = 4;
    ctx.quadraticCurveTo(60, 130, 75, 75);
    ctx.moveTo(75,75);
    ctx.quadraticCurveTo(90, 20, 150, 15);
    ctx.stroke();

}
draw1();
 </script>

Das macht einem dann ein:

Das ganze funktioniert mit Firefox ab Version 1.5 (aber erst ab 2.x gehen auch quadratic Splines), Opera 9 und neueren Safaries.
Infos hier:

Die grünen Linien habe ich nur gemacht, damit man die Stützpunkte der Splines besser sehen kann.
Ach was war die CG-Vorlesung doch schön 😀

Blogged with the Flock Browser

SSL erzwingen in einem Java Application Server

Morgen :-),
so langsam bin ich dabei alle meine Problem gelöst zu bekommen 🙂 – ja wird auch Zeit :-D.
Bezogen auf diesem Post:
Ich bin an der Implementierung mit JAAS noch dran, allerdings habe ich herausgefunden, dass man dem Server einen Filter unterschieben kann, der bei jedem Aufruf überprüft, ob eine SSL Verbindung besteht, und wenn dies nicht der Fall ist, diese per Redirect erzwingt.
Das ganze funktioniert über Filter (wie es ja Ruby on Rails auch macht).
Man erstellt sich eine Klasse, welche javax.servlet.Filter implementiert.
Diese bindet man dann per web.xml ein:

    <filter>
        <filter-name>SSLFilter</filter-name>
        <filter-class>de.hausswolff.cotodo.security.SSLFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SSLFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

D.h. alle Anfragen, die an die Applikation gesendet werden, werden durch diesen Filter geschickt.
Der Filter im einzelnen vergleicht ob request.getScheme() == “https” ist. ansonsten redirected er einfach auf entsprechnede Seite.
In meinem Fall (da eine nicht-https Verbindung nur bei einem nicht angemeldeten Benutzer vorhanden ist auf eine Login-Seite)
Ich hoffe, dass ich morgen dann meine Anmeldung vervollständigen kann.
Für alle die sich noch näher mit den Feature von JEE 5 befassen wollen:
Unter http://java.sun.com/developer/releases/petstore/  kann man sich mit petstore eine Beispielanwendung herunterladen, die die Neuerungen (inkl. AJAX) demonstriert. Duke’s Bank scheint demnach nicht mehr genutzt zu werden 🙂