#!/usr/bin/env python3 import html import http.client import json import os import shlex import ssl import sys import urllib.parse # Arguments i = 1 withListUrls = False listUrlsFD = None startMarker = None format = '{url}' jsonl = False 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( ' --jsonl Output JSONL instead of formatted lines', 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 elif arg == '--jsonl': jsonl = True 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