Automatically requests Let's Encrypt certificates for containers with a vhost label
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

generate.py 1.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #!/usr/bin/env python3
  2. from collections import defaultdict
  3. import argparse
  4. import etcdlib
  5. import os
  6. parser = argparse.ArgumentParser()
  7. parser.add_argument('--name', help='Name of the docker host to request certificates for', default='unknown')
  8. parser.add_argument('--etcd-port', type=int, help='Port to connect to etcd on', default=2379)
  9. parser.add_argument('--etcd-host', help='Host to connect to etcd on', default='etcd')
  10. parser.add_argument('--etcd-prefix', help='Prefix to use when retrieving keys from etcd', default='/docker')
  11. args = parser.parse_args()
  12. fetcher = etcdlib.Connection(args.etcd_host, args.etcd_port, args.etcd_prefix)
  13. while True:
  14. domains = defaultdict(set)
  15. for container, values in fetcher.get_label('com.chameth.vhost').items():
  16. if values:
  17. parts = values.split(',')
  18. domains[parts[0].strip()] |= set([] if len(parts) == 1 else parts[1:])
  19. with open('/letsencrypt/domains.txt.new', 'w') as f:
  20. print('Writing domains.txt...')
  21. for domain, alts in domains.items():
  22. print('%s [%s]' % (domain, ', '.join(alts)))
  23. f.write(domain)
  24. if len(alts):
  25. f.write(' ' + ' ' .join(alts))
  26. f.write('\n')
  27. try:
  28. os.remove('/letsencrypt/domains.txt')
  29. except OSError:
  30. pass
  31. os.rename('/letsencrypt/domains.txt.new', '/letsencrypt/domains.txt')
  32. print('Done writing domains.txt.', flush=True)
  33. fetcher.wait_for_update()