#!/usr/bin/env python """Stitch together the letsencrypt-auto script. Implement a simple templating language in which {{ some/file }} turns into the contents of the file at ./pieces/some/file except for certain tokens which have other, special definitions. """ from os.path import abspath, dirname, join import re from sys import argv DIR = dirname(abspath(__file__)) def le_version(build_script_dir): """Return the version number stamped in letsencrypt/__init__.py.""" return re.search('''^__version__ = ['"](.+)['"].*''', file_contents(join(dirname(build_script_dir), 'letsencrypt', '__init__.py')), re.M).group(1) def file_contents(path): with open(path) as file: return file.read() def build(version=None, requirements=None): """Return the built contents of the letsencrypt-auto script. :arg version: The version to attach to the script. Default: the version of the letsencrypt package :arg requirements: The contents of the requirements file to embed. Default: contents of letsencrypt-auto-requirements.txt """ special_replacements = { 'LE_AUTO_VERSION': version or le_version(DIR) } if requirements: special_replacements['letsencrypt-auto-requirements.txt'] = requirements def replacer(match): token = match.group(1) if token in special_replacements: return special_replacements[token] else: return file_contents(join(DIR, 'pieces', token)) return re.sub(r'{{\s*([A-Za-z0-9_./-]+)\s*}}', replacer, file_contents(join(DIR, 'letsencrypt-auto.template'))) def main(): with open(join(DIR, 'letsencrypt-auto'), 'w') as out: out.write(build()) if __name__ == '__main__': main()