Jun 17

So, es ist vollbracht. Die ganzen Consumer-Provider in good ‚ol Germany wollen ja irgendwie nicht so richtig mit ipv6 an den Start kommen. Also habe ich mal selbst Hand angelegt. Einen Provider hat man schnell gefunden. Ich habe mich für sixxs.net entschieden.

Bei sixxs.net bekommt man zunächst einen /64er Block für lau zugewiesen, den man hinterher auf /48 upgraden kann (Vorraussetzung: der 64er Tunnel läuft eine Woche durch / Downtimes, bspw. zum basteln, sind nicht tragisch). Einfach anmelden, „aiccu“ herunterladen, konfigurieren, starten und glücklich sein. Achtung: Aiccu / sixxs.net prüft die Systemzeit – Ein NTP-Client auf dem lokalen Endpunkt hilft da ungemein !

Das 48er-Subnet benötigt man aber nicht wirklich für den Heimgebrauch. Mit dem 64er kann man die restlichen 2^64 Adressen munter im Netz verteilen. Genau da war Anfangs auch mein Denkfehler. Mir war nicht aufgefallen, dass sixxs.net ein Transfernetz zur Vefügung stellt, durch das dass /64er gerouted werden kann. Konkret sieht das ganze nach dem ersten Start wie folgt aus:

  • PtP-Adresse (Da gehts also zu sixxs): 2001:6f8:100:fea::1/128 (Die beiden :: sind die Platzhalter für gaaanz viele Nullen – ausgeschrieben sähe das ganze so aus: 2001:6f8:100:fea:0000:0000:0000:1/128)
  • Lokale Adresse des ersten „ipv6“-Interfaces: 2001:6f8:100:fea::2/64
  • Und jetzt wird’s spannend. Im Webinterface bei sixxs.net kann man sehen, dass das zur Verfügung stehende Netz 2001:6f8:100:dfea::/64 lautet (Man beachte das „d“ bei Octet 7)

Mit dem dfea-Netz (die Adressen sind für den Blogeintrag gefaked) können wir nun intern loslurchen und die Rechner ausstatten. Im simpelsten Falle installiert man sich den radvd (Router Advertising Daemon) und konfiguriert sowie startet ihn. Der verteilt die Dinger dann im LAN. Achtung: Dem LAN-Interface muss man selbst eine (v6-)IP aus dem dfea-Netz verpassen (/etc/network/interfaces) – das macht der radvd nicht. Jetzt noch das ipv6-Fowarding enablen (echo 1 >/proc/sys/net/ipv6/conf/all/forwarding) und schon können alle anderen Rechner per ipv6 mit der Welt in Verbindung treten (oder auch angesprochen werden !!)

Was uns zu einem kleinen Schönheitsfehler bringt. Ich will ipv6, weil ich das genNATte und diese ewige dynamische IP-Vergabe leid bin. Dummerweise vergibt der radvd die IP’s aber höchstdynamisch. Statisch verfügbar wäre in diesem Szenario also allenfalls der Router. Schuld (- Die Diskussion will ich hier nicht führen -) sind die sog. „privacy extensions“ die irgendwelche paranoiden Mitmenschen entworfen haben. Ich war schon bei v4 kein Freund von „Würfel“-DHCP. Ganz abgesehen davon möchte ICH, und nicht irgendein Billo-Router regeln, wer wann wie worüber ins Netz geht. Bei IP’s die man nicht kennt, ist das ein grausames Unterfangen.

Jetzt gibt es zwei Möglichkeiten aus dem Dilemma herauszukommen.

  1. DHCP-V6 aufsetzen (hab ich noch nicht ausprobiert) und die IP’s statisch den Mac-Adressen im LAN zuordnen.
  2. Den Servern händisch statische IP’s verpassen.
  3. Mischbetrieb aus 2 und radvd

Habe mich erstmal für Variante 3 entschieden. Also jeden Server abgrasen und eine IP aus dem dfea-Netz eintragen, Default(-v6-)Route setzen und testen. Die Arbeitsplatzrechner bekommen die IP’s per radvd, die Server sind statisch verdrahtet. Fein, funktioniert.

Jetzt kommt der fieseste Teil, an dem ich zwei Stunden versenkt habe:

Das ganze ist bei Debian nämlich leider nicht Bootfest, da Linux ganz jeck auf Route-Advertisments ist, und sich dort auch eine IP „ziehen“, wenn sie schon statisch eine abbekommen haben. Hier helft eine Kernel-Einstellung in /etc/sysctl.conf:

net.ipv6.conf.default.accept_ra = 0
net.ipv6.conf.default.autoconf=0

Die alleine macht aber auch noch nicht glücklich, da die sysctls beim booten eingelesen werden sollen. Zu diesem Zwecke linkt man sich die /etc/init.d/procps in die runtimelevel-Dirs (/etc/rcX.d/). Hilft auch noch nicht, weil: Die Einstellungen greifen nur, wenn auch das ipv6-Kernel Modul schon geladen ist – sonst laufen die ins leere 🙁 Hierzu ipv6 in die /etc/modules eintragen. Anschliessend booten – et voila: Es läuft !

Jetzt fehlt eigentlich nur noch eins: Eine ordentliche Firewall mit Connection-Tracking. Gibts wohl demnächst mal einen Blogeintrag drüber. Soviel sei gesagt: Connectiontracking geht erst ab Kernel 2.6.26, redirect (bspw. für transparente Proxies) erst ab 2.6.36…

Somit wäre dieses Blog nun auch via ipv6 erreichbar !

Tagged with:
Apr 11

Das Kind hat doch derbe Defizite mit dem kleinen 1×1. Macht sich jetzt so richtig bemerkbar, weil im Unterricht Division mit REST durchgenommen wird. Nun habe ich allerdings wenig Lust, mir alle Nasenlang neue Aufgaben aus den Fingern zu saugen. Also mal flux ein Perl-Script geschrieben, welches die Ergebnisse gleich mitliefert. Auf Excel-Output hatte ich gerade keine Lust, sollte aber mit „Spreadsheet::WriteExcel“ (gibts beim CPAN Ihres Vertrauens) auch kein Thema sein.

Das folgende Script wirft also 60 Aufgaben mit 60 Ergebnissen aus. Wenn man den Output (Tab-getrennt) in Excel guttenbergt (CopyPaste), dann hat man auf dem „linken“ Blatt, bei einem 18er Font, die Aufgaben, und auf dem rechten Blatt die Ergebnisse. Die machen es dann etwas leichter, den Kram den der Nachwuchs da hingepinselt hat, zu kontrollieren.

#!/usr/bin/perl
my $i=100;
my @erg,@aufg;
my $sollaufgaben=60;
while ($aufgaben<$sollaufgaben) {
  $i++;
  my $a=int(rand($i)%100);
  my $b=int(rand($i)%10);
  $b=1 if int($b)==0;
  $a=1 if int($a)==0;
  if (int($a/$b)<12) {
    $aufgaben++;
    push @aufg,$aufgaben."\t".$a."\t:\t".$b;
    push @erg,int($a/$b)." R ".($a % $b);
  }
}

for (my $i=0;$i<int($sollaufgaben/2);$i++) {
  print $aufg[$i*2]."\t\t".$aufg[$i*2+1]."\t\t";
  print $erg[$i*2]."\t".$erg[$i*2+1]."\n";
}
									

Tagged with:
Mrz 01

Wenn man per Cron, PL/SQL, whatever Mails mit mehr als einem Empfänger im Enterpriseumfeld versendet, dann bekommt man meist diese schäbigen Abwesenheitsnotizen & Co. zurück, die einem das Absenderpostfach zumüllen.

Lösungsansätze gibt es da zwei (wovon ich den zweiten bevorzuge):

  1. no-reply@enterprisecompany.tld als Absender verwenden
  2. Einen Mail-Header mitsenden, nämlich: „X-Auto-Response-Suppress: DR,RN,NRN,OOF,AutoReply“

Nummer 2 hat den charmanten Vorteil, dass man Bounces & Co. noch weiterhin bekommt. Nachteil: Der MTA muss es auch erkennen. Bei „Exchange“ ist das der Fall.

Tagged with:
Dez 06

Args. Was ein pfu. Doch von vorne:

Am Freitag letzter Woche ging es los. Meine gute SmartUPS 1500RM hatte auf einmal Hitzewellen. Woher die kamen ? Keine Ahnung. Entdeckt habe ich das ganze eher durch Zufall, da ich ab und an dann doch mal einen Blick ins cacti werfe. Da sah das ganze dann so aus:Hitzewellen in der APC 1500 Interessant in dem Zusammenhang: Die USV wirft erst einen Alert ab ca. 60 Grad Celsius. Meiner Meinung nach – die sollte sich später noch bestätigen – viel zu spät. Das Rack, indem sich die APC 1500 befindet, hat übrigens direkte Aussenbelüftung – im „Serverraum“ waren es also die ganze Zeit über so um die 16 Grad. Bei den Peaks bin ich dann doch mal ‚runter gegangen und hab die Schranktür des Racks aufgemacht, und siehe da: Temp wieder normal.

Am Wochenende stand das gute Stück also erstmal unter Beobachtung. Wie man oben erkennt, war es jedoch ruhig. Pünktlich zum Wochenbeginn fing die USV dann aber wieder an zickig zu werden. Da mir dass ganze (wörtlich !) zu heiss wurde, habe ich mich dann entschlossen das Batterypack (ist in so einer Cartridge) zumindest abzuklemmen. Da die Notstromversorgung Hot (!)-Pluggable ist, also kein Problem.

Sofern die angeschlossenen Geräte in diesem Zustand (Batterien abgezogen / disconnected) noch laufen, sollte man es tunlichst unterlassen der USV den Strom zu klauen. Nicht nur, dass dann alles aus ist – das wäre zu einfach – man bekommt auch keinen Saft wieder auf die USV. Die lässt sich nämlich nur mit angepömpelten Akkus starten (FAIL !!).

Also erstmal Ersatzakkus bestellen. Aber € 520,- für ’ne Cartridge (RBC24) mit 4 Moppedakkus ? Ja sind die wahnsinnig bei APC ? Das muss doch günstiger gehen. Geht es: Diverse Händler verkaufen die Akkus einzeln zum Stückpreis von € 20,- . Da die Akkus bisher noch nicht eingetroffen sind, spreche ich da noch keine Empfehlung aus 🙂

Demontage:

Ansich nett gedacht. Frontblende der UPS entfernen, 4 Schrauben lösen und dann einfach die Cartridge mit den 4 Bleigelakkus rausziehen. Was aber tun, wenn die Dinger aufgequollen sind ? Mit Gewalt ziehen, hat geholfen. Hier das Resultat:

Nun „nur noch“ die 4 Akkus aus der Blechwanne entfernen. Haha ! Kein Tutorial, keine versteckte Klammer mit der die Dinger da gehalten werden – nix. Fühlt sich an wie festgeklebt. So war es auch. Jeder Akku ist mit einem dusseligen doppelseitigem Klebestreifen an der Wanne festgeklebt. (2ter FAIL !!) Also auch hier wieder Gewalt anwenden, und die Dinger vorsichtig mit dem Schraubenzieher anhebeln – irgendwann kommen die von alleine 🙂 Der Sicherheit halber, habe ich die Anschlüsse mal zusammengetaped, isoliert, und mit Nümmerchen versehen. Jeder Platz in der Aluwanne hat dann die korrespondierende Nummer bekommen. Jetzt heisst es warten auf die Ersatzlieferung, und hoffen das der Strom nicht ausfällt.

PS: Vor ca. 6 Jahren ist mir mal eine 750er Desktop-SmartUPS unterm Schreibtisch hochgegangen. War nicht lustig. Die musste ich mit dem Topflappen auf den Balkon befördern… Von daher: Wenn Euch die Akku-Temperatur (Internal Temperature bei APC) komisch vorkommt – lieber heute als morgen die Akkus wechseln.

Tagged with:
Okt 26

Kennwort unter Solaris „expired“ ?

Beim Login per ssh per key-auth kommt nix, und bei einem su – xxx kommt die Meldung „Password for user ‚xxx‘ has expired – use passwd(1) to update it“ ? Da gibts eine Loesung:

Einfach auf der Shell (als anderer User) das Tool „login“ aufrufen, mit den „alten“ Credentials einloggen, und schont kommt der Password-Change-Prompt. Gut versteckt das ganze !

Tagged with:
Mrz 26

Sehr cool was mit dem Arduino so alles machbar ist. Um es vorweg zu nehmen: Mit dem Ding habe ich eine Ansteuerung eines BetaBrite LED-Moduls via Netzwerk gebaut (also im „Live-Betrieb“ OHNE Rechner benutzbar).

Doch vorne angefangen:

Vor ein paar Jahren hatte ich mir bei eBay ein BetaBrite geschossen – Das ist so eine nette Laufschrift, die man zum Leute quälen draussen an seinen Copyshop hängen kann, so man(n) den einen hat. Die Idee war damals die Temperaturdaten meiner Wetterstation und ein paar andere Dinge anzeigen zu lassen. Ist aber nie so richtig umgesetzt worden, da mein „Serverpark“ im Keller steht, und die Anzeige dort natürlich null Nutzwert hat. Vor ein paar Tagen bin ich dann auf das Arduino-Projekt gestossen – klang (und ist auch) alles sehr vielversprechend:

Eine simple Plattform incl. Entwicklungsumgebung für die ATMEGA-Microcontroller Serie mit massenweise Zubehör. Wer das Ding nicht kennt, einfach mal bei arduino.cc umschauen. Bezugsquellen sind u.a. watterod, komputer.de oder auch farnell.com, sofern man (bei farnell) denn im Besitz eines Stundentenausweises ist (Die Spareffekte dort sind vernachlässigbar). Der Knaller an dem Ding ist jedoch der Preis. So gibt es den Arduino für ca. 20-28 Euronen incl. Versand zu haben. Der Microcontroller lässt sich über die USB-Schnittstelle (sowohl auf Mac, PC oder Linux) in einer Art C-Dialekt für Kids programmieren (Ist wirklich extremst Easy). Das ganze geht so in Richtung SPS – daher heisst der Dialekt wohl auch „Processing“. Man hat im Template quasi 2 vorgefertigte „Prozeduren“:

  • void setup – wird einmalig aufgerufen, wenn der ATMEGA hochgefahren wird und dient zum initialisieren der Ports, etc.
  • void loop – wird, wie der Name schon sagt, im Loop kontinuierlich durchlaufen – bei mir kamen da direkt Errinerungen an die Lehrzeit wieder hoch (SPS – Merker setzen und sowas)

Hardwaretechnisch verfügt das Ding über 14 Digitale I/O Pins, von denen 6 per PWM ansteuerbar sind (alles TTL-Pegel), sowie 6 Analoge ein/Ausgänge mit einer 8bittigen genauigkeit im A/D bzw. D/A Wandler. Sämtliche Anschlüsse sind auch für Wurstfinger, wie meine, leicht verfügbar, sodass Löten – wenn man es denn nicht gerade drauf anlegt – ausfällt.

Zurück zum Titel dieses Eintrags. Zusätzlich zum Board habe ich mir noch eine Ethernet-Shield gegönnt. Shields sind sowieso die Erfindung hier uberhaupt. Man kann sich das als „Huckepack“-Platine vorstellen, die bestimmte Pins des Arduinos belegen und dann weiter Funktionalitäten bereitstellen. Das eth-Shield stellt also einen Netzanschluss zur Verfügung, und genehmigt sich dafür 6 Pins. (Eine gute übersicht über den „Pinverbrauch“ und verfügbare Shields gibts übrigens bei shieldlist.org). Das Shield selbst lässt sich dann im „Processing“ über ein paar Simple Funktionen ansteuern / auslesen.

Problematisch beim BetaBrite war, dass dieses über eine RS232 (vulgo: Serielle) Schnittstelle verfügt, der Arduino aber nur TTL-Pegel verarbeiten kann. Es gibt für den Ard. eine Serial-Library, mit der man aus zwei weiteren Pins einen Seriellen Anschluss „emulieren“ kann, aber ohne korrekte RS232-Pegel ist das suboptimal. Was tun ? Mal ein wenig gekramt, und dann ist mir ein MAX232 zwischen die Finger gekommen – quasi genau das was man braucht. Die Schaltung mit dem MAX232 ist mehr als simpel (Einfach ausgedrückt konvertiert der 232 die Pegel). Somit steht das ganze Hardwaremässig schonmal. Ethernet-Shield -> Arduino -> MAX232 -> BetaBrite. Fehlt nur noch die „Software“. Die Ansteuerung der BetaBrites ist schnell im Netz gefunden (z.B. hier, bzw. als PDF direkt beim Hersteller). Der Code auf dem Arduino umfasst gerade mal 2kB (incl. inline-Dokumentation !!!). Falls interesse besteht, stell ich den gerne mal hier ein.

Was kann das ganze jetzt ?

Nun, Der Microcontroller mit Ethernetanschluss „horcht“ auf TCP-Port 23. Immer wenn sich etwas connected und eine Zeile schreibt, dann gibt der Controller das an das Betabrite weiter. Serverseitig kann ich nun, aus dem Keller heraus :-), das BetaBrite ansteuern, wo immer auch Netz verfügbar ist…

Tagged with:
Feb 01

Na premium. Setze mich heute morgen an den Rechner, und was sehe ich: Kein Internet !

Dass man Abstriche machen muss, wenn man knapp 2 Jahre lang Kabelmodem verwöhnt war, (Kein nervtötender Reconnect / NULL Ausfälle / Konstanter Up/Downstream etc.) hatte ich mir ja schon gedacht. Nunja, seit ca. 3 Wochen bin ich wieder PPP over Ethernet User (DSL) mit all seinen „netten“ Nebeneffekten (siehe oben). Normalerweise reconnected der pppd auch fein nach jedem Disconnect – nur heute Nacht halt nicht.

Die Analyse (siehe Logauszug) ergibt zwei suspekte Dinge:

  1. „Rausschmiss“ durch den Provider nach 574 Minuten (Normalerweise passiert das nach 24h)
  2. Reconnectversuch durch den PPPD, der jedoch mangels Antwort der Gegenstelle ins leere läuft.

Gerade Punkt 2 nervt hier – denn per default gibt der pppd nach 10 Versuchen auf. Nach etwas googlerei habe ich dann doch die richtige Option gefunden, mit der er unendlich „PADI“s schicken soll, um irgendwann dann mal ’nen Connect hinzubekommen. Einfach ein „maxfail 0” in die /etc/ppp/peers/provider eintragen, und schon versucht es der Router bis zum St.Nimmerleinstag


Feb 1 03:03:04 pppd[530]: LCP terminated by peer
Feb 1 03:03:04 pppd[530]: Connect time 573.9 minutes.
Feb 1 03:03:04 pppd[530]: Sent [ne Menge] bytes, received
[noch viel mehr] bytes.
Feb 1 03:03:07 pppd[530]: Connection terminated.
Feb 1 03:03:07 pppd[530]: Modem hangup
Feb 1 03:04:12 pppd[530]: Timeout waiting for PADO packets
Feb 1 03:04:43 pppd[530]: PPP session is 350
Feb 1 03:04:43 pppd[530]: Using interface ppp0
Feb 1 03:04:43 pppd[530]: Connect: ppp0 <--> eth2
Feb 1 03:04:49 pppd[530]: Connection terminated.
Feb 1 03:04:49 pppd[530]: Modem hangup
Feb 1 03:05:54 pppd[530]: Timeout waiting for PADO packets
Feb 1 03:06:59 pppd[530]: Timeout waiting for PADO packets
Feb 1 03:08:04 pppd[530]: Timeout waiting for PADO packets
Feb 1 03:09:09 pppd[530]: Timeout waiting for PADO packets
Feb 1 03:10:14 pppd[530]: Timeout waiting for PADO packets
Feb 1 03:11:19 pppd[530]: Timeout waiting for PADO packets
Feb 1 03:12:24 pppd[530]: Timeout waiting for PADO packets
Feb 1 03:13:29 pppd[530]: Timeout waiting for PADO packets

Tagged with:
Nov 13

Wah !

2 Wochen habe ich mich nun mit verlorenen Paketen herumgequält, die interessanterweise nur bei IMAPs Verbindungen vom LAN ins WAN aufgetreten sind. Jetzt hab ich das ganze mal mit Wireshark analysiert. Ergebnis: Lost packets (Ja wusste ich auch schon).

Des Rätsels Lösung: Nie, ich wiederhole, NIEMALS mit der mtu in einer DomU unter XEN herumspielen. Einfach auf „default“ lassen. Jetzt geht es wieder !

Tagged with:
Mai 29

Das Perl-Modul WWW::Shorten::Bitly als solches bietet die Moeglichkeit URLs, die zuvor mit bit.ly verkuerzt worden sind, wieder zu „expanden“ und auch diverse Clickstatistiken auf diese URLs zu fahren.

Leider hat das Modul ein paar Schoenheitsfehler:

  1. Beim „Expanden“ meint das Modul die Methode „GET“ nutzen zu wollen. Die API von bit.ly schreibt hier aber ein „POST“ vor. Das ist recht zuegig gefixed. Einfach in der Zeile 257 (Methode „expand“ der Version 1.14) aus dem get ein post machen -> Fertig 🙂
  2. Beim Aufruf der Methode „clicks“ auf URLs mit vielen Statistik-Daten (Referrers, etc.) versagt der SAX-Parser auf ganzer Linie. Er quittiert das Parsen mit einer Fehlermeldung a’la: End tag mismatch (nodeKey != nodeValue) [Ln: x, Col: yyyyy]Das Problem laesst sich dadurch loesen, dass man dem XML::Simple Modul sagt, es soll gefaelligst einen Ordentlichen parser benutzen. z.B. den XML::Parser (der zuvor via cpan installiert werden muss (setzt libexpat1-dev vorraus !)). Wir teilen dies dem Bitly Modul nach dem Einbinden von XML::Simple ueber folgenden String mit: $XML::Simple::PREFERRED_PARSER = 'XML::Parser'; … und oh Wunder: Alles funktioniert

In diffs ausgedrueckt sind folgende Aenderungen an WWW::Shorten::Bitly Version 1.14 notwendig:

22a23,24
> $XML::Simple::PREFERRED_PARSER = 'XML::Parser';
>
257c259
< $self->{response} = $self->{browser}->get($self->{BASE} . '/expand', [
---
> $self->{response} = $self->{browser}->post($self->{BASE} . '/expand', [

Ab nun klappt auch das Auslesen mit dem Modul.

Tagged with:
Mai 12

Sachverhalt: Zig dilettantisch benannte Dateien mit Leerzeichen und Umlauten in wiederrum zig Verzeichnissen (Windeutsch: Ordner).

Wunsch: umbennen der Files mit einem Schlage

Lösung:

Shellscript:

#!/bin/bash
find . -depth -execdir rename 's/ä/ae/g;s/ö/oe/g;s/ü/ue/g;s/ß/ss/g;s/ /_/g' "{}" \;
find . -depth -execdir rename 's/Ä/Ae/g;s/Ö/Oe/g;s/Ü/Ue/g;s/ß/ss/g;s/ /_/g' "{}" \;

Tagged with:
Jan 14

Einfach nur Göttlich

Jan 05

… schonmal versucht Abhängigkeiten grafisch darzustellen ? Am besten noch aus Datenbankcontent ?

Klar, man könnte zu irgendwelchen proprietären MindMap-Tools oder gar zu M$-Visio (oh grauss !) greifen. Dabei geht es mit graphviz in Verbindung mit „dot“ soooo einfach. Das Ding ist ehrlich einen Blick wert. Zusammen mit der „Connect by Prior“ Clause in Oracle ist das Teil der Knaller schlechthin.

Ein wenig Doku dazu (die original-Doku ist recht schwere Kost) gibt es z.B.

Das allerbeste ist, dass MediaWiki das Ding von Haus aus unterstützt, und man derartige Graphen direkt per Wiki-Editor in die Artikel einbetten kann…

Tagged with:
Dez 29

Aufmerksam geworden durch diesen Artikel, mit dem ueber den Proxy geholte Webseiten (genauer gesagt werden alle Images einmal um 180 Grad gedreht) on the Fly manipuliert werden habe ich mir das ganze mal näher angesehen und optimiert.

Vorweg schonmal das Ergebnis (funktioniert TRANSPARENT mit allen JPGs, GIFs und PNGs). Transparent bedeutet in diesem Falle, dass der Anwender in keinerlei Weise mitbekommt, dass es sich hier um ein manipliertes Bild handelt. Die Requests werden quasi 1:1 durchgeleitet.

Wor moechten also alle Bilder, die aus dem LAN via Proxy angefordert werden, einmal um 180 Grad drehen. Folgende Ausgangssituation:

  • Transparenter Squid auf einem Router
  • Webserver auf einem etwas dickeren Rechner im LAN

in /etc/squid/squid.conf folgende Zeile einfügen:

url_rewrite_program /usr/bin/updwn.pl
url_rewrite_children 5

Das File /usr/bin/updwn.pl sollte wie folgt aussehen:

#!/usr/bin/perl
# Runs as proxy:proxy
# input - siehe unten (Array params)
# output - URL - transparent *invisble to Enduser :-) *
$|=1;
while (<>) {
chomp $_;
@params=split(/ /,$_);
# 0 = Request URL
# 1 = Requesting IP/-
# 2 = -
# 3 = Request Method
# 4 = myip= ?
# 5 = myport = ?
$url=$params[0];
if (!($params[1]=~/192\.168\.60\.200/)) { # Nicht rekursiv aufrufen (Boese !!)
$url='http://192.168.60.200/ppics/updwn.pl?u='.$url if ( ($url=~/gif/i) || ($url=~/jpg/i) || ($url=~/jpeg/i) || ($url=~/png/i));
}
print $url."\n";
$count++;
}

Wobei die 192.168.60.200 durch die IP des eigenen Webserver zu ersetzen waere. Die eigentliche „Magie“ findet naemlich jetzt im updwn.pl auf dem Webserver statt. Das Ding benutzt, im gegensatz zu dem File, welches in dem Artikel beschrieben wurde, direkt die GD-Library und ruft keinerlei Executables mehr auf. Damit ist das Script ein wenig performanter

Hier der Inhalt von /var/www/ppics/updwn.pl:

use CGI qw/:standard/;
use LWP::UserAgent;
use GD;
binmode STDOUT;

$|=1;
my $url=param(„u“);

chomp $url;
my $ctype=“;
my $content=“;
get_content($url,\$ctype,\$content);
rotate(\$content,\$ctype) if ($ctype=~/image/i);
print „Content-Type: „.$ctype.“\n\n“;
print $content;
print „\n–magicalboundarystring\n“ if ($ctype=~m/image/);

sub get_content {
my ($url,$ref_ctype,$ref_content)=@_;
my $ua = LWP::UserAgent->new;
$ua->agent(„MyApp/0.1 „);
my $req = HTTP::Request->new(GET => $url);
my $res = $ua->request($req);
$$ref_ctype=$res->content_type;
$$ref_content=$res->content;
}

sub rotate {
my ($ref_content,$ref_header)=@_;
my $image=undef;
$image=newFromPngData GD::Image($$ref_content) if ($$ref_header=~/png/i);
$image=newFromJpegData GD::Image($$ref_content) if ($$ref_header=~/jpeg/i);
$image=newFromGifData GD::Image($$ref_content) if ($$ref_header=~/gif/i);
$image->rotate180();
$$ref_header=’image/png‘;
$$ref_content=$image->png();
}
Wichtig: Die URL sollte nicht aus dem Internet erreichbar sein. Ansonsten hat man einen selbstgebastelten offenen Proxy…

Mithilfe der Parameter des Files /usr/bin/updwn.pl kann man sich jetzt sogar lustige ACLs bauen. (Rotiere nur fuer bestimmte IP’s oder fuer bestimmte URLs, etc…) Der Phantasie sind da keine Grenzen gesetzt.

Tagged with:
Dez 28

Oh wie wahr….

Nov 22

Man kennt das. Gerade frisch einen Postfix aufgesetzt, eine Testmail losgelassen und Zaaack! – das Ding will nicht rausgehen. Jetzt dümpelt die Mail bis zum Timeout in der Queue herum. Abhilfe habe ich früher geschaffen in dem ich mir via mailq die Mail-ID herausgekramt habe und dann mühsam durch die spool Directories gegangen bin um ein File nach dem anderen zu löschen. Es geht eleganter:

mailq aufrufen um die Mail-ID zu bekommen

und anschliessend nur noch „postsuper -d <mail-id>“ aufrufen um die Mail zu töten. Fertig….

Ja, die meisten werden es kennen. Nur so vergesse ICH das garantiert nicht mehr 🙂

preload preload preload