PDA

View Full Version : programmazione di sistema


akyra
03-06-2004, 19:30
il mio prob è il seguente:
ho creato una sorta di disco virtuale in linux che simula un file system (creazione di directory, copia di file dal file system di linux al disco virtuale....).
Il problema è che il prog che gestisce il disco dovrebbe essere avviato (ad es con un comando da shell:....$ virtual start) e, quando avviato, dovrebbe intercettare le operazioni che implicano il disco virtuale.
Mi spiego meglio: se l'utente vuole creare una directory normalmente sul file system di linux digita:

....$ mkdir /home/bla/nome

se vuole creare una directory sul disco virtuale digita:

......$ VD:/nome

in pratica la presenza di "VD" dovrebbe far capire che il comando di creazione di directory va eseguito dal disco virtuale e non dal file system "normale".
Non ho idea di come riuscire a fare in modo che il prog che gestisce il disco virtuale sia appunto "in ascolto" di un comando dell'utente che lo riguardi....naturlamente il suddetto prog dovrebbe possedere i comandi di start e stop che lo avviino e lo fermino....
Chiunque abbia una qualche idea, anche miserrima, sono pronto ad offrigli una notte con la mia ragazza!!!
:(

akyra
04-06-2004, 00:07
nessuno?? :cry: :cry:

cionci
04-06-2004, 10:06
Credo che l'unica cosa sia di crearsi un device in /dev...come fare e come intercettare le chiamate questo lo ignoro (probabilmente ti devi scrivere un modulo per il kernel)...

akyra
04-06-2004, 10:44
no, è molto più semplice....lo devo fare attraverso uno script bash.
questo script dovrebbe ridirezionare l'input dell'utente verso il "disco virtuale" se nel comando compare "VD", altrimenti dovrebbe chiamare il comando normale...
cioè se il comando è :

...$cp /home/pippo /home/prova/

la copia del file "pippo" avviene normalmente

se l'input è

......$ cp /home/pippo VD:/pippo

lo script vedendo "VD" chiama la funzione che copia il file dal file system di unix al disco virtuale...forse mi ero spiegato male...
Non sono un gran appassionato si scripting bash, quindi vorrei avere qualche opinione in merito...
comunque ti ringrazio infinitamente della tua risposta!

cionci
04-06-2004, 11:16
Non vedo come tu possa richiamare uno script bach in quel modo :wtf:

akyra
04-06-2004, 11:27
allora la cosa e' così:

nella cartella dove risiede il disco virtuale ci dovrebbe essere uno script che fa partire e ferma il disco virtuale, ad es. se lo script si chiama VD, il comando

....$./VD start

fa partire il disco virtuale.
a quel punto lo script può intercettare tutte le richieste che riguardano il disco virtuale (se nel comando e' presente "VD") ed inviare tali richieste al prog che gestisce il disco.
Se il comando non riguarda il disco (ad es: un semplice "mkdir" fatto sul file system di unix) lo script esegue il comando normale.
Il comando VD stop permette di fermare il disco e ritornare alla normale esecuzione....naturalmente se la shell viene chiusa il programma termina (com'è logico che sia per ogni processo figlio).
Grazie ancora della disponibilità....

akyra
04-06-2004, 12:25
in pratica il problema è che non so come far comunicare contemporaneamente

utente--->script----->prog gestore del disco virtuale

akyra
05-06-2004, 00:31
nessuno?
il prob mi sembra semplice, soltanto che non sono un genio dello scripting in bash...dovrei fare in modo che questo script, una volta fatto partire, ascolti l'input dell'utente e chiami il comdando richiesto...soltanto che non so come far stare lo script in attesa del comando dell'utente una volta fatto partire.....cioè, non so come far in modo che lo script non termini una volta che viene inserito il primo comando da parte dell'utente....come potrei fare, con un ciclo?
ringrazio fin d'ora qualsiasi persona che mi dia un qualche consiglio....

cionci
05-06-2004, 02:30
Ripeto...
Originariamente inviato da cionci
Non vedo come tu possa richiamare uno script bash in quel modo :wtf:
Prova ad inviare un PVT a ilsensine...

LukeHack
05-06-2004, 04:44
Originariamente inviato da akyra
nessuno?
il prob mi sembra semplice, soltanto che non sono un genio dello scripting in bash...dovrei fare in modo che questo script, una volta fatto partire, ascolti l'input dell'utente e chiami il comdando richiesto...soltanto che non so come far stare lo script in attesa del comando dell'utente una volta fatto partire.....cioè, non so come far in modo che lo script non termini una volta che viene inserito il primo comando da parte dell'utente....come potrei fare, con un ciclo?
ringrazio fin d'ora qualsiasi persona che mi dia un qualche consiglio....
io proporrei una soluzione non-bash (perchè di bash non ne so un'ash:D)
un programma per es in C a riga di comando che,fatto partire,elabora i comandi bash (cp,mv..tutti insomma): se questi sono normali,invoca una system() (o execv() o similia) del comando scritto,altrimenti invia le richieste al programma che gestisce il disco virtuale...

ovviamente sta cosa la puoi fare anche in bash eh;)

VICIUS
05-06-2004, 10:04
In pratica vorresti fare una cosa simile a questa ?
#!/bin/bash

# cerca VD:/
TROVATO=0
for cmd in $*; do
case $cmd in
VD\:\/*)
# comando con vd ...
TROVATO=1
break;;

*)
# ciccia ...
;;
esac
done

# finisce il tutto ...
if [ $TROVATO -eq 1 ]; then
# esegue il comando sul disco virutale
echo "fa qualcosa sul disco virtuale 'cp.vd $*'"
else
# esegue il comando normale
echo "esegue il comando solito: 'cp.old $*'"
fi

Dai allo script il nome cp e lo meti in /bin stando attento a rinominare quello vecchio in cp.old. e il programma cp.vd dovrebbe essere appunto quello che gestisce il disco virtuale.

Certo questo è molto semplice e devi crearti uno script per ogni comando che vuoi sostituire ma c'è un trucchettino semplice semplice per risolvere anche a questo ma te lo lascio scoprire da solo cosi ti diverti un po :D

ciao ;)

cionci
05-06-2004, 10:11
Io credevo che volesse qualcosa di definitivo... Credevo che volesse fare in modo che per ogni comando processato la stringa VD venisse riconosciuta automaticamente...

akyra
05-06-2004, 13:50
intanto vi ringrazio infinitamente delle risposte che mi avete dato...
lo script che dovrei fare dovrebbe far partire il disco virtuale
ad es (se lo script si chiama VD.sh):

...$./VD.sh start

tale comando chiama il gestore del disco virtuale, il quale inizializza la struttura dati necessaria, crea un socket di acolto, ed attende connessioni a questo socket per soddisfare le richieste che coinvolgono il disco virtuale.
Quindi a quel punto lo script, più che comunicare direttamente col gestore del disco virtuale, comunica con un client che si colloga al socket del disco virtuale e gli invia le richieste.
Il problema però è che non so come fare per far in modo che lo script rimanga sempre in attesa delle operazioni dell'utente, in quanto dopo il primo comando "...$./VD.sh start", lo script termina, per cui se si volessero fare altre operazioni sul disco, bisognerebbe richiamare esplicitamente lo script, per farlo ripartire.....
guardando tutto quello che ho già fatto per fare sta cosa, mi fa rabbrividire arenarmi su un dettaglio di questo tipo...
Ringrazio ancora tutti dell'aiuto profuso!
(se non è ancora chiaro quello che lo script dovrebbe fare, chidetemi pure chiarimenti)

LukeHack
05-06-2004, 13:59
Originariamente inviato da akyra
intanto vi ringrazio infinitamente delle risposte che mi avete dato...
lo script che dovrei fare dovrebbe far partire il disco virtuale
ad es (se lo script si chiama VD.sh):

...$./VD.sh start

tale comando chiama il gestore del disco virtuale, il quale inizializza la struttura dati necessaria, crea un socket di acolto, ed attende connessioni a questo socket per soddisfare le richieste che coinvolgono il disco virtuale.
Quindi a quel punto lo script, più che comunicare direttamente col gestore del disco virtuale, comunica con un client che si colloga al socket del disco virtuale e gli invia le richieste.
Il problema però è che non so come fare per far in modo che lo script rimanga sempre in attesa delle operazioni dell'utente, in quanto dopo il primo comando "...$./VD.sh start", lo script termina, per cui se si volessero fare altre operazioni sul disco, bisognerebbe richiamare esplicitamente lo script, per farlo ripartire.....
guardando tutto quello che ho già fatto per fare sta cosa, mi fa rabbrividire arenarmi su un dettaglio di questo tipo...
Ringrazio ancora tutti dell'aiuto profuso!
(se non è ancora chiaro quello che lo script dovrebbe fare, chidetemi pure chiarimenti)
usa i thread, uno per ogni connessione,il server resta nel frattempo sempre in LISTEN col primo thread...direi che cosi stai a posto

akyra
05-06-2004, 14:38
intanto grazie...
il problema non è su come effettuare la connessione al server che gestisce le richieste, ma è su come non far terminare lo script dopo il comando start....in pratica vorrei tradurre in bash una serie di camandi C di questo tipo



while(1){
/*memorizza i comandi inseriti dall'utente*/
/*li scansiona, e seleziona i comandi corrispondenti (cd, mkdir, ls...)*/
/*nel caso all'interno di uno di questi compaia "VD" allora richiama le funzioni del disco virtuale*/
/*quindi ricomincia il ciclo*/
/*se viene inserito "VD stop" il ciclo termina*/
}


non mi sembra una cosa impossibile...soltanto che in script bash sono una sega....

LukeHack
05-06-2004, 14:48
Ripeto:
Originariamente inviato da LukeHack
usa i thread, uno per ogni connessione,il server resta nel frattempo sempre in LISTEN col primo thread...direi che cosi stai a posto

non so se si possono fare in bash (direi di si), in C si farebbe in pochi minuti

VICIUS
05-06-2004, 17:48
Originariamente inviato da akyra
il problema non è su come effettuare la connessione al server che gestisce [...]

quindi vorresti implementare una specie di shell sopra bash. ? ho modifica lo script di prima per fare piu ho meno quel ciclo che hai riportato. certo alcune cose sono da sistemare ma sono piuttosto facili.
#!/bin/bash

# se si passa come argomento start allora incomincia il ciclo
if [ "$1" == "start" ]; then
while /bin/true; do
# legge un comando
echo -n "shell: "
read CMD

# controlla se è stato inseito vd stop
if [ "$CMD" == "vd stop" ]; then
break;
fi

# cerca VD:/
TROVATO=0
for cmd in $CMD; do
case $cmd in
VD\:\/*)
# comando con vd ...
TROVATO=1
break;;

*)
# ciccia ...
;;
esac
done

# finisce il tutto ...
if [ $TROVATO -eq 1 ]; then
# esegue il comando sul disco virutale
echo "fa qualcosa sul disco virtuale 'vd $CMD'"
else
# esegue il comando normale
echo "esegue il comando solito: 'old $CMD'"
fi
done
fi
Se hai intenzione di imparare un po di bash qui c'è la guida definitiva che oltre tutto è anche in italiano http://it.tldp.org/guide/abs/

akyra
05-06-2004, 18:59
grazie VICIUS, adesso non ho tempo per provare lo script che mi hai suggerito, ma penso che sia sulla strada giusta...appena ho 2 minuti lo provo!
:ave: :ave:

Dun
05-06-2004, 21:12
Originariamente inviato da akyra
il mio prob è il seguente:
ho creato una sorta di disco virtuale in linux che simula un file system (creazione di directory, copia di file dal file system di linux al disco virtuale....).
Il problema è che il prog che gestisce il disco dovrebbe essere avviato (ad es con un comando da shell:....$ virtual start) e, quando avviato, dovrebbe intercettare le operazioni che implicano il disco virtuale.
Mi spiego meglio: se l'utente vuole creare una directory normalmente sul file system di linux digita:

....$ mkdir /home/bla/nome

se vuole creare una directory sul disco virtuale digita:

......$ VD:/nome

in pratica la presenza di "VD" dovrebbe far capire che il comando di creazione di directory va eseguito dal disco virtuale e non dal file system "normale".
Non ho idea di come riuscire a fare in modo che il prog che gestisce il disco virtuale sia appunto "in ascolto" di un comando dell'utente che lo riguardi....naturlamente il suddetto prog dovrebbe possedere i comandi di start e stop che lo avviino e lo fermino....
Chiunque abbia una qualche idea, anche miserrima, sono pronto ad offrigli una notte con la mia ragazza!!!
:(


Ahhh Unive :D :D :D

Hint: Ridefinisci i comandi base attraverso alias o funzioni e li scrivi nel .bashrc. Okkio che devi rilanciare la shell perche' ti accetti i nuovi comandi. Ricorda che non c'e modo per esportare funzioni o varibali da uno script eseguito in una sottoshell alla shell madre da cui hai lanciato lo script.

Nelle funzioni poi fai un parser che, vista la necessita' di scrivere sul VD, lanci il server con oppportune opzioni.

Spero di averti in parte illuminato :)


Ah il comando vdstart non lo userei per far partire il processo gestore ;)

akyra
06-06-2004, 15:00
grazie della risposta Dun, evidentemente hai capito a pieno di cosa sto parlando, però ti chiedo un grandissimo favore di essere un po' più preciso perchè, ripeto, che lo scripting bash non è che mi entusiasmi più di tanto, ed in più sono alquanto una sega in questo tipo di programazione...
Ti ringrazio infinitamente dei consigli che mi hai dato e non vorrei annoiarti, però potresti farmi qualche esempio a riguardo?

akyra
07-06-2004, 11:23
allora, ho capito cosa intendi dire.
Cioe' dovrei costruire degli script che vadano a sostituire i comandi principali, ed assegnarli attraverso alias, in modo che, ad es., l'invocazione del comando "cp" chiami lo script definito da me, il quale scansiona l'input dell'utente e chiama la funzione richiesta....giusto?