diff --git a/dockerDDNS.py b/dockerDDNS.py index 4b0891e..012acc0 100755 --- a/dockerDDNS.py +++ b/dockerDDNS.py @@ -23,7 +23,7 @@ zone_update_add_alias_template = """update delete {0}.{1} update add {0}.{1} 600 CNAME {2}.{1}. -update add {2}.{1} 600 TXT dockerDDNS-alias:{0}: +update add {3}.{1} 600 TXT dockerDDNS-alias:{0},{2}: """ zone_update_delete_record_template = """update delete {0}.{1} @@ -31,6 +31,7 @@ def register_container(container_id): + container_id_60 = container_id[:60] detail = c.inspect_container(container_id) container_hostname = detail["Config"]["Hostname"] container_name = detail["Name"].split('/', 1)[1] @@ -45,18 +46,18 @@ def register_container(container_id): nsupdate.stdin.write(bytes(zone_update_start_template.format(args.server, args.zone), "UTF-8")) nsupdate.stdin.write(bytes(zone_update_template.format(container_hostname, args.domain, container_ip), "UTF-8")) if container_name != container_hostname: - nsupdate.stdin.write(bytes(zone_update_add_alias_template.format(container_name, args.domain, container_hostname), "UTF-8")) + nsupdate.stdin.write(bytes(zone_update_add_alias_template.format(container_name, args.domain, container_hostname,container_id_60), "UTF-8")) if re.search("_", container_name): alternate_name = re.sub('_','-',container_name) logging.info("Adding alternate name %s to %s", alternate_name, container_name) - nsupdate.stdin.write(bytes(zone_update_add_alias_template.format(alternate_name, args.domain, container_hostname), "UTF-8")) + nsupdate.stdin.write(bytes(zone_update_add_alias_template.format(alternate_name, args.domain, container_hostname,container_id_60), "UTF-8")) nsupdate.stdin.write(bytes("send\n", "UTF-8")) nsupdate.stdin.close() def remove_container(container_id): logging.info("Destroying %s", container_id) - short_id = container_id[:12] + short_id = container_id[:60] record_to_delete = [short_id] logging.debug("Looking for alias to %s.%s", short_id, args.domain) @@ -67,7 +68,8 @@ def remove_container(container_id): logging.debug("Checking TXT record %s for alias", answer) match = re.search(r"dockerDDNS-alias:([^:]+):", answer.to_text()) if match: - record_to_delete.append(match.group(1)) + for alias_entry in match.group(1).split(","): + record_to_delete.append(alias_entry) except DNSException as e: logging.error("Cannot get TXT record for %s: %s", short_id, e) except: @@ -130,10 +132,10 @@ def remove_container(container_id): if line != '': text_line = line.decode().rstrip() logging.debug("Read line %s", text_line) - m = re.search(r"\s+([0-9a-f]{64}):.*\s+([a-z]+)\s*$", text_line) + m = re.search(r".*\s+container\s+([a-z]+)\s+([0-9a-f]{64}).*$", text_line) if m: - event = m.group(2) - container_id = m.group(1) + event = m.group(1) + container_id = m.group(2) logging.debug("Got event %s for container %s", event, container_id) if event == "start": @@ -146,3 +148,6 @@ def remove_container(container_id): # 2014-11-28T15:32:04.000000000+01:00 a3d66b00acc9adbdbdbc91cc664d2d94b6a07cc4295c5cf54fcc595e2aa92a43: (from mongo:latest) restart # 2015-03-05T08:36:14.000000000+01:00 eb75c1a5ad836d008b0fd66bf6b1ea353510175e8caa619e59d9851029b1ceca: (from ggtools/zabbix-server:latest) exec_start: ifconfig eth0 + +# docker Version: 1.12.1 +# 2017-01-11T20:46:26.268651386-05:00 container start bc340bc76860452fb99ce15101765107f0cf32005e9fcb3261407d81d247307d (image=ubuntu:14.04, name=toto) diff --git a/systemd/Ubuntu/README.mkd b/systemd/Ubuntu/README.mkd new file mode 100644 index 0000000..f297cbb --- /dev/null +++ b/systemd/Ubuntu/README.mkd @@ -0,0 +1,37 @@ + +# Install + +This configuration was tested on Ubuntu (16.04) + +1. copy dockerDDNS.py into /usr/local/sbin/ +2. Change permission to let root execute file (chmod 766 /usr/local/sbin/dockerDDNS.py) +2. copy dockerDDNS.service into /etc/systemd/system +3. finaly copy dockerDDNS into /etc/default/ +4. Edit file /etc/default/dockerDDNS , fix Variables for your needs +5. reload systemd configuration file (sudo systemctl daemon-reload) + +Installation complet, It's time to TRY :D + +1. Validation systemd have the new configuration + + $ systemctl list-unit-files | grep dockerDDN + dockerDDNS.service disabled +2. Try to start the new service + + $ systemctl start dockerDDNS.service +3. View the status and fix it problems + + $ systemctl status dockerDDNS.service + dockerDDNS.service - Update a dynamic DNS when Docker starts containers + Loaded: loaded (/etc/systemd/system/dockerDDNS.service; disabled; vendor preset: disabled) + Active: active (running) since Mon 2017-01-09 16:43:21 EST; 4s ago + Main PID: 2067 (python3) + Tasks: 7 (limit: 4915) + Memory: 33.4M + CPU: 263ms + CGroup: /system.slice/dockerDDNS.service + ├─2067 python3 /usr/local/sbin/dockerDDNS.py --key /tmp/bind/key.private --domain dck.example.com. --server 127.0.0.1 + └─2083 docker events +4. Double check, just to be sure :D + + $ ps aux | grep dockerDDNS diff --git a/systemd/Ubuntu/dockerDDNS b/systemd/Ubuntu/dockerDDNS new file mode 100644 index 0000000..7a5b9e9 --- /dev/null +++ b/systemd/Ubuntu/dockerDDNS @@ -0,0 +1,12 @@ +# Configuration file for the DockerDDNS service +# REF : https://github.com/ggtools/docker-tools + +# DNS key to update bind9 server +DDNS_UPDATE_KEY=/etc/bind/keys/Kdck.example.com.+157+31514.private + +# domain to update +DOMAIN=dck.example.com + +# DNS server +DNS_SERVER=127.0.0.1 + diff --git a/systemd/Ubuntu/dockerDDNS.service b/systemd/Ubuntu/dockerDDNS.service new file mode 100644 index 0000000..29b7546 --- /dev/null +++ b/systemd/Ubuntu/dockerDDNS.service @@ -0,0 +1,13 @@ +[Unit] +Description=Update a dynamic DNS when Docker starts containers +After=docker.service +Requires=docker.service + +[Service] +EnvironmentFile=/etc/default/dockerDDNS +ExecStart=/usr/local/sbin/dockerDDNS.py --key $DDNS_UPDATE_KEY --domain $DOMAIN --server $DNS_SERVER --catchup +PIDFile=/var/run/dockerDDNS +KillMode=process + +[Install] +WantedBy=default.target diff --git a/systemd/archLinux/README.mkd b/systemd/archLinux/README.mkd new file mode 100644 index 0000000..6ebf746 --- /dev/null +++ b/systemd/archLinux/README.mkd @@ -0,0 +1,37 @@ + +# Install + +This configuration was tested on ArchLinux (2017-01-09) + +1. copy dockerDDNS.py into /usr/local/sbin/ +2. Change permission to let root execute file (chmod 766 /usr/local/sbin/dockerDDNS.py) +2. copy dockerDDNS.service into /etc/systemd/system +3. finaly copy dockerDDNS into /etc/conf.d/ +4. Edit file /etc/conf.d/dockerDDNS , fix Variables for your needs +5. reload systemd configuration file (sudo systemctl daemon-reload) + +Installation complet, It's time to TRY :D + +1. Validation systemd have the new configuration + + $ systemctl list-unit-files | grep dockerDDN + dockerDDNS.service disabled +2. Try to start the new service + + $ systemctl start dockerDDNS.service +3. View the status and fix it problems + + $ systemctl status dockerDDNS.service + dockerDDNS.service - Update a dynamic DNS when Docker starts containers + Loaded: loaded (/etc/systemd/system/dockerDDNS.service; disabled; vendor preset: disabled) + Active: active (running) since Mon 2017-01-09 16:43:21 EST; 4s ago + Main PID: 2067 (python3) + Tasks: 7 (limit: 4915) + Memory: 33.4M + CPU: 263ms + CGroup: /system.slice/dockerDDNS.service + ├─2067 python3 /usr/local/sbin/dockerDDNS.py --key /tmp/bind/key.private --domain dck.example.com. --server 127.0.0.1 + └─2083 docker events +4. Double check, just to be sure :D + + $ ps aux | grep dockerDDNS diff --git a/systemd/archLinux/dockerDDNS b/systemd/archLinux/dockerDDNS new file mode 100644 index 0000000..7a5b9e9 --- /dev/null +++ b/systemd/archLinux/dockerDDNS @@ -0,0 +1,12 @@ +# Configuration file for the DockerDDNS service +# REF : https://github.com/ggtools/docker-tools + +# DNS key to update bind9 server +DDNS_UPDATE_KEY=/etc/bind/keys/Kdck.example.com.+157+31514.private + +# domain to update +DOMAIN=dck.example.com + +# DNS server +DNS_SERVER=127.0.0.1 + diff --git a/systemd/archLinux/dockerDDNS.service b/systemd/archLinux/dockerDDNS.service new file mode 100644 index 0000000..28ec154 --- /dev/null +++ b/systemd/archLinux/dockerDDNS.service @@ -0,0 +1,13 @@ +[Unit] +Description=Update a dynamic DNS when Docker starts containers +After=docker.service +Requires=docker.service + +[Service] +EnvironmentFile=/etc/conf.d/dockerDDNS +ExecStart=/usr/local/sbin/dockerDDNS.py --key $DDNS_UPDATE_KEY --domain $DOMAIN --server $DNS_SERVER --catchup +PIDFile=/var/run/dockerDDNS +KillMode=process + +[Install] +WantedBy=default.target