emacs –daemon mit launchd und KeepAlive

Problem

Wer den Emacs unter OSX als daemon starten will, kann das mittels launchd-Skript machen.

Das Verfahren wird schon an verschiedenen Stellen beschrieben.

Problematisch wird es nur, wenn im launchd-Skript „KeepAlive“ benutzt wird, da der Emacs einen Fork macht, was launchd nicht mag – siehe Emacs-Bugeintrag.

Lösung

Als Workaround habe ich mir einen emacsdaemon.sh –Wrapper geschrieben:

$HOME/Library/Scripts/emacsdaemon.sh

#/bin/sh

EMACS_DIR=/usr/local/Cellar/emacs/HEAD/
EMACS=${EMACS_DIR}/bin/emacs
EMACSCLIENT=${EMACS_DIR}/bin/emacsclient

getPid(){
 PID=$($EMACSCLIENT -e '(emacs-pid)' 2> /dev/null)
 echo $PID
}
anywait(){
 for pid in "$@"; do
 while kill -0 "$pid"; do
 sleep 5
 done
 done
}

DAEMON_PID=$(getPid)

on_complete() {
 echo $(date +%R)' Ended.' >> "$LOG"
 kill -9 $DAEMON_PID
 exit
}

trap 'on_complete 2> /dev/null' SIGTERM SIGINT SIGHUP EXIT

case $1 in 
 status)
    if [ -z "$DAEMON_PID" ]; then 
       echo "Emacs-Daemon NOT RUNNING"
    else
       echo "Emacs-Daemon running PID:$DAEMON_PID"
    fi
 ;;
 stop)
    kill -9 $DAEMON_PID
    exit 0
 ;;
 launchd)
    test -z "$DAEMON_PID" && {
        $EMACS -daemon
        sleep 1
    }
    DAEMON_PID=$(getPid)
    test -z "$DAEMON_PID" && {
       echo "not running -> exit"
       sleep 2
       exit 1
    }
    anywait $DAEMON_PID
 ;;
 wait)
    anywait $DAEMON_PID
 ;;
esac

EMACS_DIR sollte evtl angepasst werden

$HOME/Library/LaunchAgents/gnu.emacs.daemon.plist

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
 <key>Label</key>
 <string>gnu.emacs.daemon</string>
 <key>ProgramArguments</key>
 <array>
 <string>~/Library/Scripts/emacsdaemon.sh</string>
 <string>launchd</string>
 </array>
 <key>RunAtLoad</key>
 <true/>
 <key>KeepAlive</key>
 <true/>
 <key>EnableGlobbing</key>
 <true/> 
 <key>ServiceDescription</key>
 <string>Gnu Emacs Daemon</string>
 </dict>
 </plist>

Einsatz

Einfach einmal per launchctl laden und der Emacs ist nach jeden Login als daemon gestartet.

$ launchctl load $HOME/Library/LaunchAgents/gnu.emacs.daemon.plist
$ ps ax | grep -i emacs
52370   ??  S      0:00.08 sh /Users/xxx/Library/Scripts/emacsdaemon.sh launchd
52382   ??  Ss     0:03.18 /usr/local/Cellar/emacs/HEAD/Emacs.app/Contents/MacOS/Emacs -nw --daemon=^J3,4^J

 

Lion-Macs in der Active Directory – Homes auf netatalk-Server

Nehmen wir mal an, dass man einige Macs in die Active Directory integrieren will.
Das ist ja eigentlich straightforward, da es von Apple genug Anleitungen dazu gibt, wie man dabei vorzugehen hat.

Komplizierter wird es dabei schon, wenn man man abweichende HOME-Verzeichnisse für  Mac (AFP)-Clients haben will, während die Windows-Clients die Standard-Homes auf dem Windows-Server nutzen.

Das Home-Verzeichnis der Mac-Clients liegt dabei auf einem Unix/Linux/FreeBSD-Server

Im Prinzip sind es 3 Schritte die man dafür durchführen muss. Schritt 1 und 2 lasse ich erstmal mangels Zeit weg (werden aber benötigt), Schritt 3 ist der interessante.

Schritt 1: Intergration in die AD

-> Server Admin 10.6 Help: Konfigurieren des Zugriffs auf eine Active Directory-Domain

Schritt 2: Single Sign On/GSSAPI mit Netatalk

<to be filled> Stichworte: samba, net ads keytab, uams_gss.so, kinit

Schritt 3: Den Client zum richtigen Home bringen

Dieser Schritt ist ein wenig knifflig rauszufinden.

Die Apple-Dokumentation geht von ein und dem selben Home-Verzeichnis aus, das in der ADS unter homeDirectory steht.

Die Einstellung „Zu verwendendes Netzwerkprotokoll“ aus der Apple-Doku steuert im Prinzip nur den Automounter des Unix-Subsystems, d.h:


# Protokoll AFP
/usr/libexec/od_user_homes joe
-> afp://;AUTH=NO%20USER%20AUTHENT@/UserShares/joe
# Protokoll SMB
/usr/libexec/od_user_homes joe
-> smb:///UserShares/joe

Das ganze wird über die Datei /etc/auto_home gesteuert:

#
# Automounter map for /home
#
+auto_home # Use directory service
#
# Get /home records synthesized from user records
#
+/usr/libexec/od_user_homes

Wie man sieht, wird das od_user_homes-Skript hier aufgerufen.


...
#+/usr/libexec/od_user_homes
+/usr/local/libexec/od_user_homes_linux

Den Aufruf ersetzen wir durch ein eigenes Skript

#!/bin/sh

/usr/libexec/od_user_homes $1 | grep -q $1 && {
echo "afp://;AUTH=NO%20USER%20AUTHENT@linuxserver.domain/$1"
}

Dies liefert die Linux-netatalk-Variante zurück, wenn der Original-Aufruf etwas zurückliefert. Im Prinzip kann hier alles stehen. Auch eine Snow-Leopard-Variante ist möglich, da dort od_user_homes gar nicht vorhanden.

Fazit

Wenn alle Schritte funktionieren hat man Mac-Clients mit automatisch zugewiesenen Home-Verzeichnissen auf einen Netatalk-Server.

ARD/ZDF Euro2012-Streams mit VLC multiplexen

EURO2012-Multiplexer (sinnvoll in Büros)

Man braucht:

  • OSX/Linux/whatever
  • aktueller VLC (am besten mit cvlc-Kommandozeilenclient)

Folgendes Script (vlcproxy.sh)


#!/bin/bash

case $(uname -s) in
Darwin)
VLC_BINARY=“/Applications/VLC.app/Contents/MacOS/VLC“
;;
*)
VLC_BINARY=$(which vlc)
;;
esac

VLC=“${VLC_BINARY} –intf=rc –sout-ffmpeg-strict=-2″

CHANNELS=““
case $1 in
ard|ARD)
PLAYLIST=http://metafiles.gl-systemhaus.de/wdr/ARD/ARD_Event2_geo.m3u8 #original aus iOS-App von Squid-Log
PLAYLIST=http://wdr_ios_fsev_geo-i.akamaihd.net/hls/live/201764/1/playlist1x.m3u8
$VLC $PLAYLIST –sout ‚#standard{mux=ts,dst=:8181,access=http}‘
;;
zdf|ZDF)
;;
*)
echo „USAGE: $0 ard oder $0 zdf“
;;
esac

Danach auf dem Client die URL im VLC öffnen
http://SERVERIP:8181

Skype5 kann VIM/SED-Kommandos

gerade beim Chatten gemerkt ..
Im neuen Skype kann man seine Nachrichten mittels VIM oder SED -Commandos nachträglich modifizieren.
Schreibt man fälschlicherweise
... abfahren
und schickt es ab, kann man durch
s/abfahren/abgefahren/g
den eingegebenen Text korrigieren lassen … UNIX-Like.

[UPDATE] Scheint auch schon länger zu gehen.

1&1 Surf-Stick (ZTE MF110) unter OSX ohne Join Air

Wie man ja schön in einer c’t nachlesen kann, saugt die Provider UMTS-Software ziemlich unter dem Mac.

Zum Glück lässt sich auch darauf verzichten, das ZTE Join Air-Programm zu installeren.

Treiber

Im Join Air.mpgk-Paket ist der Treiber drin, der gebraucht wird.

Variante 1 (Finder):

  • Im Finder mittels „Paketinhalt anzeigen“  den Inhalt des Join Air.mpkg zum Vorschein bringen
  • in Contents/Packages wechseln
  • drv.pkg durch Doppelklick installieren

Variante 2 (Shell):

$ cd /Volumes/Join\ Air/Join\ Air.mpkg/Contents/Packages/
$ open drv.pkg

Danach sollte OS X bei eingesteckten STICK ein Modem erkennen ….

Neue Hardware

PIN-eingabe

Zuerst muss man seine SimCard mittels PIN aktivieren. Und zwar jedes Mal, wenn der Stick eingesteckt wird.

automatisch per launchd-Skript

Ich habe mir ein launchd-skript gebaut, das automatisch beim Einstecken des Sticks die SimCard mit dem PIN freischaltet.

my.domain.surfstick.plist nach /Users/MEINNUTZER/Library/LaunchAgents legen und PIN (1111) ändern
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>my.domain.surfstick</string>
<key>OnDemand</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/Users/MEINNUTZER/Library/Scripts/setpin.sh</string>
<string>1111</string>
<string>/dev/tty.ZTEUSBATPort_</string>
</array>
<key>WatchPaths</key>
<array>
<string>/dev/</string>
</array>
</dict>
</plist>

setpin.sh nach /Users/MEINNUTZER/Library/Scripts legen
#!/bin/sh
PIN=$1
DEVICE=$2
test -z "$DEVICE" && DEVICE=/dev/tty.ZTEUSBATPort_
test -z "$PIN" && {
echo "Usage: $0 <PIN>"
exit 0
}
test -c $DEVICE || exit 0

PID=zte

screen -dm -S $PID $DEVICE 115200
sleep 0.2;
screen -S $PID -p0 -X stuff "AT+CPIN=$PIN
"
sleep 0.1;
screen -S $PID -p0 -X kill;

Aktivierung:

launchctl load -w ~/Library/LaunchAgents/my.domain.surfstick.plist

manuell

Da gibt es 2 Möglichkeiten, die hier ganz gut beschrieben sind. Der Devicename ist hierbei /dev/tty.ZTEUSBATPort_ (screen-Methode) oder ZTEUSBATPort_ (für das KingPin.app).

Netzwerkeinstellungen

Jetzt fehlen nur noch die richtigen Einstellungen.

  • Ich habe dabei ZTEUSBModem in 1und1Stick umbenannt
  • Benutzername und Passwort sind total egal
  • Der APN war in meinen Fall web.vodafone.de (aus der 1und1 Schnellstartanleitung)

Danach sollte die Verbindung mit OSX Bordmitteln möglich sein.

Unter OSX Wireless LAN auf der Kommandozeile einrichten

Wenn man an seinen Mac mal keine Tastatur dran hat und nur SSH über Ethernetkabel verfügbar hat, kann man über die Shell W-LAN global einrichten:

$ ssh root@macmini # oder andere nutzer und dann mit sudo
root@macmini:~/ > networksetup| grep -A 1 airport
Usage: networksetup -getairportnetwork
Usage: networksetup -setairportnetwork [password]
Usage: networksetup -getairportpower
Usage: networksetup -setairportpower
root@macmini:~/ > networksetup -getairportpower en1
AirPort Power (en1): On
root@macmini:~/ > networksetup -removepreferredwirelessnetwork en1 HONEYPOT
Removed HONEYPOT from the preferred networks list
root@macmini:~/ > networksetup -addpreferredwirelessnetworkatindex en1 HONEYPOT 0 WPA2 meinpasswort
Security type is set to: WPA2 Personal
Added HONEYPOT to preferred networks list
root@macmini:~/ > networksetup -listpreferredwirelessnetworks en1
Preferred networks on en1:
HONEYPOT