Newsgroup: it.comp.www.php
Titolo: problema con exec() e porta seriale

Salve a tutti, ho un problema che non riesco a risolvere e spero che
qualcuno mi aiuti perchè non so più dove sbattere la testa. Quello
che devo fare è comandare tramite php uno script in c che gira sotto
linux che parla attraverso la porta seriale (emulata tramite un
convertitore USB/SERIALE) con un proiettore. Se eseguo lo script da
shell tutto funziona correttamente. Il problema nasce quando eseguo lo
script tramite la funzione exec() in php. Lo script si esegue ma non
riesce ad accedere alla porta.
Premetto che ho tutti i permessi per accedere alla seriale a lato
shell, infatti come ripeto se lancio lo script da shell di linux il
tutto funziona. Leggendo alcune guide in rete ho il sospetto che sia un
problema di apache, a seconda dell'utente che lo esegue. (sottolineo
che la funzione safe è a Off). Ho provato a settare sul file
httpd.conf User e Group uguali a quelli con cui eseguo lo script nella
shell, ma comunque non riesco ad aprire il dispositivo /dev/ttyUSB0,
infatti la open mi restituisce -1.
Se qualcuno ha un'idea.. grazie

shell
"Ho". Hai... tu Andrea. Apache gira come utente wwwrun, nobody, www-data
o chissa' cos'altro, e quei permessi magari non ce l'ha.
Prova a fare una cosa brutta del tipo
	chown andrea:users /path/to/script
	chmod +s /path/to/script
...a quel punto lo script dovrebbe girare con i permessi corretti. O, in
alternativa (e forse meglio), usi "sudo".
Per debuggare la faccenda, da utente root, puoi dare "su wwwrun" in modo
da impersonare l'utente wwwrun e vedere cosa puo' e non puo' fare.
Ovviamente con wwwrun intendo l'utente di default in httpd.conf...
Leonardo
-- 
Dawn is near, the time is short (Human aircraft! Hard to port!)
We eight reindeers of the night work as one in silent flight.
Let not one damn house pass by (Who taught that guy how to fly?)
Each year sees more girls and boys: how many of them can we bring toys?

Grazie Leonardo per la risposta. Ho provato a fare come dici tu, ma non
funziona. Ricapitolando ho settato sul file httpd.conf User nobody e
Group nobody.  Per essere sicuro dei permessi ho:
1) chmod 777 /dev/ttyUSB0
2) chown nobody /dev/ttyUSB0
3) chgrp nobody /dev/ttyUSB0
Stessa cosa l'ho fatta sulla cartella dello script e sul file dello
script. Ho provato anche a fare eseguire lo script nella cartella
cgi-bin ma il prolema rimane lo stesso. Digitando dmesg ecco cosa mi
viene fuori:
audit(1159954028.137:958): avc:  denied  { read write } for  pid=4698
comm="main" name="ttyUSB0" dev=tmpfs ino=12632
scontext=user_u:system_r:httpd_sys_script_t:s0
tcontext=system_u:object_r:tty_device_t:s0 tclass=chr_file
Un'altra cosa: se eseguo tramite una exec('ps aux') dal php questo mi
visualizza solo i processi dell'utente nobody, come se apache lavorasse
su un file system parallelo a quello di linux?!
Non ho più idea di cosa fare per risolvere il problema. Ma mi sembre
impossibile che non sia possibile controllare la porta seriale da php.
Anche se provo ad aprire la porta direttamente da php con
$fp=fopen("/dev/ttyUSB0",r) mi dice "failed to open stream: Permission
denied".
Avete qualche idea? Grazie infinite
Leonardo Serni ha scritto:


tcontext=system_u:object_r:tty_device_t:s0 tclass=chr_file
Ahe. Tu hai SELinux installato e attivo anzicheno'. Devi autorizzare in
modo esplicito httpd al r/w su ttyUSB0, se no ciccia.
Con audit2why puoi scoprire i dettagli in forma umana; e quel messaggio
in pasto ad audit2allow ti crea la regola che autorizza httpd.
Qui trovi qualche info in piu':
http://www.samag.com/documents/s=9820/sam0508a/0508a.htm


Ciao Leonardo, grazie per la dritta. E' come hai scritto, è proprio
SELinux che mi nega l'accesso. Adesso ho sistemato e non ho più
problemi per quanto riguarda l'accesso alla seriale. Ti ringrazio di
cuore. Adesso ho solo un piccolo problemino da risolvere, ma penso di
saper cavarmela da solo, cmq te lo illustro magari sai già come
fare... Se scrivo /myserver/cgi-bin/mioscript nel browser lo script
parte e accede finalmente alla seriale, quindi sono a posto. Se invece
lo richiamo dallo scritpt php con una system('/cgi-bin/mioscript') non
viene eseguito. I permessi della cartella dello script e dello script
sono a 777 con own e grp come quelli in cui viaggia apache. Ma non me
lo fa partire. Ciao e grazie
Leonardo Serni ha scritto:


lo fa partire.
Prova:
	if (!file_exists($PATHDELCGI))
		die("Qui non c'e'.");
	if (!is_executable($PATHDELCGI))
		die("Non posso eseguirlo");
	system("$PATHDELCGI $OPZIONI");
