/* PIPE- Filesystem */

1. Was sind PIPEs?

das 'PIPE Filesystem' entstand urspruenglich aus der Frage heraus:
Wie kann ich ein Linux System oder Teile davon ueber/auf einen
DOS-Rechner oder Novell Fileserver sichern.
Ein schneller Loesungsansatz ergab das 'PIPE Filesystem'.

In dem Pipe Filesystem koennen Shell Scripte oder
Linux Programme hinterlegt werden.
Diese Programme werden von dem Client (z.B. DOS) wie einfache
Dateien behandelt.
Ein Lese oder Schreibzugriff auf diese Dateien ueber den Client bewirkt
einen popen dieser Programme. Der Server uebergibt
als 1. Parameter entweder 'READ' oder 'WRITE'
je nach Modus des ersten Zugriffes (Read oder Write).
Das 'PIPE-Filesystem' bietet damit eine direkte Schnittstelle
zwischen Client Anwendungen und Linux Programmen.

2.  Beispiele

2.1 Dos->Linux, Linux->Dos Backup

Die Loesung des obigen Problems ergab sich dann mit folgendem einfachen
Shell Script, welches im PIPE-Filesystem hinterlegt wurde.

#!/bin/sh
case "$1" in
'WRITE')
        cd /u3 && tar -xf -  2>> /tmp/tar.in
        # restore directory /u3/mar
        ;;
'READ')
        cd /u3 && tar -cf -  mar  2> /dev/null
        # save directory /u3/mar
        ;;
*)
        ;;
esac

Unter DOS kann nun diese 'Pipe Datei' mit dem Copy Befehl in eine
lokale Datei 'kopiert' werden ( -> Sichern ) bzw. es
kann die lokale Datei auf diese 'Pipe Datei' kopiert werden.
( -> Ruecksichern )

2.2 Drucken ueber Pipes

Ein einfaches Drucken kann z.B. mit folgendem Mini Script realisiert werden.
Anstatt des Scriptes reicht in diesem Fall natuerlich auch ein link auf
/usr/bin/lpr.

#!/bin/sh
/usr/bin/lpr

Dadurch kann ein capture unter DOS/Windows entfallen.

2.3 Private Windowsinstallation fuer jeden Netzbenutzer

(Beispiel von Sascha Herrmann <sascha@system.rhein-main.de>)

Die Idee fuer diesen Script, war auf einem Netz mit Diskless PCs, die ueber
mars-nwe ihr Dos/Windows System bekommen, fuer jeden einzelnen Benutzer eine
eigene Windowsconfiguration zu bekommen.
Hierfuer habe ich einen kleinen Shellscript geschrieben, der diese Aufgabe
bisher recht gut erledigt, ohne viel Speicherplatz zu verschwenden.

Fuer den Skript muss zunaechst einmal Windows in mehrere Teile aufgesplittet
werden, einen gemeinsamen Teil, auf den kein Schreibzugriff noetig ist
(*.exe, *.dll etc.) und einen Teil auf den Schreibzugriff noetig ist (*.ini
etc.). Windows bringt mit der Serverinstallation schon eine moeglichkeit die
Installation in zwei Teile aufzuspalten. setup /a erzeugt ein Verzeichnis,
das von allen Benutzern gemeinsam benutzt werden kann und setup /n erzeugt
dann eine Benutzerinstallation, die nur noch ca. 500kb gross ist. Das so
erzeugte Verzeichnis wird nun auf den Server kopiert und dort nochmal in
zwei Teile aufgeteilt (nach dem oben beschriebenen Schema).

Der Skript kopiert und linkt nun einfach die Dateien aus dem mit setup /n
installierten Dateien in ~/windows/windows. Wenn man nun auf den Dosclient
das Volume \\SERVER\HOMEDIR\WINDOWS auf Laufwerk d: und das mit setup /a
erzeugte Verzeichnis auf ein anderes Laufwerk einbindet hat man eine
funktionierende Windowsinstallation, die pro Benutzer grade einmal 80kb
Plattenplatz wegnimmt.

Der Skript wird nach jedem login von dem Dosclient durch einen type auf die
Datei ausgefuehrt und kopiert alle Dateien mit cp -au (u steht fuer Update,
daher nur neuere Dateien werden kopiert) aus $TEMPLATE/dynamic nach
~/windows/windows und legt fuer jede Datei aus $TEMPLATE/static einen
symbolischen link in ~/windows/windows an. Damit kann man die mit setup -n
erstellten Dateien noch einmal in einen Teil mit und einem ohne
Schreibzugriff unterteilen.
Leider setzt mars-nwe (zumindest in 0.99.pl4) in Pipescripts die
umgebungsvariable $HOME immer auf /root, daher lese ich das Heimatverzeichnis
mit dem gethomedir.pl script aus /etc/passwd aus.

--------------------------------------------------------------------
#!/bin/sh
# mkwin Pipeskript
#
# !!!!ACHTUNG!!!!
# Wenn in $home/ eine Datei windows oder windows/windows exestiert,
# wird diese ohne nachfrage geloescht
PATH="/bin:/usr/bin"

TEMPLATE="/var/spool/nwserv/windows/template"
home=`/var/spool/nwserv/pipe/gethomedir.pl $UID`
case "$1" in
 'READ')
         if ! test -d $home/windows ; then
          rm -rf $home/windows
         fi
         if ! test -d $home/windows/windows ; then
          rm -rf $home/windows/windows > /dev/null
          mkdir -pm 0700 $home/windows/windows
         fi
         for i in $TEMPLATE/static/* ; do
          ln -s $i $home/windows/windows
         done
         cp -au $TEMPLATE/dynamic/* $home/windows/windows
        ;;
esac
-----------------------------------------------------------------
#!/usr/bin/perl
#
# File: gethomedir.pl
#
print "$1\n";
open(PW, "/etc/passwd");
while ($line=<PW>) {
 chop($line);
 ($uid, $home) = ($line=~
/[^\:]*\:[^\:]*\:([\d]*)\:[^\:]*\:[^\:]*\:([^\:]*)\:/
);

 if ($uid == $ARGV[0]) {
  print "$home";
 }

}
close(PW);
------------------------------------------------------------------

2.4 andere Beispiele

In dem Verzeichnis examples gibt es als zusaetzliches Beispiel
die Programmpaare unxcomm<->comm und sendm<->unxsendm.
Mittels unxcomm/comm ist es sehr einfach moeglich einige
Linux Befehle vom Client aus aufzurufen.
z.B. : ps, lpq, lprm usw.

Ueber weitere dokumentierte Anwendungen bzw. Anregungen zu dem
PIPE-Filesystem wuerde ich mich freuen.

Martin

