aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--noRMS-apt.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/noRMS-apt.py b/noRMS-apt.py
new file mode 100644
index 0000000..fdcea92
--- /dev/null
+++ b/noRMS-apt.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python3
+import argparse
+from pathlib import Path
+import re
+import subprocess
+import sys
+import urllib.parse
+
+parser = argparse.ArgumentParser(
+ description="""
+ noRMS for APT-based systems (Debian, Ubuntu, etc).
+ Checks to see which installed packages are attached to RMS (i.e. the FSF and GNU).
+ """
+)
+parser.add_argument('--verbose', '-v', help='Print more stuff', action='count', default=0)
+args = parser.parse_args()
+
+verbose = args.verbose
+
+PACKAGE = re.compile(r'^(?P<name>[^/ ]+).*$')
+
+# from https://directory.fsf.org/wiki/GNU:
+# `new Set([].map.call(document.querySelectorAll('table tr td:nth-child(3)'), x => new URL(x.innerText).host))`
+GNU_DOMAINS = set([
+ "www.gnu.org",
+ "puszcza.gnu.org.ua",
+ "gcc.gnu.org",
+ "gcompris.net",
+ "gmplib.org",
+ # "www.gnome.org", # the GNOME foundation signed https://rms-open-letter.github.io/ so they're OK
+ "www.gnucash.org",
+ "gnunet.org",
+ "www.gnuhealth.org",
+ "www.list.org",
+ "www.midnight-commander.org",
+ "mediagoblin.org",
+ "www.multiprecision.org",
+ "www.mpfr.org",
+ "www.nano-editor.org",
+ "jemarch.net",
+ "www.r-project.org",
+ "savannah.gnu.org",
+ "www.texmacs.org",
+ "unifoundry.com"
+])
+
+rms_count = 0
+
+all_packages = subprocess.check_output(['apt', 'list', '--installed'], text=True)
+packages = [PACKAGE.match(line)['name'] for line in all_packages.splitlines() if line != 'Listing...']
+all_info = subprocess.check_output(['apt', 'show', *packages], text=True)
+infos = [x for x in all_info.split('\n\n') if len(x.strip()) > 0]
+
+package_homepage_map = dict()
+for info in infos:
+ lines = info.splitlines()
+ package_lines = [line for line in lines if line.startswith('Package: ')]
+ if len(package_lines) == 0:
+ print('what uhhhh the fuck?')
+ print(info)
+ print()
+ continue
+ package = package_lines[0][len('Package: '):]
+
+ homepage_lines = [line for line in info.splitlines() if line.startswith('Homepage: ')]
+ if len(homepage_lines) == 0:
+ if verbose >= 1:
+ print(f'no webpage found for {package}, skipping')
+ continue
+ homepage = homepage_lines[0][len('Homepage: '):]
+
+ package_homepage_map[package] = homepage
+
+for package in packages:
+ if package not in package_homepage_map:
+ continue
+ webpage = package_homepage_map[package]
+ parsed_url = urllib.parse.urlparse(webpage)
+ host = parsed_url.netloc
+ if verbose >= 2:
+ print('package:', package, 'host:', host, 'webpage:', webpage)
+ if host in GNU_DOMAINS:
+ print(f'error: {package} is GNU software (website is {webpage})')
+ rms_count += 1
+
+print()
+print('Total RMS-affiliated packages found:', rms_count)
+
+if rms_count == 0:
+ print('Hell yeah!')
+ sys.exit(0)
+else:
+ sys.exit(1)