Remarkable 2: Hacks & servidor propio

En este documento (con fines educativos), vamos a poder ver cómo se puede cambiar un poquito el sistema que trae la Remarkable 2 para liberar todas sus funcionalidades, además de cómo poder montar nuestro propio servidor cloud para sincronizar, compartir la pantalla, documentos…

 

Como creo que muchos habréis escuchado el dispositivo Remarkable 2 es una pasada para los que nos gusta tomar notas de manera manual. Un dispositivo táctil, de tinta electrónica, que permite tener distintos cuadernos para organizarte como quieras, distintas puntas, grosores… muy muy completo. Al tacto muy similar al papel, puedes subrayar, mover, copiar… La verdad que el hardware es una pasada, y el ‘problema’ digamos lo tiene el software, que depende que funcionalidades te interesen pues requiere de suscripción anual, y si el precio fuera accesible, pues bueno… La posibilidad de compartir la pantalla, enviar un documento por mail, convertir a OCR lo que se ha escrito…

Para evitar todo esto podremos cambiarle por un lado el sistema y habilitarle las funciones que vienen desbloqueadas, y por el otro lado montarnos nuestro propio servidor de Remarkable para realizar las funciones de almacenamiento y sincronización de nuestros cuadernos, notas, libros… además de poder enviar docs o compartir la pantalla, entre otros.

 

Actualizando el software de la Remarkable 2,

 

Empezamos antes de nada actualizando el firmware de la Remarkable 2 hasta la versión máxima que encontremos que tenga la versión ‘hackeada’. Os dejo anotados los pasos que seguí cuando la adquirí hace 1-2 años. En esta web encontraréis las instrucciones de ddvk (Dobrin von Känel) para el hacks y en esta otra para el proceso del update.

 

En una MV con linux nos descargamos el repo de ddvk que permite actualizar la Remarkable 2:

cd /tmp/
git clone https://github.com/ddvk/remarkable-update.git

 

De aquí nos bajaremos la versión más reciente para nuestra Remarkable 2 y lo guardamos en la carpeta ‘updates’ que habrá creado el paso anterior. Arrancamos ya pues el servicio que ofrece la actualización:

cd remarkable-update
python3 serve.py

2.12.2.573
Using hostname, to override use: ./serve.py hostname
Device should use:  http://OS-XXX-01.openservices.local:8000/
Available updates: {'reMarkable2': ('2.12.2.573', '2.12.2.573_reMarkable2-XnE1EL7ojK-.signed')}
Starting fake updater: 8000

 

En mi caso la Remarkable 2 traía la versión 2.10.4.5 y la vamos a subir a la 2.12.2.573. Ahora vamos a la Remarkable 2, nos logueamos en ella por SSH con root y nuestra contraseña (que la encontraremos en Settings > Help > Copyright and Licenses, debajo de GPLv3 Compliance). Editamos el fichero de configuración de actualización con vim o nano con la URL que nos dió el paso anterior, grabamos y salimos:

vim /usr/share/remarkable/update.conf
    SERVER=http://OS-XXX-01.openservices.local:8000
:wq

 

Desde el shell de la Remarkable 2 podemos forzar a actualizar, levantamos el servicio, chequeamos si hay updates y vemos el proceso de actualización:

systemctl start update-engine
update_engine_client -check_for_update
journalctl -u update-engine -f

 

Tras ello, reiniciamos y listos para aplicarle el hack!

 

Cambiando el software al de hacks,

Bien, ahora que hemos actualizado la Remarkable 2 a una versión compatible con hacks, pues podemos comenzar a aplicarlo. Sin miedo, ya que cuando acabemos podremos elegir si aplicaremos los cambios o no, tras trastear un poco con el dispositivo.

Volvemos a loguearnos en la Remarkable 2 con SSH como root y la contraseña que tendremos ya anotada en un lugar seguro. Y ejecutamos:

sh -c "$(wget https://raw.githubusercontent.com/ddvk/remarkable-hacks/master/patch.sh -O-)"

 

Y empezará:

Connecting to raw.githubusercontent.com (185.199.111.133:443)
wget: note: TLS certificate validation not implemented
writing to stdout
-                    100% |***********************************************************************************************************************************************************************************************************| 10013  0:00:00 ETA
written to stdout
Disk space seems to be enough.
rM2 Version 2.12.2.573 - patch_31.2.01
Connecting to github.com (140.82.121.4:443)
wget: note: TLS certificate validation not implemented
Connecting to raw.githubusercontent.com (185.199.109.133:443)
saving to '/home/rmhacks/patch_31.2.01'
patch_31.2.01        100% |***********************************************************************************************************************************************************************************************************| 88907  0:00:00 ETA
'/home/rmhacks/patch_31.2.01' saved
Connecting to github.com (140.82.121.4:443)
wget: note: TLS certificate validation not implemented
Connecting to raw.githubusercontent.com (185.199.110.133:443)
saving to '/home/rmhacks/patch.sh'
patch.sh             100% |***********************************************************************************************************************************************************************************************************| 10013  0:00:00 ETA
'/home/rmhacks/patch.sh' saved
Failed to stop rm2fb.service: Unit rm2fb.service not loaded.
killall: remarkable-shutdown: no process killed
killall: xochitl: no process killed
Cleaning up...

**********************************************
Trying to start the patched version...
You can play around, press CTRL-C when done!
**********************************************

Registering exit handlers
Reading waveforms from /usr/share/remarkable/320_R400_AF8F11_ED103TC2C5_VB3300-KCD_TC.wbf
Running INIT (111 phases)
15:02:22.065 qt.qpa.input             evdevtouch: Using device discovery
15:02:22.072 qt.qpa.input             evdevtouch: Adding device at /dev/input/event2
15:02:22.072 qt.qpa.input             evdevtouch: Using device /dev/input/event2
15:02:22.073 qt.qpa.input             evdevtouch: /dev/input/event2: Protocol type B  (multi), filtered=no
15:02:22.073 qt.qpa.input             evdevtouch: /dev/input/event2: min X: 0 max X: 1403
15:02:22.074 qt.qpa.input             evdevtouch: /dev/input/event2: min Y: 0 max Y: 1871
15:02:22.074 qt.qpa.input             evdevtouch: /dev/input/event2: min pressure: 0 max pressure: 0
15:02:22.074 qt.qpa.input             evdevtouch: /dev/input/event2: device name: pt_mt
15:02:27.521 qt.qpa.input             evdevtouch: Updating QInputDeviceManager device count: 1 touch devices, 0 pending handler(s)
^CShutting down...
Cleaning up...
If everything worked, do you want to make it permanent [N/y]? N
Use the /home/rmhacks/xochitl.patched binary if you change your mind / provide it if it segfaulted.
Starting the original...

 

Esto arranca la Remarkable 2 con el hack, podremos parar el proceso con CTR+C cuando queramos y nos preguntará si queremos guardarlo en memoria N/y.

Si N se reinicia con el anterior firmware.

 

Montando nuestro servidor nube propio,

Bien, podremos montar en una MV o en una Raspberry Pi, o en una NAs… nuestro propio servidor de Remarkable 2, para lo que hemos dicho antes, almacenar y sincronizar los documentos, la posibilidad de enviarlos por mail, compartir la pantalla, etc…

Esto lo haremos con otra de las utilidades de ddvk, con rmfakecloud, un contenedor de Docker que en un periquete lo tendremos corriendo.

Antes de empezar, tenemos que crearnos una cuenta en: https://developer.myscript.com y tras activar la cuenta, crearemos una app en https://developer.myscript.com/dashboard >Cloud recognition > Manage > Create application (o ir a https://cloud.myscript.com/#/user/applicationList). En mi caso la llamo ‘App para rmfakecloud’. La abrimos y > Generate application Key’, y debemos anotar el ‘Application Key’ (formato xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) y el HMAC Key: (mismo formato).

 

En una máquina donde tengamos Docker creamos el directorio para los datos y levantamos el contenedor de rmfakecloud, debiendo modificar algún dato como véis:

sudo mkdir /mnt/data-rmfakecloud

sudo docker run -p 3000:3000 -v /mnt/data-rmfakecloud:/data -e JWT_SECRET_KEY='XXXXXXXX' \
-e RMAPI_HWR_APPLICATIONKEY='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx' \
-e RMAPI_HWR_HMAC='xxxxxxxx-xxxx-xxxx-xxxx-' \
-e RM_SMTP_SERVER='mail.midominio.eso:465' \
-e RM_SMTP_USERNAME='usuario@midominio.eso' \
-e RM_SMTP_PASSWORD='contraseña' \
-e RM_SMTP_FROM='usuario@midominio.eso' \
-e RM_SMTP_INSECURE_TLS \
-e RM_SMTP_STARTTLS \
ddvk/rmfakecloud

 

Levantamos el contenedor y le indicamos que se inicie siempre:

sudo docker start rmfakecloud
sudo docker update --restart unless-stopped rmfakecloud

 

Abrimos una web contra la URL del contenedor en formato http://FQDN_DOCKER:3000 y el primer usuario con el que entremos, se creará.

 

 

Nos vamos a la Remarkable 2 y desde la shell, desde un Putty logueados como root ejecutamos:

sh -c "$(wget https://raw.githubusercontent.com/ddvk/rmfakecloud/master/scripts/device/automagic.sh -O-)"

 

Y saldrá algo como esto:

root@reMarkable:~# sh -c "$(wget https://raw.githubusercontent.com/ddvk/rmfakecloud/master/scripts/device/automagic.sh -O-)"
Connecting to raw.githubusercontent.com (185.199.109.133:443)
wget: note: TLS certificate validation not implemented
writing to stdout
-                    100% |***********************************************************************************************************************************************************************************************************|   275  0:00:00 ETA
written to stdout
Getting the installer...
Connecting to github.com (140.82.121.3:443)
wget: note: TLS certificate validation not implemented
Connecting to objects.githubusercontent.com (185.199.108.133:443)
saving to 'installer.sh'
installer.sh         100% |***********************************************************************************************************************************************************************************************************| 2000k  0:00:00 ETA
'installer.sh' saved
Running the installer...
Extracting embedded binary...
Failed to stop proxy.service: Unit proxy.service not loaded.
~/rmfakecloud ~
Generating CA key and crt...
Generating RSA private key, 2048 bit long modulus (2 primes)
.....................................+++++
...................................................+++++
e is 65537 (0x010001)
Generating private key...
Generating RSA private key, 2048 bit long modulus (2 primes)
.....+++++
................................+++++
e is 65537 (0x010001)
Generating pub key...
writing RSA key
Generating csr and crt...
Signature ok
subject=C = AA, ST = QQ, L = JJ, O = the culture, CN = *.appspot.com
Getting CA Private Key
Generation complete!
Clearing symlinks in /etc/ssl/certs...
done.
Updating certificates in /etc/ssl/certs...
rehash: warning: skipping ca-certificates.crt,it does not contain exactly one certificate or CRL
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
Enter your own cloud url [http(s)://somehost:port] >

 

Nos está solicitando que debemos introducir la URL con el servidor propio que acabamos de montar en formato: http://FQDN_DOCKER:3000 y le damos al Enter, ojo que aquí podremos usar un FQDN público si es que queremos que la Remarkable 2 pueda acceder a él desde Internet. Tras el Enter, seguirá…

Setting cloud sync to: http://FQDN_DOCKER:3000
Created symlink /etc/systemd/system/multi-user.target.wants/proxy.service → /etc/systemd/system/proxy.service.
Patching /etc/hosts
Stoping xochitl..
Fixing sync status...
Starting xochitl...
~

 

En la Remarkable 2 vamos a Settings > General > Account > Connect to reMarkable cloud > Connect > y nos pedirá un código de estos OT que conseguiremos en http://FQDN_DOCKER:3000/generatecode

Lo introduciremos y listo! Ya nos saldrá nuestra cuenta activada y con el Subscription Plan de tipo ‘Connect’! Ahora lo único recuerda que no se actualice sola la Remarkable 2, búscalo en los Settings.

 

Por si no lo conocéis también existe una app de Remarkable para el PC, para nuestro escritorio, para ver los documentos, acceder a la pantalla compartida… para ello deberemos tener en cuenta que el FQDN ‘local.appspot.com’ deberá responder contra nuestro contenedor de rmfakecloud o un proxy inverso que montemos en Nginx.

 

Espero os haya resultado interesante, la idea de este documento es ver las posibilidades de estos hacks, y ni mucho menos fomentar la piratería ni esas cosas chungas. Como siempre, desearos que os vaya muy bien, que seais felices y comáis perdices!

Venga lo último… Podéis comprar como lápiz alguno barato en Amazon tipo este de STAEDTLER, y queda muy friki… los hay con borragomas atrás para borrar directamente…

Ahora sí, ¡un abrazo!

 

Héctor Herrero