fuseftp: Implementing userspace filesystems with Perl

Update 2011: Well, I haven’t done anything with Perl in the last couple of years, but to update this Page: FuseFTP is now up on Github, you can fork it there.

Well, as I mentioned earlier, 2.6.14 has this nifty new FUSE feature, allowing the implementation of a file system in userspace. Unfortunately, there was no implementation of a FTP filesystem. Fortunately, there are Perl bindings for FUSE :-).

One can implement a userspace filesystem using the whole power of Perl, and that makes it quite easy. I implemented a basic ftp filesystem this morning, which uses Fuse.pm and Net::FTP to allow read only access to ftp servers. It works quite well and was really easy, so this might be the beginning of a couple of nice userspace filesystems written in Perl. I could actually create MegasusFS….

BTW, you can download fuseftp from my Github Account.

Usage is quite easy, you can simply:

marcus@hal2000:~: mkdir kernel
marcus@hal2000:~: fuseftp kernel/ ftp.kernel.org &
Successfully logged into ftp.kernel.org
[1] 7150
marcus@hal2000:~: cd kernel/
marcus@hal2000:~/kernel: ls
for_mirrors_only  lost+found  pub  usr  welcome.msg
marcus@hal2000:~/kernel: cd ..
marcus@hal2000:~: fusermount -u kernel/
[1]+  Done                    fuseftp kernel/ ftp.kernel.org

Alles Transparent

Nein, eigentlich geht es nich um das “Theme der Woche”, das ich heute ein wenig angepasst habe und das mir doch sehr gut gefällt. Für alle die es doof finden, es gibt in der rechten Leiste einen Theme Switcher, mit dem man sich sein liebstes Theme einstellen kann und das bleibt dann auch so. Eigentlich geht es nämlich um die heute erschienene neue Kernelversion.

Ich finde den neuen Kernelentwicklungsansatz total toll, jedes Release ein neues Feature über das man sich freuen kann. In 2.6.13 war es inotify (das jetzt auch mitlerweile von der standard libgamin von Debian unterstützt wird), in 2.6.14 ist es FUSE. FUSE ist eine Filesystem-Userspace bridge, d.h. man kann sich lustige virtuelle Dateisysteme basteln. Z.b. eins für WebDAV, eins für SSH, eins für Bluetooth, eins für Mediawiki und eins für SMB. Eins für FTP gibt es auch, das muss man dann aber über ein Emulationslayer einbinden. Diese sind dann absolut transparent, sehen also für alle Applikationen so aus wie Dateien auf dem lokalen Rechner, Spass pur. Ich habs zwar noch nicht ausprobiert, aber das ganze ist schon sehr vielversprechend.

In other news habe ich endlich ein sinnvolles Mailbackup gefunden, bzw. gemacht. Nein, ich rede nicht von meinem etwas wahnsinnigen System das seit ende letzten Jahres meine Emails über drei Server schickt und auf jedem jeweils ein Backup macht, sondern ich reden von meinem Archiv was so bis 2001 zurückreicht. Die habe ich nun endlich mal auf meinen GMail Account hochgeladen bzw. weitergeleitet, hat auch nur so um die 20 Stunden gedauert, meinen Account ein wenig gefüllt aber dafür weiß ich jetzt das ich nie mehr irgendwelche Mails verlieren werde. Ein tolles Tool dafür (abgesehn davon das es in Python geschrieben ist gibt es hier.

Net::SILC::Client

Once upon a time there was a Linux user group which switched it’s chatting system to SILC. Unfortunately there was no Chatbot available for SILC and the user group had to live without. Suddently, in the beginning of ’05, somebody had the time to write a bot, called Megasus, which runs inside the Irssi client, which is used by SILC as well. From now on the chat was enriched by nice information provided by a Bot. But Megasus had a problem, (actually the Irssi client when you call fork() inside of it) and it was leaking memory like hell, until the bad Adminstrators where forced to put memory and runtime limits on the machine. This lead to Megasus dying a horrible death every week and really annoyed the author. But then…

Well, I have been looking for real Perl bindings for the SILC Client API for quite a while. The problem is that there are none. Apparantly, nobody took it’s time to write something which would allow something like:

use Net::SILC::Client;
use Chatbot::Eliza;

my $bot = new Chatbot::Eliza( );

sub on_channel_message {
    my ($self, $channel, $nick, $message) = @_;

    if ($message =~ $self->nickname) {
        my $answer = $bot->transform($message);

        $self->channel_message($channel, 
                               $nick . ': '  . $answer );
    }
}

my $silc = Net::SILC::Client->new (channels => [ 'silc' ],
                                   nickname => 'NSC');

$silc->set_callback('channel_message', &on_channel_message);

$silc->connect;

A few days ago, I stumbled over SILC.pm a Sourceforge Project which attempted to create a Perl wrapper for the SILC API. They hadn’t released any code and as the project was founded in 2002 I contacted the authors and asked if they had already done some work, because I started believing that I would have to do this myself. They where really friendly and they had code, but only wrapping some of SILCs Math functions and not really what I needed. So I started writing from scratch.

As of today, you can run the above example and it does what it has to, plus there are a couple of other events that you can handle directly from Perl. As this is my first Perl/C/PerlXS Module I believe that it is leaking memory like hell as well as there are a couple of other problems (vanishing scalars between two function calls is one of them). But it supports all important events (you can set callbacks as this whole system is event driven), lets you issue commands and send private and channel messages. What I need to do to make it a possible frontend for Megasus is that I need an other Event System (for things like fetching RSS feeds) and some other minor fixes, but the major part is done. The Event System is a little bit tricky, as I tried to use Event.pm and running the SILC Main Loop with it which crashed horibly and I’m still not really good in debugging this stuff. And of course, it is lacking documentation (there are two examples which show the main methods as well as some information about the events, but this is not really good). It’s still far away from something I’d release to the CPAN, but If you want to have a look, it’s all in the CVS on Sourceforge.

Konsistenz?

Naja, eigentlich mag ich es nicht hier immer über Windows schlecht zu schreiben, das Problem ist nur das wenn ich mich damit auseinandersetzen muss ich immer das Gefühl habe das ich Machtlos dummen Ideen gegenüberstehe, das frustriert und das muss ich rauslassen.
Was ist geschehen? Ich habe gestern meiner Ma geholfen ihren Rechner mal von 3 Jahren Müll zu befreihen, sprich installierte Programme. Dabei ist mir dann aufgefallen, wie schrecklich die Softwareverwaltung auf Windows ist. Abgesehen davon, das das ganze nicht batch fähig ist und man auch nicht mehr als ein Programm auf einmal deinstallieren kann ist das ganze unglaublich inkonsistent. Jede Deinstallationsroutine sieht anders aus, stellt andere Fragen und ist auch sonst nicht besonders Benutzerfreundlich. Ein Spiel startete sogar ein komplett in Game deinstaller, mit Grafiken und Sound etc. Es kann doch nicht sein das so etwas simples wie Software deinstallieren so inkonsistent und kompliziert ist das selbst ich bei den meisten Fragen nur raten kann. Warum fragt ein Programm nach ob es beim deinstallieren Dateien aus seinem eigenen Verzeichnis löschen darf? Ferner ist dieser Konsistenzgedanke, der Linux ja ständig vorgeworfen wird, bei Windows noch nicht angekommen. Ist euch mal aufgefallen das es auf Windows cool ist kein UI wie alle andern zu haben? WinAmp, Office 03, Nero, Media Player … all diese Programme sehen nicht mehr aus wie eine normale Windows Anwendung und die Linux Desktop Menschen wollen unbedingt hin zu viel konsistenz. Ich habe fast den Eindruck das bei mir alles viel konsistenter ist, da ein komplettes Desktop System, als auf Windows. Ich hoffe Microsoft fügt nach der Shell und dem Editor auch noch ein Paketmanagement ein. Würde vieles viel einfacher machen.
Sowas ist doch ganz Simpel, Apt-Get stellt meistens beim deinstallieren keine dummen Fragen, ich weiß das die Konfigurationsdateien da bleiben, es sei denn ich haue sie mit –purge raus und ich kann viele Programme auf einmal de- und installieren. So macht Software Spass.

MSH: Microsoft’s Sucking Helper?

Eine von den vielen Sachen die Windows etwas unbenutzbar machen ist das Fehlen einer ordentlichen Shell in der default Installation (und eines Editors, und eines Compilers, und eines Browsers, und einer dezentralen Konfiguration von Diensten). Microsoft versucht diese Lücke mit Monad aka MSH zu schließen, was anscheinend ganz gut aussieht. Wie in diesem Artikel ausführlich beschrieben, scheint das Rezept von Microsoft relativ einfach zu sein: ein bissel Perl, ein wenig SQL und ein Objekt Orientiertes Interface machen eine Microsoft Shell. Aber entgegen aller Erwartungen scheint MS es diesmal recht gut hinzubekommen: Reguläre Ausdrücke, Anonyme Funktionen, Unified Zugriff auf Dateisystem und Registrierung, ein -whatif Schalter der nur zeigt was passieren würde sehen schon sehr vielversprechend aus. Besonders beeindruckend ist


msh> $x = [xml]"<zoo><animal kind='monkey'><name>Albert</name></animal></zoo>"

msh> $x.zoo.animal
kind name
---- ----
monkey Albert

XML Zugriff. Sehr simpel, man scheint mit dieser Shell auf jeden Fall tolle Sachen machen zu können. Dummerweise wird MSH nicht rechtzeitig zu Windows Vista fertig, was dann wohl heißt das erst MS Windows 2010 mit einer sinnvollen Shell ausgeliefert wird. Naja, man kann ja nicht alles haben … aber ein Editor wäre schon noch nett.

Hamburg 2.0

Am 11.11 gehts in Hamburg in die 2. Runde. Das ist ja schon mal durchweg positiv, da weil ich auch am 11.11. noch nichts mit rheinischem Karneval anfangen kann. Abgesehen davon gibt es ja in Hamburg auch die ständige Vertretung.
In other news ist es sehr nervig das HLX nur Flüge morgens um 7 nach Hamburg hat.

Ferner habe ich gestern dann mal wieder meinen “goldenen Schuss” bekommen, neben den üblichen vier Sorten (Hep A und B, Tetanus, Diphterie) war jetzt auch noch mal Polio dabei (eigentlich nicht mehr ausdrücklich empfohlen, aber ich hatte schon noch vor mal nach Indien etc. zu reisen). Also waren es jetzt 5 auf einmal (“man kann von der Polio Impfung auch Muskelschmerzen bekommen – sind sie Rechtshänder oder Linkshänder?”). Hatte ich schon erwähnt das mein kompletter linker Arm weh tut. 😦