giovedì 15 aprile 2010

SMF service per JBoss

Sicuramente chi già utilizza Solaris oppure OpenSolaris conoscerà tutti i benefici e le comodità dei servizi SMF, per chi non conosce l'argomento potete leggere una breve introduzione da me scritta in questi articoli.

Ultimamente per lavoro ho utilizzato molto spesso l'application server JBoss ed ho notato la mancanza di un apposito servizio per integrarlo in SMF, di conseguenza mi sono armato di pazienza e ne ho creato uno. Il servizio è stato testato con JBoss AS versione 5.1.0-GA, ma dovrebbe comportarsi bene anche con la versione 6. I due file che compongono il pacchetto sono il descrittore XML del servizio e uno script di shell che si occupa di far partire (o arrestare) JBoss.

Cominciamo l'analisi del file xml (jboss.xml):
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">

<service_bundle type='manifest' name='jboss'>

 <service name='application/jboss' type='service' version='1'>

  <!-- Wait for network interfaces to be initialized. -->
  <dependency name='network' grouping='require_all'
      restart_on='none' type='service'>
   <service_fmri value='svc:/milestone/network:default' />
  </dependency>

  <!-- Wait for all local filesystems to be mounted. -->
  <dependency name='filesystem-local' grouping='require_all'
      restart_on='none' type='service'>
   <service_fmri value='svc:/system/filesystem/local:default' />
  </dependency>

  <!-- Wait for the production database to be online
  <dependency name='database' grouping='require_all'
      restart_on='restart' type='service'>
   <service_fmri value='svc:/application/database/mysql:version_51' />
  </dependency>
  -->

  <exec_method type='method' name='start'
      exec='/lib/svc/method/jboss %m %i' timeout_seconds='60' />

  <exec_method type='method' name='stop'
      exec='/lib/svc/method/jboss %m %i' timeout_seconds='60' />

  <!-- rememer to set home dir of jboss user (usermod -d /opt/jboss5/ jboss) -->
  <property_group name="jboss" type="application">
   <propval name="home" type="astring" value="/opt/jboss5" override="true"/>
   <propval name="user" type="astring" value="jboss" override="true"/>
  </property_group>

  <!-- set this to productions values:
   # svccfg -s svc:/application/jboss:default setprop instance/host=0.0.0.0
   # svcadm refresh jboss:default
  -->
  <instance name='default' enabled='false'>
   <property_group name='instance' type='application'>
    <propval name='host' type='astring' value='127.0.0.1' />
    <propval name="partition" type="astring" value="" override="true"/>
    <propval name="udp_address" type="astring" value="" override="true"/>
    <propval name="udp_port" type="astring" value="" override="true"/>
    <propval name="properties" type="astring" value="" override="true"/>
   </property_group>
  </instance>

  <instance name='all' enabled='false'>
   <property_group name='instance' type='application'>
    <propval name='host' type='astring' value='127.0.0.1' />
    <propval name="partition" type="astring" value="" override="true"/>
    <propval name="udp_address" type="astring" value="" override="true"/>
    <propval name="udp_port" type="astring" value="" override="true"/>
    <propval name="properties" type="astring" value="" override="true"/>
   </property_group>
  </instance>

  <instance name='minimal' enabled='false'>
   <property_group name='instance' type='application'>
    <propval name='host' type='astring' value='127.0.0.1' />
    <propval name="partition" type="astring" value="" override="true"/>
    <propval name="udp_address" type="astring" value="" override="true"/>
    <propval name="udp_port" type="astring" value="" override="true"/>
    <propval name="properties" type="astring" value="" override="true"/>
   </property_group>
  </instance>

  <instance name='standard' enabled='false'>
   <property_group name='instance' type='application'>
    <propval name='host' type='astring' value='127.0.0.1' />
    <propval name="partition" type="astring" value="" override="true"/>
    <propval name="udp_address" type="astring" value="" override="true"/>
    <propval name="udp_port" type="astring" value="" override="true"/>
    <propval name="properties" type="astring" value="" override="true"/>
   </property_group>
  </instance>

  <instance name='web' enabled='false'>
   <property_group name='instance' type='application'>
    <propval name='host' type='astring' value='127.0.0.1' />
    <propval name="partition" type="astring" value="" override="true"/>
    <propval name="udp_address" type="astring" value="" override="true"/>
    <propval name="udp_port" type="astring" value="" override="true"/>
    <propval name="properties" type="astring" value="" override="true"/>
   </property_group>
  </instance>

 <stability value='Stable' />

 <template>
  <common_name>
   <loctext xml:lang='C'>JBoss AS</loctext>
  </common_name>
  <documentation>
   <doc_link name='jboss.org' uri='http://www.jboss.org/jbossas/docs.html' />
  </documentation>
 </template>

 </service>
</service_bundle>

Nella prima parte del servizio ho descritto le dipendenze di base, ovvero networking e filesystem (per ovvie ragioni), inoltre ho inserito anche una dipendenza dal database MySQL (commentata di default), togliendo i commenti JBoss non partirà finche il database non sarà partito, inoltre in caso di restart del servizio database verrà effettuato anche un restart di JBoss.

Di seguito trovate le proprietà generali di JBoss, ovvero la cartella dove è installato e l'utente con cui lo si vuole far partire, mentre tutte le altre proprietà sono state specificate a livello di istanza, facendo così sulla stessa macchina potreste far partire JBoss profilo standard sull'indirizzo 127.0.0.1 e JBoss profilo web su 192.168.10.1. Per modificare queste proprietà basterà dare i seguenti comandi:
# svccfg -s svc:/application/jboss:default setprop instance/host=0.0.0.0
# svcadm refresh jboss:default

in questo caso abbiamo impostato l'host per l'instanza default al valore 0.0.0.0; ovviamente se JBoss erà già stato avviato occorrerà farlo ripartire con un:
# svcadm restart jboss:default

Ovviamente se nella vostra installazione avrete creato altre configurazioni personalizzate di JBoss non dovrete far altro che aggiungere al file XML una nuova istanza copiando una di quelle esistenti.

Evito l'analisi dello script di supporto in quanto è decisamente banale, concludo invece con le informazioni per installare il tutto sul vostro sistema. Scaricate il file da qui, scompattatelo con:
# gzcat jboss-smf.tar.gz | tar xf -

ora copiamo il file di script e rendiamolo eseguibile:
# cp jboss /lib/svc/method/
# chmod +x /lib/svc/method/jboss

ed importiamo il descrittore di servizio:
# svccfg import jboss.xml

a questo punto tutte le istanze saratto regolarmente configurate:
# svcs -a|grep jboss
disabled        9:46:57 svc:/application/jboss:all
disabled        9:46:57 svc:/application/jboss:default
disabled        9:46:57 svc:/application/jboss:web
disabled        9:46:57 svc:/application/jboss:minimal
disabled       14:16:17 svc:/application/jboss:standard

per farne partire una basterà digitare:
# svcadm enable jboss:standard

e, ad ogni riavvio del sistema, verrà fatto ripartire anche JBoss!