Skip to content

Instantly share code, notes, and snippets.

@ObjectBoxPC
Last active March 26, 2025 07:35
Show Gist options
  • Save ObjectBoxPC/3153c21866136502d60d7ee4299b61cd to your computer and use it in GitHub Desktop.
Save ObjectBoxPC/3153c21866136502d60d7ee4299b61cd to your computer and use it in GitHub Desktop.
Automatically update ungoogled-chromium on Debian
#!/usr/bin/env python3
import json
import re
import shutil
import subprocess
import tempfile
import urllib.request
USER_AGENT = "Ungoogled-Chromium-Debian-Update/1.0"
GITHUB_RELEASES_API = "https://api.github.com/repos/berkley4/ungoogled-chromium-debian/releases?per_page=10"
RELEASE_NAME_REGEX = re.compile("Unstable ([0-9\\.]+).*")
ASSET_NAME_REGEX = re.compile("ungoogled-chromium_.*_amd64\\.deb")
VERSION_OUTPUT_REGEX = re.compile("Chromium ([0-9\\.]+).*")
def request_json(url):
headers = { "User-Agent": USER_AGENT, "Accept": "application/json" }
request = urllib.request.Request(url, headers=headers)
with urllib.request.urlopen(request) as json_result:
return json.load(json_result)
def open_download(url):
headers = { "User-Agent": USER_AGENT }
request = urllib.request.Request(url, headers=headers)
return urllib.request.urlopen(request)
def get_release_from_api():
releases = request_json(GITHUB_RELEASES_API)
for release in releases:
release_name_match = RELEASE_NAME_REGEX.match(release["name"])
if release_name_match:
release_version = release_name_match.group(1)
release_assets = release["assets"]
for asset in release_assets:
if ASSET_NAME_REGEX.match(asset["name"]):
return (release_version, asset["browser_download_url"])
return None
def get_version_from_system():
version_output = subprocess.run(["chromium", "--version"], capture_output=True, check=True, encoding="utf-8")
version_match = VERSION_OUTPUT_REGEX.match(version_output.stdout)
return version_match.group(1) if version_match else None
api_release = get_release_from_api()
system_version = get_version_from_system()
if api_release:
(api_version, download_url) = api_release
if api_version == system_version:
print("Ungoogled Chromium appears to be up to date")
else:
print("Updated version available: {}".format(api_version))
with open_download(download_url) as download_file, \
tempfile.NamedTemporaryFile(suffix=".deb") as temp_file:
shutil.copyfileobj(download_file, temp_file)
subprocess.run(["sudo", "apt-get", "install", "-y", temp_file.name], check=True)
else:
print("Could not get version from release feed")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment