79 lines
1.6 KiB
Python
Executable File
79 lines
1.6 KiB
Python
Executable File
#!/usr/bin/env python3 -u
|
|
|
|
import os
|
|
import stat
|
|
import sys
|
|
from dotenv import dotenv_values
|
|
import time
|
|
|
|
from lib import *
|
|
|
|
config = {}
|
|
ipam4_old = {}
|
|
|
|
|
|
def main():
|
|
global config
|
|
config = get_config()
|
|
|
|
try:
|
|
stat.S_ISSOCK(os.stat(config['DOCKER_SOCKET']).st_mode)
|
|
except Exception as e:
|
|
print(e)
|
|
print(
|
|
"Docker socket " +
|
|
config['DOCKER_SOCKET'] +
|
|
" not found, exiting...")
|
|
sys.exit(1)
|
|
|
|
if not eval(config['ONE_SHOT']):
|
|
while True:
|
|
loop()
|
|
time.sleep(int(config['REFRESH_INTERVAL']))
|
|
|
|
loop()
|
|
|
|
|
|
def loop():
|
|
container.init(config)
|
|
ipam4 = container.generate_container_list()
|
|
global ipam4_old
|
|
|
|
additions4 = determine_additions(ipam4, ipam4_old)
|
|
deletions4 = determine_deletions(ipam4, ipam4_old)
|
|
|
|
nsupdate.init(config)
|
|
nsupdate.delete_records(deletions4)
|
|
nsupdate.add_records(additions4)
|
|
|
|
ipam4_old = ipam4
|
|
|
|
|
|
def get_config():
|
|
config_file = sys.argv[1] if len(sys.argv) >= 2 else 'config'
|
|
|
|
x = {
|
|
**dotenv_values(os.path.join(os.getcwd(), config_file)),
|
|
**os.environ
|
|
}
|
|
|
|
print("Detected config values:")
|
|
for item in ['DOCKER_SOCKET', 'DOMAIN', 'HOSTNAME_LABEL', 'DEFAULT_NETWORK', 'REFRESH_INTERVAL', 'ONE_SHOT', 'NAMESERVER', 'TSIG_NAME']:
|
|
print(item, end=": ")
|
|
print(x[item])
|
|
|
|
return x
|
|
|
|
|
|
def determine_additions(ipam, ipam_old):
|
|
return {k: v for k, v in ipam.items() if k not in ipam_old}
|
|
|
|
|
|
def determine_deletions(ipam, ipam_old):
|
|
return {k: v for k, v in ipam_old.items() if k not in ipam}
|
|
pass
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|