Archiv ‘Linux’

Donnerstag, 26. März 2015

monit unter Mac OS X neu starten

Vor einigen Tagen meldete mir die monit-Instanz aus einem anderen Subnet, dass die Web-Oberfläche der monit-Instanz auf meinem Mac mini nicht mehr ansprechbar war. Heute, nach unzähligen Warnmeldungen, habe ich mich um das Problem gekümmert.

Wie sich herausstellte, liess sich das Problem beheben, indem ich monit schlicht neu startete. Auf der Mac OS X-Kommandozeile geht dies so:

$ sudo launchctl unload /Library/LaunchDaemons/com.tildeslash.monit.daemon.plist
$ sudo launchctl load /Library/LaunchDaemons/com.tildeslash.monit.daemon.plist

Via: Monit

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

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 21. Januar 2015

Wieder einmal: Unrealistisch grossen FLV-Video-Stream herunterladen

Heute enthielt ein E-Mail-Thread einen Link auf folgenden CBN-Videoclip:

Native French under Attack in Muslim Areas

Wie so üblich wollte ich den Clip lokal auf meinem NAS speichern, damit ich ihn mir in einer ruhigen zu Gemüte führen kann, ohne dabei auf eine Internetverbindung angewiesen zu sein.

Ich öffnete deshalb Firefox, startete den Web-Developer-Modus und zeichnete im Tab „Network“ die Netzwerkaktivitäten auf. Dies liefert mir folgende URL, welche ich mit einem Rechtsklick in die Zwischenablage kopierte:

Akamai-URL

Erst nachdem ich den Download dieser URL mit wget gestartet hatte, realisierte ich, dass die Grösse der Datei mit exakt 2 GB angegeben wird:

...
Länge: 2147483647 (2,0G) 
...

Dies, obwohl der Nachrichtenbeitrag nachweislich weniger als vier Minuten lang ist. Während ich Google-Recherchen durchführte, erblickte ich in Terminal.app plötzlich folgenden Hinweis:

...
2015-01-21 21:32:07 (343 KB/s) - Verbindung bei Byte 91428830 geschlossen. Erneuter Versuch.
...

Danach nahm wget die Verbindung wieder auf und lud den Datenmüll weiter herunter.

Rasch realisierte ich, dass dies wohl eine Eigenschaft des Videostream-Servers ist, um die Übertragung des gesamten Streams zu einem bestimmten Zeitpunkt abzubrechen.

Wenig später hatte ich mir die cURL-Kommandozeile zusammengebastelt, welche nur die ersten 91428830 herunterlud:

$ curl -o "muslim.mp4" -r -91428830 "http://cbnhdf-f.akamaihd.net/734546207001/734546207001_34531,60520001_NewsBlock-9AM-041014-HD720-1029-626-1306-946,48268001_NewsBlock-9AM-041014-HD720-1029-626-1306-946,52212001_NewsBlock-9AM-041014-HD720-1029-626-1306-946,60209001_NewsBlock-9AM-041014-HD720-1029-626-1306-946,66563001_NewsBlock-9AM-041014-HD720-1029-626-1306-946,36206001_NewsBlock-9AM-041014-HD720-1029-626-1306-946-copy,.mp4.csmil/bitrate=5?videoId=3453082509001&lineUpId=&pubId=734546207001&playerId=1535799574001&affiliateId=&bandwidthEstimationTest=true&v=3.4.0&fp=MAC%2016,0,0,257&r=WGQXV&g=OWBGOOCJISIC"
...
curl: (18) transfer closed with 2056054817 bytes remaining to read

Und so hatte ich auch dieses Streaming-Video-Biest gezähmt.

Tags: , , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Montag, 12. Januar 2015

IPP-Druckserver debuggen

Kürzlich musste ich zu Hause einen IPP-Druckserver (natürlich Apples CUPS) debuggen. Dabei entdeckte ich folgenden Befehl, um von einem Client-System zu prüfen, ob und wie der IPP-Druckserver auf Anfragen reagiert.

Dank der Fehlermeldung des CUPS-Servers als Antwort auf nachfolgenden Befehl …

$ ipptool -v -4 http://10.10.10.10:631/Laserdrucker get-printer-attributes.test
The printer or class does not exist.
       EXPECTED: STATUS successful-ok (got client-error-not-found)
       status-message="The printer or class does not exist."
       EXPECTED: charset-configured
       EXPECTED: charset-supported
       EXPECTED: compression-supported
       EXPECTED: document-format-default
       EXPECTED: document-format-supported
       EXPECTED: generated-natural-language-supported
       EXPECTED: ipp-versions-supported
       EXPECTED: natural-language-configured
       EXPECTED: operations-supported
       EXPECTED: pdl-override-supported
       EXPECTED: printer-is-accepting-jobs
       EXPECTED: printer-name
       EXPECTED: printer-state
       EXPECTED: printer-state-reasons
       EXPECTED: printer-up-time
       EXPECTED: printer-uri-supported
       EXPECTED: queued-job-count
       EXPECTED: uri-authentication-supported
       EXPECTED: uri-security-supported

… realisierte ich, dass ich meinen Laserdrucker über die URL http://10.10.10.10:631/printers/Laserdrucker ansprechen muss.

Auf dem Druckserver selber zeigt man sich den Status des Druckers mit folgendem Befehl an:

$ lpstat -p
printer Laserdrucker is idle. enabled since Wed 10 Dec 2014 06:56:43 PM CET

Tags: , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Dienstag, 6. Januar 2015

Welcher Prozess verwendet unter Linux welchen Netzwerkport?

# netstat -tulpn

Quelle: Look for the process bound to a certain port

Tags: , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Dienstag, 25. November 2014

Ubuntu von einem kleinen USB-Stick installieren

Kürzlich nahm ich mir vor, einen alten Windos-Laptop mit Jahrgang 2008 platt zu machen und stattdessen Ubuntu darauf zu installieren. Da Computer mit DVD/CD-Laufwerken in unserem Haushalt de facto nicht mehr existieren, konnte ich die Installation nicht mittels einer DVD durchführen.

Ich entschied mich deshalb, die Installation über einen USB-Stick zu starten. Leider hatte ich nur einen alten USB-Datenträger mit mickrigen 512 MB zur Hand (auf dem anderen USB-Stick im Haushalt liegt Mac OS X 10.9 Mavericks als Installationsmedium bereit). Doch selbst für diesen exotischen Anwendungsfall hat Ubuntu vorgesorgt:

Ubuntu Minimal

Ich lud mir dafür Version 14.10 herunter, welche wenige 39 MB wiegt.

Anschliessend schloss ich den USB-Stick an meinem Mac mini an und folgte der Anleitung How to install Ubuntu on MacBook using USB Stick, um die Installationsdateien auf den USB-Stick zu bringen. Das MacBook wollte ich dann aber doch nicht mit Linux verschandeln, weshalb ich der Anleitung nur bis Punkt 11 folgte.

Die wichtigsten Befehle lauten (sozusagen als Sicherheitskopie hier in meinem Blog, falls das Ubuntu-Wiki das Zeitliche segnen sollte):

$ hdiutil convert minimal.iso -format UDRW -o minimal.img
# diskutil unmountDisk /dev/diskN
# dd if=minimal.img of=/dev/diskN bs=1m
# diskutil eject /dev/diskN

Da ich in der Vergangenheit meine liebe Mühe mit bootbaren USB-Sticks hatte, war ich überrascht, dass der Toshiba-Laptop beim ersten Anlauf ohne zu zicken in den Ubuntu-Installationsmodus bootete …

Tags: , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 2. November 2014

SNMP-Proxy einrichten

Seit Jahren zeichne ich minütlich Vitalwerte meiner IT-Infrastruktur auf. Dafür verwende ich das quelloffene cacti, dessen Entwicklung zwar seit mehr als einem Jahr stillsteht, meine Bedürfnisse aber immer noch abdeckt. An der Code-Qualität hege ich meine Zweifel, habe mich bisher aber damit arrangiert, insbesondere weil aus meiner Sicht derzeit keine Alternative zur Verfügung steht. Item!

Seit einigen Monaten habe ich das Netzwerk hier in unserer gemeinsamen Wohnung in Bern mittels OpenVPN mit dem Netzwerk im Elternhaus verbunden. Zum Einsatz kommen zwei Router, welche mit DD-WRT geflasht sind (die Konfiguration von OpenVPN auf diesen Kisten ist eine weitere Pendenz in der Liste der geplanten Blog-Artikel).

Der Linux-Server, auf welchem cacti installiert ist und der Poller läuft, befindet sich im Elternhaus. Meine OpenVPN-Konfiguration hat es nun an sich, dass ich den Router in meiner Wohnung nicht per SNMP abfragen kann, weil dessen interne IP aus dem entfernten Netzwerk nicht ansprechbar ist.

Vor einer Woche hatte ich deshalb die zündende Idee, mich auf die Suche nach einem SNMP-Proxy zu machen, welchen ich auf einem Client im LAN unserer Wohnung aufsetze und mittels cacti via SNMP darüber die SNMP-Werte des Routers abfragen kann. Die Wahl fiel auf meinen Mac mini, auf dem SNMP bereits aktiviert ist und bereits von cacti abgefragt wird.

Nach einigen Recherchen mit Google war rasch klar, dass net-snmp die Funktionalität mit sich bringt, einzelne OIDs oder einen ganzen OID-Baum von einem SNMP-fähigen Drittsystem einzubinden und so als Proxy zu wirken.

Die Anleitungen, die man im Netz findet, sind leider etwas holprig, weshalb ich hier für die Nachwelt festhalten möchte, wie ich das Setup schlussendlich zum Laufen gekriegt habe — im Grunde ist es äusserst simpel:

/etc/snmp/snmpd.conf

(Auf dem Rechner, welcher im selben Subnetz wie der abzufragende Router steht)

...
# Proxy to let remote cacti retrieve local router SNMP information

# Define a simple view 'systemview', which includes everthing under .1.3.6.1
view    systemview     included      .1.3

# Map 'public' community to the 'notConfigUser'
com2sec notConfigUser  default       public

# Map 'notConfigUser' to 'notConfigGroup'
group   notConfigGroup v1            notConfigUser
group   notConfigGroup v2c           notConfigUser

# Give 'notConfigGroup' read access to objects in the view 'systemview'
access  notConfigGroup ""            any       noauth    exact  systemview none none

# v1/v2c community string for each proxied host
com2sec -Cn my_router_int notConfigUser  default       my_router

# Allow the 'notConfigUser' (a member of 'notConfigGroup') access for these contexts
access  notConfigGroup my_router_int        any     noauth  prefix  systemview none none

# Proxy configuration
proxy -Cn my_router_int -v 1 -c public 192.168.168.168 .1.3

Via: [HOWTO] Graph multiple servers using an SNMP proxy

Diese Konfiguration kann problemlos in die eigene Konfiguration eingepflegt werden, anzupassen sind einzig die IP des Routers (hier: 192.168.168.168), der über den Proxy abgefragt werden können soll, sowie dessen Community-Namen (hier fahrlässigerweise public).

Aus ästhetischen und verständlichen Gründen anzupassen sind zudem die Bezeichnungen my_router_int sowie my_router. my_router ist der Community-Name, mit welchem die SNMP-Daten des Drittsystems abgefragt werden können. my_router_int wiederum scheint eine Rolle bei der internen Zugriffsverwaltung zu spielen.

Unter Mac OS X verwende ich das von mir auf Github geteilten Restart-Script, um den SNMP-Server neu zu starten.

Test

Mittels des Tools snmpwalk prüfen wir in einer Shell direkt auf dem Proxy, ob net-snmp den OID-Baum tatsächlich einbindet:

$ snmpwalk -v 1 -c my_router localhost
SNMPv2-MIB::sysDescr.0 = STRING: Linux DD-WRT 3.X.X #110 Sun Mar 24 15:46:47 CET 2013 mips
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (12623972) 1 day, 11:03:59.72
SNMPv2-MIB::sysContact.0 = STRING: user@domain.tld
...

Klappt!

cacti

Schlussendlich muss das neue Gerät noch in cacti erfasst werden. Das stellt den erfahrenen cacti-Benutzer vor keine Probleme, einzig muss darauf geachtet werden, dass man nicht die IP des Routers, sondern diejenige des Proxys und der in snmpd.conf definierte Community-String (im obigen Beispiel -c my_router, also my_router) angibt. Belässt man den Community-Wert auf public frägt man stattdessen die Werte des Proxys selber ab — und nicht diejenigen des zu überwachenden Routers.

Weiterführende Links

Ein ETH-Mitarbeiter hat aufgeschrieben, wie man so etwas via SSH-Tunnel hinkriegt, wenn man keinen VPN-Tunnel hat.

Tags: , , , , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Dienstag, 16. September 2014

udevd meldet „invalid rule“

In /etc/udev/rules.d/10-local.rules stand bei mir Folgendes:

BUS=="usb", KERNEL=="sd?1", ATTR{manufacturer}=="LaCie*", NAME="%k", SYMLINK+="usbhdd1"

Mit einem der udev-Updates der letzten Jahre scheint sich die Notation solcher Regel etwas geändert zu haben, weshalb beim Boot-Prozess meines Linux-Servers kurzzeitig eine Fehlermeldung aufflackerte:

udevd[xxx]: invalid rule '/lib/udev/rules.d/10-local.rules:1'

Das Debugging solcher Fehlermeldungen und Regeln ist ganz einfach — wenn man weiss wie.

Auf der Kommandozeile führt man folgenden Befehl aus:

# udevadm test /etc/udev/rules.d/10-local.rules
load module index
read rules file: /etc/udev/rules.d/10-local.rules
unknown key 'BUS' in /etc/udev/rules.d/10-local.rules:1
invalid rule '/etc/udev/rules.d/10-local.rules:1'
...

Quelle: Debugging udev rules

Und siehe da, heute scheint das neu folgendermassen zu heissen:

SUBSYSTEM=="usb"

Nach der Änderung prüft man die Syntax erneut:

# udevadm test /etc/udev/rules.d/10-local.rules
load module index
read rules file: /etc/udev/rules.d/10-local.rules
unknown key 'SYSFS{manufacturer}' in /etc/udev/rules.d/10-local.rules:1
invalid rule '/etc/udev/rules.d/10-local.rules:1'
...

Aha, heute heisst das offenbar:

ATTR{manufacturer}

… und ab sofort motzt udevd nicht mehr rum:

# udevadm test /etc/udev/rules.d/10-local.rules
load module index
read rules file: /etc/udev/rules.d/10-local.rules
read rules file: /lib/udev/rules.d/42-usb-hid-pm.rules
...

Der Abend ist gerettet.

Tags: , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 31. August 2014

Unter Linux einen Kommandozeilenbefehl regelmässig in Sekundenabständen ausführen (ohne cron)

Kürzlich spielte ich wieder einmal eine Sicherung des Inhaltes der 2 GB SD-Card, welche in meinem uralten TomTom ONE Europe steckt, zurück auf das Gerät. Da das Navigationsgerät nur über einen USB1-Anschluss verfügt, handelt es sich um eine entsprechend langwierige Angelegenheit.

Da ich die Sicherung auf der Kommandozeile unter Verwendung von rsync und ohne irgendwelche aussergewöhnlichen Kommandozeilenoptionen durchführte (-av reicht mir in solchen Fällen), musste ich mir einen anderen Weg überlegen, um den Fortschritt zu visualisieren.

Ich öffnete mir dazu ein zweites Kommandozeilenfenster. Damit ich den Computer kurzzeitig verlassen und mich bei der Rückkehr jeweils vom Fortschritt überzeugen konnte, startete ich folgenden Befehl:

$ watch -n 1 "df -k | grep INTERNAL | awk '{print \$4} {print \$5}'"

Mit Hilfe des Unix-Tools watch kann ein Befehl alle definierten n Sekunden wieder ausgeführt werden (hier: n -1, sprich jede Sekunde). Den Befehl fügte ich in Anführungszeichen bei, weil dieser Sonderzeichen und Pipes enthielt.

Konkret wird das Tool df aufgerufen, welches Grösseninformationen über gemountete Volumes ausgibt. Mittels grep filtere ich den Datenträger heraus, welcher mich interessiert. Und mittels awk isoliere ich dann die Grössenangaben über den noch verfügbaren Speicher (-k, das heisst in Kilobytes). Diese Zahl sollte im beschriebenen Anwendungsfall stetig nach unten zählen, bis der Kopiervorgang zu Ende ist.

WICHTIG: Damit awk in einem solchen Konstrukt funktioniert, müssen die Dollarzeichen escaped werden.

Tags: , , ,
Labels: Linux

1 Kommentar | neuen Kommentar verfassen

Donnerstag, 10. Juli 2014

MySQL meldet „Using unique option prefix X instead of Y is deprecated“

Warning: Using unique option prefix database instead of databases is deprecated and will be removed in a future release.
Please use the full name instead.

MySQL reklamiert dies, weil die Namen einiger Argumente und Konfigurationsparameter in den kommenden Releases umbenannt werden.

Im Script zur Sicherung meiner Datenbanken war die Anpassung simpel:

...
$MYSQLDUMP --user=$USER --password=$PW --database $DATABASE > "$DUMPFILE"
...

… wurde zu …

...
$MYSQLDUMP --user=$USER --password=$PW --databases $DATABASE > "$DUMPFILE"
...

Man beachte, dass in der ursprünglichen Version der Parameter databases noch im Singular (database) aufgeführt war.

Denkanstoss: Thread: Using unique option prefix pass instead of password is deprecated

Tags: ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen

Samstag, 5. Juli 2014

E-Mail bei Verwendung von sudo

Auch das ist dank Google und dem Internet ein äusserst simples Unterfangen:

# visudo

In der Konfigurationsdatei fügt man unterhalb der bestehenden Default-Einträge folgende Zeilen ein:

...
Defaults mail_always
Defaults mailerpath=/usr/sbin/sendmail
Defaults mailto="logger@domain.tld"
Defaults mailsub="*** Command run via sudo on %h ***"
Defaults mailerflags="-t"
...

Quelle: Email notification everytime users run “sudo” on Linux

Tags: , , ,
Labels: Linux

Keine Kommentare | neuen Kommentar verfassen