Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save chimpdude/2e4673d8554cf3a29856d0d6c85ed20a to your computer and use it in GitHub Desktop.
Save chimpdude/2e4673d8554cf3a29856d0d6c85ed20a to your computer and use it in GitHub Desktop.
Generate random machine ids and send to reMarkable update server to find an ID that is approved for a firmware update.
#!/usr/bin/env python3
import time
import uuid
import random
import requests
# This script is tested and working as of September 2020.
# It is only a slightly modified version of leezu's script: https://gist.github.com/leezu/2efb1533d453b70db406b58eb6e3a2af
# leezu gets 99.9% of the credit
# INSTRUCTIONS:
# Run this script on any computer with internet and python3 installed.
# Once a machine id is found, see instructions at the end of this script (instructions will be printed to terminal).
# not sure if the UUID of these ones matter
orig_appid = "98DA7DF2-4E3E-4744-9DE6-EC931886ABAB"
orig_bootid = "fddcd3cd-3bf6-4cee-9a0a-31577b58b6da"
# these two DO matter
orig_machineid = "b21b4221836c4fd0967139ae9aef0612" #example id, run 'cat /etc/machine-id' on tablet for yours
orig_oem = "RM102-939-99999" #find in /home/root/.config/remarkable/xochitl.conf as 'deviceid=RM102-xxx-xxxxx'
# this is the request to send; fill your tablet's current software version and the desired update version
cur_firmware_ver = "2.3.0.48"
des_firmware_ver = "2.4.1.30"
req = """<?xml version="1.0" encoding="UTF-8"?>
<request protocol="3.0" version="{des_firmware}" requestid="{{{requestid}}}" sessionid="{{{sessionid}}}" updaterversion="0.4.2" installsource="{installsource}" ismachine="1">
<os version="zg" platform="reMarkable" sp="0.0.4.81_armv7l" arch="armv7l"></os>
<app appid="{{{appid}}}" version="{cur_firmware}" track="Prod" ap="Prod" bootid="{{{bootid}}}" oem="{oem}" oemversion="2.1.3" alephversion="{cur_firmware}" machineid="{machineid}" lang="en-US" board="" hardware_class="" delta_okay="false" nextversion="0.0.0" brand="" client="" >
<ping active="1"></ping>
<updatecheck></updatecheck>
<event eventtype="3" eventresult="2" previousversion=""></event>
</app>
</request>"""
url = "https://get-updates.cloud.remarkable.engineering/service/update2"
def get_uuid():
"""Generate a random UUID.
update_engine/utils.cc just reads this from /proc/sys/kernel/random/uuid
"""
return str(uuid.uuid4())
def get_oem():
base = "RM102"
middle = "939"
end = str(random.randint(50000, 70000))
return "-".join([base,middle,end])
while True:
params = {
"installsource": "scheduler", # or "ondemandupdate"
"cur_firmware": cur_firmware_ver,
"des_firmware": des_firmware_ver,
"requestid": get_uuid(),
"sessionid": get_uuid(),
"machineid": get_uuid().replace("-", ""),
"oem": get_oem(),
"bootid": orig_bootid,
"appid": orig_appid
}
req_fulltext = req.format(**params)
resp = requests.post(url, req_fulltext)
if "Bad Request" in resp.text:
msg = f"Bad request. Request content:\n{req_fulltext}"
raise requests.RequestException(msg)
if len(resp.text) != 0:
if "noupdate" in resp.text:
print(f"\nNo update ---- OEM: {params['oem']}, machine-id: {params['machineid']} ", end='')
time.sleep(1)
else:
print("Found params to get update: ")
print(f"{params}\n")
print(resp.text)
break
else:
print(".", end='', flush=True)
# there is a limit to how many requests can be sent to their server
# limit was found to be 3 requests every 20 sec
# decreasing the delay below will just result in more empty responses
time.sleep(20)
print(f"\nNow replace your tablet's machine-id with: {params['machineid']}")
print("You can do that by running this command on your tablet:\n")
print(f"\tmv /etc/machine-id /etc/machine-id_orig && echo {params['machineid']} > /etc/machine-id\n")
print("After that, on tablet go to Settings -> Software -> set 'Automatic updates' to 'On' -> press 'Check for updates'")
print("Then you should be able to download the new firmware update!")
@AaronDavidSchneider
Copy link

AaronDavidSchneider commented Oct 30, 2020

To get this to work with the current update on a rm1, I need to change the get_oem function to use RM100 and the middle part found as well as lines 21,22 and 26,27. Is that correct?
Edit: It worked. Thanks!

@chimpdude
Copy link
Author

Glad it worked. :) Did you need to change the oem to get it to work?

This is actually the script I used for my RM1. I forgot that different RM1 tablets have different oem IDs; mine starts with RM102. My new RM2 instead starts with RM110.

@AaronDavidSchneider
Copy link

AaronDavidSchneider commented Oct 30, 2020

Yes, i changed the oem base and middle to adapt to my device (see the fork of your gist).

After two hours or so of running this script on my raspberry pi I got a machine-id that
worked.

Thanks again!

@yaofeiwang
Copy link

sorry, i have a question that i cannot see the deviceid in '/home/root/.config/remarkable/xochitl.conf'. And my device is remarkable2. How can I use this script?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment