
Vi siete mai chiesti quale sia la forza che spinge gli sviluppatori di software libero a continuare a scrivere utili programmi, spesso di elevata qualità?
Ci sono sicuramente tante concause, ma penso che la soddisfazione di un'esigenza personale (gli anglofoni dicono "scratching his own itch") sia uno dei fattori maggiormente rilevanti.
Bene, oggi mi sono tolto una piccola soddisfazione, che voglio condividere con voi: la realizzazione di una piccola e rozza applet per il pannello di GNOME che mostri la qualità del segnale della mia scheda wireless.
So bene che ci sono già delle applicazioni che lo fanno, ma nessuna era semplice come volevo io, nessuna mi dava
solo quell'informazione, nessuna mi appagava.
E poi, il bello è proprio questo: ce ne saranno migliaia, ma nessuna è
mia! :)
Qui riporto alcuni dei passaggi fondamentali da me seguiti nella realizzazione dell'applet ed il codice sorgente completo della stessa, rilasciata sotto GNU GPL 3.
Prelievo dell'informazione sul segnalePrimo problema: come trovo l'informazione sulla potenza del segnale?
Penso che tutti conoscano l'utility
iwconfig, che, tra le altre, fornisce anche l'informazione che cerco, sotto la voce "Link Quality".
Python, tramite il modulo
commands, fornisce la possibilità di ottenere l'output di un comando. Vediamo come sfruttarlo:
import commands
interface = "eth2"
def get_signal_strength():
str = commands.getoutput("/sbin/iwconfig " + interface).split("\n")
for row in str:
pos = row.find("Quality=")
if pos > 0:
sig = row.split()[1].split("=")[1]
return sig
return ""
Questa funzione elabora l'output di iwconfig, cercando la riga contenente l'informazione ed estrapolandola. L'output di questa funzione sarà una stringa tipo "49/100", che è proprio quello che andremo a posizionare, rozzamente, nel pannello di GNOME.
Realizzazione di un'applet per il pannelloPerfetto, ora che abbiamo l'informazione che ci serve, dobbiamo
solo mostrarla nel pannello ed aggiornare ad intervalli regolari quest'informazione. Come fare?
Fortunatamente esiste un modulo di python, chiamato
gnomeapplet, che serve proprio a realizzare applet per il pannello di GNOME. Sotto debian, il pacchetto si chiama
python-gnome2-desktop, ed installandolo vi tirerete dietro anche i binding Python per le GTK+ e per GNOME, che sono ovviamente necessari.
A questo punto, vista la solita mancanza di documentazione, non ho fatto altro che andare a spulciare gli esempi di gnomeapplet, ed ho verificato che è necessario, oltre alla scrittura del codice python, realizzare un file per Bonobo (uno dei componenti fondamentali di GNOME) in modo da fargli notare che esiste anche la nostra applet, e visualizzarla così nella finestra "Aggiungi al pannello" che mostra tutte le applet che si possono inserire.
Bando alle ciance, ecco il codice per l'applet vera e propria, wimonitor.py:
import pygtk
pygtk.require('2.0')
import gtk
import gnomeapplet
import gobject
import commands
interface = "eth2"
interval = 1000
def get_signal_strength():
str = commands.getoutput("/sbin/iwconfig " + interface).split("\n")
for row in str:
pos = row.find("Quality=")
if pos > 0:
sig = row.split()[1].split("=")[1]
return sig
return ""
def update_signal(label):
label.set_text(get_signal_strength())
return True
def applet_factory(applet, iid):
label = gtk.Label(get_signal_strength())
applet.add(label)
applet.show_all()
gobject.timeout_add(interval, update_signal, label)
return True
gnomeapplet.bonobo_factory("OAFIID:GNOME_WiMonitor_Factory", gnomeapplet.Applet.__gtype__, "hello", "0", applet_factory)
Ed ecco il codice del file GNOME_WiMonitor.server:
<oaf_info>
<oaf_server iid="OAFIID:GNOME_WiMonitor_Factory" type="exe" location="/home/andrea/wimonitor/wimonitor.py">
<oaf_attribute name="repo_ids" type="stringv">
<item value="IDL:Bonobo/GenericFactory:1.0"/>
<item value="IDL:Bonobo/Unknown:1.0"/>
</oaf_attribute>
<oaf_attribute name="name" type="string" value="WiMonitor"/>
<oaf_attribute name="description" type="string" value="Semplice monitor del segnale wireless"/>
</oaf_server>
<oaf_server iid="OAFIID:GNOME_WiMonitor" type="factory" location="OAFIID:GNOME_WiMonitor_Factory">
<oaf_attribute name="repo_ids" type="stringv">
<item value="IDL:GNOME/Vertigo/PanelAppletShell:1.0"/>
<item value="IDL:Bonobo/Control:1.0"/>
<item value="IDL:Bonobo/Unknown:1.0"/>
</oaf_attribute>
<oaf_attribute name="name" type="string" value="WiMonitor"/>
<oaf_attribute name="description" type="string" value="Semplice monitor del segnale wireless"/>
<oaf_attribute name="panel:category" type="string" value="Utility"/>
<oaf_attribute name="panel:icon" type="string" value="bug-buddy.png"/>
</oaf_server>
</oaf_info>
È necessario modificare l'attributo
location del primo tag
oaf_server in modo da renderlo coerente con la posizione reale del file wimonitor.py.
Potete posizionare il file wimonitor.py dove preferite, mentre il file GNOME_WiMonitor.server va posizionato in /usr/lib/bonobo/servers.
Configurate l'applet modificando opportunamente i valori delle variabili
interface e
interval.
Se tutto è andato bene, troverete WiMonitor tra le applet da aggiungere al pannello, ed aggiungendola potrete avere sott'occhio l'andamento del segnale della vostra scheda wireless.
ConclusioniEffettivamente l'applet è un po' bruttina, non è personalizzabile.. È decisamente migliorabile!
Ma onestamente a me non interessava creare un
sexy framework di monitoraggio delle prestazioni di rete, volevo soltanto avere sott'occhio
velocemente quell'informazione e dare un'occhiata alla programmazione GNOME in Python.
Spero che questo post sia utile come introduzione a tutti coloro che abbiano voglia anche loro di togliersi uno sfizio del genere.
E ricordate...
Python RULEZ!