Archive

Archive for the ‘Java’ Category

A python script to download an artefact from Sonatype Nexus

July 22nd, 2014 No comments

I use for a moment now the excellent Sonatype Nexus as artefact manager to deploy Maven project. But I was looking how to easily download the latest version of an artefact from a server, so without maven. I notice Nexus provide a REST API, therefore I wrote the following script.

It expects few parameters (bold are mandatories):

  • -g for the groupId
  • -a for the artefactId
  • -s for the Nexus base url
  • -v for the version (default is LATEST)
  • -p for the packaging (default is jar)
#!/usr/bin/env python2.7
 
 
__author__    = 'Bruno Bonfils, <bbonfils@opencsi.com>'
__copyright__ = "OpenCSI, Bruno Bonfils"
__licence__   = "LGPL"
__version__   = 0.1
 
 
"""
A Script to download the given version (or LATEST is no one is provided)
"""
import libxml2
import sys
import urllib
from optparse import OptionParser
import logging
 
args_options = OptionParser()
 
args_options.add_option("-g", "--group-id", dest="groupid", help="group id")
args_options.add_option("-a", "--artifact-id", dest="artifactid", help="artifact id")
args_options.add_option("-v", "--version", dest="version", help="version of artifact", default="LATEST")
args_options.add_option("-r", "--repository", dest="repository", help="Nexus repository name", default="snapshots")
args_options.add_option("-p", "--packaging", dest="packaging", help="packaging (jar, war, etc.)", default="jar")
args_options.add_option("-s", "--nexus-url", dest="server", help="nexus server")
args_options.add_option("-d", "--debug", action="store_true", dest="debug", help="Enable debugging", default=False)
 
(options, args) = args_options.parse_args()
 
if options.groupid is None or options.artifactid is None or options.repository is None or options.server is None:
    print >> sys.stderr, "At least one required option is missing"
    sys.exit(1)
 
if options.debug:
    logging.basicConfig(level=logging.DEBUG)
 
nexusQueryURL = options.server + "/service/local/artifact/maven/resolve" + \
                "?g=" + options.groupid + \
                "&a=" + options.artifactid + \
                "&v=" + options.version + \
                "&r=" + options.repository + \
                "&p=" + options.packaging
 
logging.debug("Performing request on URL: " + nexusQueryURL)
nexusAnswer = urllib.urlopen(nexusQueryURL)
 
""" TODO: improve error management """
try:
    nexusDOM = libxml2.parseDoc("".join(nexusAnswer.readlines())).xpathNewContext()
except libxml2.parserError as exception:
    logging.error("Unable to parse response")
    sys.exit(2)
 
if nexusAnswer.getcode() != 200:
    logging.error("Return code: " + str(nexusAnswer.getcode()))
    logging.debug("HTTP response: \n" + "".join(nexusAnswer.readlines()))
 
artifactURL = nexusDOM.xpathEval("//data/repositoryPath/text()[1]")[0]
fileName = str(artifactURL).split("/")[-1]
urllib.urlretrieve(options.server + "/service/local/repositories/" + options.repository + "/content" + str(artifactURL),
                   filename=fileName)

Categories: Java, Sysadmin Tags: ,

Test de Glassfish Preview

June 2nd, 2009 No comments

Depuis quelques jours (heures ?), Glassfish v3 preview est disponible. Comme Alexis est bien mieux placé que moi pour en parler, je vous engage à lire cet article pour la description de cette version. Au travers de ce petit billet, je résume ma toute première utilisation de Preview. Pour cela, mon cas d’utilisation est tout simple, déployer XWiki en version 1.8 dans un premier temps, mais au travers d’une source de connexions JDBC. Cas d’utilisation donc très simple.

Mes remarques, en vrac :

  • Nécessite un JDK 1.6 (java -version pour vérifier). Utilisateur d’OS X, vous devez définir JAVA_HOME et PATH, la version par défaut étant encore en 1.5
  • La commande start-domain ne met que quelques secondes à rendre la main ! Néanmoins, la console d’administration n’est pas disponible avant d’autres longues secondes :). Pour rappel, la version 3 de Glassfish est construit autour d’OSGI, un système orienté composant.
  • L’interface d’administration est proche de la version 2.1, on s’y retrouve donc assez facilement. Néanmoins, il y a une différence notable dans la gestion des applications. Il faut que je creuse le sujet.
  • Il faut que je vérifie, mais lors de la configuration du pool de connexions JDBC, Glassfish me demandait un restart, que j’ai fait. J’avoue que cela me dérange un peu si c’est vraiment nécessaire, c’est quand même une opération simple !
  • Temps d’arrêt très rapide, plutôt appréciable.
  • J’en suis presque surpris (pas taper), mais le déploiement de XWIki est OK du premier coup ! Très bon signe !
  • L’URL JMX n’est plus affiché lors du démarrage du domaine, c’est bien dommage !
  • A priori pas de changements sur la taxinomie (namespace) des MBeans, ce qui est plutôt plaisant.

Bref, premier contact plutôt positif, même si j’ai constaté quelques petits soucis dans l’interface web, mais rien de bien méchant. Vivement la première version de production !

Categories: Java, Sysadmin Tags: ,

How to build and deploy JRDS

May 25th, 2009 9 comments

At my work, we currently use nagios and cacti for monitoring, the “standard” tools. However, why it’s difficult to replace nagios – for many reasons (it use standard flat configuration flies) – I’m looking for a way to replace Cacti. Indeed, it’s written in pure PHP, there is almost no CLI. So, when I add a new host, I need to use my browser, and my mouse, and I don’t like that. By chance, a friend of mine wrote his own tool, called JRDS, in pure Java. I’m actually in test phase, however, here are some pros:

  • It’s Java, no need for php, whatever.
  • JRDS use rrd4j, RRDTool Java implementation
  • Use flat files for configuration, so it’s very easy to manage

However, one of its wort cons i s the lack of documentation! So here some notes to build JRDS :

  1. Fetch and extract JRDS sources from the subversion repository
  2. Fetch and extract RRD4j sources from the subversion repository (note: a dev.java.net account seem to be required)
  3. Build RRD4j
    • # cd rrd4j/rrd4j
    • # ant
    • # cp rrd4j-<version>.jar $JRDS_HOME/trunk/lib
  4. Build JRDS
    • If you don’t have it, download ivy and copy its jar in ~/.ant/lib directory
    • # cd $JRDS_HOME/trunk
    • # ant resolve
    • Extrat c.tld from lib/standard.jar and copy the file in the lib/ directory ( # unzip lib/standard.jar META-INF/c.tld ; mv META-INF/c.tld lib/ ; rmdir META-INF
    • # cp local.properties.sample local.properties
    • Edit local.properties, don’t forget to set jai.home at the end of file
    • # ant war
  5. Before deploy jrds.war, you need to create a properties file, and some directories. See the inital setup chapter of JRDS Userguide.
  6. Note: to deploy JRDS on Glassfish, the only way I found to create the property is to defined in the JVM options. I also have sometimes a deadlock, if that appears, you need to kill the Glassfish process and restart it.

jrds.properties

configdir=/Users/bbonfils/tools/jrds/config
rrddir=/Users/bbonfils/tools/jrds/probe
logfile=/Users/bbonfils/tools/jrds/log/jrds.log
libspath=/Users/bbonfils/sources/jrds/trunk/build/probes.jar
#loglevel=debug

config/host-kaoru.xml

<?xml version="1.0" encoding="UTF-8"?>
<host name="kaoru.asyd.net">
        <snmp community="secret" version="2"/>
        <probe type="TcpSnmp" />
        <probe type="IpSnmp" />
        <probe type="UdpSnmp" />
        <probe type="IcmpSnmp" />
        <probe type="MemLinux" />
        <probe type="CpuRawTimeLinux" />
        <probe type="UcdRawSystemCounter" />
        <probe type="PartitionSpace">
                <arg type="String" value="/" />
        </probe>
        <probe type="IfSnmp">
               <arg type="String" value="eth0" />
        </probe>
        <probe type="CpuLoadFloat" />
        <probe type="TcpStat" />
</host>

Categories: Java, Sysadmin Tags:

Create a JDBC Connection Pool using JMX/AMX

May 22nd, 2009 No comments

In my previous post, I demonstrate how to set a property for each http-service in a glassfish domain using groovy and jmx. Here the code to create a new JDBC Connection Pool, still using groovy and JMX/AMX APIs.

 
import javax.management.ObjectName
import javax.management.remote.JMXConnectorFactory as JmxFactory
import javax.management.remote.JMXServiceURL as JmxUrl
import javax.management.MBeanServerConnection
 
 
 
//def uri = 'service:jmx:rmi:///jndi/rmi://portal3:46302/jmxrmi'
def uri = 'service:jmx:rmi:///jndi/rmi://localhost:8686/jmxrmi'
def login = 'admin'
def password = 'adminadmin'
 
import javax.management.Query
 
def jmxurl = new JmxUrl(uri)
def attributes = new Hashtable()
 
def buffer = [ login, password ]
 
attributes.put("jmx.remote.credentials", (String[]) buffer)
 
def server = JmxFactory.connect(jmxurl, attributes).mBeanServerConnection
 
def createJDBCConnectionPool = { name ->
    def objectname = new ObjectName("amx:j2eeType=X-DomainConfig,name=na")
    def options = new ArrayList()
    options.add(name)
    options.add("com.mysql.jdbc.jdbc2.optional.MysqlDataSource")
    def properties = [
        'ResType':'javax.sql.DataSource'
    ]
 
    options.add(properties as Map)
 
    server.invoke(objectname, 
                "createJDBCConnectionPoolConfig",
                options as Object[],
                ["java.lang.String","java.lang.String","java.util.Map"] as String[] )
 
    /* To add other properties, we need to invoke setProperty to new object */
 
    objectname = new ObjectName("amx:j2eeType=X-JDBCConnectionPoolConfig,name=" + name)
 
    server.invoke(objectname, "setPropertyValue", [ "user", "xwiki"] as Object[], [ "java.lang.String", "java.lang.String"] as String[])
    server.invoke(objectname, "setPropertyValue", [ "password", "xwiki"] as Object[], [ "java.lang.String", "java.lang.String"] as String[])
    server.invoke(objectname, "setPropertyValue", [ "databaseName", "xwiki"] as Object[], [ "java.lang.String", "java.lang.String"] as String[])
    server.invoke(objectname, "setPropertyValue", [ "serverName", "localhost"] as Object[], [ "java.lang.String", "java.lang.String"] as String[])
    server.invoke(objectname, "setPropertyValue", [ "port", "3306"] as Object[], [ "java.lang.String", "java.lang.String"] as String[])
    server.invoke(objectname, "setPropertyValue", [ "networkProtocol", "tcp"] as Object[], [ "java.lang.String", "java.lang.String"] as String[])
}
 
createJDBCConnectionPool("xwikiPool")

As you probably noticed, I can’t create properties directly using the invokation of createJDBCConnectionPool. Indeed, we can specifly only few properties (take a look at the complete list). However, once the object is created, we can use the setPropertValue to create any properties we want.

Categories: Java, Sysadmin Tags: ,

Configure glassfish via JMX and Groovy

May 19th, 2009 1 comment

At my new work, we have a lot of glassfish in production. For some of them, we even have almost 10 instances per DAS (Domain Admin Server). As a (good) system administrator, I’m a lazy man. After having to installed and created a glassfish with 10 instances, I was really tired to click, click, and click again through the web interface. Yes I know, it’s possible to edit the files directly, but I think it’s not very convenient. First, it’s easy to make mistakes, it’s not atomic, and finally you need to restart/reload the instance.

So, I was wondering if it’s possible to proceed some configuration using JMX/AMX (AppServer Management Extensions). I start to browse MBeans using JConsole, and check that’s really possible to modify the configuration, and the answer is yes. Ok, my first try is a simple one, I just want enable access.log, meaning set accessLoggingEnabled property to true for each http-service. Since I’m not really good to write Java, I wrote a groovy script. Here it comes :

 
import javax.management.ObjectName
import javax.management.remote.JMXConnectorFactory as JmxFactory
import javax.management.remote.JMXServiceURL as JmxUrl
import javax.management.MBeanServerConnection
 
def uri = 'service:jmx:rmi:///jndi/rmi://localhost:8686/jmxrmi'
def login = 'admin'
def password = 'adminadmin'
 
import javax.management.Query
 
def jmxurl = new JmxUrl(uri)
def attributes = new Hashtable()
 
def buffer = [ login, password ]
 
attributes.put("jmx.remote.credentials", (String[]) buffer)
 
def server = JmxFactory.connect(jmxurl, attributes).MBeanServerConnection
 
def enableAccessLog = { serviceUri ->
    properties = [ "accessLoggingEnabled", "true" ]
    def signature = [ "java.lang.String", "java.lang.String"]
    server.invoke(serviceUri, "setPropertyValue", properties as Object[], signature as String[] );
}
 
def checkAccessLog = { serviceUri ->
    def properties = [ "accessLoggingEnabled" ]
    def answer = server.invoke(serviceUri, "getPropertyValue", properties as Object[], "java.lang.String");
    println "Access log for: " + serviceUri + " enabled: " + answer
}
 
 
def query = new ObjectName("amx:*,j2eeType=X-HTTPServiceConfig")
 
server.queryNames(query, null).each { service ->
    checkAccessLog(service)
    enableAccessLog(service)
    checkAccessLog(service)
}

That’s magic… Sure I’ll post some others script to manage more complex configuration, like create a connection pool, etc.

Categories: Java, Sysadmin Tags: , ,

Utiliser une datasource pour XWiki

May 11th, 2009 No comments

Actuellement, la configuration de la base de données utilisée par XWiki est directement effectuée au travers du fichier hibernate.cfg.xml du répertoire WEB-INF de l’application. Néanmoins, comme ce week end je voulais tester un peu de monitoring au niveau du serveur d’application, je me suis penché sur la question de comment utiliser un pool de connexion JDBC définit au niveau du serveur d’application en lieu et place de celui créer directement par hibernate.

Dans glassfish :

  • Dans l’onglet Resources, Connections Pools créer une nouvelle ressource du type javax.sql.ConnectionPoolDataSource en sélectionnant le driver approprié
  • De la même manière, créer une JDBC Resources, par exemple jdbc/xwiki
  • Puis finalement dans le fichier hibernate.cfg.xml, utiliser la configuration suivante
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="connection.datasource">jdbc/xwiki</property>
    <mapping resource="xwiki.hbm.xml"/>
    <mapping resource="feeds.hbm.xml"/>

Categories: Java Tags: ,

Utiliser groovy dans une page XWiki

October 31st, 2008 2 comments

Parce que je n’ai pas trouve facilement, voici un exemple d’utilisation d’un script groovy a l’interieur d’une page XWiki.

#set ($address = "172.20.12.61")
 
IP Address: $address
 
<%
 
import java.net.InetAddress;
 
vcontext = context.get("vcontext");
hostname = vcontext.get("address");
 
InetAddress addr = InetAddress.getByName(hostname);
hostname = addr.getHostName().toLowerCase();
 
%>
 
Hostname: $hostname

Du coup, j’en ai profiter pour rajouter cette page dans la documentation XWiki. Et merci a Vincent pour sa patience 🙂

Categories: Business tools, Java Tags: ,

Debuter avec xwiki

October 28th, 2008 1 comment

Si suite a un precendent post, vous etes interesse par le scripting dans XWiki, voici selon moi les deux pages par ou debuter :

Et bien entendu, mon post sur bugzilla et xwiki, meme si c’est juste un petit test, cela montrer les possibilites.

Categories: Business tools, Java Tags: ,

Extraire les certificats utilisateurs d’un fichier p7b

July 24th, 2008 No comments

Sous Windows, lorsque vous exporter un certificat utilisateur (depuis le magasin windows, bien évidemment); il est enregistré dans un fichier p7b. Pour information, un fichier p7b est un fichier CMS, décris par la RFC 2797, c’est à dire un conteneur de donnéees qui peuvent être signées ou chiffrées (dans le cas présent, le certificat est signé). Bref, j’ai eu besoin programmatiquement de pouvoir être en mesure d’extraire le certificat final d’un p7b, sachant que le fichier peut contenir plus d’un certificat (typiquement windows inclus la chaîne de certification), et j’avoue que bouncycastle n’est pas forcément simple d’approche, c’est pourquoi je mets aujourd’hui le code en dispo ! Enjoy

Categories: Java, PKI Tags:

Applet : attention a java1.6 (au moins) en u5/u6

July 22nd, 2008 No comments

Contexte : soit une application de gestion electronique de document (GED, pour ceux qui raffolent des acronymes) – que je nommerais pas – utilisant une applet pour envoyer les fichiers depuis le poste local vers l’application (web, donc). Un utilisateur se plaint depuis peu de ne pas (plus ?) pouvoir envoyer des documents, suite a une “erreur technique”. Apres analyse, (simple ouverture de la console java) on observe une jolie exception concernant java.security, sur un refus de faire un connect,resolve vers l’adresse IP du serveur (en https, je ne sais pas si le http est concerne, je ne pense pas). Quelques recherches google plus tard, un fichier java.policy modifie, et ca fonctionne.. Jusque la ca peut etre encore comprehensible, mais ca le deviens moins quand on m’explique que ca marche depuis la plupart des autres postes. Apres une intense reflexion, et surtout – je l’admets – differents tests, je m’apercois que le probleme n’est reproductible qu’en java 6, update 5 et 6, et que cela fonctionne tres bien en java 6 update 10 (beta). Il me semble fonctionne dans des versions precedant l’update 5.

Bref, si un jour vous avez des problemes avec une applet, concernant des exceptions java.security, penser a upgrader. Si jamais quelqu’un est motive pour trouver des pointeurs precis concernant ce probleme, je suis preneur :0

Categories: Java Tags: