PDA

Ver la Versión Completa : CIFs para SGSII y RSYNC para sincronizar


jnadie
09/06/11, 10:31:17
Introducción
Antes de comenzar, algunas ideas que debemos tener claras:

UNIX
Nuestros Androids son en realidad un sistema UNIX, se trata de un Sistema Operativo (S.O.) de los más antiguos, y de los más potentes. Esta "antiguedad" le confiere muchas cosas, entre ellas una potentisima "línea de comando" (en inglés "Shell"). Aunque solo sea por culturilla general, comentar que uno de los UNIX más famosos es "LINUX", y que tanto Android como los sistemas operativos de Apple también tienen un UNIX por detrás...

Linea de comando y "Shell script"
Una de las cosas más potentes que tiene cualquier LINUX es la disponibilidad de una línea de comando (en modo TEXTO) que nos permite hacer muchísimas cosas, lo más parecido en el mundo Windows es el "CMD" o "Simbolo de sistema", aunque comparar un CMD con una línea de comando UNIX es comparar una bicicleta con un transbordador espacial... sí, ambos son medios de transporte... pero ahí acaba su parecido.
Si estais familiarizados con el mundo Windows conocereis los ficheros de proceso por lotes (ficheros .BAT), pues bien, en UNIX eso también existe y se llaman "Shell script", normalmente se suele utilizar la extensión ".sh" para identificarlos (por favor, los expertos de Unix no me tengais en cuenta esta pequeña "patada al diccionario", esto lo estoy escribiendo para el público en general).
En un "shell script" podemos colocar todos los comandos que queramos ejecutar uno tras otro, y después lanzarlos todos juntos, aquí vamos a utilizar esto para crear un programa que con "un solo click" nos sincronice carpetas.

CIFs
CIFs es el protocolo que utilizan los Windows para compartir ficheros, necesitamos que nuestro SGS2 "hable este idioma" para poder acceder de modo nativo a los ficheros de un Windows.

Punto de montaje
El equivalente de las "unidades compartidas" de windows en el mundo unix son los "puntos de montaje", la idea es la misma, si en un Windows para "montar una unidad remota" le asignamos una letra [por ejemplo en U: tengo montada mi unidad de usuario de la red], en el mundo Unix lo que hacemos es "montar una unidad remota" en un directorio cualquiera (normalmente vacio), así por ejemplo, puedo crear un directorio en mi SD que se llame "/sdcard/CIFs" ("/sdcard" es como realmente se llama mi SD para el Unix) y "montar" mi unidad remota en ese directorio. Imaginaros que tengo un fichero "FOTO.JPG" en mi carpeta de red, pues bien, en Windows la vería en "U:\FOTO.JPG", y en unix la vería en "/sdcard/CIFs/FOTO.JPG" (Por cierto, fijaros que en unix las barras van alrevés).

Módulo de sistema operativo (fichero *.ko)
En unix, y en android en particular, se pueden añadir nuevas funcionalidades al sistema operativo "instalando modulos" desde la línea de comando, estos módulos con nuevas funcionalidades en Android suelen tener extensión "ko", y aquí tendremos que utilizandos para añadir nuestra funcionalidad "CIFs" al S.O.

ROOT
En un S.O. unix, al abrir un shell el usuario normalmente no es el administrador (root) de la máquina, suele ser un usuario "corriente" que puede hacer cosas "poco peligrosas" para el funcionamiento del sistema. Si queremos hacer cosas avanzadas -y peligrosas- debemos ser administradores del S.O., es decir, tenemos que ser ROOT. Para ello en la línea de comando basta con teclear el comando "su" (de Super User) e inmediatamente seremos administradores del sistema.

Dispositivo rooteado
Esto seguro que lo habeis oido todos "me he hecho root de mi Android", pues bien, "hacerse root" *solo* sirve para poder acceder en modo root (modo administrador) al S.O., y pongo *solo* entre asteríscos porque esto abre un mundo increible si lo sabemos aprovechar...


Instalar soporte CIFs en SGS2
Por fin he encontrado como añadir montajes CIFs a nuestros cacharritos, el "HOWTO" original es este: http://forum.xda-developers.com/showthread.php?t=1113191

Ahora os resumo y complemento...

Es necesario añadir la funcionalidad "CIFs" a nuestro sistema operativo Android, eso se hace añadiendo unos ficheros "*.ko" al sistema, estos ficheros nos los facilitan amablemente desde XDA

Descarga desde XDA: http://forum.xda-developers.com/attachment.php?attachmentid=617912&d=1307412988
Mirror en Megaupload (por si acaso): http://www.megaupload.com/?d=BJ8EG3WW

Bien, el proceso es el siguiente:
1.- Tenemos que ser ROOT, sino no hay nada que hacer...
2.- Descomprimimos los ficheros que contienen el zip (slow-work.ko, cifs.ko) y los subimos a la SDCARD de nuestro SGS2 (con el método que prefiráis), para esta guia voy a suponer que están en "/sdcard/" (la raíz de la sd).
3.- Montamos en R/W el /system (con el Root explorer por ejemplo)
4.- Creamos una carpeta "fs" en /system (con el Root explorer por ejemplo)
5.- Copiamos los dos ficheros anteriores desde la SDCARD a /system/fs/ (De nuevo lo podemos hacer con el Root explorer)
6.- Accedemos en modo terminal al teléfono (con adb shell o con una aplicación "console" de android, como prefirais).
7.- Ganamos "root" en el terminal, para ello tecleamos "su", el prompt pasará de ser "$" a "#", si es la primera vez que lo hacéis desde el adb tener cuidado de validar en el teléfono el permiso de "root" (si tenéis la pantalla apagada no lo vais a ver).
8.- Ejecutamos "insmod /system/fs/slow-work.ko"
9.- Ejecutamos "insmod /system/fs/cifs.ko"

Para probar si ha funcionado:

Crear una carpeta en /sdcard llamada "cifs" (o como queráis), el path a esta carpeta sería /sdcard/CIFS y ejecutar este comando:

busybox mount -t cifs -o username=**poner_vuestro_usuario**,password=**pone r_vuestra_clave** //**La_IP**/*La compartición** /sdcard/CIFS

Un ejemplo con datos rellenados:

busybox mount -t cifs -o username=pitufo,password=cachoperro //192.168.1.10/Fotos /sdcard/CIFS

10.- Por último quitamos el R/W de /system (con el root explorer, por ejemplo)

IMPORTANTE: Los comando "insmod" son válidos hasta que reiniciamos el teléfono, si lo hacemos habrá que volverlos a ejecutar (Si alguien sabe como hacerlos "definitivos" que me lo diga y modifico esta guía).

Automatizar (con scripts) el montaje de una carpeta por CIFs
Dejando de lado el software "CifsManager" que es capaz de montar unidades CIFs en Android, os voy a contar como hacerlo a mano, lo que después nos servira para poder automatizar lo que nos venga en gana sin las limitaciones de ningún otro software.

Vamos a necesitar un software que sea capaz de ejecutar shell scripts (como ficheros BAT) desde el entorno gráfico, yo estoy usando el "GScript Lite", para ello tenemos que crear un fichero de texto (en nuestro PC, por ejemplo) con este contenido:

insmod /system/fs/slow-work.ko
insmod /system/fs/cifs.ko
busybox mount -t cifs -o username=pitufo,password=cachoperro //192.168.1.10/Fotos /mnt/sdcard/CIFS

Y lo guardamos como "MontajePitufo.sh" (sh es el equivalente a BAT en linux), lo subimos al teléfono, por ejemplo a /sdcard/MisScripts, vamos a "GScript Lite" y añadimos un script "add script", el contenido del script será una única línea:

sh /mnt/sdcard/MisScripts/MontajePitufo.sh

Nota: Prefiero no teclear el script a pelo en el GScript Lite porque no me fío de que después todo funcione correctamente al estar interactuando con cosas del sistema operativo.
Nota 2: No pasa nada por ejecutar el insmod varias veces, la primera hará su trabajo y las siguientes dirá que el módulo ya esta cargado.


Intalar RSYNC
El comando RSYNC es un viejo conocido de UNIX (para los que llevamos mucho tiempo trabajando con este sistema operativo), en un principio pensé que vendría con el busybox (como no) pero mi sorpresa fue que no era así...

Para comenzar diré que RSYNC es un comando muy completo que permite hacer copias entre equipos remotos, en particular me interesa para esta entrada que RSYNC es capaz de sincronizar 2 directorios de forma incremental (copiando solo lo estrictamente necesario) y además manteniendo todos los atributos de los ficheros (en particular la fecha/hora que es muy interesante para fotos y vídeos).

El primer handicap es conseguir el binario de este programa para android, por suerte -es lo que tiene el código abierto- hay gente que se ha dedicado a portarlo a Android, yo en particular encontré esta página:

RSync portado a Android: http://code.google.com/p/rsyncdroid/
El binario ya preparado: http://www.megaupload.com/?d=H2D8NQBM

Colocarlo en el sistema
El binario ya preparado (ya sea el descargado de la página original, que tendréis que preparar, o el que yo os he subido a megaupload) tenéis que depositarlo en /system/bin, pasos:
1.- Copias el binario -una vez preparado o descomprimido- en vuestra SD por el método que prefirais.
2.- Con el "Root explorer" montáis en R/W el /system.
3.- Copiáis el "rsync" desde la SD (donde lo hayáis dejado) a /system/bin (con el root explorer)
4.- Con el "Root explorer" montáis en R/O el /system.

Y ya está, a partir de ahora tenéis disponible el rsync para lo que necesitéis.


Sincronizar carpetas con RSYNC
Una vez disponible el comando y montado el volumen CIFs podemos ejecutar un comando como este:

rsync -vrt --ignore-existing --size-only --progress --human-readable /sdcard/DCIM/ /sdcard/CIFS/FotosDeMiMovil/DCIM/

Donde:

-v : Mostrar muchos detalles durante la sincronización
-r : Copia recursiva
-t : Mantener la información de fecha/hora en el archivo copiado
--ignore-existing : Ignorar si el fichero ya existe en destino
--size-only : Solo comparar tamaños para saber si los ficheros son iguales
--progress : Mostrar progreso durante la sincronización
--human-readable : Mostrar los datos en "formato humano"
/sdcard/DCIM/ : La carpeta de origen, para este ejemplo he puesto la de las fotos.
/sdcard/CIFS/FotosDeMiMovil/DCIM/ : El camino, compuesto por el punto de montaje (/sdcard/CIFS) y la ruta dentro de esa carpeta compartida (/FotosDeMiMovil/DCIM/) donde sincronizar la carpeta de origen

...más detalles más tarde... Los comentarios serán bien recibidos!!!

Script completo de sincronización
Aquí os dejo un script bastante "limpio" para que se pueda entender bien:


#***********************************
# Variables para configurar el script
#***********************************

unCaminoMod= /system/fs # Lugar donde tenemos los ficheros *.ko para el CIFs (Tenéis que poner el vuestro si es distinto)


ActivarCIFs()
{
insmod $unCaminoMod/slow-work.ko
insmod $unCaminoMod/cifs.ko
}


MontarCIFs() # Parámetros: unPuntoDeMontaje, unaCarpetaAMontar, unUsuario, unaClave
{
unPuntoDeMontaje=$1
unaCarpetaAMontar=$2
unUsuario=$3
unaClave=$4
busybox mount -t cifs -o username=$unUsuario,password=$unaClave $unaCarpetaAMontar $unPuntoDeMontaje
}

SincronizarCIFs() # Parámetros: unaCarpetaLocalASincronizar, unaCarpetaRemotaASincronizar
{
unaCarpetaLocalASincronizar=$1
unaCarpetaRemotaASincronizar=$2
rsync -vrt --ignore-existing --size-only --progress --human-readable $unaCarpetaLocalASincronizar/ $unaCarpetaRemotaASincronizar/
}


ActivarCIFs
MontarCIFs /sdcard/CIFS //192.168.1.100/UnaCarpetaRemota unUsuariounaClave# <- Tenéis que modificar esto con vuestros valores
SincronizarCIFs /sdcard/DCIM /sdcard/CIFS/CarpetaRemota # <- Tenéis que modificar esto con vuestros valores



Automatización One-Click para sincronizar lo que queramos
Unos pantallazos:
http://img710.imageshack.us/img710/1751/qttempvh2300.png

http://img35.imageshack.us/img35/4986/qttempza2300.png

Fijaros que me da erróres al insertar los módulos (File exists), es porque ya están insertados, no hay problema en realidad. Como ya esta sincronizada mi carpeta tampoco veo avanzas en el RSync, solo que se ha ejecutado.


Saludos!

djvicio89
09/06/11, 12:04:26
Interesantisimo el tutorial, tengo ganas de meterle mano, a ver para cuando ese con rsync que tiene que molar eso de tener sincronizado la carpeta que escojamos con un click =)

intronauta
09/06/11, 13:41:40
Con cifs manager es mucho más fácil que con scripts, no?

jnadie
09/06/11, 16:16:42
Con cifs manager es mucho más fácil que con scripts, no?

Si funciona... :pensando:

El problema es que la SGS2 no tiene soporte CIFs nativo, seguramente haciendo lo que comento funcionará el Cifs Manager...

intronauta
09/06/11, 18:29:48
No, claro, instalar los módulos y que sea cifs manager quien los cargue y gestione los puntos de montaje.

jnadie
10/06/11, 12:32:57
Actualizado el primer post

intronauta
10/06/11, 13:57:35
Ánimo con ello y a tu ritmo que el foro no se va a ninguna parte :ok:

jnadie
13/06/11, 09:48:44
Editado y completado, solo falta "el one click"

jnadie
13/06/11, 10:16:03
Pantallazos del "one click", aún me queda pulir explicaciones, pero ya esta completado.

arxus
13/06/11, 16:24:12
Muchas gracias por todo, la verdad es que siempre uso rsync entre mis linux y ahora también puedo con el móvil! en cuanto decida que rom me quedo, lo pruebo ;)

totapunk
08/03/14, 19:43:23
Decir que linux y android son sistemas unix... Es una burrada... Pero bueno.. Me viene muy bien el tuto grax