From 9412f0c81c79a1f50ed74b63f9d0c4472cbe8f99 Mon Sep 17 00:00:00 2001 From: JustAnotherArchivist Date: Tue, 17 Aug 2021 17:25:01 +0000 Subject: [PATCH] Add azure-storage-list --- azure-storage-list | 114 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100755 azure-storage-list diff --git a/azure-storage-list b/azure-storage-list new file mode 100755 index 0000000..03bf8ff --- /dev/null +++ b/azure-storage-list @@ -0,0 +1,114 @@ +#!/usr/bin/env python3 +import html +import http.client +import os +import shlex +import ssl +import sys +import urllib.parse + + +# Arguments +i = 1 +withListUrls = False +listUrlsFD = None +startMarker = None +format = '{url}' +args = [] +while i < len(sys.argv): + arg = sys.argv[i] + if arg == '--help': + print('azure-storage-list [options] CONTAINERURL', file = sys.stderr) + print('', file = sys.stderr) + print('Options:', file = sys.stderr) + print(f' --format FORMAT Modify the output format; FORMAT defaults to {format!r}; available fields: name, url, and all fields returned by Azure (e.g. Content-Length, Last-Modified)', file = sys.stderr) + print( ' --marker MARKER Start with a marker instead of from the beginning', file = sys.stderr) + print( ' --with-list-urls Enables printing the list URLs retrieved to FD 3', file = sys.stderr) + sys.exit(1) + elif arg == '--with-list-urls': + withListUrls = True + try: + listUrlsFD = os.fdopen(3, 'w') + except OSError: + print('Error: FD 3 not open', file = sys.stderr) + sys.exit(1) + elif arg == '--marker': + startMarker = sys.argv[i + 1] + i += 1 + elif arg == '--format': + format = sys.argv[i + 1] + i += 1 + else: + args.append(arg) + i += 1 +assert len(args) == 1, 'Need one argument: container URL' +baseUrl = args[0] +assert baseUrl.startswith('http://') or baseUrl.startswith('https://'), 'Argument does not look like an HTTP URL' +if '/' not in baseUrl.split('://', 1)[1] or not baseUrl.endswith('/'): + baseUrl = f'{baseUrl}/' +hostname = baseUrl.split('://', 1)[1].split('/', 1)[0] + + +conn = http.client.HTTPSConnection(hostname, context = ssl._create_unverified_context()) +params = {'restype': 'container', 'comp': 'list'} +if startMarker is not None: + params['marker'] = startMarker +while True: + queryString = urllib.parse.urlencode(params) + url = f'{baseUrl}?{queryString}' + if withListUrls: + print(f'{url}', file = listUrlsFD) + conn.request('GET', url[url.index('/', 8):]) + resp = conn.getresponse() + body = resp.read() + if not body.startswith(b'\xef\xbb\xbf