Munki und AutoPKG

Um meine Software zu verteilen nutze ich Munki. Damit die enthaltenen Pakete auch immer aktuell sind und ich nicht jede einzelne Herstellerseite absurfen muss, kommt AutoPKG zum Einsatz. Diese Software lädt die Pakete von diversen Websites runter, fügt noch ggf. Installscripte hinzu und kopiert sie in das Munki-Repo. Nun muss ich also nur regelmäßig ein Script starten und das tut den Rest. Eine Installationsanleitung ist bei Github zu finden.

Für jede Software gibt es Recipes, also Rezepte (u.a. für den Download). Um diese den eigenen Bedürfnissen anzupassen, kann man Overrides erstellen.

$ autopkg search QuickLookCSV

Name                             Repo             Path                                    
----                             ----             ----                                    
QuickLookCSV.pkg.recipe          jps3-recipes     QuickLookCSV/QuickLookCSV.pkg.recipe    
QuickLookCSV.download.recipe     jps3-recipes     QuickLookCSV/QuickLookCSV.download.recipe
QuickLookCSV.munki.recipe        jps3-recipes     QuickLookCSV/QuickLookCSV.munki.recipe  

To add a new recipe repo, use 'autopkg repo-add <repo name>'

$ autopkg repo-add jps3-recipes
Attempting git clone...

Adding /Users/admin/Library/AutoPkg/RecipeRepos/com.github.autopkg.jps3-recipes to RECIPE_SEARCH_DIRS...
Updated search path:
  '.'
  '~/Library/AutoPkg/Recipes'
  '/Library/AutoPkg/Recipes'
[...]

$ autopkg make-override QuickLookCSV.munki.recipe
Override file saved to /Users/admin/Library/AutoPkg/RecipeOverrides/QuickLookCSV.munki.recipe

Um nun alle Recipes auszuführen, führe ich folgenden Befehl aus:

$ autopkg run /Users/admin/Library/AutoPkg/RecipeOverrides/*.recipe MakeCatalogs.munki

Wenn ich nun die AutoPKG-Installation zu einem neuen Rechner migieren möchte, kopieren ich nur die RecipeOverrides auf den neuen Rechner und führe danach folgendes Script aus:

#!/bin/sh
autopkg repo-add "recipes"
for recipe in ~/Library/AutoPkg/RecipeOverrides/*
do
    repo=$(cat "${recipe}" | grep ParentRecipe -A 1 | tail -n 1 | tr -d "[:blank:]" | sed "s/<string>(.*)</string>/1/" | sed "s/.*.github.(.*)..*..*/1/")
    repoarray+=("${repo}")
done

IFS=$'n' repoarray=($(sort <<<"${repoarray[*]}"))
IFS=$'n' repoarray=($(uniq <<<"${repoarray[*]}"))

for repo in "${repoarray[@]}"
do
    echo "${repo}"
    autopkg repo-add "${repo}-recipes"
done

Das Script liest aus jeder Override-Datei das Parent-Recipe und dessen Repository aus und fügt es per autopkg repo-add xxx hinzu. So wird auch automatisch ein Update des bisherigen Repos durchgeführt.

Munki mit Git

Ich setze für meine Softwareverteilung auf Macs Munki ein. Das ist eine Software, die serverseitig nur einen Webserver und ein paar XML-Dateien benötigt. Der Client fragt dann regelmäßig am Server an und erhält so Updates. Die Funktion und Einrichtung von Munki ist aber im offiziellen Wiki viel besser dokumentiert.

In diesem Beitrag soll es um die Versionierung des Munki-Repositories mit Git und anschließender Veröffentlichung auf einem Server gehen.

Ich habe einen Webserver lokal auf meinem iMac laufen. Hier werden neue Pakete in Munki importiert, Software getestet und die ganze Verteilung geprüft. Ein weiterer Webserver läuft im Internet, der das gleiche Munki-Repo anbietet, sodass alle meine (und befreundete) Macs den Update-Server erreichen und Software installieren können.

Ich gehe davon aus, dass deine Munki-Installation funktioniert und so oder so ähnlich wie im Demonstration Setup konfiguriert ist.

Munki-Repository mit Git versionieren

Um nun das Repo zu versionieren, muss zuerst ein Git-Repository erstellt werden. Dazu wechselt du im Terminal in dein Munki-Repo und gibst folgenden Befehl ein:

$ git init

Danach müssen noch sämtliche Dateien eingecheckt werden, die versioniert werden sollen. Da das mit Binärdaten aber eher nicht so toll funktioniert, ignoriere ich den Ordner pkgs per .gitignore im Hauptverzeichnis meines Git-Repos.

$ cat .gitignore
/pkgs/
.DS_Store
$ git add .
$ git commit -m "First commit"

So sind alle Dateien – außer die Installer-Dateien –  eingecheckt und somit versioniert. Wenn ich nun ein Softwarepaket verändere (im Beispiel den Katalog von testing auf production ändere), dann kann ich dies also in Zukunft nachvollziehen und im Zweifel rückgängig machen.

Bildschirmfoto 2015-09-04 um 14.32.01

Remote-Repository einrichten

Nun möchte ich dieses lokal konfigurierte und getestete Repository auf meinem Server im Internet bereitstellen. Dies ist relativ einfach mittels Remote-Repository zu erreichen.

Hierzu muss auf dem Webserver ein Git-Server laufen und ein Headles-Repository eingerichtet sein. Wie ein Git-Server installiert und eingerichtet wird, erfährst du an anderer Stelle.

$ mkdir munki-test.git
$ cd munki-test.git
$ git --bare init

Danach wird das Remote-Repository dem lokalen Git-Repository hinzugefügt.

Bildschirmfoto 2015-09-04 um 14.48.07

Und nun kann das lokale Branch an den Remote-Server gepusht werden.

Bildschirmfoto 2015-09-04 um 23.48.34

Die Eigenheit von einem Bare-Repository ist, dass es nur die Git-Metadaten vorhält und nicht einen Branch auscheckt. Somit liegt das Munki-Repository nicht im direkten Zugriff auf dem Server. Das Git-Repo muss nach dem Push noch in Richtung Webserver ausgecheckt werden.

git --work-tree=/var/www/munki_repo --git-dir=/home/git/munki-test.git checkout -f

Da dieser Befehl nach jedem Push (also Upload zum Server) passieren muss, kann man es über die sog. Git Hooks lösen. In dem Git-Ordner auf dem Server sollte eigentlich schon ein Unterordner namens hooks mit ein paar Beispiel-Dateien liegen. Hier wird eine neue Datei namens post-receive angelegt, die in etwa so aussehen kann:

#!/bin/sh
git --work-tree=/var/www/munki_repo --git-dir=/home/git/munki-test.git checkout -f

Eingangs hatte ich geschrieben, dass ich die Binaries nicht mittracke. Wenn ich das nicht tue, werden sie natürlich auch nicht mit hochgeladen und auf dem Webserver bereitgestellt. Dies mache ich separat mit einem rsync. Und damit es auch automatisch läuft, nutze ich in meinem lokalen Repository den pre-push-hook.

$ cat pre-push
#!/bin/sh

remote="$1"
url="$2"

z40=0000000000000000000000000000000000000000

IFS=' '
while read local_ref local_sha remote_ref remote_sha
do
    if [ "$local_sha" = $z40 ]
    then
        # Handle delete
        :
    else
        if [ "$remote_sha" = $z40 ]
        then
            # New branch, examine all commits
            range="$local_sha"
        else
            # Update to existing branch, examine new commits
            range="$remote_sha..$local_sha"
        fi

        ### do the rsync
        rsync -hrLvzp --size-only --ignore-errors --stats --timeout=60 --delete-after --progress --exclude-from="/Users/admin/munki/syncfolders.exclude" /Users/admin/munki/munki_repo/pkgs/ username@server:/var/www/munki_repo/pkgs
        if [ $? != 0 ]; then
            echo "rsync error"
            exit 1
        fi
        ssh username@server "chown -R www-data:www-data /var/www/munki_repo/pkgs"

        # Check for WIP commit
        commit=`git rev-list -n 1 --grep '^WIP' "$range"`
        if [ -n "$commit" ]
        then
            echo "Found WIP commit in $local_ref, not pushing"
            exit 1
        fi
    fi
done

exit 0

Nun wird also der Ordner pkgs per rsync zum Server synchronisiert, das Git-Repo zum Server gepusht und serverseitig das Git-Repo in den www-Ordner ausgecheckt.

Dieses ganze Szenario habe ich bisher nur in eine Richtung getestet. Also von meinem Client zum Server. Git ist ja für die verteilte Versionskontrolle bekannt. Besonders das rsync-Script ist aktuell nicht darauf ausgelegt, mehrere Quellen (also 2-3 Rechner von Munki-Admins, die Updates bereitstellen) zu bedienen.

Adobe Lightroom – ein Katalog auf 2 Rechnern

Wenn ich Fragen im Netz lese/höre, wie man Lightroom auf mehreren Rechnern nutzt, läuft es meist auf folgende Empfehlung raus:

  • öffne Lightroom
  • wähle einen Ordner oder eine (smarte) Sammlung aus
  • klicke auf Datei – Als Katalog exportieren…
  • speichere den neuen Katalog mittels Export-Dialog auf eine externe Festplatte (oder ein anderen portables/zentrales Medium)

Ich finde dies etwas unglücklich. So hat man nur einen Teil seiner Bilder bei sich. Und wie der Re-Import in den Hauptkatalog aussieht, will ich gar nicht wissen.

Ich mache es mir da etwas einfacher. Ich nutze nur einen Katalog, der automatisch auf mein Notebook synchronisert. Ich importiere meine Bilder nach einem Shooting in Lightroom und lasse sie automatisch in Ordner nach Jahren, Monaten und Tagen importieren. Parallel dazu liegt ein Ordner namens „Lightroom“, der nur meinen Katalog (und dessen Backups) enthält. Ein weiterer Ordner heißt „MBA“ – dazu später mehr. Zusätzlich habe ich für die Bilder der letzten 1-3 Jahre Smart Previews erstellt, die sich dann ebenfalls im Katalog befinden.

Bildschirmfoto 2015-02-27 um 21.42.57Diesen Katalog-Order „Lightroom“ und den Ordner „MBA“ synchronisiere ich nun mit Bittorrent Sync zu meinem Notebook.

So habe ich alle (aktuellen) Bilder immer dabei und kann dank „Smart Previews“ die Bilder in vollem Umfang bearbeiten, korrigieren, zuschneiden und taggen.

Der Weg zurück

Wenn ich nun Bilder eines Shootings schon mobil importiere, mache ich das in den Ordner „MBA“. Auch hier drunter werden die Bilder von Lightroom automatisch in Ordner nach Datum sortiert. Jetzt kann ich natürlich den vollen Lightroom-Funktionsumfang nutzen. Vorteil: Beim taggen der Bilder steht mir die komplette History meiner Stichwörter zur Verfügung (da es ja nur ein Katalog ist).

Wenn ich nun wieder zu Hause bin, öffne ich nur mein Notebook, starte parallel meinen iMac und lasse Bittorrent Sync den Rest machen. Die beiden Ordner „Lightroom“ (mit dem Katalog) und der Ordner „MBA“ (mit den neuen Bildern) landen an passender Stelle auf meinem Hauptrechner.

Da die Ordnerstruktur auf meinem Rechnern die gleiche ist, stimmen natürlich sämtliche Dateipfade und alle Bilder sind in Lightroom zugreifbar.

Weil Ordnung so toll ist – und natürlich auch um wieder Platz auf dem Notebook zu schaffen – verschiebe ich in Lightroom die Bilder aus dem Ordner „MBA“ in meinen Haupt-Bilderordner. Sofort unterstützt mich Bittrorrent Sync wieder und synchronisiert den nun leeren MBA-Ordner wieder zum Notebook.

Warum nur der Katalog?

Warum synchronisiere ich nur den Katalog und nicht meinen gesamten Bilderordner inklusive aller Rohdaten? Ganz einfach: Zu wenig Platz.

Auf dem MacBook Air habe ich nicht so viel Platz zur Verfügung, um alle Bilder parat zu haben. Aber das ist ja dank Smart Previews auch gar nicht notwendig.

Mein Lightroom-Katalog selbst hat aktuell ca. 8GB, die Rohdaten (JPEGs oder RAWs bzw. DNGs) schlagen mit knapp 70GB zu buche.

Multi-Boot-Stick mit OS X

Da ich mir aus Gründen meinen Multi-Boot-Stick mit OS X 10.6, 10.7, 10.8, 10.9 und allen Systemupdates zerschossen habe, muss ich mir gerade einen neuen bauen. Ich nutze die Chance, um es mal zu dokumentieren. BTW: Der Lion Disk Maker bzw. Disk Maker X löscht alle Partitionen auf einem Stick, obwohl man nur eine Partition ausgewählt hat.

Partitionieren

Ich nutze hierfür ein 64GB Stick. Es wird für einen Bootstick meist ein 8GB-Stick empfohlen. Deshalb partitioniere ich meinen Stick mit 5 Partitionenen. 4*8GB und 1*32GB für Systemupdates.

Partition

10.9

Als nächstes lade ich mir das Mavericks-Update aus dem Mac App Store. Hier wird gleich die Vollinstallation mit 10.9.2 geladen und nicht nur 10.9.0.

Um nun die 10.9-Partition zu beschreiben, gebe ich folgenden Befehl ein:

sudo /Applications/Install OS X Mavericks.app/Contents/Resources/createinstallmedia --volume /Volumes/10.9 --applicationpath /Applications/Install OS X Mavericks.app/ --nointeraction

Wenn dies durch ist, passe ich sowohl die Beschriftung der Partition (durch einfaches umbenennen im Finder), als auch die Beschriftung während des bootens an:

sudo bless --folder /Volumes/10.9/ -label "10.9"

Die Beschriftung ist auf einem neuen iMac Late 2013 (dünnes Modell) aber seltsamerweise nicht sichtbar. Deshalb ändere ich noch die Icons der entsprechenden Partition und setze ein Bild passend zum Betriebssystem.

10.8

Auch 10.8 lade ich mir aus dem Mac App Store. Hier gehe ich wie in diesem Artikel beschrieben vor. Inhalt der Installations.app anzeigen lassen, InstallESD.dmg aus dem Ordner „Contents/Shared Support“ mounten und mit dem Festplattendienstprogramm wiederherstellen (links das DMG auswählen, dann rechts „Wiederherstellen“ auswählen und die 10.8er Partition vom Stick auf das „Zielmedium“ draggen.

10.7

Hier ist die Vorgehensweise exakt wie bei 10.8.

10.6

Die 10.6er Startpartition muss ich später mal wiederherstellen. Habe aktuell keine Install-DVD parat, um mir davon ein Image zu ziehen.

Brother P-Touch 2430PC am Mac

Ich habe mir den Etikettendrucker P-Touch 2430PC von Brother gegönnt.

Laut Spezifikationen des Herstellers wird nur Microsoft Windows unterstützt. Einige Amazon-Kommentare behaupteten aber etwas anderes.

Auf dieser Seite habe ich die Software und den Treiber für den Mac gefunden. Getestet auf einem OS X 10.9. Läuft wunderbar.

Wichtig: Der Schalter auf der Rückseite muss auf „E“ stehen. Sonst wird der Drucker am Mac nicht erkannt. Auf Position „EL“ wird zusätzlich noch ein Laufwerk am Rechner eingebunden, auf dem die Windows-Software zu finden ist.

VMWare Fusion: Booten vom USB-Stick

Mit Bordmitteln kann man eine virtuelle Maschine leider nur via CD oder ISO-Datei booten. Von einem fertigen USB-Stick scheint es nicht zu funktionieren.

Dies bekommt man aber mit dem Tool Plop Boot Manager hin. Ich habe mit VMWare Fusion 5.0.3 auf einem OS X 10.9 die Datei plpbt-5.0.14.zip getestet.

ISO in der virtuellen Maschine als CD einbinden, USB-Stick stecken und mit der VM verbinden und booten. Im Bootmanager nun USB auswählen und das war’s.

Bootmenü des Plop Boot ManagersUnd schon wird vom Stick gebootet.

Bootmenü der Hiren Boot-CDQuelle: http://professionalvmware.com/2012/10/boot-usb-drive-in-fusion-5/

 

Songs mit Lyrics versehen

Vor einiger Zeit habe ich bereits eine funktionierende Infrastruktur gehabt, um Songs in meiner iTunes-Bibliothek auf dem Mac mit Songtexten auszustatten. Durch diverse Systemupdates funktioniert dies aber nicht mehr, sodass ich mich neu umschauen musste.

In iOS6 ist die Liedtextanzeige auch rausgefallen, mit dem aktuellen Update auf iOS7 aber wieder zurück gekommen.

Welche Songs haben keine Lyrics?

Um herauszufinden, welche Songs keine Lyrics enthalten, würde ich normalerweise eine Smart-Playlist bauen. Leider gibt es das Kriterium “Lyrics” nicht. So muss man sich also mit einem AppleScript zu helfen wissen.

tell application "iTunes"
  if exists playlist "No Lyrics" then
    delete playlist "No Lyrics"
  end if
  make new playlist with properties {name:"No Lyrics"}
  duplicate (every track of playlist 1 whose lyrics is equal to "") to playlist "No Lyrics"
end tell

Nach Ausführung dieses Scripts hast du eine neue Playliste namens “No Lyrics”, in der sich alle Songs ohne Lyrics befinden.

Du kannst auch folgende Zeile nutzen, um nur ein bestimmte Playliste zu filtern:

  duplicate (every track of playlist "Name der Playliste" whose lyrics is equal to "") to playlist "No Lyrics"

Diese Maßnahme ist aber rein informell. Du kannst den nächsten Schritt auch durchführen, ohne diese Liste generiert zu haben.

Songs mit Lyrics ausstatten

Um nun auf Lyrics-Suche zu gehen, benötigst du das Programm Get Lyrical. Die Bedienung ist selbsterklärend. Tracks in iTunes auswählen und in der App auf “Auswahl taggen” klicken. Sollte ein Song bereits Lyrics enthalten, kommt folgende Abfrage:

Get Lyrical - Liedtexte überschreiben

Nach ein paar Minuten Wartezeit sollten der Großteil deiner Songs Lyrics enthalten.

Mikrofon

CC BY 2.0 Some rights reserved by LifeSupercharger http://www.flickr.com/photos/8047705@N02/5344906827/

Lyrics anzeigen

iTunes selbst kann die Lyrics anzeigen. Dies ist aber nicht sehr komfortabel. In den Informationen des Songs (CMD+I) gibt es einen Reiter namens “Lyrics”.

Die App “Get Lyrical” kann ebenfalls die geladenen Lyrics anzeigen. Nach einem Klick auf den jeweiligen Button mit dem Auge werden die Lyrics in einem Quicklook-Fenster angezeigt.

FusionDrive im iMac

So, ich hab es endlich durchgezogen. Mein optisches Laufwerk ist aus dem iMac rausgeflogen und wurde durch eine SSD ersetzt. Zum Einsatz kommt hier eine Corsair CSSD-F120GBGT-BK Force GT SSD 120GB. Sie schafft laut Herstellerangabe >500MB/s beim schreiben als lesen. Leider hat mein iMac nur eine SATA-II-Schnittstelle, sodass ich es gar nicht voll auskosten kann. Als Einbaurahmen nutze ich den Adapter von hardwrk für das MacBook Pro. Im Anschluss muss noch das optische Laufwerk in das von hardwrk mitgelieferte externe Gehäuse eingebaut werden – das hab ich allerdings noch nicht durchgeführt.

Hier mal ein paar Bilder vom Umbau…

Mac OS X 10.6.8 auf dem Lenovo S10-2

Fundstück aus den Blog-Entwürfen…
Diese Anleitung habe ich während der Installation von OS X auf einem Lenovo-Netbook mitgeschrieben. Dies ist mittlerweile aber schon wieder 7-8 Monate her. Ob diese Anleitung jetzt noch aktuell ist bzw. funktioniert, ist unklar.

Um ein Update von 10.6.0 auf 10.6.8 durchzuführen, muss folgendes gemacht werden:

Nun solltest du auf 10.6.7 sein und alles sollte funktionieren.

Weiter geht’s mit dem Update auf 10.6.8:
Beim Kernel-Panic nach dem Update auf 10.6.7 folgendes durchführen
  • Boot vom Installations-Medium
  • Terminal starten
  • umount /Volumes/Macintosh HD
  • mount -t hfs /dev/disk0s2 /Volumes
  • evtl. rm -rf /Volumes/Extra/SleeperEnable.kext
  • rm -rf /Volumes/System/Library/Extensions/SleepEnabler.kext

Mein Dock

Hier möchte ich euch mal zeigen, was bei mir so im Dock und in der Menüleiste meines Mac OS X schlummert.

Die Idee hierfür hab ich vom tekshrek 🙂

Da ich momentan unterwegs bin, folgt hier vorerst nur mein MacBook Air…

Update: Das Dock und die Menüleiste von meinem iMac hab ich nun auch hinzugefügt.

MacBook Air

Dock

v.l.n.r
Finder
Google Chrome google.de/chrome
Mail.app
Messages
Adressbuch
iCal
Erinnerungen
Notizen
Skype 5.0
Tweetbot tapbots.com/tweetbot_mac
Reeder AppStore
iTunes
Systemeinstellungen
1Password AppStore
Terminal
Transmit AppStore
Coda 2 AppStore
Tower git-tower.com

Menüleiste

v.l.n.r.
Cobook AppStore
Dropbox db.tt/DInkGjX
Little Snitch obdev.at/products/littlesnitch/index-de.html
VMWare vmware.com/de/products/desktop_virtualization/fusion/overview
ControlPlane controlplaneapp.com
Hazel noodlesoft.com/hazel.php
CleanMyDrive AppStore
Choosy choosyosx.com
Caffein AppStore
Tedium tediumapp.com
VPN
Time Machine
Bluetooth
Lautstärke
Wifi
Akku
Tastatur- und Zeichenübersicht
Datum & Uhrzeit
Benutzerwechsel
Spotlight
Mitteilungszentrale

iMac

Dock

v.l.n.r.
Finder
Launchpad
Mail.app
Google Chrome google.de/chrome
Mozilla Firefox mozilla.org/de/firefox
Messages
Tweetbot tapbots.com/tweetbot_mac
Skype 5.0
Reeder AppStore
Coda 2 AppStore
Tower git-tower.com
Adressbuch
iCal
Erinnerungen
Notizen
iTunes
Transmit AppStore
iPhoto
Time Machine
Systemeinstellungen
Terminal
VMWare Fusion 4 vmware.com/de/products/desktop_virtualization/fusion/overview
HandBrake handbrake.fr
HandBrakeBatch osomac.com/apps/osx/handbrake-batch
MP4tools emmgunn.com/mp4tools/mp4toolshome.html
Crashplan crashplan.com

Menüleiste

v.l.n.r.
VMWare vmware.com/de/products/desktop_virtualization/fusion/overview
I Love Stars AppStore
Little Snitch obdev.at/products/littlesnitch/index-de.html
Dropbox db.tt/DInkGjX
Cobook AppStore
ControlPlane controlplaneapp.com
Hazel noodlesoft.com/hazel.php
Crashplan crashplan.com
CleanMyDrive AppStore
Choosy choosyosx.com
Tedium tediumapp.com
Caffein AppStore
TuneInstructor tune-instructor.com/de
iStats Menu bjango.com/mac/istatmenus
Lautstärke
Time Machine
Bluetooth
Tastatur- und Zeichenübersicht
Wifi
Datum & Uhrzeit
Benutzerwechsel
Spotlight
Mitteilungszentrale