Sonntag, 9. Juni 2013

RAM-Speicherauslastung unter Mac OS X über SNMP auslesen

Ich habe heute Sonntag ein wenig Zeit in dieses Projekt investiert und stelle die Scripts, Konfigurationsanpassungen und Installationsanleitung über GitHub zur Verfügung:

macosx-memory-snmp

Tags: , , , , , ,
Labels: Apple

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 9. Juni 2013

SNMP unter Mac OS X 10.8 Mountain Lion aktivieren

Mac OS X 10.8 (Mountain Lion) bringt Out-of-the-box alles mit, um einen SNMP-Server bereitzustellen. In Verbindung mit cacti zeichne ich so in Echtzeit Systeminformationen meines Mac minis, MacBook Airs und Stephanies Mac mini auf.

Wer Rechner ausschliesslich in seinem heimischen LAN betreibt, kann nachfolgende Minimal-Konfiguration einrichten, damit cacti auf einem Drittserver per SNMP v1 und ohne Passwort darauf zurückgreifen kann:

/etc/snmp/snmpd.conf (Desktop-Rechner)

sysContact  Vorname Nachname 
sysLocation Strasse Strassennummer, PLZ Ort

rocommunity public

includeAllDisks 10%
load    30 10 5

Auf einem portablen Gerät würde ich SNMP abriegeln und den Zugriff nur mittels Benutzernamen und Passwort zugänglich machen. Verwendet man obige Lösung, kann im Flughafen-WiFi oder im Uni-WiFi jedes Script-Kiddie mit nmap-Portscans auf den SNMP-Server aufmerksam werden und mehr oder weniger sensitive Informationen abrufen.

Hierzu eignet sich folgende Konfiguration:

/etc/snmp/snmpd.conf (portabler Rechner)

createUser <username>     MD5 "<password>" DES "<secret>"
authuser   read -s usm  <username> priv  .1

sysContact  Vorname Nachname 
sysLocation Strasse Strassennummer, PLZ Ort

includeAllDisks 10%
load    30 10 5

Sowohl password als auch secret können frei gewählt werden (alphanumerische Zeichenfolge).

Quelle: Setup SNMP V3 USM with encryption.

Daemon (neu) starten

Nach der Konfigurationsanpassung heisst es, den SNMP-Server (neu) zu starten. Dies habe ich mit folgendem Script automatisiert:

#!/bin/sh

echo "Stopping SNMP daemon ..."
sudo launchctl unload /System/Library/LaunchDaemons/org.net-snmp.snmpd.plist

echo "Starting SNMP daemon ..."
sudo launchctl load -w /System/Library/LaunchDaemons/org.net-snmp.snmpd.plist

exit 0

Daemon bei jedem Neustart von Mac OS X laden

Hierzu habe ich die von Apple mitgelieferte plist-Datei /System/Library/LaunchDaemons/org.net-snmp.snmpd.plist angepasst:

	<key>Disabled</key>
	<false/>

Tags: , , , , , , ,
Labels: Linux, Uncategorized

Keine Kommentare | neuen Kommentar verfassen

Samstag, 8. Juni 2013

Mit cacti einen Xerox-Drucker überwachen

Vor Jahren habe ich unter Mit Cacti SNMP-fähige Netzwerkdrucker abfragen cacti-Templates bereitgestellt, mit welchen die Attribute vernetzter HP Laserjet-Drucker per SNMP aufgezeichnet werden können.

Da ich mittlerweile in einer nächtlichen Aktion cacti auf meiner brandneuen Synology DS413j zum Laufen gebracht habe, hiess es heute Samstag-Morgen, meinen Xerox Phaser 3250DN ebenfalls in das Monitoring aufzunehmen. Dies war komplizierter als gedacht, weil zwar offenbar die OIDs für den Page Count standardisiert sind, nicht aber für den Supply Level des Toners. Bei Xerox handelt es sich um die OID 1.3.6.1.2.1.43.11.1.1 respektive 1.3.6.1.2.1.43.11.1.1.9.1.1, um den Füllstand des schwarzen Toners in Prozenten zu eruieren.

Damit ich diesen Wert ebenfalls auslesen konnte, lud ich mir folgende zwei cacti-Template-Sammlungen herunter:

Der Einfachheit halber biete ich hier alle benötigten Dateien in einer einzigen ZIP-Datei an:

SNMP Printer Supplies (27 KB)

Nachdem die XML-Dateien in SNMP Printer.zip über die cacti Web-Oberfläche eingelesen wurden (Import Templates), musste ich die printer_supply.xml aus dem zweiten Download im Web-Server-Verzeichnis von cacti unter cacti/resource/snmp_queries ablegen.

Anschliessend fügte ich beim bestehenden Eintrag des Xerox-Druckers unter Associated Data Queries das Query SNMP – Get Printer Supply ein und erstellte mit Create Graphs for this Host den neuen, zusätzlichen Graphen. Fertig!

Xerox 3250DN Used Level

Labels: Uncategorized

1 Kommentar | neuen Kommentar verfassen

Freitag, 7. Juni 2013

Mac OS X Mountain Lion und die immer wiederkehrenden Log-Einträge

Console.app zeigt mir in regelmässig wiederkehrenden Zeitabschnitten folgende Fehlermeldungen an:

07.06.13 22:43:03.898 mdworker[27399]: Unable to talk to lsboxd
07.06.13 22:43:03.904 mdworker[27401]: Unable to talk to lsboxd
07.06.13 22:43:03.910 mdworker[27400]: Unable to talk to lsboxd
07.06.13 22:43:04.003 sandboxd[27404]: ([27399]) mdworker(27399) deny mach-lookup com.apple.ls.boxd
07.06.13 22:43:04.012 sandboxd[27404]: ([27401]) mdworker(27401) deny mach-lookup com.apple.ls.boxd
07.06.13 22:43:04.022 sandboxd[27404]: ([27400]) mdworker(27400) deny mach-lookup com.apple.ls.boxd
07.06.13 22:43:04.000 kernel[0]: Sandbox: sandboxd(27404) deny mach-lookup com.apple.coresymbolicationd

Das Problem ist an einschlägigen Orten im Internet sehr gut dokumentiert — nur leider ist mir die ultimative Lösung des Problems bisher nicht angeboten worden. Werte Apple-Ingenieure, könnt ihr euch nicht einmal um einen Bugfix bemühen? Danke.

Nachtrag: Mac OS X 10.8.4 scheint das Problem endlich zu beheben:

I’ve had 10.8.4 running for about eight hours now (installed via combo update), and it appears to have have partially fixed my issues. I no longer am getting sandboxd[296] ([299]): mdworker(299) deny mach-lookup com.apple.ls.boxd and kernel[0]: Sandbox: sandboxd(314) deny mach-lookup com.apple.coresymbolicationd messages.

I’ve only gotten one mdworker[299]: Unable to talk to lsboxd message during that time.

Quelle: 10.8.2 – mdworker: Unable to talk to lsboxd

Tags: , , , , ,
Labels: Apple

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 22. Mai 2013

Konkurrenz-Probleme in PHP

In den letzten Wochen habe ich intensiv an meinem Raspberry Pi-Dashboard für unser Apartment geschraubt und gebastelt. Verschiedene Tiles werden mittels AJAX-Requests, welche über jQuery abgesetzt werden, mit Inhalten versorgt — und dies regelmässig alle paar Minuten.

Ein mysteriöser Bug machte mir in den letzten Tagen das Leben schwer: Es konnte vorkommen, dass zwei Tiles mit den Aktienkursen desselben Unternehmens gefüllt wurden, obwohl die Tile-IDs unterschiedliche ISINs trug.

Nach einigen Minuten Debugging schwante mir dann plötzlich, was das Problem war: Der auf dem Server lokal zwischengespeicherte HTML-Cache war zwar in Dateien mit der richtigen ISIN im Dateinamen abgelegt — der Inhalt war aber identisch. Konkret enthielt die HTML-Datei über das Unternehmen AAPL die Daten für das Unternehmen GOOG.

Wie sich heraustellte, hatte ich mein Script nicht dermassen intelligent programmiert, dass es mit mehreren, nur wenige Millisekunden auseinanderliegenden Requests ordnungsgemäss umging. Um nämlich den Aktienkurs einer ISIN abzufragen, muss dieser zuerst über einen HTTP-Request an ein Suchscript meines unfreiwilligen Kursanbieters in eine vom Anbieter intern verwendete NOTATION_ID umgewandelt werden (was wissbegierigen Lesern dieses Blogs einen Hinweis gibt, von welcher Web-Site ich die Kursdaten beziehe). Erst danach kann ich die Informationsseite des auf dem Aktienmarkt gehandelten Unternehmens aufrufen, herunterladen und im lokalen Dateisystem ablegen.

Konkret war mein Fehler, dass ich die Suchergebnisse zur Umwandlung der ISIN in die NOTATION_ID in eine Cache-Datei mit statischem Dateinamen ablegte. Da die Requests mit wenigen Millisekunden Versatz beim Server ankamen, war die Cache-Datei manchmal bereits von einem späteren Request überschrieben worden, als ich den HTML-Code endlich in PHP einlesen wollte (ich denke, dass wir hier von einigen wenigen hundert Millisekunden sprechen). Dies führte dazu, dass ich einer ISIN fälschlicherweise die NOTATION_ID des nachfolgenden Requests zuwies und diese plötzlich für zwei Kursanbieter galt. Da ich dieses Mapping aus Performance-Gründen ebenfalls serialisiert in einer Cache-Datei ablegte, wurden ab diesem Zeitpunkt zwei Tiles mit identischen Inhalten befüllt.

Die erste Lösung, dem Dateinamen einen sich ständig ändernden Wert einzupflegen, scheiterte grandios, weil ich time() verwendete. Da die Requests innerhalb der selben Sekunde auf dem Server eintreffen konnten, konnte die Cache-Datei im schlimmsten Fall weiterhin vom nachfolgenden Request überschrieben werden. Die zweite Lösung war deshalb, durch das Einfügen einer mittels rand(1000,9999) definierten Zufallszahl einen wahrlich zufälligen Wert in den Dateinamen einzuschleusen. Die Chancen, einen identischen Cache-Namen zu erwischen, ist hier 1:10000 — good enough, würde ich sagen.

Natürlich hätte ich auch einfach die ISIN in den Namen der Cache-Datei aufnehmen können. Hier hegte ich aber Zweifel, weil ich nicht wollte, dass bei einem Downloadfehler einfach unbemerkt die bestehenden, veralteten Daten eingelesen würden.

Tags: , , , , , , ,
Labels: Programmierung

1 Kommentar | neuen Kommentar verfassen

Sonntag, 12. Mai 2013

Wetter-Icons als Web-Font in ein Dashboard einbinden

Derzeit arbeite ich mit Hochdruck an einem Dashboard, welches ich in unserer Mietwohnung in Form eines TFT-Bildschirms beim Eingangsbereich platzieren möchte. Das Dashboard basiert softwaretechnisch auf HTML, CSS, JavaScript und PHP. Es integriert gecachte HTML-Dateien, JSON-Abfragen (MEZI, Twitter) und sogar einen iCalendar.

Ein Element (resp. „Tile“) des Dashboards wird die Wettervorhersage für den morgigen Tag sein. Um nicht nur eine qualitative Beschreibung des Wetters anzuzeigen, sondern auch ein Icon, habe ich mich natürlich vom derzeitigen (technologischen wie designtechnischen) Platzhirschen forecast.io inspirieren lassen. Dessen mit HTML5-Canvas animierten Icons waren dann aber doch Overkill für mich.

Stattdessen habe ich auf die Meteocons Web-Font von Alessio Atzeni zurückgegriffen. Die Web-Font ist in der Public Domain und lässt sich somit problemlos in ein HTML5/CSS3-Web-Projekt einbinden.

Leider sind die Icons meines Wissens nicht einem standardisierten Wettertyp zugeordnet, weshalb ich dieses Mapping mittels eines PHP-Arrays von Hand nachholen musste. Das Resultat lässt sich durchaus sehen:

eMeidi.local Dashboard Weather Forecast

Tags: , , , ,
Labels: Web

3 Kommentare | neuen Kommentar verfassen

Mittwoch, 24. April 2013

WordPress verbieten, YouTube-Links automatisch einzubetten

Um zu verhindern, dass YouTube-Links in einem WordPress-Beitrag automatisch als Objekt eingebettet werden, muss man in seinem Theme in den entsprechenden Dateien des Themes (bei mir: single.php) zuoberst im PHP-Block folgenden Befehl einfügen:

...
remove_filter( 'the_content', array( $GLOBALS['wp_embed'], 'autoembed' ), 8 );
...

Tags: , , , , ,
Labels: Web

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 24. April 2013

YouTube-Links in einer Textdatei sequentiell herunterladen

Heute hat Kollege Burgdorfer auf Facebook folgenden Artikel gepostet: 15 Fascinating TED Talks for Econ Geeks.

Natürlich möchte ich mir diese jeweils sehr lehrreichen Mini-Vorlesungen nicht entgehen lassen. Doch wie kriege ich nun die Videos auf die lokale Festplatte, damit ich sie bei Gelegenheit mit Air Video via iPhone/iPad über unseren Apple TV auf 42″ Plasma-Fläche abspielen kann?

Zuerst habe ich im Zielverzeichnis eine Text-Datei namens links.txt erstellt, in welcher ich pro Zeile einen der 15 YouTube-Links hineinkopiert habe:

http://www.youtube.com/watch?v=uXl-mKZ7aSc
http://www.youtube.com/watch?v=5UGC2nLnaes
http://www.youtube.com/watch?v=DUd8XA-5HEk
http://www.youtube.com/watch?v=ONXYcN-7k1Y
http://www.youtube.com/watch?v=fiK5-oAaeUs
http://www.youtube.com/watch?v=VhAD0dMslB8
http://www.youtube.com/watch?v=2cYDyMnL4M8
http://www.youtube.com/watch?v=imhUmLtlZpw
http://www.youtube.com/watch?v=kMTCNOlozTA
http://www.youtube.com/watch?v=9ZwNaaJxw40
http://www.youtube.com/watch?v=HUM2rCIUdeI
http://www.youtube.com/watch?v=XO1Me-MY-Q0
http://www.youtube.com/watch?v=CGksAjzI0go
http://www.youtube.com/watch?v=XkiXXP_hycA
http://www.youtube.com/watch?v=dIbkqUm_xKk

Um YouTube-Videos auf die lokale Festplatte zu kopieren, bedient man sich des folgenden quelloffenen Scripts:

youtube-dl — Download videos from YouTube.com

Dieses platziert man in einem leicht zugänglichen Ort; bei mir liegt es beispielsweise mit einer Ladung anderer Scripts unter /Users/mario/Scripts.

Anschliessend habe ich auf der Kommandozeile im Zielordner folgenden Befehl ausgeführt:

while read line; do (~/Scripts/youtube-dl.sh "$line" &); done < urls.txt

Nun werden nach und nach alle Videos heruntergeladen, und spätestens heute Abend kann ich mir dann das eine oder andere Video zu Gemüte führen.

youtube-dl.sh

#!/bin/sh

YDL="/Users/mario/Scripts/yt-dl"

$YDL -q -o "%(title)s.%(ext)s" "$1"

exit 0

Tags: , , , , , , , , ,
Labels: Linux

1 Kommentar | neuen Kommentar verfassen

Samstag, 13. April 2013

Google Calendar zeigt selber entwickelte ICS-Feeds nicht mehr an

Heute habe ich festgestellt, dass meine selber entwickelten .ics-Feeds in Google Calendar nicht mehr angezeigt werden. Das Debugging ergab:

  1. Mein Server läuft, welcher die .ics-Dateien bereitstellt
  2. Mittels wget kann ich die .ics-Datei herunterladen
  3. Die Datei sieht in vim in Ordnung aus
  4. In access.log wird angezeigt, dass ein Google-Bot gelegentlich auf die Datei zugreift

Auf Grund einer Fehlermeldung des iCalendar Validator ist mir nun bewusst, dass in .ics-Kalenderdateien keine Unix-Zeilenumbrüche erlaubt sind (\n), sondern nur die MS DOS-Zeilenumbrüche (\r\n) unterstützt werden.

Nachdem ich in meiner ICS-Klasse folgende Zeile eingefügt habe, wird der Kalender in Google Calendar endlich wieder ordentlich angezeigt:

...
$out = str_replace("\n","\r\n",$out);

return $out
...

Nachtrag

In einem anderen ICS-Script verwende ich keine Klassen und spitze die Kalenderdaten nicht vorgängig in eine Variable ab. Ich habe das PHP-Script deshalb kurzerhand komplett auf MS DOS Zeilenendungen umgestellt:

sed s/$/^M/ unix.php dos.php

Tags: , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 24. März 2013

Wenn Apples Mail nach dem Verschieben einer IMAP-Nachricht diese nur noch als Base64-Müll anzeigt

… hilft nur eines: Man selektiert den IMAP-Ordner, welche die E-Mail-Nachricht enthält, und führt dann folgenden Befehl aus der Menuleiste aus:

  1. Mailbox
  2. Rebuild

Quelle: How to Fix Corrupted IMAP Attachments in Apple Mail

Die Nachrichten werden im Zuge dieser „Reinigung“ erneut vom Server heruntergeladen — und statt Base64-enkodiertem Zeichensalat sieht man bald wieder die Nachricht in Originalform.

Tags: , , , , ,
Labels: Apple

Keine Kommentare | neuen Kommentar verfassen