Monday, March 31, 2008

Test e profiling di applicazioni web

Testare e profilare applicazioni web è una attività davvero semplice, infatti sono disponibili molti strumenti, alcuni dei quali anche open source, per svolgere questo compito.

La procedura da seguire varia in funzione del tipo di attività che si vuole eseguire e che individuamo in quattro tipologie:
  1. test funzionali, utili per verificare che l'applicazione risponda ai requisiti
  2. test di non regressione, utili per evitare di introdurre errori durante la manutenzione evolutiva
  3. test di performance, o stress test, per individuare i limiti imposti dall'accoppiata hardware e software
  4. profilatura per l'individuazione di colli di bottiglia e di punti di memory leak
In tutti i casi il tool che suggerisco di utilizzare è Jakarta JMeter, un tool open source realizzato in Java, e quindi utilizzabile su qualunque piattaforma, dotato di comoda interfaccia utente grafica per la realizzazione, manipolazione e verifica dei test.

Se l'applicazione che vogliamo sottoporre a test esiste già o ha una interfaccia utente già definita mediante un prototipo statico, l'attività di creazione del test è davvero banale:
  1. si lancia JMeter e si crea nel Workbench un elemento di tipo HTTP Proxy Server che utilizzeremo per registrare le attività che svolgeremo all'interno del nostro browser
  2. si lancia il browser preferito e si passa alla configurazione dei parametri di rete per fare in modo che utilizzi JMeter (127.0.0.1:8080) come se si trattasse di un server proxy
  3. si attiva, non necessariamente sulla macchina locale, l'applicazione web che vogliamo sottoporre al test
  4. utilizziamo il nostro web browser per navigare all'interno dell'applicazione avendo cura di eseguire tutte le attività che vogliamo sottoporre al test
Alla fine di questi passaggi JMeter avrà registrato tutte le operazione che avremo effettuato e sarà in grado di replicarle tutte le volte che vogliamo.

Se il nostro obiettivo è quello di creare una suite di test funzionali o di non regressione possiamo istruire JMeter per utilizzare una certa serie di parametri oppure di verificare mediante regular expression che l'output restituito contenga una determinata stringa.

Se il nostro obiettivo è quello di effettuare un test prestazionale o una profilatura allora dovremo chiedere a JMeter di eseguire il test in multiutenza ovvero come se si molti computer si connettessero contemporaneamente all'applicazione oltre che di raccogliere le informazioni statistiche di cui abbiamo bisogno.

Gli accorgimenti che suggerisco di seguire sono i seguenti:
  • raccogliere sempre in un unico punto i parametri relativi al server che si va a testare, così da non dover modificare tutta la suite di test nel caso si dovesse ripetere il test sulla stessa applicazione deployata su un altra macchina
  • attivare la gestione della sessione attraverso cookies o attraverso url rewriting
  • definire sempre un listener per verificare le attività svolte dal tool
  • inserire un eventuale processo di autenticazione (login) in un controller che lo esegua solo la prima volta
  • definire eventuali liste di parametri comuni a più richieste all'interno dell'apposito elemento di configurazione

Tuesday, March 25, 2008

PL/Java on CentOS 5

Installare la libreria PL/Java su CentOS 5 è stata una dura battaglia.
Ovviamente abbiamo bisogno un Java Runtime per poter utilizzare questa
estensione, in questo caso io ho usato una JDK Sun 1.6.0 update 5 installato attraverso JPackage.

Per questa operazione ho prima scaricato il JDK dal sito della Sun (la versione RPM in self extracting) che ho eseguito e poi ho rimosso i package installati, poi

$ yum install jpackage-utils
$ wget http://mirrors.dotsrc.org/jpackage/1.7/generic/non-free/RPMS/java-1.6.0-sun-compat-1.6.0.05-1jpp.i586.rpm
$ rpm -Uvh jdk-6u5-linux-i586.rpm java-1.6.0-sun-compat-1.6.0.05-1jpp.i586.rpm

Innanzitutto è stato necessario aggiornare la versione di PostgreSQL dalla 8.1.11 (ultima versione disponibile sul repository di CentOS) alla 8.3.1 utilizzando un repository non ufficiale.

$ wget http://yum.pgsqlrpms.org/reporpms/8.3/pgdg-centos-8.3-2.noarch.rpm
$ rpm -Uvh http://yum.pgsqlrpms.org/reporpms/8.3/pgdg-centos-8.3-2.noarch.rpm
$ yum update


A questo punto è possibile installare la versione 1.4.0 di pljava per postgres 8.3

$ wget http://pgfoundry.org/frs/download.php/1598/pljava-i686-pc-linux-gnu-pg8.3-1.4.0.tar.gz
$ tar -zxvf pljava-i686-pc-linux-gnu-pg8.3-1.4.0.tar.gz


Spostiamo i file appena decompressi nelle locazioni più consone sotto CentOS

$ mv pljava.so /usr/lib/pgsql
$ mv pljava.jar /usr/share/java/


Adesso dobbiamo rendere visibili le librerie libjvm.so e poi installare il linguaggio in PostgreSQL

$ ldconfig
$ psql -U postgres template1 < install


Dove ovviamente install è il file che troviamo nella cartella decompressa di pljava!


Wednesday, March 19, 2008

JBoss 4.2.2 fails to start

It can seems weird but on Linux you could incur on a strange startup failure with JBoss 4.2.2

Caused by: java.lang.RuntimeException: Exception creating identity: hostname

This issue is easily solveable just adding your hostname (the one used at prompt) into your /etc/hosts file.

OpenVPN & OpenSSH

Per ottenere un livello di sicurezza decente con OpenVPN è necessario mettere in piedi una piccola PKI con tanto di CA Root Certificate.

Oggi ho giocherellato un pò con OpenSSH per passare dal metodo di autenticazione basato su password al metodo di autenticazione basato su chiavi asimmetriche.

Ad un certo punto sono andato in confusione ed ho sbagliato nel configurare le chiavi utilizzate per effettuare l'accesso SSH scambiandole con quelle utilizzate per connettermi alla VPN aziendale. Allora mi è saltato alla mente che in fondo si tratta sempre di una coppia di chiavi asimmetriche RSA! Perchè dovrei generarne altre?

Partendo dalle chiavi generate per OpenVPN e passando per PuTTYGen sono riuscito ad ottenere con facilità l'effetto desiderato: una chiave privata + un certificato X.509 = accesso ai server aziendali!

La procedura è abbastanza banale:

  1. generare la coppia di chiavi pubblica e privata con i tool easyrsa di OpenVPN
  2. aprire la chiave privata con PuTTYGen
  3. salvare la chiave pubblica
  4. esportare la chiave privata in formato OpenSSH