Browse Source

Wait for updates and run in a loop.

master
Chris Smith 8 years ago
parent
commit
f785d9ab27
3 changed files with 42 additions and 24 deletions
  1. 0
    5
      README.md
  2. 17
    1
      fetcher.py
  3. 25
    18
      generate.py

+ 0
- 5
README.md View File

@@ -49,8 +49,3 @@ docker run -d \
49 49
   --<arguments>
50 50
 ```
51 51
 
52
-## Current known issues
53
-
54
-* **The container performs one update and then exits.** It does not yet monitor
55
-  for changes to etcd.
56
-

+ 17
- 1
fetcher.py View File

@@ -1,6 +1,7 @@
1 1
 #!/usr/bin/env python3
2 2
 
3 3
 import etcd
4
+import time
4 5
 
5 6
 
6 7
 class Fetcher:
@@ -19,5 +20,20 @@ class Fetcher:
19 20
 
20 21
   def get_label(self, label):
21 22
     node = self._read_recursive('/labels/%s' % label)
22
-    return {child.key.split('/')[-1]: child.value for child in node.children}
23
+    if node:
24
+      return {child.key.split('/')[-1]: child.value for child in node.children}
25
+    else:
26
+      return {}
27
+
28
+
29
+  def wait_for_update(self):
30
+    original_time = self._client.read(self._prefix + '/_updated').value
31
+    new_time = original_time
32
+
33
+    while new_time == original_time:
34
+      try:
35
+        new_time = self._client.read(self._prefix + '/_updated', wait=True).value
36
+      except etcd.EtcdWatchTimedOut:
37
+        new_time = self._client.read(self._prefix + '/_updated').value
38
+      time.sleep(10)
23 39
 

+ 25
- 18
generate.py View File

@@ -12,23 +12,30 @@ parser.add_argument('--etcd-host', help='Host to connect to etcd on', default='e
12 12
 parser.add_argument('--etcd-prefix', help='Prefix to use when retrieving keys from etcd', default='/docker')
13 13
 args = parser.parse_args()
14 14
 
15
-domains = defaultdict(set)
16 15
 fetcher = Fetcher(args.etcd_host, args.etcd_port, args.etcd_prefix)
17
-for container, values in fetcher.get_label('com.chameth.vhost').items():
18
-  parts = values.split(',')
19
-  domains[parts[0].strip()] |= set([] if len(parts) == 1 else parts[1:])
20
-
21
-with open('/letsencrypt/domains.txt.new', 'w') as f:
22
-  for domain, alts in domains.items():
23
-    f.write(domain)
24
-    if len(alts):
25
-      f.write(' ' + ' ' .join(alts))
26
-    f.write('\n')
27
-
28
-try:
29
-  os.remove('/letsencrypt/domains.txt')
30
-except OSError:
31
-  pass
32
-
33
-os.rename('/letsencrypt/domains.txt.new', '/letsencrypt/domains.txt')
16
+
17
+while True:
18
+  domains = defaultdict(set)
19
+  for container, values in fetcher.get_label('com.chameth.vhost').items():
20
+    parts = values.split(',')
21
+    domains[parts[0].strip()] |= set([] if len(parts) == 1 else parts[1:])
22
+
23
+  with open('/letsencrypt/domains.txt.new', 'w') as f:
24
+    print('Writing domains.txt...')
25
+    for domain, alts in domains.items():
26
+      print('%s [%s]' % (domain, ', '.join(alts)))
27
+      f.write(domain)
28
+      if len(alts):
29
+        f.write(' ' + ' ' .join(alts))
30
+      f.write('\n')
31
+
32
+  try:
33
+    os.remove('/letsencrypt/domains.txt')
34
+  except OSError:
35
+    pass
36
+
37
+  os.rename('/letsencrypt/domains.txt.new', '/letsencrypt/domains.txt')
38
+  print('Done writing domains.txt')
39
+
40
+  fetcher.wait_for_update()
34 41
 

Loading…
Cancel
Save