Monday, August 18, 2008

JBoss AOP Made Easy (Included Eclipse WTP)

First of all the documentation is correct, but it's hard to find out the correct steps to follow, so I'll give here a few quick steps valid in case of JBoss 4.x and Java 5 or Java 6.

  • delete server/default/deploy/jboss-aop-jdk50.deployer and replace it with jboss-40-install/jboss-aop-jdk50.deployer
  • move into the new folder and delete common-softvaluehashmap.jar
    (already available) and move javassist.jar to ../../lib/javassist.jar (to replace the jboss providen library)
  • edit server/default/deploy/jboss-aop-jdk50.deployer/META-INF/jboss-service.xml and set the EnableLoadtimeWeaving parameter to true
  • edit the run.bat or run.sh script and add the java option -javaagent:$JBOSS_HOME/bin/pluggable-instrumentor.jar
Now you can start JBoss from command line, but not from Eclipse as it still misses some parameters: just open the Servers view, double click on your JBoss server and in the editor window click on the Open launch configuration link now you have select the Arguments tab and to append the -javaagent:pluggable-instrumentor.jar directive on the list.

Monday, August 11, 2008

Eclipse Plugins

Eclipse is my preferred IDE and here follows a list of plugins I commonly use:
  • Resource Bundle Editor (http://sourceforge.net/projects/eclipse-rbe/)
  • Log4E (http://log4e.jayefem.de/)
  • Maven Integration (http://m2eclipse.codehaus.org/)
  • Subclipse (http://subclipse.tigris.org/)
  • Wicked Shell (http://www.wickedshell.net/)
  • QuickREx (http://www.bastian-bergerhoff.com/eclipse/features)
  • FindBugs (http://findbugs.cs.umd.edu/eclipse)

Saturday, August 9, 2008

PostgreSQL on Windows Vista

Today I experienced a strange behavior of that strange operating system called Windows Vista Premium Edition: I wasn't able to correctly install PostgreSQL 8.2 nor 8.3

At a first look the installation process was ending correctly but whenever I try to start the service or the stand alone server nothing happens. When I tried to start the server from the command line I got something was missing from the installation folder... the entire data subfolder was missing!

After trying without success many installation options I tried to digg into the problem and what I've found is very strange: I don't have the permissions to create that folder!

The strange thing is I had the permission to create the parent installation folder, all the sibling folders containing binaries, extensions and clients... but not the data folder!

I got the short way: I created the data folder, added myself as a user having all rights on the folder then I runned bin\initdb.exe -D data et voilà... the database is ready and working.

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

Monday, February 18, 2008

CentOS 5.1 + Xen + LVM for Guests

Normalmente per eseguire una installazione di un DomU di Xen usando delle partizioni LVM basterebbe configurare la macchina virtuale per usare il volume scelto usando qualcosa del tipo

disk = [ 'phy:/dev/mapper/vg-dom1,xvda1,w', 'phy:/dev/mapper/vg-dom1swap,xvda2,w']

Purtroppo Anaconda, l'installer di RedHat usato anche da CentOS, non sembra essere in grado di eseguire una installazione usando una partizione quindi il normale processo di installazione vanificherebbe l'utilizzo di LVM per la gestione flessibile dei dischi.

La soluzione, seppur complicata, una volta applicata potrà essere facilmente riutilizzata e replicata.
Partiremo dall'inizio, cioè dalla installazione dell'ambiente host, cioè del Dom0 all'interno del quale installeremo il minor numero di pacchetti possibile per consentire una facile gestione e contemporaneamente un alto livello di sicurezza.

Inserito il disco di CentOS avviamo l'installazione grafica (non quella testuale in quanto non consente la manipolazione dei volumi LVM) e quando arriviamo al partizionamento dei dischi selezioniamo il partizionamento manuale. Creiamo una struttura di partizioni come la seguente:
volume group - base
logical volume - root (4GB)
logical volume - swap (max 2GB)
volume group - xen

Arrivati alla selezione dei pacchetti eliminiamo qualsiasi segno di spunta e chiediamo di rivedere il dettaglio dei pacchetti da installare. A questo punto deselezioniamo qualsiasi segno di spunta dall'elenco dei gruppi (di default vengono spuntati i pacchetti per la connessione remota tramite modem, internet testuale e gli editor) ed attiviamo solamente i pacchetti per la virtualizzazione.

Facciamo completare l'installazione e riavviamo la macchina per poi procedere ad un successivo hardening eliminando i seguenti pacchetti che vengono comunque installati ma che molto probabilmente non saranno necessari:

  • NetworkManager
  • amtu
  • conman
  • bluez-utils
  • coolkey
  • irda-utils
  • firstboot-tui
  • irda-utils
  • pcmciautils
  • rp-pppoe
  • virt-manager
  • gnome-applet-vm

A questo punto prepariamoci all'installazione del sistema operativo guest, o DomU nel gergo xen, utilizzando un disco virtuale su file come base per l'installazione.

Creiamo quindi un disco virtuale di dimensioni iniziali 256MB e dimensioni massime 4GB (tanto per stare sul sicuro) con il seguente comando:

$ dd if=/dev/zero of=/var/lib/xen/images/template.hda.img oflag=direct bs=1M seek=4096 count=256

Facciamo attenzione ad usare la cartella corretta per il file altrimenti avremo problemi successivamente con SELinux.
Adesso abbiamo bisogno dei file initrd.img e vmlinuz necessari ad effettuare il boot dal disco virtuale oltre che di un file di configurazione per Xen che descriva la virtual machine così realizzata.

I primi due possono essere scaricati dal sito di Centos avendo l'accortezza di selezionare la cartella corrispondente all'architettura del sistema operativo ospite: i386 oppure x86_64.

Posizioniamo i due file appena scaricati nella cartella /var/lib/xen e creiamo un file /etc/xen/template per il nuovo DomU come il seguente:

kernel = "/var/lib/xen/vmlinuz-xen-install"
ramdisk = "/var/lib/xen/initrd-xen-install"
#decommentare la linea seguente se abbiamo un kickstart file pubblicato
#extra = "text ks=http://ipaddress/minimal-ks.cfg"
name = "template"
memory = "256"
disk = [ 'tap:aio:/var/lib/xen/images/template.hda.img,xvda,w', ]
vif = [ 'bridge=xenbr0', ]
vcpus=1
on_reboot = 'destroy'
on_crash = 'destroy'


Avviamo la virtual machine attaccandoci alla console ed eseguiamo una normale installazione text based (se non avevamo specificato un kickstart file non interattivo) per il nostro nuovissimo server virtuale, avendo ovviamente cura a selezionare il minimo dei pacchetti necessari:

$ xm create template -c

Non resta che spostare quanto installato sul disco virtuale all'interno di un disco reale gestito in LVM quindi procediamo allo stop della macchina virtuale e creiamo quindi i volumi LVM necessari cioè uno per la partizione root ed uno per l'area di swap:

$ lvcreate -L12288 -ntemplate xen
$ lvcreate -L1024 -ntemplate.swap xen
$ mkfs.ext3 /dev/mapper/xen-template01
$ mkswap /dev/mapper/xen-template01.swap

Ovviamente è possibile variare le dimensioni ed i nomi a piacere. Adesso effettuiamo lo spostamento di quanto presente nella partizione principale del disco virtuale all'interno della partizione LVM appena creata.

$ dd if=/var/lib/xen/images/template.hda.img of=/dev/mapper/xen-template01
$
resize2fs -p /dev/mapper/xen-template01

Ora non ci resta che perfezionare la configurazione del sistema in modo che non ci sia nessun riferimento rispetto all'installazione appena effettuata quindi montiamo il disco appena creato e cominciamo le attività di pulizia:

$ mount /dev/mapper/xen-template01 /media
$ chroot /media

Con quest'ultimo comando abbiamo impostato il disco della configurazione finale come se fosse la root del nostro sistema quindi possiamo avviare tutti i comandi che effettuano modifiche sul disco come se fossimo già all'interno della virtual machine.

Procediamo andando a modificare i punti di mount in fstab

$ vi /etc/fstab

Che dovrà essere modificato per fare riferimento alle partizioni LVM, come riportato nell'esempio seguente dove sono state evidenziate le linee modificate.
/dev/xvda1      /        ext3   defaults       1 1
/dev/xvda2 swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0


e successivamente dobbiamo modificare la configurazione di GRUB (editando il file /etc/grub.conf) andando anche qui a sostituire LABEL=/ con /dev/xvda1

Prima di avviare la macchina virtuale è necessario ancora eseguire alcune operazioni.

Disattiviamo il supporto ad IPv6 se non è necessario modificando i file:

  • /etc/sysconfig/network dovrà contenere NETWORKING_IPV6=no

  • /etc/sysconfig/network-scripts/ifcfg-XXXX dovranno contenere IPV6INIT=no


Disattiviamo il firewall per IPv6 con il comando

$ chkconfig --levels 2345 ip6tables off

Assicuriamoci che al prossimo riavviano venga eseguito il relabel del filesystem per SELinux eseguendo il comando

$ touch /.autorelabel

e che vengano rigenerate le chiavi usate da OpenSSH eliminando quelle già generate:

$ rm /etc/ssh/ssh_host_*

Infine un aggiornamento alle ultime versioni è un'operazione consigliabile

$ yum update

Finita la preparazione della nostra nuova macchina virtuale torniamo al Dom0 per preparaci a gustare i risultati del nostro lavoro.

$ exit
$ umount /media /mnt

Ci rimane da preparare (o modificare) il file di configurazione per Xen in modo che sia in grado di avviare la nostra nuova macchina virtuale. per farlo editiamo il file /etc/xen/template affinchè rispecchi queste nuove proprietà:
name = "template"
bootloader = "/usr/bin/pygrub"
disk = [ 'phy:/dev/mapper/xen-template,xvda1,w','phy:/dev/mapper/xen-template.swap,xvda2,w']
vif = [ 'bridge=xenbr0']
vcpus = 1
on_reboot = 'restart'
on_crash = 'restart'

Per comodità nell'installazione delle successive macchine virtuali converrà creare un nuovo archivio, a partire dal sistema appena installato sul volume LVM, da tenere in disparte per evitare di dover ripetere il processo dall'inizio: con l'archivio già pronto potremo ripartire dalla creazione delle partizioni LVM e limitarci a configurare la rete e l'hostname!

$ dd if=
/dev/mapper/xen-template01 of=/var/lib/xen/images/lvm-template.img

Non resta che effettuare lo start della macchina virtuale et voilà,
avete la vostra bella macchina virtuale CentOS 5.1 che lavora su una
partizione LVM.... come promesso!