Kleine und große Linux AHAs
Beiträge getaggt mit perl
Simpler Zugang zum Netz, oder nicht? CaptivePortal in einfach
23. Feb
Viele kennen es aus Hotels, Bahnhöfen, Cafes oder öffentlichen Plätzen. Es gibt ein offenes WLAN zum Internet und wenn man sich damit verbindet landet man zuerst einmal auf einer speziellen Seite. Auf dieser muss man sich dann irgendwie registrieren oder halt bezahlen. Aber wie funktioniert sowas und macht das vielleicht auch Sinn für ein Unternehmen intern?
Warum kann das unternehmensintern Sinn machen?
Also hier geht es nicht um Provider oder Firmen die das ganze öffentlich anbieten. Es gibt beispielsweise die Anforderung in Unternehmen die Produktionsstraßen besitzen, Großraumhallen, Fertigungshallen oder ähnliches. Oft gibt es dort viele Geräte verschiedener Hersteller die gewartet werden (nur ein Beispiel). Es kommen also externe Dienstleister um Updates einzuspielen oder Support zu leisten. Diese müssen mittlerweile, um vernünftig arbeiten zu können, Kontakt mit Ihrer Firma haben. Das kann über 3G geschehen, ist allerdings schneller über WLAN. Für solche Dienstleister macht ein WLAN Zugang also Sinn. Das auch für einen “normalen” Besprechungs- oder Schulungsraum schon Sinn machen.
Nun hat man ein Problem. Das WLAN offen zu lassen ist quasi grob fahrlässig. Das WLAN schützen macht es umständlich – je nach Anzahl der verschiedenen Benutzer. Dann haben wir da noch den Aspekt des Loggings. Prinzipiell muss man die Verbindungsdaten mitloggen, da man je nach dem in die Beweispflicht genommen werden kann. Um zu loggen muss ich auch wissen wer zu welchem Gerät gehört, da mir ansonsten die Information nichts bringt. Das alles kann ich mit der Anmeldung quasi erledigen. Ich weiß wer zu welchem Gerät gehört und kann auch mitloggen. Bevor der Nutzer sich über das WLAN mit dem Internet verbindet, muss er einer entsprechenden Nutzungserklärung zustimmen (wegen logging etc.).
Wie kann sich so was mit Linux darstellen?
Diese Portale sind gar nicht so kompliziert wie man denkt. Um so etwas unter Linux zu realisieren kann man sich fertiger Software bedienen oder auch einfach das ganze selbst – relativ schnell – programmieren. Ein Projekt mit einer “CaptivePortal” Funktion ist beispielsweise pfsense. Die meisten CaptivePortal Funktionen befinden sich im Bundle mit Firewalls und bieten weit mehr als eine einfach Authentifizierung für einen Netzzugang.
Um so etwas mit Linux Mitteln darstellen zu können habe ich folgende Komponenten genutzt:
- einen Apache Webserver
- MySQL Datenbank
- iptables
- DHCP Server (Standardkonfig mit Netz 192.168.199.0/24)
Das ganze funktioniert nach folgendem Ablauf:
- Gerät verbindet sich mit dem Netz (dabei ist unerheblich ob per WLAN oder per Kabel)
- das Gerät bekommt eine IP per DHCP
- per Default werden alle Verbindungen geblockt, Verbindungen zu Port 80 (egal wohin) werden auf den Webserver des Gateways umgeleitet, bis das Device registriert ist
Zur Registrierung benötigt man einen Schlüssel (5 Stellen, Alphanumerisch). Diesen kann man sich an eine interne Mailaddresse schicken lassen. Also können nur interne Accounts quasi den Zugriff genehmigen. Wenn man einen Schlüssel besitzt, dann kann man sich über das Portal registrieren (Name, Firma und Schlüssel werden abgefragt). Mit der Registrierung – richtiger Schlüssel vorausgesetzt – wird der Zugang für einen Tag freigegeben.
Genauer??
Der Client bekommt eine IP Adresse vom DHCP Server. Alle Zugriffe ins (bspw.) Internet werden erst einmal geblockt, außer Zugriffen auf Port 80 – diese werden umgeleitet auf den Webserver des Gatewyas – das CaptivePortal erscheint. Hat man noch keinen Schlüssel zum registrieren, so muss dieser angefordert werden. Man trägt eine eMail Adresse ein und sendet die Anfrage. Im Hintergrund wird per Perl Script geprüft ob die Empfängeradresse ok ist (bspw. interne Domain oder in einer Liste) und ein Schlüssel generiert. Dieser Schlüssel inkl. Mailadresse wird in der Datenbank hinterlegt und per Mail an den Empfänger geschickt.
Mit dem Schlüssel registriert sich der Client am Portal (inkl. Name, Firma). Mit dem Klicken des Buttons “registrieren” wird der Schlüssel geprüft und deaktiviert. MAC Adresse, Name und Firma des Anforderers werden in die Datenbank geschrieben. Danach wird ein iptables Befehl abgesetzt, der dem Client mit der betreffenden MAC Adresse den Zugriff zum Netz gewährt. Ebenfalls wird in der Datenbank ein Zeitstempel gespeichert, dadurch ist es möglich über ein iptables-update den Zugriff generell nur für eine gewisse Zeit freizugeben und dann automatisch wieder zu sperren. In der Datenbank gibt es ein Flag um zu definieren, ob dieser Eintrag überhaupt abläuft oder nicht (expires yes/no). Damit kann man also auch das ganze für interne Mitarbeiter statisch freigeben, damit diese sich nicht immer wieder neu registrieren müssen.
Die Komponenten
(Die Scripte liegen bei mir unter /opt/captivePortal – der Pfad ist in manchen Scripten zu finden)
iptables
iptables ist ja quasi auf jedem Linux System vorhanden und muss auch nicht groß konfiguriert werden.
Script 1 (Initiales iptables Script / iptables.sh):
#!/bin/bash # Initial Iptables Script to enable captivePortal # # Ronny Becker, 02.2012 IPTABLES=/sbin/iptables # the interface to authenticate PORTAL_INT=eth2 # the interface where traffic goes through OUTPUT_INT=eth0 # PortalIP (for captivePortal website) PORTAL_IP=192.168.199.201 # clear all rules iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT # Create captivePortal chain $IPTABLES -N captivePortal -t mangle # All traffic goes to this chain $IPTABLES -t mangle -A PREROUTING -j captivePortal ###### captivePortal CHAIN ########## # get allowed MACs out of the database (maybe persistent or in time) /opt/captivePortal/iptablesFromDB.pl # DNS is allowed for all $IPTABLES -t mangle -A captivePortal -i $PORTAL_INT -p udp --dport 53 -j RETURN # Mark packets that are not allowed till here $IPTABLES -t mangle -A captivePortal -i $PORTAL_INT -j MARK --set-mark 99 # redirect port 80 to captivePortal $IPTABLES -t nat -A PREROUTING -m mark --mark 99 -i $PORTAL_INT -p tcp --dport 80 -j DNAT --to-destination $PORTAL_IP # drop all marked with 99 $IPTABLES -t filter -A FORWARD -m mark --mark 99 -j DROP # masquerading (if needed) iptables -t nat -A POSTROUTING -o $OUTPUT_INT -s 192.168.199.0/24 -j MASQUERADE
Das iptables.sh Script muss bei jedem Systemstart ausgeführt werden. Des Weiteren muss ip_forward (/etc/sysctl.conf) gesetzt sein, damit der Server routen kann.
Script 2 (Perl Script zum Auslesen der aktuellen Berechtigungen aus der Datenbank / iptablesFromDB.pl):
#!/usr/bin/perl
# captivePortal
# Script to get registered MACs out of DB
use DBI;
# get Config from central conf file
BEGIN { require "/opt/captivePortal/captivePortal.conf" };
# database connection
$connectionInfo="DBI:mysql:database=$db;$host:$port";
$dbi = DBI->connect($connectionInfo,$userid,$passwd);
# select datasets
$sql="select mac from registered where expires='no' or ((UNIX_TIMESTAMP()-timestamp) < $tte)";
$sth = $dbi->prepare($sql);
$sth->execute() or die("Cannot get MACs");
$sth->bind_columns(undef, \$db_mac);
while ( $sth->fetch() ) {
# and run iptables
`/sbin/iptables -t mangle -A captivePortal -m mac --mac-source "$db_mac" -j RETURN`;
}
$sth->finish();
$dbi->disconnect();
Config (Konfig für die Perl Scripte (s. Script 2 / captivePortal.conf):
# captivePortal - central config # this conf file is used in perl scripts use vars qw( $tte $db $host $port $userid $passwd $iptables_if ); # Time To Expire for dynamic subscriptions $tte="86400"; # Database Information $db="captivePortal"; $host="localhost"; $port="3306"; $userid="portal"; $passwd="captive"; # portal interface $iptables_if="eth2";
Script 3 (Updatescript für iptables um abgelaufene Registrierungen zu löschen / iptables_update.sh):
#!/bin/bash # captivePortal # Update iptables rules to delete expired registrations IPTABLES=/sbin/iptables # the interface to authenticate PORTAL_INT=eth2 # clear the chain $IPTABLES -t mangle -F captivePortal # run the rules out of the db /opt/captivePortal/iptablesFromDB.pl # add default rules (see iptables.sh) $IPTABLES -t mangle -A captivePortal -i $PORTAL_INT -p udp --dport 53 -j RETURN $IPTABLES -t mangle -A captivePortal -i $PORTAL_INT -j MARK --set-mark 99
Das Update Script sollte per cron alle Xmin / Xstunden ausgeführt werden, damit abgelaufene Registrierungen den Zugriff verlieren. Wenn man den cronjob nicht gerade jede Minute laufen lässt, ist damit natürlich nicht gewährleistet dass eine Registrierung genau so lange gültig ist, wie es in der Konfiguration steht. In meinem Fall läuft das Script jede Stunde – das ist für meine Zwecke ausreichend.
MySQL
Die Datenbank besteht aus zwei Tabellen -> captivePortal.sql
Apache
Wir benötigen lediglich ein CGI Script. Auf dieses muss per Default umgeleitet werden sobald der Server eine Anfrage bekommt. Das kann man auf verschiedenste Weisen machen – also nicht schimpfen
Redirect
Damit das ganze mit iPhone und Android funktioniert, habe ich folgende Apache config am Start:
<VirtualHost 192.168.199.201:80>
ServerAdmin webmaster@localhost
Servername captivePortal
DocumentRoot /var/www
Redirect /index.html http://192.168.199.201/cgi-bin/captivePortal.pl
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI Indexes -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^/$ http://192.168.199.201/cgi-bin/captivePortal.pl [L,R]
</IfModule>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Dem entsprechend liegt das CGI (captivePortal.pl) unter /usr/lib/cgi-bin.
Das CGI
#!/usr/bin/perl
# captivePortal
#
# This is the cgi for the simple captivePortal
#
# Do not forget to change
# line 51: valid domain to send regkey to
# line 58: sender adress
#
#
#
# Ronny Becker, 02.2012
use CGI qw(:all);
use DBI;
# get Config from central conf file
BEGIN { require "/opt/captivePortal/captivePortal.conf" };
# connect to DB
$connectionInfo="DBI:mysql:database=$db;$host:$port";
$dbi = DBI->connect($connectionInfo,$userid,$passwd);
# params
$thisscript=$ENV{'SCRIPT_NAME'};
# cgi params
$para_req_sendto=param('req_sendto');
$para_req_submit=param('req_submit');
$para_reg_company=param('reg_company');
$para_reg_name=param('reg_name');
$para_reg_key=param('reg_key');
$para_reg_submit=param('reg_submit');
# print some headers
print "Content-type: text/html\n\n";
print '
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>WLAN Gastzugang</title>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
</head>
<body style="font-family: courier,courier-new">
<h2>WLAN Gastzugang</h2><br>';
# request for key
if ( $para_req_submit ) {
# address valid?
if ( $para_req_sendto ) {
if ( $para_req_sendto =~ /.*\@mydomain\.de/i || $para_req_sendto =~ /.*\@mydomain2\.de/ ) {
# generate a key
my @chars=('a'..'z','0'..'9');
foreach (1..5) {
$secret.=$chars[rand @chars];
}
# send key to recipient
$result=`export EMAIL="gastzugang\@mydomain.de"; echo "Der Registrierungsschluessel fuer Ihren Gast lautet: $secret" | mail -s "WLAN Gastzugang" $para_req_sendto`;
print "$result";
# Insert Key into DB
$sql="insert into regkeys(regkey,sendto,datetime) values('$secret','$para_req_sendto',NOW())";
$sth = $dbi->prepare($sql);
$sth->execute() or die("Fehler beim schreiben in die Datenbank");
$sth->finish();
print "<div style='background-color: green; color: white'><p><b>Registrierungsschluessel wurde zugeschickt</b></p></div>";
}
}
}
# request for registration
if ( $para_reg_submit ) {
# name given?
if ( length($para_reg_name) <= 5 || length($para_reg_key) != 5 ) {
print "<div style='background-color: red; color: white'><p><b>Sie muessen einen Namen und den Registrierungsschluessel angeben.</b></p></div>";
} else {
# Check DB for regkey
$sql="select sendto from regkeys where regkey='$para_reg_key' and isActive='1'";
$sth = $dbi->prepare($sql);
$sth->execute() or die("DB: Cannot run select");
$sth->bind_columns(undef, \$db_sendto);
$sth->fetch();
$sth->finish();
if ( $db_sendto ) {
# disable key
$sql="update regkeys set isActive='0' where regkey='$para_reg_key'";
$sth = $dbi->prepare($sql);
$sth->execute() or die("DB: Cannot update");
$sth->finish();
# get MAC
open (ARP,"</proc/net/arp");
while (<ARP>) {
$line = $_;
$line =~ s/ */;/g;
($arp_ip,undef,undef,$arp_mac,undef,undef) = split(";",$line);
if ( $arp_ip eq $ENV{'REMOTE_ADDR'} ) {
$mac=$arp_mac;
}
}
close ARP;
# write data into db
$sql="insert into registered(name,guestof,mac,timestamp,expires) values('$para_reg_name, $para_reg_company','$db_sendto','$mac',UNIX_TIMESTAMP(),'yes')";
$sth = $dbi->prepare($sql);
$sth->execute() or die("DB: Cannot insert");
$sth->finish();
$output=`sudo /sbin/iptables -I captivePortal 1 -t mangle -m mac --mac-source $mac -j RETURN`;
print "<div style='background-color: green; color: white'><p><b>erfolgreich registriert</b><br>$output</p></div>";
} else {
print "<div style='background-color: red; color: white'><p><b>Registrierungsschluessel nicht gefunden</b></p></div>";
}
}
}
# disconnect from DB
$dbi->disconnect();
# print form etc.
print '
<form method=get action='.$thisscript.'>
<b>Registrierungsschluessel anfragen</b><br>
senden an: <input type=text name=req_sendto size=40> <input type=submit name=req_submit value=zusenden></form>
<hr><br>
<form method=get action='.$thisscript.'>
<b>Registrieren</b><br>
<b><u>Achtung! Registrieren Sie sich mit dem Geraet, mit dem Sie Zugriff benoetigen</b></u><br>
<table>
<tr><td>Name:</td><td><input type=text name=reg_name size=30></td></tr>
<tr><td>Firma:</td><td><input type=text name=reg_company size=30></td></tr>
<tr><td>Registrierungsschluessel:</td><td><input type=text name=reg_key size=10></td></tr>
<tr><td colspan=2 align=center><font color=red><b><u>Nutzungsbedingungen:</u><br>
Mit klicken auf den Button "registrieren" stimmen Sie zu,dass die ihre Verbindungsdaten (Zeitpunkt und Dauer einer Verbindung, Addressierungsdaten) mitprotokolliert werden.
Dies dient lediglich zur Fehleranalyse und zur Sicherheitsueberpruefung.
Es werden keine Daten an dritte weitergegeben oder weiterverarbeitet.<br><br><br>
Sie haben (per Default) ab dem Zeitpunkt der registrierung Zugriff fuer 24 Stunden.
<input type=submit name=reg_submit value=registrieren></td></tr>
</table>
</form>
</body>
</html>';
Das Webinterface ist recht einfach gehalten damit es auch mit mobilen Endgeräten keine Probleme gibt. Das ganze ist natürlich nach belieben anzupassen oder zu ändern
Ich hoffe ich hab nix vergessen – falls doch einfach fragen.
MailMig Teil 6: Hokus Pokus Fidibus – Thunderbird Konfiguration wie von Zauberhand
28. Okt
Wie im letzten Artikel angekündigt hier nun ein paar Tipps, wie man Thunderbird in größeren Umgebungen automatisch konfigurieren kann. In unserem Beispiel im Zusammenspiel mit Group-Office, allerdings ist das recht flexibel.
Die Lösung für ISPs
Was schon recht bekannt ist, ist die automatische Konfiguration der Server für ein Konto entsprechend der Domain. Das ganze ist beschrieben im MDC. Das ist jedoch nur eine Unterstützung, da dieses Verfahren lediglich – anhand der Domain aus der Email Adresse – die Server (Name, Ports, SSL…) für den Email Empfang bzw. Versandt bestimmt.
Die Lösung für den Mittelstand
Weniger bekannt ist die Möglichkeit, die komplette Konfiguration beim Start, beispielsweise per http, zur Verfügung zu stellen. Wir haben damit bisher folgendes realisiert:
- Mailkonto komplett konfiguriert, inkl. einheitlicher Signatur, speziellen Ordnern (…)
- LDAP Addressbuch fertig konfiguriert
- vorgegebene Startseite
- vorgegebene Schriftarten
- Proxy Konfiguration
- automatische Updates disabled
Man bedenke, dass all diese Einstellungen komplett automatisch geschehen ohne zutun des Anwenders oder Admins.
Nagios Plugin: check_snmp_storage – kleines Hilfswerkzeug
19. Jul
In meinem Artikel “Nagios Plugin – check_snmp_storage” hatte ich einen von mir erweiterten Nagios Plugin vorgestellt der mit einem Aufruf mehrere Partitionen/Platten prüft, und dabei trotzdem für jede Prüfung verschiedene warn/crit Werte akzeptiert.
Wer damit arbeitet und zwischendurch einmal bei der ein oder anderen Partition die Grenzwerte angepasst hat wird wissen, dass es je nach Menge der Partitionen recht mühsam ist die richtigen Wertepaare zu finden. Bei mir gibt es beispielsweise öfter mal sowas:
check-snmp-storage-multi!nagios!80,80,80,80,80,80,80,80,80!90,90,90,90,90,90,90,90,90!/,/var,/custom,/opt,/opt/om,/svc,/sbase,/estore,/opt/trans
ITler sind faule Menschen. Also hab ich mir ein Script geschrieben. Dieses Script zeigt mir das alles in einer Tabelle und lässt mich ganz easy Änderungen durchführen. Bei der Erstellung des Scripts habe ich nicht wirklich darauf geachtet das ganze für viele nutzbar zu machen. Wer Interesse hat sollte sich das also vorher mal anschauen
Linux & Windows Links: schöner öffnen mit win_path
20. Apr
Wer einen Linux Desktop beruflich nutzt, bekommt je nach Umgebung diverse Aufgaben gestellt um sich in einem heterogenen Netzwerk zurecht zu finden. Dazu gehört zum Beispiel Lotus Notes ans Laufen zu bringen oder auch der gemeinsame Zugriff auf zentrale Laufwerke.
Fileserver werden (leider) recht selten unter Linux betrieben. Von daher muss man Möglichkeiten und Wege finden sich damit zu arrangieren. Im folgenden möchte ich ein Script vorstellen, welches einen Teil dieser Interoperabilität sehr einfach unterstützt.
Worum geht es ?
Man bekommt eine eMail. In dieser Mail wird auf ein zentral abgelegtes Dokument verwiesen. Wie ? Na ganz einfach per “I:\Ordner\Dokument.doc” – ein Link auf ein gemapptes Laufwerk. Unter Ubuntu darauf klicken und Firefox (das wird als Link verstanden) sagt “Ich weiß nicht wirklich was ich damit machen soll !”.
Lösung !
Ich habe ein Script geschrieben, welches dieses Szenario wie folgt löst:
- Link kopieren
- Script starten
- es öffnet sich Nautilus, bzw. die Anwendung
Das ganze hört sich erst einmal komplizierter an als es ist. Das Script starten kann man eleganter weise nämlich z.B. über gnome-do oder mit einem einfachen Shortcut unter Gnome erledigen. Dann macht das ganze auch Sinn und ist komfortabel.
Prerequisites:
- libnotify-bin
- xclip
- um gemappte Laufwerke (s. Beispiel oben) zu nutzen, müssen diese an einem zentralen Punkt beispielsweise per auto-mounter zur Verfügung stehen. Im Script ist das ganze bei mir unter /mnt/cifs/ gemappt. Diese einzelnen Laufwerke und deren Pfade müssen im Script angepasst werden.
#!/usr/bin/perl -w
#
# Script zum oeffnen von Windows "Links" unter Ubuntu
#
# - Umsetzung von Links wie I:\Ordner\dokument.doc
# - das Dokument wird direkt geoeffnet
# - Umsetzung von Links wie I:\Ordner
# - der Ordner wird in Nautilus geoeffnet
# - Umsetzung von Links wie \\Server\... wird ebenfalls unterstuetzt
#
# Prerequisites:
# - libnotify-bin
# - xclip
#
# Ronny Becker, 02.2009
# get clipboard data
$path=`xclip -o -selection c`;
chomp($path);
# show information
system("DISPLAY=:0.0 dbus-launch /usr/bin/notify-send -u low -t 3000 \"Win Path\" \"\nöffne\n\n\'$path\'\"");
if ( $path !~ /[a-zA-Z]/ ) { exit; }
# LW \\...
if ( $path =~ /^\\\\/ ) {
$path =~ s/^\\\\/smb:\/\//;
}
# for each drive a separate config
# LW Q (Dokumentation)
if ( $path =~ /^[qQ]:/ ) {
$path =~ s/^[qQ]:/\/mnt\/cifs\/Q/;
}
# mapped drive I
if ( $path =~ /^[iI]:/ ) {
$path =~ s/^[iI]:/\/mnt\/cifs\/I/;
}
# mapped drive W
if ( $path =~ /^[wW]:/ ) {
$path =~ s/^[wW]:/\/mnt\/cifs\/W/;
}
# mapped drive L
if ( $path =~ /^[lL]:/ ) {
$path =~ s/^[lL]:/\/mnt\/cifs\/L/;
}
# set \ to /
$path =~ s/\\/\//g;
# if the link target is a document use xdg-open, otherwise open with nautilus (folder)
if ( $path =~ /\.[a-z]{3}$/ ) {
system("xdg-open \"$path\"");
} else {
system("nautilus \"$path\"");
}
Download: win_path
Damit man sieht, dass das Script auch ausgeführt wird, wird der an das Script übergebene Link per “Bubble” angezeigt. Das Script kann natürlich auch auf der Konsole ausgeführt werden – z.B. zur Fehlersuche.
[Update]
Ein Update wegen eines xclip Problems gibt es hier.
Fragen über Fragen
02. Mrz
Linux Problem und beim googlen noch keine Lösung gefunden ?
Also wenn es nicht gerade um Anfängerfragen – sorry – geht, könnt ihr uns ja mal fragen. Mit welchen Themen wir uns so beschäftigen könnt ihr auf unserer Seite sehen und vielleicht kann man aus einer Frage auch einen Artikel machen, der für andere ebenfalls interessant ist.
Also einfach hier als Kommentar die Frage einstellen und damit vielleicht auch anderen helfen. Mal gespannt was da kommt …
Linux & Windows Links: schöner öffnen mit win_path [Update]
05. Feb
Heute morgen haben wir festgestellt, dass die xclip Version unter Ubuntu 9.10 (Karmic) kein UTF-8 unterstützt. Die Versionen ab 0.11 unterstützen UTF-8 – Karmic kommt mit v0.08.
Das ganze fällt auf, wenn man Links hat in denen Sonderzeichen enthalten sind (im Pfad oder dem Dateinamen). Ich habe kurzerhands die aktuelle xclip Version auf Karmic compiliert und stelle sie hier zur Verfügung. Um den Aufwand gering zu halten nicht als .deb, sondern einfach als Binary. Das legt ihr unter /usr/bin/ ab und gut (vorher das installierte löschen).
Nagios Plugin – check_snmp_storage (update)
20. Mai
Plugin Update
Der Plugin akzeptiert in der “ursprünglichen” Form für Fenster (im englischen Windows) Systeme nicht einfach die Angabe des Laufwerkbuchstabens. Das ganze habe ich nun ebenfalls angepasst. Man kann also nun mit dem gleichen Aufruf Linux und Fester Systeme abfragen.
ex. --> check_snmp_storage_dld.pl -H pw300eg -m C,D -C public -w 80,80 -c 90,90 -r
Download: check_snmp_storage
Nagios Plugin – check_snmp_storage
18. Mai
Schon lange benutze ich den Nagios Plugin check_snmp_storage von dieser Seite um per SNMP und Nagios den Plattenplatz auf Systemen zu prüfen. Dabei hat man leider nur zwei Wahlmöglichkeiten um Partitionen zu checken (im groben). Entweder man nimmt alle – oder man nimmt nur eine. Dadurch hat man im einen Fall entweder zu viel drin, oder auf der anderen Seite muss man mehrere Dienste in Nagios anlegen um alle Informationen zu bekommen die man haben möchte. Was mehr Dienste bedeutet und auch mehr Traffic.
Den Plugin habe ich ein wenig angepasst, so dass der Plugin mehrere Partitionen mit einem Aufruf prüfen kann und man auch – und das war eben wichtig – für jede Partition eigene Schwellenwerte angeben kann.
Vorher: ... -m / -w 80 -c 90 -r (-> prüfe / mit einem Warning Schwellwert von 80% und einem Critical Schwellwert von 90%)
Nachher: ... -m /,/var,/tmp -w 80,70,90 -c 90,85,95 -r (-> prüfe / (W80%, C90%),/var (W70%, C85%) und /tmp (W90%,C95%) )
Hier gibt es das von mir abgewandelte check_snmp_storage zum Download.
perl daemon mit input aus einer named pipe
07. Mai
Auch sowas wo ich lange nach gesucht habe. Möchte man, dass ein Perl Programm den Input einer named pipe verarbeitet, so wird man als erstes auf ein Problem stossen. Das Programm wird sich nach jeder Eingabe beenden. Mein erster Code sah zum Beispiel so aus:
#!/usr/bin/perl -w
open(THISPIPE, ") {
echo $_;
}
close THISPIPE;
So würde wohl jeder erste Versuch aussehen. Das Problem liegt darin, dass sobald Daten über die Pipe ausgetauscht werden, auch ein EOF mitgegeben wird. Dieses EOF wird von Perl als solches auch interpretiert und die Datei wird geschlossen.
Umgehen kann man das, indem man einen Trick anwendet und die Datei nicht nur zum lesen öffnet, sondern zum Lesen und Schreiben. Dadurch wird die Datei nicht nach einem EOF geschlossen und der Daemon lauscht weiterhin auf der Pipe. Das sieht dann so aus:
#!/usr/bin/perl -w
open(THISPIPE, "+) {
echo $_;
}
close THISPIPE;






