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.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #!/usr/bin/env python3
  2. from collections import defaultdict
  3. from fetcher import Fetcher
  4. import argparse
  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 = Fetcher(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. parts = values.split(',')
  17. domains[parts[0].strip()] |= set([] if len(parts) == 1 else parts[1:])
  18. with open('/letsencrypt/domains.txt.new', 'w') as f:
  19. print('Writing domains.txt...')
  20. for domain, alts in domains.items():
  21. print('%s [%s]' % (domain, ', '.join(alts)))
  22. f.write(domain)
  23. if len(alts):
  24. f.write(' ' + ' ' .join(alts))
  25. f.write('\n')
  26. try:
  27. os.remove('/letsencrypt/domains.txt')
  28. except OSError:
  29. pass
  30. os.rename('/letsencrypt/domains.txt.new', '/letsencrypt/domains.txt')
  31. print('Done writing domains.txt')
  32. fetcher.wait_for_update()