Die freigegebenen Ordner herausfinden

Manchmal hat man es mit einem mehr oder weniger unbekannten Windowssystem (oder Samba) zu tun und möchte nun wissen, welche Freigaben es auf diesem Ordner gibt und welche Ordner das lokal sind.

Auf einem aktuellen Windows-Rechner ist das sehr einfach in der Konsole zu ermitteln:

NET SHARE

zeigt mir alle Freigabennamen (Shares), die Resourcen (Ordner) und die Beschreibungen dazu an.

Auf einem Samba-System gibt es zwar auch die NET-Tools, diese unterscheiden sich aber von den windowseigenen Befehlen. So zeigt mir das Kommando

net share -l

auf einem Linux-Rechner mit laufenden Samba zwar die Freigabenamen (Share names) und die Beschreibungen dazu an, nicht aber die lokalen Ordner.

Open-Office: Dezimale Stunden oder Minuten im Zeit-Format anzeigen

Ich habe immer mal wieder das Problem, dass ich in Open-Office dezimale Stunden oder Minuten berechne und diese dann aber in einem menschlichen Format angezeigt haben möchte.

Also aus 3 * 0,3 Std wird 0,9 Std., dies soll aber als 0:54 angezeigt werden (also 54 Minuten, 0 Stunden).

Oder ich addiere Minuten, erhalte 104 und möchte das nun als 01:44 sehen.

Dies geht in Open-Office mit der nicht ganz so offensichtlich dafür geeigneten Funktion ZEIT. Dabei muss man den Stunden- oder den Minutenwert an die entsprechende Stelle der Parameterliste stellen und die anderen Felder mit 0 belegen.

Für die Stunden Geschichte von oben sieht das dann so aus: =ZEIT(0,9;0;0) oder =ZEIT(3*0,3;0;0).

Und bei den 104 Mituten erhält man die richtige Anzeige mit =ZEIT(0;104;0).

Natürlich kann man anstelle der direkten Zahlen hier auch Zellbezüge einsetzen.

Eigene 404-Error-Page bei 1&1

Will man dem Besucher bei einer nicht gefundenen Seite nicht die vom Hoster vorgegebene Error-Page sondern eine Eigene präsentieren, so geht das normalerweise ganz einfach mit der folgenden Zeile in der .htaccess-Datei:

ErrorDocument 404 /error404.html

Bei dem Hoster 1&1 funktioniert das zwar auch, aber nur für statische Seiten. Dynamische Seiten mit PHP werden bei dieser Direktive ignoriert. Aber auch hier gibt es eine Möglichkeit: Das Rewrite-Modul vom Apache.

Um alle Seitenaufrufe, die nicht gefunden werden, auf eine eigene Fehlerseite umzuleiten fügt man in seine .htaccess-Datei diese Zeilen ein (an Stelle der o.g. Direktive):

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /error404.html

Zur Erklärung: Alle Seitenaufrufe, deren REQUEST_FILENAME weder als Datei noch als Verzeichnis gefunden werden, werden auf die Seite error404.html im Wurzelverzeichnis (Document-Root) umgeleitet.

Bei mir ist dies dann häufig ein PHP-Script, welches mir die Vermisste URL nebst dem Referer zu mailt.

set -x Ausgaben nur in eine Datei schreiben

Der Schalter set -x (auch xtrace genannt) ist ein hilfreiches Werkzeug zum Debuggen von Shellskripten. Aber manchmal sieht man auf Grund der Vielzahl an Meldungen den Wald von lauter Bäumen nicht. Und der normale Anwender sollte davon besser auch nichts zu sehen bekommen. Daher sollte man nach getaner Kammerjägerei den Schalter wieder aus dem Skript entfernen oder auskommentieren.

Was aber, wenn man die schönen Meldungen auch in der normalen Anwendung sammeln möchte, um z.B. einem von einem Anwender gemeldeten Fehler auf die Spur zu kommen. Mit ein paar zusätzlichen Zeilen kann man dies bewerkstelligen.

Hier erst mal das „normale“ Script:

#!/bin/sh

echo "Ich melde einen Fehler" >&2
echo "Eine ganz normale Meldung"

Es macht nichts wirklich sinnvolles, es gibt nur eine Meldung auf STDERR und eine auf STDOUT aus.

Nun die modifiziere Variante:

#!/bin/sh
{
  echo "+++++++++ `date "+%F %T"`: ${0##*/} $1 $2 $3 +++++++++"
  set -x
  echo "Fehler" >&2
  echo "normal"
  set +x
} 2>&1 | tee -a /tmp/${0##*/}.log | grep -v '^+'

Dieses Skript schreibt die komplette Ausgabe (mit den Debug-Zeilen von xtrace) in eine Logdatei mit gleichen Namen wie das Script selbst (mit angehängtem .log) in das Verzeichnis /tmp. Die xtrace-Zeilen werden für die normale Ausgabe über grep ausgefiltert.

Durch den Schalter -a bei tee wird die Ausgabe immer an die bestehende Logdatei angehängt. Dem trägt auch die echo-Zeile Rechnung, durch die zum Einen der Beginn eines neuen Laufs markiert wird und zum Anderen die zusätzlichen Parameter protokolliert werden.

Windows Firefox: Flashplayer-Installation als Nicht-Admin

Ludwig Coenen beschreibt in seinem Blog wie man unter Windows für den Firefox den Flashplayer ohne Adminrechte installieren kann. Ich musste allerdings den in seiner Quelle genannte Link für den Download des Flashplayers benutzen. Unter dem Link in seinem Artikel bekam ich immer nur die Installation, nicht aber den Download angeboten.

Eigentlich ist es ganz einfach, ich weiß gar nicht, warum da normalerweise Adminrechte benötigt werden.

Update: Leider funktioniert das oben beschriebene Verfahren zumindest mit der aktuellen Version 10.1.53.64 nicht mehr, da die neuen Installer-Dateien von Adobe nicht mehr die beiden Dateien NPSWF32.DLL und flashplayer.xpt enthalten (zumindest nicht so, dass man noch daran kommt). Mir hat dann die Lösung von Its all About…: Install Latest Flash Player 10.1 on Firefox without Admin Rights geholfen. Dieses kopiert die Dateien im persönlichen Anwendungsdaten-Verzeichnis in den Ordner MozillaPlugins.

Man kann auch, sofern verfügbar, sich die beiden Dateien von einem anderen Windows-Rechner mit der aktuellen Version holen. Diese liegen dann dort aber im System-Verzeichnis im Ordner MacromedFlash (z.B.: c:WINDOWSsystem32MacromedFlash). Siehe hierzu auch MozillaZine Knowledge-Base.

Ein 19-Zoll-Rack von IKEA

Von eth0Wiki - LackRack

Von eth0Wiki - LackRack

Ist das allseits bekannte schwedische Möbelhaus nun unter die Rack-Hersteller gegangen? Indirekt schon. Denn die quasi omnipräsenten IKEA-Tische der Serie LACK eigenen sich hervorragend zum Einbau von 19″-Geräten. Ob das nun im heimischen Wohnzimmer so gut aussieht muss jeder für sich entscheiden (bzw. mit seiner besseren Hälfte ausdiskutieren). Wer aber eine sehr günstige Möglichkeit sucht, seinen 19″-Kram mal endlich ordentlich zu verstauen, wird auf der LackRack-Seite des eth0-Wiki mit Tipps und Installationsanleitungen versorgt.

Firefox 3.6 und Java auf SuSE 11.1

Ich habe Anfang dieser Woche auf meinem Laptop den Firefox auf die Version 3.6 gebracht. Abgesehen von einem Addon, das den Browser zum unregelmäßigen Absturz brachte (ich hab noch nicht raus, welches Addon es ist – zzt. sind die meisten deaktiviert) funktionierte auch Java nicht mehr mit dieser Version.

Nach stundenlangem Googlen und Ausprobieren hab ich es nun endlich wieder am Laufen! Die Lösung ist eigentlich ganz einfach: ich musste einen Symlink von /usr/lib64/jvm/java-1.6.0-sun-1.6.0/jre/lib/amd64/libnpjp2.so in mein Mozilla-Plugin-Verzeichnis ~/.mozilla/plugins anlegen und den Browser neu starten. Das Plugin-Verzeichnis musste ich aber erst noch erstellen.

Diesen entscheidenden Hinweis fand ich per Google auf der Seite „Camp Firefox • Thema anzeigen – FF 3.6 Java Plugin“ — allerdings ist diese Seite zzt. nicht erreichbar, so dass ich den Google-Cache bemühen musste.

Die o.g. Datei stammt aus dem Paket java-1_6_0-sun-plugin-1.6.0.u17-1.20. Dieses wiederum hatte ich in meiner Verzweiflung per One-Click-Install aus dem Non-OSS openSUSE Factory-Repository geholt, aber das Standard-Paket 1.6.0.u17-1.1.1 sollte m.E. auch gehen.

Da ich bei der ganzen Herumprobiererei auch die aller-aktuellste JRE-Version von Sun heruntergeladen und installiert hatte und mich die Plugin-Testseite auch darauf aufmerksam gemacht hatte, dass es eine neuere Version des Plugins geben soll, haben ich den Link noch mal auf eben jene aktuelle Version geändert:

libnpjp2.so -> /usr/java/latest/lib/amd64/libnpjp2.so

Das funktioniert auch un die Testseite ist nun vollständig zufrieden.

print_r für Perl

Ich nutze unter PHP recht oft die Funktion print_r für’s Debugging. Diese Funktion gibt eine beliebige Variable strukturiert aus. Sinnvoll ist das natürlich am meisten bei Arrays und Objekten.

Für Perl gibt es kein print_r, dafür aber Data::Dumper (CPAN).

Ein kleines Beispiel:

use Data::Dumper;
my @arr = qw(foo bar foobar);
my %hash = (
             foo => 'bar',
             bar => @arr
           );
print Dumper(@arr, \%hash);

Das ergibt:

$VAR1 = [
          'foo',
          'bar',
          'foobar'
        ];
$VAR2 = {
          'bar' => $VAR1,
          'foo' => 'bar'
        };

Steht Data::Dumper mal nicht zur Verfügung geht es zur Not auch ohne.

Ein einfaches Array kann man sich so ansehen:

print "@array";

Mit dem Array aus den Beispiel von oben ergibt das:

foo bar foobar

Bei Hashs funktioniert das aber nicht. Hier geht es aber so:

my %hash =  (
              A => 1,
              B => 2,
              C => 3,
            );

{
  local $, = ' ';
  print %hash, $/;
}

Die Ausgabe sieht so aus:

A 1 C 3 B 2

Zugegeben, Data::Dumper ist da optisch besser, aber in der Not frisst der Teufel Fliegen…

Eine Reihe von IP-Adressen per Ping prüfen

Mitunter hat man das Problem, eine nicht kleine Anzahl an Rechnern auf Erreichbarkeit zu überprüfen. Die Adressen und Hostnamen liegen als Excel-Liste vor, aber diese alle von Hand zu pingen … dazu bin ich echt zu faul. Also habe ich mir ein kleines Script gebaut, welches diese Aufgabe elegant erledigt:

#!/bin/sh
#
# Sendet einen Ping an alle in der übergebenen Datei aufgeführten Adressen.
# In der Liste muss pro Zeile zuerst die IP-Adresse und danach durch Leerzeichen
# getrennt der Hostname stehen (optional).
# Die Ausgabe von Ping kann unterdrückt werden, indem STDERR ins Null-Dev
# geschickt wird:
# ping_list liste.txt 2>/dev/null
#

#set -x

Newline='
'

IFS=$Newline
for LINE in `cat $1`
do
  #echo "'$LINE'"
  ADR=${LINE%% *}
  HOST=${LINE##* }
  #echo "Adr: $ADR"
  #echo "Host: $HOST"
  if [ "$OSTYPE" = "linux" ]
  then
    ping -q -W 3 -c 1 $ADR 1>&2
  elif [ "$OSTYPE" = "hpux11.00" ]
  then
    ping $ADR -n 1 -m 3 1>&2
  else
    echo "Unknown OS"
    exit 99
  fi
  if [ $? -eq 0 ]
  then
    echo "$ADR ($HOST) is up"
  else
    echo "$ADR ($HOST) FAILED"
  fi
done
IFS=

Es arbeitet zzt. unter Linux (SuSE 11.1) und HP-UX 11i und kann auch hier heruntergeladen werden:
ping_list

munin auf centOS 5.2 installieren

Ich war kürzlich in der Verlegenheit, ein System mit centOS 5.2 überwachen zu müssen. Ich habe mir als Tool dazu munin auserkoren, das sich an Hand der Anleitung „Überwachung eines CentOS 5.2 Servers mit munin und monit“ einfach installieren und in Betrieb nehmen lässt (auf monit habe ich verzichtet).

Allerdings bekam ich danach alle fünf Minuten eine E-Mail mit der Meldung:

Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()

Zunächst habe ich alle relevanten Dateien in /etc/munin mittels iconv von ISO nach UTF8 konvertiert – was nichts genützt hat, da die Dateien bereits in UTF8 sind bzw. keine Umlaute etc. enthalten.

Eine weitere Recheche im Netz der Netze brachte mich auf ein Post im Gentoo-Forum, in dem ein Patch auf die Datei munin-graph erwähnt wird. Dieser Patch ist leider für die Munin-Version 1.3.4, auf meinem System ist aber die Stable-Version 1.2.5 installiert. Ich habe mir aber einmal den Patch angesehen und festgestellt, dass er recht einfach ist. Er baut  an sich nur eine Erkennung ein, ob die verwendete RRD eine Version größer oder gleich 1.3. Nur dann werden die an RRD übergebenen Parameter nach UTF8 gewandelt. Netterweise war der Patch im Context-Format erstellt worden, so dass es mir ein Leichtes war, die entsprechenden Code-Stellen auch in der Datei /usr/share/munin/munin-graph der Version 1.2.5 zu finden. Ich habe die beiden Code-Fragmente an den entsprechenden Stellen eingebaut – und es geht!

Hier nun der entsprechend angepasste Patch für die Munin-Version 1.2.5:

*** munin-graph.old     2009-03-25 01:28:10.000000000 +0100
--- munin-graph 2009-10-01 15:42:36.000000000 +0200
***************
*** 29,34 ****
--- 29,35 ----
  use Digest::MD5;
  use Getopt::Long;
  use Time::HiRes;
+ if ($RRDs::VERSION >= 1.3) { use Encode; }

  my $graph_time= Time::HiRes::time;
  my $DEBUG = 0;
***************
*** 832,837 ****
--- 833,848 ----
                    push @complete, "--end",(int($lastupdate/$resolutions{$time}))*$resolutions{$time};
            }
            print "

rrdtool "graph" "", join (""
	"",@complete), ""
" if $DEBUG;
+
+           # Since version 1.3 rrdtool uses libpango which needs its input
+           # as utf8 string. So we assume that every input is in latin1
+           # and decode it to perl's internal representation and then to utf8.
+           if ( $RRDs::VERSION >= 1.3 ) {
+               @complete = map {
+                   $_ = encode("utf8", (decode("latin1", $_)));
+               } @complete;
+           }
+
            RRDs::graph (@complete);
            if (my $ERROR = RRDs::error) {
                logger ("Unable to graph $filename: $ERROR");

Den Patch gibt es natürlich auch zum Download: munin-1.2.5_utf8.patch