Archive

Posts Tagged ‘groovy’

Writing a daemon in groovy

June 10th, 2009 3 comments

I actually need to write a little daemon based on the JVM (I’ll explain why in a future post). As the groovy fan I am, I was looking for a ready to use receipt, this one is interesting but show only how to write, not to read ūüôā After getting some help from Guillaume here a working sample:

import java.net.ServerSocket
import net.asyd.nagios.Hello
 
def listenPort = 4242
 
def server = new ServerSocket(listenPort)
 
while(true) {
    server.accept { socket ->
        println "new connexion"
 
        socket.withStreams { input, output ->
 
            def reader = input.newReader()
 
            def buffer = reader.readLine() 
 
            output << "Hello world " + buffer + "\n"
 
        }
    }
}

As you can see it’s very simple, thanks to groovy, once again. A thread will be create for each client.

Categories: 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: , ,

XWiki, c’est d√©cidemment magique

December 15th, 2008 No comments

Encore un billet dans la s√©rie XWiki, mais d√©cidemment, cet outil me rend vraiment beaucoup de services. Ma derni√®re oeuvre (sic) consiste en la cr√©ation d’une mini gestion des membres de l’association (GUSES, pour ceux qui ne le savent pas d√©j√† !). Nous utilisons d√©j√† Galette pour g√©rer les cotisations, mais malheureusement il n’y a rien (√† ma connaissance) pour y brancher des hooks, dans mon cas ajouter l’utilisateur √† la liste de diffusion de l’assocation.

Bref, quel rapport avec XWiki me direz vous ? Et bien, gr√†ce √† la biblioth√®que SSH Trilead pour Java j’ai √©crire une classe Groovy qui me permet d’ex√©cuter des commandes (au sens unix) √† distance. Et via quelques scripts shell et perl, il m’est d√©sormais possible lors de l’ajout d’un utilisateur dans XWiki, d’automatiquement l’ajouter dans la base Galette, mais aussi l’inscrire √† la liste de diffusion. D’autant plus que ces deux op√©rations √©taient jusqu’alors r√©alis√© par deux personnes diff√©rentes, n’arrangeant rien.

Un petit d’exemple d’utilisation de ma classe Groovy (sshhelper), en Groovy :

def sshHelper = new SshHelper()
sshHelper.openSession("hostname", "4222", "asyd", "/Users/asyd/.ssh/id_dsa", "password");
println sshHelper.runCommand("echo OK");

Le même utilisable directement depuis XWiki :

#set ($sshHelper = $xwiki.parseGroovyFromPage("Users.SshHelper"))
$sshHelper.openSession("hostname", "22", "user", "/Users/asyd/.ssh/id_dsa", "password")
#set ($buffer = $sshHelper.runCommand("echo OK")

Il est √† noter que j’ai eu des probl√®mes (avec la biblioth√®que Trilead) d’authentification en login / mot de passe vers des serveurs Linux (Debian) alors que cela fonctionne vers des serveurs Solaris. Cependant, l’authentification par cl√© a fonctionn√© vers les deux OS.

Categories: Business tools, Sysadmin 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: ,

IDM, EJBCA, SPML, et Groovy, ca y est !

August 26th, 2008 No comments

J’en r√™vais, alors je l’ai fais ! Mon id√©e √©tait de disposer d’un ensemble d’outils pour g√©n√©rer facilement des requ√™tes SPML, j’ai donc cr√©er une petite biblioth√®que Java, et √©cris quelques scripts groovy associ√©s, en pratique cela donne :

import net.asyd.iam.spml.AddRequest
 
AddRequest request = new AddRequest()
 
request.init("http://localhost:8080/SPMLServer/openspml2")
request.createPsoId("easyspmlDemo")
request.addAttribute("emailAddress", "bbonfils@gmail.com")
request.proceed()
request.dumpResponse()

Comme vous pouvez le constater, cela deviens tr√®s simple. De plus, dans ma lanc√©, je me suis dis pourquoi ne pas cr√©er une servlet recevant des requ√™tes SPML pour les traduires dans des WebServices EJBCA. C’est maintenant chose faite. Bien que je n’impl√©mente actuellement que la m√©thode addRequest, cela me permet de provisionner des entit√©s depuis un producteur SPML, comme par exemple Sun Identity Manager. La “traduction” entre SPML et la couche EJBCA se fais au travers d’un script groovy (et oui, encore du groovy, groovy c’est le bien !), de la mani√®re suivante :

import java.util.HashMap
import net.asyd.iam.FinalAddEntity
import org.ejbca.core.protocol.ws.UserDataVOWS
 
public class FinalAddEntitySample implements FinalAddEntity {
 
    def id
    def attributes
    def buffer
    def ejbcaEntity
 
    public void init(String id, HashMap attributes, UserDataVOWS ejbcaEntity) {
        this.id = id
        this.attributes = attributes
        this.ejbcaEntity = ejbcaEntity
    }
 
    public void preprocess() {
        buffer = ",UID=" + id + ",OU=staff,O=asyd dot net,C=FR"
    }
 
    public String getSubjectDN() {
        return "CN=" + id + buffer
    }
 
    public boolean proceed() {
        ejbcaEntity.setUsername(id)
        ejbcaEntity.setEmail(attributes.get("emailAddress"))
        ejbcaEntity.setSubjectDN(getSubjectDN())
 
        ejbcaEntity.setCaName("DemoCA")
        ejbcaEntity.setCertificateProfileName("ENDUSER")
        ejbcaEntity.setEndEntityProfileName("EE_SPML_USER")
        ejbcaEntity.setTokenType("P12")
        ejbcaEntity.setSendNotification(true)
 
        return true
    }
}

Plus d’information disponible sur devel.asyd.net :

Actuellement le code est plut√īt un POC que production ready, mais avec un peu de chance cela ne saurait tarder, et apr√®s tout ca permet d√©j√† de faire des choses sympas !

Categories: IAM, PKI Tags: ,

xwiki, groovy, velocity: c’est magique !

June 25th, 2008 10 comments

Il y a peu de temps, j’ai mentionn√© la joie de ma d√©couverte de xwiki. Quelques jours plus tard, et surtout apr√®s quelques heures de geekage intensif (et de lecture de documentation de velocity, hibernate, groovy, xwiki…) je viens de r√©ussir √† faire ce que je voulais ! √Ä savoir avoir une macro permettant depuis mon xwiki d’aller r√©cup√©rer des informations depuis un bugzilla √† partir du num√©ro du bug. Concr√™tement, dans ma page, j’utilise le code suivant :

#showBug(“123”)

pour obtenir le résultat suivant :

  • #226: Add a property to deactivate email verification
  • #231: Implement the Request Certificate uc

la couleur est d√©pendante du statut du bug. Voil√†, c’est peut √™tre pas grand chose, mais je suis vraiment impressionn√© par la rapiditi√© de d√©veloppement que fournit xwiki au travers de velocity/groovy. Note : le code est disponible en attachement, n√©anmois je sais que ce n’est pas tr√®s optimis√©, je vais le faire √©voluer.

Categories: Business tools, Java Tags: ,