From 7df68dc0eb172b0d275692d70116e837083f870e Mon Sep 17 00:00:00 2001 From: Philipp Dieter Date: Sat, 12 Mar 2022 23:11:42 +0100 Subject: [PATCH] [TASK] Init --- check | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++ in | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ out | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 235 insertions(+) create mode 100755 check create mode 100755 in create mode 100755 out diff --git a/check b/check new file mode 100755 index 0000000..a8bd22c --- /dev/null +++ b/check @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +#pylint: disable=invalid-name +''' +aptly-resource out + +https://github.com/gopythongo/aptly-api-client + +HTTPS_PROXY="http://localhost:8080" \ +CURL_CA_BUNDLE="$HOME/.mitmproxy/mitmproxy-ca-cert.pem" \ +./out_test.py + +''' + +import json +import sys +import os +import functools +import requests +import semver + +root = os.path.dirname(os.path.abspath(__file__)) +config = json.loads(sys.stdin.read()) +directory = sys.argv[1] + +previous_version = False +if 'version' in config and 'version' in config['version']: + previous_version = config['version']['version'] + +package_file_uri = config['source']['repo_uri'] \ + + '/' + config['source']['repo'] \ + + '/dists' \ + + '/' + config['source']['distribution'] \ + + '/' + config['source']['component'] \ + + '/binary-' + config['source']['architecture'] \ + + '/Packages' + +packages_data = requests.get(package_file_uri).text +packages_data_blocks = packages_data.strip().split('\n\n') + +packages = [] +versions = [] + +for packages_data_block in packages_data_blocks: + packages_data_block_rows = packages_data_block.split('\n') + package = {} + for packages_data_block_row in packages_data_block_rows: + package_data = packages_data_block_row.split(': ') + + package[package_data[0]] = package_data[1] + + if package['Package'] != config['source']['package']: + continue + + if previous_version \ + and semver.compare(previous_version, package['Version']) > 0: + continue + + versions.append({ + 'version': package['Version'] + }) + +versions.reverse() + +def compare_func(a, b): + return semver.compare(a['version'], b['version']) + +versions.sort(key=functools.cmp_to_key(compare_func)) + +if not previous_version and versions: + versions = [versions[-1]] + +print(json.dumps(versions)) diff --git a/in b/in new file mode 100755 index 0000000..04c2717 --- /dev/null +++ b/in @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +#pylint: disable=invalid-name +''' +aptly-resource out + +https://github.com/gopythongo/aptly-api-client + +HTTPS_PROXY="http://localhost:8080" \ +CURL_CA_BUNDLE="$HOME/.mitmproxy/mitmproxy-ca-cert.pem" \ +./out_test.py + +''' + +import json +import sys +import os +import shutil +import requests +import semver + +root = os.path.dirname(os.path.abspath(__file__)) +config = json.loads(sys.stdin.read()) +directory = sys.argv[1] + +version = config['version']['version'] + +package_file_uri = config['source']['repo_uri'] \ + + '/' + config['source']['repo'] \ + + '/dists' \ + + '/' + config['source']['distribution'] \ + + '/' + config['source']['component'] \ + + '/binary-' + config['source']['architecture'] \ + + '/Packages' + +packages_data = requests.get(package_file_uri).text +packages_data_blocks = packages_data.strip().split('\n\n') + +match = False + +for packages_data_block in packages_data_blocks: + packages_data_block_rows = packages_data_block.split('\n') + package = {} + for packages_data_block_row in packages_data_block_rows: + package_data = packages_data_block_row.split(': ') + + package[package_data[0]] = package_data[1] + + if package['Package'] != config['source']['package']: + continue + + if semver.compare(version, package['Version']) != 0: + continue + + match = package + +if not match: + sys.exit('Package not found') + +package_uri = config['source']['repo_uri'] \ + + '/' + config['source']['repo'] \ + + '/' + match['Filename'] + +package_filename = package_uri.rsplit('/', 1)[1] +package_filepath = directory + '/' + package_filename + +with requests.get(package_uri, stream = True) as r: + with open(package_filepath, 'wb') as f: + shutil.copyfileobj(r.raw, f) + +with open(directory + '/filemane', 'wb') as f: + f.write(package_filename.encode()) + +print(json.dumps({ + 'version': {'version': match['Version']}, + 'metadata': [ + {'name': 'sha256', 'value': match['SHA256']} + ] + })) diff --git a/out b/out new file mode 100755 index 0000000..5c24317 --- /dev/null +++ b/out @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 +''' +aptly-resource out + +https://github.com/gopythongo/aptly-api-client + +HTTPS_PROXY="http://localhost:8080" \ +CURL_CA_BUNDLE="$HOME/.mitmproxy/mitmproxy-ca-cert.pem" \ +./out_test.py + +''' + +import json +import sys +import os +import hashlib +from pprint import pprint +from aptly_api import Client +from aptly_api.base import AptlyAPIException + +BLOCK_SIZE = 65536 + +root = os.path.dirname(os.path.abspath(__file__)) +config = json.loads(sys.stdin.read()) +directory = sys.argv[1] + +aptly = Client( + config['source']['api_uri'], + http_auth = ( + config['source']['username'], + config['source']['password'] + ), + timeout = config['source']['timeout'] + ) + +try: + repo = aptly.repos.show(config['source']['repo']) +except AptlyAPIException as e: + if e.status_code != 404: + raise e + aptly.repos.create( + reponame = config['source']['repo'], + default_distribution = config['source']['distribution'], + default_component = config['source']['component'] + ) + +with open( + directory + '/' + config['params']['archive_file'], + 'r', + encoding = 'utf8' + ) as f: + archive_path = f.read().strip() + + +archive_filename = archive_path.split('/', -1)[-1] +archive_filename_parts = archive_filename.split('_') + + + +file_hash = hashlib.sha256() +with open(directory + '/' + archive_filename, 'rb') as f: + fb = f.read(BLOCK_SIZE) + while len(fb) > 0: + file_hash.update(fb) + fb = f.read(BLOCK_SIZE) + + +#aptly.files.upload( +# config['source']['repo'], +# directory + '/' + archive_path +# ) + +aptly.repos.add_uploaded_file( + reponame = config['source']['repo'], + dir = config['source']['repo'], + remove_processed_files = False, + force_replace = True + ) + +print(json.dumps({ + 'version': {'version': archive_filename_parts[1]}, + 'metadata': [ + {'name': 'sha256', 'value': file_hash.hexdigest()} + ] + }))