diff --git a/files/run_bandersnatch.py b/files/run_bandersnatch.py index c3636f8..e3a1ab3 100644 --- a/files/run_bandersnatch.py +++ b/files/run_bandersnatch.py @@ -15,8 +15,12 @@ # limitations under the License. import logging +import os +import re import requests import subprocess +import time +import urlparse def setup_logging(logger): @@ -28,6 +32,25 @@ def setup_logging(logger): logger.addHandler(ch) +def normalize(name): + return re.sub(r"[-_.]+", "-", name).lower() + + +def get_purge_urls(url): + res = urlparse.urlparse(url) + ret = [url] + ret.append(os.path.join(url, 'json')) + m = re.match('^/simple/([^/$]*)', res[2]) + if m: + package = normalize(m.group(1)) + new_url = list(res[:]) + new_url[2] = '/simple/%s/' % package + ret.append(urlparse.urlunparse(new_url)) + new_url[2] = '/simple/%s/json' % package + ret.append(urlparse.urlunparse(new_url)) + return ret + + def main(): logger = logging.getLogger('bandersnatch') setup_logging(logger) @@ -40,11 +63,14 @@ def main(): if 'Expected PyPI serial' in line: url = line.split("for request ")[1].split()[0] stale[url] = True - for url in stale.keys(): - logger.info('Purging %s' % url) - response = requests.request('PURGE', url) - if not response.ok: - logger.error('Failed to purge %s: %s' % (url, response.text)) + for stale_url in stale.keys(): + logger.info('Purging URLs for stale request %s' % stale_url) + for url in get_purge_urls(request_url): + logger.info('Purging %s' % url) + response = requests.request('PURGE', url) + if not response.ok: + logger.error('Failed to purge %s: %s' % (url, response.text)) + time.sleep(0.1) if __name__ == '__main__':