sabato 9 agosto 2008

Eseguire VLC 0.9.0 da root su Gentoo

So che non è una abitudine corretta ma su tutte le mie macchine utilizzo sempre e soltanto l'utente root. Questo mi permette di non dover digitare centinaia di volte la stessa password e di avere un controllo completo sulla mia macchina. Inoltre in questo modo ci si abitua a pensare sempre due volte prima di fare qualcosa il che non è male anche in altri ambiti.

Ogni tanto però sorgono dei problemi. L'altro giorno ad esempio ho avuto modo di utilizzare sul pc di un amico la nuova versione di VLC (0.9.0) e ho scoperto con mio sommo piacere che essa permette di visualizzare una barra di navigazione dei contenuti anche in modalità fullscreen. Era una delle poche cose che mi facevano veramente arrabbiare in VLC per cui ho pensato di installarla subito smascherando il corrispondente pacchetto in portage. Direte voi qual'è il problema?

Il problema è che, sorpresa delle sorprese, gli sviluppatori di VLC hanno pensato bene si inserire in questa nuova versione una fantastica porzioncina di codice che impedisce a root di eseguire il programma. La porzioncina di codice è questa:

if (geteuid () == 0)
{
fprintf (stderr, "VLC is not supposed to be run as root. Sorry.\n"
"If you need to use real-time priorities and/or privileged TCP ports\n"
"you can use %s-wrapper (make sure it is Set-UID root first and\n"
"cannot be run by non-trusted users first).\n", ppsz_argv[0]);
return 1;
}

e si trova nel file src/vlc.c.

Lasciando perdere l'arrabbiatura voglio solo riportare due motivi per cui questa scelta da parte degli sviluppatori VLC mi sembra una emerita stupidaggine:
  1. In questo modo si impedisce all'utente root di fare qualcosa in nome della sicurezza. Questo è assolutamente assurdo e va contro ogni definizione di superutente che su una macchina linux dovrebbe avere pressappoco gli stessi poteri di Dio. Invece in questo modo un utente normale può fare qualcosa che root non può fare. Inconcepibile.
  2. Inoltre si va contro la stessa filosofia di Linux che è basata sul concetto della scelta. Se io voglio essere costantemente root sulla mia macchina sicuramente non devono impedirmelo gli sviluppatori di VLC. Al massimo possono mettere un warning che io provvederò ad ignorare dato che tutti i possibili problemi di sicurezza che utilizzare VLC da root può comportare si possono evitare in altri modi come settando un buon firewall sulla rete interna. Inoltre se devo utilizzare VLC solo per vedere ogni tanto qualche DVD non credo che questi problemi siano effettivamente tanto gravi da comportare questa limitazione.
Al di là di tutto, comunque, questa macabra scoperta mi ha permesso di imparare qualcosa di nuovo su Gentoo quindi in fondo posso solo essere contento. In particolare ho imparato meglio a realizzare un overlay con un ebuild personalizzato e soprattutto a prevedere una patch per il codice sorgente applicandola al momento dell'esecuzione di emerge.
Ho seguito strettamente la guida http://gentoo-wiki.com/HOWTO_Create_an_Updated_Ebuild di cui riporterò i passaggi principali adattandoli al mio caso.

Per prima cosa è necessario settare la directory nella quale vogliamo realizzare l'overlay:
mkdir -p /usr/local/portage && echo 'PORTDIR_OVERLAY="/usr/local/portage"' >> /etc/make.conf
Successivamente si individua l'ebuild del pacchetto che si vuole modificare e lo si copia nella nuova directory:
cp /usr/portage/media-video/vlc/vlc-0.9.0_beta3.ebuild /usr/local/portage/media-video/vlc/xchat-2.0.9.ebuild 
Conviene utilizzare la stessa versione perchè l'ebuild dell'overlay avrà sempre precedenza su quello del portage tree standard ma si avrà comunque la possibilità di rendersi conto di ulteriori aggiornamenti e scegliere di effettuarli. Sarebbe stato necessario smascherare il pacchetto ma io lo avevo già fatto in precedenza.

Affinchè la patch venga applicata è necessario creare una directory files nella stessa directory dell'ebuild e copiarvi dentro tutti i file necessari. Nel nostro caso l'unico file sufficiente è la patch. Per creare quest'ultima non ho fatto altro che scompattare l'archivio di VLC presente in /usr/portage/distfiles/, copiare il file src/vlc.c in src/vlc.c.orig, modificarlo commentando la porzione di codice suddetta e creare il file delle differenze:
diff -u vlc.c.orig vlc.c > my-new-patch.patch
Successivamente ho copiato in files la patch e ho inserito nell'ebuild la direttiva che dice al portage di applicarla:
cd "${S}/src"
epatch "S{FILESDIR}"/my-new-patch.patch
aggiungendola prima della parentesi graffa finale nella sezione src_unpack().

Una volta che si è fatto digerire a portage il nuovo ebuild tramite il comando:
ebuild /usr/local/portage/media-video/vlc/vlc-0.9.0_beta3.ebuild digest
si è pronti per effettuare il nuovo emerge che compilerà VLC con l'inutile controllo di sicurezza disabilitato. Voglio solo concludere facendo notare come Gentoo si dimostri anche una volta essere la migliore distribuzione esistente dato che mi permette di modificare il codice sorgente di un software secondo le necessità mantenendo però la nuova versione all'interno del sistema di gestione dei pacchetti. Meravigliosamente elegante direi.