Ejecución remota desde Android con remote launcher y demonios Java en Linux

Hace tiempo tuve un control físico para xbmc y queria replicar eso mediante Android para lo cual encontre un cliente. El inconveniente que tenia con xbmc era el levantarme de mi cama para ejecutar el control en Android y asi fue como encontre Remote Launcher.

Remote Launcher es una especie de control para ordenar la ejecución de aplicaciones desde el smartphone, el cual solo necesita una contraparte en el servidor, tiene dos modos de ejecución un modo de ejecución gráfico y otro desde la terminal, la parte del servidor esta escrita en java.

Luego de un par de pruebas y de seguir los pasos de la configuración que hay en la pagina, ya podia ejecutar xbmc desde mi teléfono y podía controlarlo con el control de xbmc, sin embargo el problema ahora era ejecutar remote launcher en mi pc -_-, aunque mi primera opción fue agregarlo como programa al iniciar Gnome, perdia el poder de controlar la pc con pasarme a Fluxbox (mi otro escritorio) y mi solución final fue integrar Remote Launcher a los servicios del sistema en Gentoo.

Preeliminares

Aunque cada distribución tiene su propio sistema de arranque, la mayoria al final ejecutan una utilidad del sistema llamada start-stop-daemon (Debian y Gentoo por ejemplo) que como su nombre lo indica se encarga de gestionar la ejecución del programa en cuestión como un demonio y no como una aplicación normal. En mi caso la configuración que funciono fue la siguiente:

  • Configurar un nuevo servicio para ejecutar el .jar de Remote Launcher  Server como si se tratara de un servicio de sistema, en mi caso un nuevo servicio para openrc en Funtoo.
  • Agregar un lanzador para xbmc con la salvedad que la aplicación tiene que abrirse en la pantalla principal 0 de mi xserver (la pantalla por defecto para la mayoría de los usuarios).

Convertir un .jar en un servicio del sistema

Al utilizar start-stop-daemon su funcionamiento por defecto es verificar si el proceso ya se encuentra en la tabla de procesos en ejecución a nivel de sistema (para cualquier usuario), si utilizaramos este metodo con java start-stop-daemon verificaria si esta en ejecución /usr/bin/java y automaticamente detendria todas las instancias de maquina virtual que esten en ejecución asi que descarte este metodo.

El instalador de remote launcher, genera un script en /usr/bin/remote-launcher-server con el comando largo de java para la ejecución del programa, script que NO debe ser utilizado para crear el servicio porque al ejecutar el script el sistema genera un pid por la ejecución del script y otro pid para la ejecución de la maquina virtual de java, otra opción descartada.

La solución final entonces es basarme en el script para ejecutar el jar de remote launcher y convertirlo a un comando de start-stop-daemon:

start-stop-daemon –start –background –user tuxtor –make-pidfile –pidfile /var/run/remote-launcher-server/remote-launcher-server.pid  –exec /usr/bin/java — -jar «/usr/share/remotelauncherserver/Remote Launcher.jar» /usr/share/remotelauncherserver/ -d

Las opciones que utilice las explico a continuación:

–start – no necesita explicación o si?

–background – envía el proceso a ejecutarse a background, sin esta opcion mi script de inicio esperaria una señal del ejecutable para decir que esta listo para aceptar conexiones, señal que nunca existiria porque remote launcher no esta programado para eso

–user tuxtor – le indico que ejecute el comando con mi usuario, esto para mantener aislado el demonio de remote launcher y para que remote launcher lance los programas con mi usuario regular

— make-pidfile – workarround para que start-stop-daemon genere un archivo con el numero de pid del proceso de remote launcher

— pidfile – ruta en donde se generara el archivo con el numero de pid, no es necesario que el archivo exista PERO la ruta completa si debe de existir

— exec /usr/bin/java – el comando a ejecutar sera la maquina virtual de java

— «-jar . . .» las opciones de ejecución de remote launcher, le indico cual es el archivo .jar a ejecutar, el classpath y por ultimo la opción -d que hace que remote launcher inicie solo en linea de comandos.

Por ultimo para hacer que el servicio se detenga volvemos a utilizar start-stop-daemon, para lo cual usamos la opcion stop y le indicamos en donde se encuentra el archivo con el pid del proceso.

start-stop-daemon –stop –pidfile /var/run/remote-launcher-server/remote-launcher-server.pid

Especifico para Gentoo

En Gentoo el script completo a ubicar en init.d seria el siguiente, ademas de ejecutar el comando anterior me aseguro que la carpeta de destino del pidfile no genere problema. Como opción adicional hice parametrizable la dirección de destino del pidfile, la cual agrego como una variable en un nuevo archivo dentro de /etc/conf.d/ en mi caso se llama remote-launcher-server.

/etc/init.d/remote-launch-server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/sbin/runscript
# Android remote launcher server init script
# Distributed under the terms of the GNU General Public License v3
 
depend() {
need net
}
 
start() {
ebegin "Starting remote-launcher-server"
 
if [ ! -e /var/run/remote-launcher-server ] ; then
mkdir -p /var/run/remote-launcher-server
chown tuxtor:users /var/run/remote-launcher-server
fi
 
start-stop-daemon --start --background --user tuxtor --make-pidfile --pidfile ${REMOTE_LAUNCHER_SERVER_PIDFILE} \
--exec /usr/bin/java -- -jar "/usr/share/remotelauncherserver/Remote Launcher.jar" /usr/share/remotelauncherserver/ -d
eend $?
}
 
stop() {
ebegin "Stopping remote-launcher-server"
start-stop-daemon --stop --pidfile "${REMOTE_LAUNCHER_SERVER_PIDFILE}"
eend $?
}

/etc/conf.d/remote-launch-server

REMOTE_LAUNCHER_SERVER_PIDFILE=»/var/run/remote-launcher-server/remote-launcher-server.pid»

Agregar un lanzador para xbmc (o cualquier otro programa con GUI) con remote launcher server ejecutandose como servicio

Remote launcher server utiliza el archivo .remotelauncherserver dentro de la carpeta /home del usuario, en mi caso tuxtor. Aunque remote launcher server ya se encuentra ejecutandose bajo mis credenciales el siguiente inconveniente a resolver es que no se puede ejecutar un programa desde una terminal no grafica, hay que forzar la ejecución en la pantalla principal del X Server, esto se hace mediante la variable de entorno DISPLAY.

Por ejemplo un lanzador tradicional en el archivo de configuración de remote launcher server seria asi:

Xbmc
Xbox Media Center (Yes Xbox)
/usr/bin/xbmc

Asi que como paso adicional hay que generar un script con la variable de entorno DISPLAY apuntando a la pantalla principal, más o menos como el siguiente:

1
2
3
#!/bin/bash
export DISPLAY=:0.0
/usr/bin/xbmc

Lo ubicamos donde nos conventa (en mi caso /opt/xbmc_disp0) lo hacemos ejecutable (chmod +x /opt/xbmc_disp0) y reescribimos el lanzador.

Xbmc
Xbox Media Center (Yes Xbox)
/opt/xbmc_disp0

Y al conectarnos desde android deberiamos ver algo como esto:

 

4 Replies to “Ejecución remota desde Android con remote launcher y demonios Java en Linux”

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *