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