Files
jobtrackingapp/docs/automation/handoffs/pre-phase10/verify_git.py
T

66 lines
3.5 KiB
Python

"""Bounded read-only Gitea diagnostics; credentials remain in Git's configured helper."""
import datetime
import json
from pathlib import Path
import socket
import ssl
import subprocess
import urllib.error
import urllib.request
def main():
import argparse
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--output', required=True, type=Path)
args = parser.parse_args()
assert not args.output.exists(), 'Preserve earlier observations'
def git(*command):
result = subprocess.run(['rtk', 'proxy', 'git', *command], text=True, capture_output=True, timeout=45)
return result
url = git('remote', 'get-url', 'origin').stdout.strip()
assert url == 'https://git.cesnimda.uk/cesnimda/jobtrackingapp.git'
record = dict(observedUtc=datetime.datetime.now(datetime.timezone.utc).isoformat(), remote=url,
localCommit=git('rev-parse', 'HEAD').stdout.strip(), tlsVerificationDisabled=False)
try:
addresses = sorted({item[4][0] for item in socket.getaddrinfo('git.cesnimda.uk', 443, type=socket.SOCK_STREAM)})
record['dns'] = dict(status='PASS', addresses=addresses)
except OSError as error:
record['dns'] = dict(status='BLOCKED', errorType=type(error).__name__)
try:
with socket.create_connection(('git.cesnimda.uk', 443), timeout=5):
record['tcp443'] = dict(status='PASS')
except OSError as error:
record['tcp443'] = dict(status='BLOCKED', errorType=type(error).__name__)
try:
with socket.create_connection(('git.cesnimda.uk', 443), timeout=5) as connection:
with ssl.create_default_context().wrap_socket(connection, server_hostname='git.cesnimda.uk') as secured:
record['tls'] = dict(status='PASS', protocol=secured.version(), certificateVerified=True)
except OSError as error:
record['tls'] = dict(status='BLOCKED', errorType=type(error).__name__, certificateVerified=False)
class NoRedirect(urllib.request.HTTPRedirectHandler):
def redirect_request(self, *unused):
return None
try:
with urllib.request.build_opener(NoRedirect()).open('https://git.cesnimda.uk/api/v1/version', timeout=6) as response:
record['https'] = dict(status='PASS', httpStatus=response.status)
except (OSError, urllib.error.URLError) as error:
record['https'] = dict(status='BLOCKED', errorType=type(error).__name__, httpStatus=getattr(error, 'code', None))
command = ['ls-remote', '--exit-code', 'origin', 'refs/heads/test/pre-phase10-ux-acceptance', 'refs/heads/planning/int-global-jobs-00']
try:
result = git(*command)
refs = dict(reversed(line.split()) for line in result.stdout.splitlines() if len(line.split()) == 2)
record['git'] = dict(argv=['git', *command], exitCode=result.returncode, refs=refs,
authentication='REACHED' if result.returncode == 0 else 'NOT_ESTABLISHED')
except subprocess.TimeoutExpired:
record['git'] = dict(argv=['git', *command], exitCode=None, refs={}, authentication='NOT_ESTABLISHED', timeoutSeconds=45)
record['publication'] = 'VERIFIED' if record['git']['refs'].get('refs/heads/test/pre-phase10-ux-acceptance') == record['localCommit'] else 'BLOCKED'
args.output.parent.mkdir(parents=True, exist_ok=True)
args.output.write_text(json.dumps(record, indent=2) + '\n', encoding='utf-8')
print(json.dumps(record))
return 0
if __name__ == '__main__':
raise SystemExit(main())