Skip to content

Commit 2d4b5ea

Browse files
committed
Added optional registration of containers running on startup.
1 parent 22ad674 commit 2d4b5ea

File tree

1 file changed

+34
-12
lines changed

1 file changed

+34
-12
lines changed

dockerDDNS.py

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,47 @@
99
from docker import Client
1010
from docker.utils import kwargs_from_env
1111

12+
# Templates for nsupdate
1213
zone_update_template = """server {0}
1314
zone {1}.
1415
update delete {2}.{3}
1516
update add {2}.{3} 60 A {4}
1617
"""
18+
1719
zone_update_add_alias_template = """update delete {0}.{1}
1820
update add {0}.{1} 600 CNAME {2}.{1}.
1921
"""
2022

23+
24+
def register_container(container_id):
25+
detail = c.inspect_container(container_id)
26+
container_hostname = detail["Config"]["Hostname"]
27+
container_name = detail["Name"].split('/', 1)[1]
28+
container_ip = detail["NetworkSettings"]["IPAddress"]
29+
logging.info("Updating %s to ip (%s|%s) -> %s", container_id, container_hostname, container_name, container_ip)
30+
if not args.dry_run:
31+
nsupdate = Popen(['nsupdate', '-k', args.key], stdin=PIPE)
32+
nsupdate.stdin.write(
33+
bytes(zone_update_template.format(args.server, args.zone, container_hostname, args.domain, container_ip),
34+
"UTF-8"))
35+
if container_name != container_hostname:
36+
nsupdate.stdin.write(
37+
bytes(zone_update_add_alias_template.format(container_name, args.domain, container_hostname), "UTF-8"))
38+
nsupdate.stdin.write(bytes("send\n", "UTF-8"))
39+
nsupdate.stdin.close()
40+
41+
42+
2143
parser = argparse.ArgumentParser()
2244

2345
parser.add_argument("--key", required=True, help="Path to the dynamic dns key")
2446
parser.add_argument("--server", help="IP/Hostname of the server to update", default="127.0.0.1")
2547
parser.add_argument("--domain", help="The domain to be updated", required=True)
2648
parser.add_argument("--zone", help="The zone to be updated (default to the domain)")
49+
50+
parser.add_argument("--dry-run", help="Run in dry run mode without doing any update", default=False, action="store_true")
51+
parser.add_argument("--catchup", help="Register the running containers on startup", default=False, action="store_true")
52+
2753
parser.add_argument("--log-level", help="Log level to display", default="INFO")
2854
parser.add_argument("--log-file", help="Where to put the logs", default="/var/log/docker-ddns.log")
2955

@@ -40,9 +66,16 @@
4066

4167
c = Client(**(kwargs_from_env()))
4268

69+
if args.catchup:
70+
logging.info("Registering existing containers")
71+
containers = c.containers()
72+
for container in containers:
73+
register_container(container["Id"])
74+
4375
# Too bad docker-py does not currently support docker events
4476
p = Popen(['docker', 'events'], stdout=PIPE)
4577

78+
4679
while True:
4780
line = p.stdout.readline()
4881
if line != '':
@@ -55,18 +88,7 @@
5588
logging.debug("Got event %s for container %s", event, container_id)
5689

5790
if event == "start":
58-
detail = c.inspect_container(container_id)
59-
container_hostname = detail["Config"]["Hostname"]
60-
container_name = detail["Name"].split('/',1)[1]
61-
container_ip = detail["NetworkSettings"]["IPAddress"]
62-
63-
logging.info("Updating %s to ip (%s|%s) -> %s", container_id, container_hostname, container_name, container_ip)
64-
nsupdate = Popen(['nsupdate', '-k', args.key], stdin=PIPE)
65-
nsupdate.stdin.write(bytes(zone_update_template.format(args.server, args.zone, container_hostname, args.domain, container_ip), "UTF-8"))
66-
if container_name != container_hostname:
67-
nsupdate.stdin.write(bytes(zone_update_add_alias_template.format(container_name, args.domain, container_hostname), "UTF-8"))
68-
nsupdate.stdin.write(bytes("send\n", "UTF-8"))
69-
nsupdate.stdin.close()
91+
register_container(container_id)
7092
elif event == "destroy":
7193
logging.info("Destroying %s", container_id)
7294
else:

0 commit comments

Comments
 (0)