Archivio per il mese di febbraio 2008



Linksys NSLU2: un piccolo storage di rete? No, di più!

Linksys NSLU2 Per la serie intitolata come ritrovarsi con un nuovo giocattolo nel giro di mezza giornata, sabato ho acquistato un aggeggino chiamato NSLU2 prodotto da Linksys, il tutto dopo averlo conosciuto venerdì sera tramite mio padre che me lo ha introdotto come uno scatolotto ideato in teoria come soluzione NAS a basso costo ma in pratica hackerabile a volontà, non solo dal punto di vista software ma anche da quello hardware.

NSLU2 è stato concepito come un network storage per condividere in rete fino a due unità di archiviazione USB (hard disk o memorie flash formattate in EXT3, FAT32 oppure anche NTFS usando l’ultimo firmware) con gestione di impostazioni, gruppi di utenza e quote accessibile attraverso un’interfaccia web scarna ma abbastanza semplice ed efficace. Considerato il prezzo ridotto di circa un centinaio di euro, questa periferica sembra svolgere decorosamente il lavoro per cui è stato progettato ma nella realtà si può ottenere decisamente molto di più da essa! Essendo basato internamente su una mini-distribuzione custom con kernel Linux del ramo 2.4, alcuni moduli ad hoc (di cui Linksys ha rilasciato i sorgenti) e un set ridotto di applicativi come Samba (condivisione dei file) o thttpd (accesso all’interfaccia web), c’è chi ha pensato bene che sarebbe stato bello poterci fare qualcosa di più e quindi sono nati firmware alternativi per tutti i gusti e le esigenze. In effetti le caratteristiche fisiche (dimensioni e peso molto ridotti, bassissimi consumi, totalmente silenzioso) e tecniche (processore Intel XScale da 266 MHz, 32 MB di memoria interna, due porte USB 2.0/1.1) dell’NSLU2 lo rendono particolarmente appetibile per svolgere l’attività di mini-server non solo per condivisione di file ma anche per avere istanze di SSH o di piccoli server web, posta, ftp, tanto che intorno ad esso è nata un’intera comunità veramente molto attiva che vede confluire un buon flusso di contributi in un unico sito ricco di informazioni su idee, caratteristiche e hack.

Alla fine il motivo che mi ha spinto a comprarlo con tempi che per me sono assolutamente da record, visto che sono solito a meditare attentamente i miei acquisti, è stato proprio il fatto di poter customizzare l’NSLU2 per ottenere un piccolo serverino senza molte pretese ma accessibile da remoto e da poter tenere sempre acceso con consumi ridotti all’osso (max 10 watt) e devo ammettere che questa attività mi sta divertendo parecchio, tanto che ho deciso di dedicarvi una serie di post con quantità e cadenza indefinite ma con lo scopo di raccogliere l’esperienza, i dettagli della mia customizzazione e i risultati degli svariati esperimenti che ho in mente.

Interagire con Windows tramite Ruby

Oggi stavo effettuando alcune ricerche su internet quando sono incappato in un mio messaggio inviato qualche mese fa sulla mailing list di ruby-it in risposta a chi chiedeva aiuto su come poter recuperare l’elenco delle unità montate su un sistema Windows. Ruby ormai offre da tempo un supporto particolarmente maturo all’interazione con il sistema su piattaforme Windows tramite Win32OLE e alle svariate librerie del progetto Win32 Utils. In questo caso, a dimostrazione della flessibilità delle soluzioni offerte da Ruby, lo stesso task può essere risolto in tre modi molto differenti tra loro.

Il primo approccio sfruttando il modulo Windows::Volume delle Win32 Utils consiste nell’utilizzare in maniera diretta le API di Windows e la sua implementazione, anche se può apparire grezza e magari non troppo elegante agli occhi dello sviluppatore Ruby puro, è comunque piuttosto facile:

require 'windows/volume' include Windows::Volume def get_drive_letters buffer = " " * 1024 length = GetLogicalDriveStrings(buffer.length, buffer) buffer[0..length].split(0.chr) end p get_drive_letters # => ["A:\\", "C:\\", "D:\\", "E:\\", "F:\\", "G:\\", "H:\\", "I:\\"]

Utilizzando GetLogicalDriveStrings si ottiene una lista di tutte le unità logiche montate nel sistema, indipendentemente dalla loro natura fisica, il tutto sotto forma di buffer contenente l’elenco di lettere di unità separate dal carattere NULL. Questo ci costringe a istanziare un buffer e a estrarne il contenuto con cui è stato riempito dalla funzione API in una maniera abbastanza lontana dal tipico stile di programmazione in Ruby, ma è pur sempre fattibile e tutto sommato non è poi così brutto a vedersi, c’è di peggio in altri linguaggi.

In Windows esistono poi gli oggetti COM messi a disposizione dalla Scripting Runtime Library e uno di questi, tra l’altro forse tra i più utilizzati, è FileSystemObject. Sinceramente sentire questo nome mi fa venire gli incubi tornare in mente a quando svariati anni fa mi è toccato usare ASP 3.0 che, per la cronaca, non ho mai sopportato. Il fatto di non dover usare le API Win32 salendo quindi di livello ci permette di utilizzare semplicemente Win32OLE:

require 'win32ole' def get_drive_letters drives = [] fso = WIN32OLE.new('Scripting.FileSystemObject') fso.drives.each { |drive| drives << "#{drive.driveletter}:\\" } drives end p get_drive_letters # => ["A:\\", "C:\\", "D:\\", "E:\\", "F:\\", "G:\\", "H:\\", "I:\\"]

L’astrazione messa a disposizione da Win32OLE per le collection restituite da oggetti COM include automaticamente un metodo each che ci permette di iterare in maniera familiare e comoda il risultato dalla proprietà Drives dell’istanza di FSO.

Esiste infine la possibilità di utilizzare l’interfaccia messa a disposizione da WMI (Windows Management Instrumentation) per ottenere le stesse informazioni in maniera ancora più intuitiva con un approccio molto SQL-like nell’interrogazione delle informazioni sui sistemi Windows:

require 'win32ole' def get_drive_letters drives = [] wmi = WIN32OLE.connect('winmgmts://') devices = wmi.ExecQuery('SELECT * FROM Win32_LogicalDisk') devices.each { |drive| drives << "#{drive.DeviceId}\\" } drives end p get_drive_letters # => ["A:\\", "C:\\", "D:\\", "E:\\", "F:\\", "G:\\", "H:\\", "I:\\"]

Interrogando la classe WMI Win32_LogicalDisk si può ottenere rapidamente una nutrita serie di informazioni risparmiandosi un sacco di giri o chiamate, delegando tutto al sistema operativo. Inoltre è possibile scremare già in fase di richiesta e molto facilmente il set di risultati desiderato, del resto come abbiamo visto le query WMI ricordano molto da vicino SQL. Per fare un esempio, cambiando la nostra query in SELECT * FROM Win32_LogicalDisk WHERE FileSystem = ‘NTFS’ è possibile ottenere l’elenco di tutte le unità il cui filesystem è NTFS. Un altro vantaggio non indifferente è quello di poter richiedere le stesse informazioni a computer remoti semplicemente cambiando la stringa di connessione al provider WMI, per esempio utilizzando una stringa di connessione come winmgmts:{impersonationLevel=impersonate}!\\192.168.1.2\root\cimv2 (in un dominio AD può tornare molto comodo per tenere sotto controllo le proprie installazioni).

E’ possibile fare tutto e in molte maniere, ce ne è per tutti i gusti. Il vantaggio di poter interagire con Windows attraverso Ruby anziché con i soliti VBScript e JScript risiede prima di tutto nella sua estrema flessibilità rispetto ai suddetti linguaggi di scripting rivali forniti di serie nel sistema operativo, ma anche nella possibilità di sfruttare nei propri script di automazione tutte le classi standard e di terze parti che gravitano intorno a Ruby è un vantaggio da non sottovalutare nello sviluppo di task amministrativi più complessi. Ok posso percepire anche coloro che ci terrebbero a sottolineare come sia possibile fare le stesse cose con Perl e Python… sì, avete perfettamente ragione, ma qui si pubblicizza Ruby ;-P

Zzz

Se dovessi onomatopeizzare la situazione attuale del blog userei sicuramente quanto scritto nel titolo di questo messaggio, tuttavia volevo approfittarne per ricordarmi che oggi è il secondo anno di clorophilla.blog anche se in effetti la mancanza di post nell’ultimo mese non rappresenta di certo il modo migliore per festeggiare. L’ultimo periodo è stato abbastanza pregno anche se non propriamente stimolante dal punto di vista lavorativo, situazione che di riflesso ha coinvolto anche questi lidi telematici. Non ho neppure avuto tempo e voglia di guardarmi intorno per decidere una volta per tutte a migrare verso un altro servizio di hosting (attualmente questo blog è su Aruba, detto questo detto tutto), per cui alla fine ho rinnovato a 4 giorni dalla scadenza e se ne riparlerà tra qualche mese. Insomma non si può andare avanti così, diamoci una svegliata e ricominciamo a fare qualcosa di interessante. Per cominciare, mentre in parallelo sto installando Visual Studio 2008 Express Edition per ricominciare con un po’ di sano hacking su IronRuby, ho ordinato tramite Amazon.com Expert F# di Don Syme (autore del linguaggio funzionale in oggetto) con Adam Granicz e soprattutto l’italianissimo Antonio Cisternino come co-autori. Ho iniziato qualche mese fa a curiosare F# e l’ho trovato molto interessante per cui ho pensato che ormai fosse giunto il momento di aumentare il passo e cominciare a studiarlo più seriamente, per cui siete autorizzati ad aspettarvi post in argomento in un futuro non troppo lontano. Nel frattempo sulla mia Debian di test ho installato CouchDB nella speranza di capire se possa tornarmi effettivamente utile un database document-based (come se c’entrasse qualcosa). Tornando un attimo a IronRuby, poco fa ho detto di aver intenzione di usare la versione Express di VS anche se potrei sfruttare in effetti la versione completa dell’IDE di casa Microsoft, l’idea però sarebbe proprio quella di verificare quanto possa essere utilizzabile la sua incarnazione gratuita per metter mano ai sorgenti del DLR e compagnia. A proposito dimenticavo di dire che nel frattempo è uscita una nuova versione di Lua (la 5.1.3 il 25 Gennaio), tuttavia si tratta di una bug-fixing release per cui non vi è nulla di particolarmente nuovo alla luce del sole. Orsù, chi non ha bug scagli la prima pietra: di Firefox non c’è stato il tempo di installare l’ultimo aggiornamento che già è emerso un nuovo bug critico, nel kernel 2.6 di Linux è stata messa in evidenza una vulnerabilità locale che permetterebbe di beccarsi a gratis una shell come root e per finire, sotto sotto, anche il sito di Amazon ci può raccontare qualcosa in quanto a bachi… sempre ammesso che in realtà non abbiano inventato la macchina per tornare indietro nel tempo senza aver reso partecipe l’umanità della loro scoperta:

Amazon: Back to the future