containers/scripts/crlite-signoff-tool.py (81 lines of code) (raw):
#!/usr/bin/env python3
import argparse
import hashlib
import subprocess
import sys
import tempfile
from pathlib import Path
import requests
import glog as log
from decouple import config
from kinto_http import Client
from kinto_http.patch_type import BasicPatch
from kinto_http.exceptions import KintoException
KINTO_RW_SERVER_URL = config(
"KINTO_RW_SERVER_URL", default="https://remote-settings.allizom.org/v1/"
)
KINTO_AUTH_USER = config("KINTO_AUTH_USER", default="")
KINTO_AUTH_PASSWORD = config("KINTO_AUTH_PASSWORD", default="")
KINTO_BUCKET = config("KINTO_BUCKET", default="security-state-staging")
KINTO_CRLITE_COLLECTION = config("KINTO_CRLITE_COLLECTION", default="cert-revocations")
KINTO_INTERMEDIATES_COLLECTION = config(
"KINTO_INTERMEDIATES_COLLECTION", default="intermediates"
)
KINTO_NOOP = config("KINTO_NOOP", default=False, cast=lambda x: bool(x))
class SignoffClient(Client):
def sign_collection(self, *, collection=None):
try:
resp = self.get_collection(id=collection)
except KintoException as e:
log.error(f"Couldn't determine {collection} review status: {e}")
raise e
original = resp.get("data")
if original is None:
raise KintoException("Malformed response from Kinto")
status = original.get("status")
if status is None:
raise KintoException("Malformed response from Kinto")
if status != "to-review":
log.info("Collection is not marked for review. Skipping.")
return
try:
resp = self.patch_collection(
original=original, changes=BasicPatch({"status": "to-sign"})
)
except KintoException as e:
log.error(f"Couldn't sign {collection}")
raise e
if __name__ == "__main__":
OK = 0
ERROR = 1
parser = argparse.ArgumentParser()
parser.add_argument(
"collection",
help="Collection to sign, either 'cert-revocations' or 'intermediates'",
)
parser.add_argument(
"--noop", default=KINTO_NOOP, action="store_true", help="Don't update Kinto"
)
args = parser.parse_args()
if args.collection == "cert-revocations":
collection = KINTO_CRLITE_COLLECTION
elif args.collection == "intermediates":
collection = KINTO_INTERMEDIATES_COLLECTION
else:
log.error(f"Unknown collection {args.collection}")
sys.exit(ERROR)
if args.noop:
log.info(f"Would sign off on {collection}, but noop requested")
sys.exit(OK)
auth = requests.auth.HTTPBasicAuth(KINTO_AUTH_USER, KINTO_AUTH_PASSWORD)
rw_client = SignoffClient(
server_url=KINTO_RW_SERVER_URL,
auth=auth,
bucket=KINTO_BUCKET,
retry=5,
)
try:
rw_client.sign_collection(collection=collection)
except KintoException as e:
log.error(f"Kinto exception: {e}")
sys.exit(ERROR)
sys.exit(OK)