Terminaux NEOWARE

Table des matières

Snapin pour les clefs USB sous UNIX

J'ai écrit un snapin s'appuyant sur le logiciel
MTOOLS (site « http://mtools.linux.lu/mtools.html ») pour rendre facilement accessible depuis une session UNIX le contenu d'une clef USB formatée en FAT32.

Le snapin est téléchargeable à l'adresse suivante : http://www.math.jussieu.fr/~besancon/system/eon/howto/files/snapins/dok-1.1.1-1.zip

Les opérations à faire sont donc :

  1. installer le logiciel MTOOLS classique sur le serveur UNIX ; au lecteur de voir quelle est la méthode pour faire cela sur sa machine (packages LINUX, FreeBSD, etc. ou recompilation à partir des sources trouvés sur le site indiqué ci-dessus)
  2. installer le snapin sur le terminal NEOWARE

Le principe est d'utiliser un drive virtuel « X: » (X comme session X) dont l'utilisation se traduira par une connexion réseau sur le NEOWARE pour lire la clef USB : la commande de MTOOLS lancée sur le serveur UNIX contacte le binaire « floppyd » qui tourne sur le NEOWARE suite à l'installation du snapin (ports TCP 5703 à 5711, en fait 5703 + numéro du DISPLAY X et donc en général pour un seul DISPLAY 5703 + 0 == 5703). La connexion réseau utilisée est protégée par le MAGIC-COOKIE de la session X-WINDOW de l'utilisateur.

Il faut bien sûr indiquer sur le serveur UNIX que l'on peut utiliser le drive « X: ». cela peut se faire globalement pour tous les utilisateurs via le fichier « /etc/mtools.conf » en y ajoutant en fin de fichier les lignes suivantes :

drive x:
        file="$DISPLAY"
        mtools_skip_check=1
        remote

Autre solution : fichier personnel « $HOME/.mtoolsrc » avec la même syntaxe.

Utilisation de la clef : commandes en ligne

On peut alors utiliser les commandes suivantes, en remplacant fichier par le nom du fichier que vous voulez manipuler :

Utilisation de la clef : MTOOLSFM

Il y a aussi une interface graphique : MToolsFM (cf « http://www.core-coutainville.org/MToolsFM/ ») qu'il faudra configurer pour que le drive « X: » soit celui utilisé. Pour cela, il suffit de faire :

Utilisation de la clef : KONQUEROR

On peut aussi utiliser dans l'environnement KDE le logiciel KONQUEROR en lui disant d'accèder à l'URL spécial « floppy:/X »

A noter qu'en ouvrant dans KONQUEROR une autre fenêtre pour « explorer » ses fichiers, on est capable entre les fenêtres KONQUEROR de faire du « drag and drop » d'icones des fichiers (le drag and drop est symbolisé par la flêche rouge dans le screendump ci-dessous) :

Détails techniques (1)

Schéma montrant l'interaction possible avec une clef USB et différents postes clients :

A priori en mode RDP 5 de base, pas d'accès possible à la clef USB.

Détails techniques (2)

Le snapin utilise une version modifiée des fichiers « floppyd.c » et « Makefile » et le tout a été compilé sur une machine Red Hat 9 :
*** floppyd.c.orig	Sat Nov  2 11:55:24 2002
--- floppyd.c	Wed Oct  6 16:06:31 2004
***************
*** 99,104 ****
--- 99,195 ----
  void serve_client(int sock, char* device_name);
  
  
+ int eon_open(char *base, int flag)
+   {
+ #ifdef EON
+ 
+ #ifndef NEEDLE
+ #define NEEDLE "dev/scsi/host"
+ #endif /* NEEDLE */
+ 
+ #ifndef USBFILE
+ #define USBFILE "/tmp/config/sys/auto.usb"
+ #endif /* USBFILE */
+ 
+     /* 
+      * Le device de la clef USB est l'un des suivants :
+      *		/dev/scsi/host0/bus0/target0/lun0/disc 
+      *		/dev/scsi/host0/bus0/target0/lun0/part1 
+      *		/dev/scsi/host0/bus0/target0/lun0/part2 
+      *		/dev/scsi/host0/bus0/target0/lun0/part3 
+      *		/dev/scsi/host0/bus0/target0/lun0/part4 
+      *
+      *		/dev/scsi/host1/bus0/target0/lun0/disc 
+      *		/dev/scsi/host1/bus0/target0/lun0/part1 
+      *		/dev/scsi/host1/bus0/target0/lun0/part2 
+      *		/dev/scsi/host1/bus0/target0/lun0/part3 
+      *		/dev/scsi/host1/bus0/target0/lun0/part4 
+      *
+      * Il est mentionne dans le fichier /tmp/config/sys/auto.usb.
+      *
+      ************************************************************* 
+      *
+      * Le 6 octobre 2004 :
+      *
+      *	[pulita@galois1]% echo $DISPLAY
+      *	tcpanoramix.institut.math.jussieu.fr:1.0
+      *	
+      *	[pulita@galois1]% mdir x:
+      *	Permission denied, authentication failed!
+      *	Auth failed: Device locked!
+      *	Drive 'X:' not supported
+      *	Cannot initialize 'X:'
+      *	
+      *	[root@tcpanoramix sys]# df -k
+      *	Filesystem           1k-blocks      Used Available Use% Mounted on
+      *	/dev/root                29573     18902     10671  64% /
+      *	/dev/root                29573     18902     10671  64% /
+      *	tmpfs                    27284       456     26828   2% /var
+      *	/dev/system_writable      1003       455       497  48% /writable
+      *	dev/scsi/host1/bus0/target0/lun0/disc
+      *	                        255920    174896     81024  68% /var/tmp/config/user_mount/usb/.autofs/usb-drive1.auto
+      *	
+      *	
+      *	cat /var/tmp/config/sys/auto.usb 
+      *	# This is an automatically generated file.  Do not edit.
+      *	usb-drive1.auto -user,uid=501,gid=100,fstype=auto,iocharset=iso8859-1,sync,noatime :dev/scsi/host1/bus0/target0/lun0/disc
+      *	
+      */
+ 
+     char buf[255];
+     char *p = NULL ;
+     FILE *fp ;
+ 
+     int fd ;
+     char device[256];
+ 
+     if ( (fp = fopen(USBFILE, "r")) != NULL )
+       {
+         while( fgets(buf, sizeof(buf), fp) != NULL )
+           {
+             if ( (p = strstr(buf, NEEDLE)) != NULL )
+               {
+                 /* On supprime le retour chariot laisse par fgets() */
+                 *(p + strlen(p) - 1) = '\0';
+                 break ;
+               }
+           }
+         fclose(fp);
+         if ( p != NULL )
+           {
+             /* On ajoute le / initial non present dans USBFILE */
+             sprintf(device, "/%s", p);
+             if ( (fd = open(device, flag)) != -1 )
+               return(fd);
+           }
+       }
+ 
+     return(-1);
+ #else
+     return(open(base, flag));
+ #endif
+   }
+ 
  
  #define New(type) ((type*)(malloc(sizeof(type))))
  
***************
*** 1066,1076 ****
  	if(version == FLOPPYD_PROTOCOL_VERSION_OLD) {
  				/* old protocol */
  		readOnly = 0;
! 		devFd = open(device_name, O_RDWR);
  		
  		if (devFd < 0) {
  			readOnly = 1;
! 			devFd = open(device_name, 
  				     O_RDONLY);
  		}
  		if(devFd < 0) {
--- 1157,1167 ----
  	if(version == FLOPPYD_PROTOCOL_VERSION_OLD) {
  				/* old protocol */
  		readOnly = 0;
! 		devFd = eon_open(device_name, O_RDWR);
  		
  		if (devFd < 0) {
  			readOnly = 1;
! 			devFd = eon_open(device_name, 
  				     O_RDONLY);
  		}
  		if(devFd < 0) {
***************
*** 1096,1102 ****
  
  		switch(opcode->data[0]) {
  			case OP_OPRO:
! 				devFd = open(device_name, O_RDONLY);
  #if DEBUG
  				fprintf(stderr, "Device opened\n");
  #endif
--- 1187,1193 ----
  
  		switch(opcode->data[0]) {
  			case OP_OPRO:
! 				devFd = eon_open(device_name, O_RDONLY);
  #if DEBUG
  				fprintf(stderr, "Device opened\n");
  #endif
***************
*** 1104,1110 ****
  				readOnly = 1;
  				break;
  			case OP_OPRW:
! 				devFd = open(device_name, O_RDWR);
  				send_reply(0, sock, devFd);
  				readOnly = 0;
  				break;
--- 1195,1201 ----
  				readOnly = 1;
  				break;
  			case OP_OPRW:
! 				devFd = eon_open(device_name, O_RDWR);
  				send_reply(0, sock, devFd);
  				readOnly = 0;
  				break;

*** Makefile.orig	Mon Nov  8 12:11:15 2004
--- Makefile	Mon Nov  8 12:14:22 2004
***************
*** 7,13 ****
  # string in the CFLAGS line below.
  
  # User specified flags
! USERCFLAGS = 
  USERLDFLAGS =
  USERLDLIBS =
  
--- 7,13 ----
  # string in the CFLAGS line below.
  
  # User specified flags
! USERCFLAGS = -DEON
  USERLDFLAGS =
  USERLDLIBS =
  
***************
*** 35,47 ****
  
  CC         = gcc
  CXX        = @CXX@
! MYCFLAGS   = -g -O2 -Wall
  MYCXXFLAGS = @CXXFLAGS@
  CPPFLAGS   = 
  HOST_ID    = -DCPU_i686 -DVENDOR_pc -DOS_linux_gnu 
  DEFS       = -DHAVE_CONFIG_H -DSYSCONFDIR=\"$(sysconfdir)\" $(HOST_ID)
  
! LDFLAGS     = 
  LIBS        = -lbsd -lnsl 
  SHLIB       = 
  MACHDEPLIBS = 	
--- 35,47 ----
  
  CC         = gcc
  CXX        = @CXX@
! MYCFLAGS   = -O2 -Wall
  MYCXXFLAGS = @CXXFLAGS@
  CPPFLAGS   = 
  HOST_ID    = -DCPU_i686 -DVENDOR_pc -DOS_linux_gnu 
  DEFS       = -DHAVE_CONFIG_H -DSYSCONFDIR=\"$(sysconfdir)\" $(HOST_ID)
  
! LDFLAGS     = -static -s
  LIBS        = -lbsd -lnsl 
  SHLIB       = 
  MACHDEPLIBS = 	
***************
*** 123,129 ****
  
  X_CFLAGS =  -I/usr/X11R6/include
  X_LIBS =  -L/usr/X11R6/lib
! X_EXTRA_LIBS = 
  X_PRE_LIBS =  -lSM -lICE
  CFLAGS = $(CPPFLAGS) $(DEFS) $(MYCFLAGS) -I.  -I. $(USERCFLAGS) 
  CXXFLAGS  = $(CPPFLAGS) $(DEFS) $(MYCXXFLAGS) -I.  -I. $(USERCFLAGS) 
--- 123,129 ----
  
  X_CFLAGS =  -I/usr/X11R6/include
  X_LIBS =  -L/usr/X11R6/lib
! X_EXTRA_LIBS = -lpthread
  X_PRE_LIBS =  -lSM -lICE
  CFLAGS = $(CPPFLAGS) $(DEFS) $(MYCFLAGS) -I.  -I. $(USERCFLAGS) 
  CXXFLAGS  = $(CPPFLAGS) $(DEFS) $(MYCXXFLAGS) -I.  -I. $(USERCFLAGS) 


Historique


Page maintenue par <Thierry.Besancon@math.jussieu.fr>
$Date: 2005-06-28 14:00:49+02 $
$Revision: 1.3 $