Grails Android GCM Plugin

Nota: esta entrada también está publicada en mi blog en inglés. If you are an english reader, you might want to read that version.

Como resultado de los dos primeros hacker fridays de OSOCO, Adrian Santalla y yo publicamos el plugin de Grails para Android GCM (entre otras cosas 😀 ), cuyo código fuente está disponible en Github.

Este pequeño plugin proporciona a tu aplicación Grails acceso a Android GCM (el servicio que Googe usa para las notificaciones push de Android) a través de un servicio que es injectado en los artefactos de tu aplicación.

El plugin está publicado en el repositorio oficial de plugins de Grails, así que instalarlo es tan fácil como invocar la orden install-plugin, tras lo cual cualquier servicio, controlador, etc, de tu aplicación podrá usar el servcio androidGCMService. El siguiente ejemplo ilustra el caso de uso más básico:

$ grails create-app AwesomeApp 
$ cd AwesomeApp
$ grails install-plugin android-gcm
$ grails create-controller Cool
$ cat > grails-app/controllers/awesomeapp/CoolController.groovy << EOF
package awesomeapp

class CoolController {

    def androidGcmService

    def index() {  
        render androidGcmService.sendMessage(
            [ 
                aMessageKey : 'The message value for the key aMessageKey', 
                anotherMessageKey : 'The message value for the key anotherMessageKey' 
            ],
            ['anAndroidDeviceToken', 'anotherAndroidDeviceToken'],
            'youShallCollapseThisMessage', 'yourGCMAPIKeyProvidedByGoogle'      
        )          
    }
}
EOF
$ grails run-app
$ $ wget -O - http://localhost:8080/AwesomeApp/cool/index 2> /dev/null
MulticastResult(multicast_id=8596196938900195177,total=2,success=0,failure=2,canonical_ids=0,results: [[ errorCode=InvalidRegistration ], [ errorCode=InvalidRegistration ]])

Como se ve, el controlador intenta enviar un mensaje (el cual, por su parte, está compuesto por dos mensajes, cada uno con su clave y valor) a dos dispositivos Android, marcando el mensaje como de tipo collapse, y pasando la clave de acceso al API de GCM porporcionada por Google. Cuando el resultado es renderizado, se muestra un objeto de clase MulticastResult (dado que hemos intentado enviar el mensaje a múltiples dispositivos) con el resultado del envío del mensaje (que en este caso es un error de tipo InvalidRegistration para ambos dispositivos, ya que estamos inventándonos su identificador de registro 😀 ). Ten en cuenta que si quieres probar este ejemplo tendrás que sustituir yourGCMAPIKeyProvidedByGoogle con un identificador de API válido, si no lo haces el API de Android al que el plugin invoca fallará con una bonita excepción de tipo null pointer :-( .

Puedes ver una lista completa de los métodos proporcionados por el servido y de las opciones de configuración disponibles en el README del proyecto en Github.

Módulos de Puppet para Git y Subversión

Nota: esta entrada también está publicada en inglés en mi blog. If you are an english reader you may want to check out the english version :-) .

Puppet

Durante este último año hemos estado usando puppet, una herramienta de configuración que permite automatizar el despligue y configuración de software usando un DSL (en vez de, por ejemplo, scripts caseros de dudosa portabilidad). Durante este tiempo hemos escribo algunos módulos agnósticos de OSOCO, que hemos publicado en nuestra cuenta de Github, así que he pensado en hacerles algo de publicidad :-D. Empezaré con dos de los más sencillos, puppet-git y puppet-svn, que te permiten hacer checkouts y actualizar repositorios de estos dos populares SCM’s

Puppet Git

Puedes encontrar el código fuente de este módulo en su repositorio de Github. Permite hacer un checkout de un repositorio o mantener actualizada una copia ya existente. Un caso de uso de ejemplo podría ser un servidor que necesita instalar una serie de herramientas cuando arranca, y se puede ver en otro módulo Puppet que tenemos publicado, el de aws-tools, cuyo código relevante puedes ver a continuación:

class my_awesome_puppet_class {
    include git
    $path = "/my/existing/aws-tools/path"
    git::clone { "aws-tools-clone":
        url => "https://github.com/osoco/aws-tools.git",
        path => "$path/aws-tools",
        username => "",
        password => "",
    }
    git::pull { "aws-tools-pull":
        path => "$path/aws-tools",
    }
}

Como se puede ver, definimos un par de recursos de tipo clone y pull, los cuales son lo suficientemente inteligentes para ejecutar su operación asociada sólo cuando tiene sentido: la operación de clone sólo se ejecutará cuando el directorio de destino no exista, mientras que la operación pull sólo lo hará cuando si exista :-) . Esto mantendrá la copia de las maravillosas aws-tools 😀 disponible y actualizada.

Puppet Subversion

Prácticamente lo mismo, pero usando el viejo y bueno Subversion (para aquellos que os lo estéis preguntando – si, todavía puedes usar subversion y ser guay 😀 ). Nuevamente, el código fuente está disponible en Github y proporciona básicamente las mismas opearaciones. En este caso, el ejemplo muestra un servidor web que al arrancar ha de obtener una copia de la web que sirve, así como mantenerla siempre actualizada:

class awesome_website_configuration {
    include svn
    $document_root = "/var/www/awesome_website"
    svn::checkout { "awesome-website-checkout":
        username => "my-readonly-svn-user",
        password => "someSecretPassword", 
        url => "https://svn.somecompany.org/svn/awesome_web/trunk",
        path => $document_root,
    }
    svn::update { "awesome-website-update":
        username => "my-readonly-svn-user",
        password => "someSecretPassword", 
        path => $document_root,
    }
}

Y eso es todo. Probablemente no son los módulos más extraordinarios que encontrarás, pero son útiles :-) .