Scrivere scripts per il vfs esterno del Midnight Commander (Traduzione a cura di Marco Ciampa (C) GNU 2000 - it@li.org) NOTA IMPORTANTE: ci possono essere ancora alcuni bachi in extfs. Buon divertimento. A cominciare dalla versione 3.1 il Midnight Commander comprende il cosiddetto extfs, che altri non è che un filesystem virtuale. Questo sistema consente di creare molto semplicemente nuovi filesystem virtuali per MC della GNU. Tale lavoro è composto di due parti fondamentali: Modifica di $(libdir)/extfs/extfs.ini. Creazione di uno script shell/programma per gestire le richieste. (Nota: $(libdir) dovrebbe essere sostituita con il percorso libdir corrente memorizzato quando configurato o compilato, come /usr/local/lib/mc o /usr/lib/mc). La prima è molto facile: Assegnate un suffisso vfs. Per esempio, se avete un file .zip e vorreste vedere cosa c'è dentro di esso, il percorso sarebbe /qualsiasipercorso/my.zip#uzip/unpercorso/... Poi basta aggiungere una linea nel file extfs.ini contenente solo quella estensione. Se il vostro vfs non richiede file di lavoro, aggiungete ':' alla fine del nome. In questo esempio, .zip è il suffisso, ma è possibile chiamare vfs 'uzip'. Perché? Beh, quello che fa vfs è essenzialmente UNzip. UN è troppo lungo così è stato scelto U. Notare che in futuro un filesystem come zip potrà esistere: prenderà l'intero albero e creerà un file zip da esso. Così /usr:zip sarà un file zip contenente l'intero albero /usr. La seconda potrebbe richiedere un po' di conoscenza di programmazione shell/c: si deve creare un prefisso di programma (con i permessi di esecuzione) in $(libdir)/extfs (nel nostro esempio $(libdir)/extfs/uzip). * Comandi che dovrebbero essere implementati nello script shell --------------------------------------------------------------- Ritorno di zero dallo script a completamento avvenuto del comando, altrimenti diverso da zero per fallimento o comando non supportato. $libdir/extfs/prefix command [arguments] * Comando: list nomearchivio Questo comando dovrebbe elencare il contenuto completo dell'archivio nel seguente formato (elenco ls -l un po' modificato) AAAAAAA NNN OOOOOOOO GGGGGGGG SSSSSSSS DATETIME [PATH/]FILENAME [-> [PATH/]FILENAME[/]]] dove (le cose in [] sono opzionali): AAAAAAA è la stringa permessi come in ls -l NNN è il numero di collegamenti OOOOOOOO è il proprietario (sia UID che nome) GGGGGGGG è il gruppo (sia GID che nome) SSSSSSSS è la dimensione del file FILENAME è il nome del file PATH è il percorso dalla radice dell'archivio senza la slash iniziale (/) DATETIME ha uno dei seguenti formati: Mon DD hh:mm, Mon DD YYYY, Mon DD YYYY hh:mm, MM-DD-YY hh:mm dove Mon è il nome del mese a tre caratteri in inglese, DD giorno 1-31, MM mese 01-12, YY anno a due cifre, YYYY anno a quattro cifre, hh ore e mm minuti. Se la -> [PATH/]FILENAME parte è presente, significa: Se i permessi cominciano con l (elle) allora è il nome al quale il collegamento simbolico punta. Se questo percorso comincia con un prefisso vfs di MC allora è un collegamento simbolico verso l'altro filesystem virtuale (se si vuole specificare un percorso dalla radice locale, si usa local:/percorso invece di /percorso perchè /percorso significa dalla radice dell'archivio elencato). Se i permessi non cominciano con l ma un numero di collegamenti maggiore di uno allora significa che questo file dovrebbe essere collegato 'hard' con l'altro file. * Comando: copyout nomearchivio nomefilememorizzato estraea Questo dovrebbe estrarre dall'archivio nomearchivio nel file di nome nomefilememorizzato (possibilmente con percorso se non collocato nella radice dell'archivio [questo è sbagliato. l'attuale extfs toglie il percorso! -- pavel@ucw.cz]) nel file estraea. * Comando: copyin nomearchive nomefilememorizzato filesorgente Questo dovrebbe aggiungere a nomearchivio il filesorgente con nome nomefilememorizzato nell'archivio. Nota importante: nomearchivio negli esempi suddetti può non avere l'estensione che ci si aspetta, come potrebbe succedere che il nomearchivio sia qualcosa del tipo /tmp/f43513254 o qualsiasi altra cosa. Ad alcuni archiviatori non piace ciò per cui dovrò trovare qualche artifizio. * Comando: rm nomearchivio nomefilememorizzato Questo dovrebbe rimuovere il nomefilememorizzato da nomearchivio. * Comando: mkdir nomearchivio nomedir Questo dovrebbe creare una nuova directory chiamata nomedir dentro nomearchivio. * Comando: rmdir nomearchivio nomedir Questo dovrebbe rimuovere un'esistente directory nomedir. Se la directory non è vuota, mc la cancellerà ricorsivamente (possibilmente avvertendo). * Comando: run Nondocumentato :-) --------------------------------------------------------- Non dimenticate di impostare questo file come eseguibile (con chmod 755 QuestoFile per esempio) Per una struttura generale di eseguibile vedere i filesystems simili ai vostri. --------------------------------------------------------- Se nel costruire queste routine verranno fatti degli errori mc non mostrerà righe di stampa maldefinite. Questo può fuorviare il programmatore nella ricerca dei difetti. Visto che questa routine è uno script shell eseguibile essa può essere lanciata dalla riga di comando indipendentemente da mc ed il risultato mostrato in console o redirezionato in un file. * Messa in uso ---------------------------------------------------------- Il file .mc.ext nella directory home e nella directory utente di mc (normalmente /usr/local/lib/mc), contiene le istruzioni per le operazioni sui files a seconda dell'estensione. E' ben documentato in altri file in questa distribuzione perciò qui si darà solo qualche nota specificatamente sull'uso del File System Virtuale che si è appena creato. Vi sono voci in .mc.ext che definiscono alcune operazioni che possono essere svolte su un file da un pannello di mc. Tipicamente sono annotate con un simbolo di cancelletto ed un'estensione come questa: # zip Vi deve essere un modo per trovare il file per estensione così la prossima linea fa ciò. Essenzialmente dichiara: "identifica la stringa ".zip" o (|) ".ZIP" alla fine del nome del file: regex/\.(zip|ZIP)$ Le operazioni seguono. Esse devono essere indentate da almeno uno spazio oppure un tabulatore. In particolare l'operazione di apertura (Open) userà ora il nuovo file system virtuale per fare cd su di esso come in questo: Open=%cd zip:%d/%p Questa è la linea usata quando un file viene evidenziato in un pannello e l'utente preme . Il contenuto dell'archivio dovrebbe essere come se si fosse in una vera directory e potesse essere manipolata in tal modo. Il resto della linea riguarda l'uso del tasto di Vista F3: View=%view{ascii} unzip -v %f con un'icona opzionale per X: Icon=zip.xpm e con un'operazione per estrarre il contenuto del file preso da una selezione file a menu: Extract=unzip %f '*' Questo è solo un esempio. La voce corrente per i file .zip ha una selezione menu di 'Unzip' che potrebbe essere usata al posto di 'Extract'. Cosa va qui dipende da quali voci si hanno o si aggiungono al menu di sistema ed inoltre c'è ancora un particolare. La somma di questo è nella voce .mc.ext: # zip regex/\.(zip|ZIP)$ Open=%cd zip:%d/%p View=%view{ascii} unzip -v %f Icon=zip.xpm Extract=unzip %f '*' Aggiungere una voce come questa al file .mc.ext nella directory home dell'utente. Se volete che altri la vedano, aggiungetela nel file mc.ext nella directory di sistema di mc spesso in /usr/local/lib/mc/mc.ext. Notare che questo file non ha un punto iniziale. Una volta che tutto questo è fatto e le cose sono al loro posto, uscite da mc se lo state usando e fatelo ripartire dimodoche possa prendere le nuove impostazioni. Questo è tutto. La parte più dura è fare una funzione di elenco che ordini l'uscita di un comando di listato di sistema e lo converta in un formato che permetta ad mc di poterlo usare. Attualmente viene usato awk (o gawk) perché quasi tutti i sistemi ne sono provvisti. Si può usare anche un'altro linguaggio di scripting come il perl, se è disponibile.