Skip to content

Instantly share code, notes, and snippets.

@cesurapp
Created July 3, 2019 03:25
Show Gist options
  • Save cesurapp/d16c3a1f8775e860a1c3c76f6217cf57 to your computer and use it in GitHub Desktop.
Save cesurapp/d16c3a1f8775e860a1c3c76f6217cf57 to your computer and use it in GitHub Desktop.
Bind9 Zone Directory Watcher
import time
import os
import subprocess
import re
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
def outputCmd(cmd):
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
stdout,stderr = proc.communicate()
if stderr != None:
return stderr.decode('utf-8')
return stdout.decode('utf-8')
def outputLog(text):
logFile = '/var/log/watcher.log'
with open(logFile, 'a+') as f:
f.write(text)
class Watcher:
DIRECTORY_TO_WATCH = "/var/named/zones"
def __init__(self):
self.observer = Observer()
def run(self):
event_handler = Handler()
self.observer.schedule(event_handler, self.DIRECTORY_TO_WATCH, recursive=True)
self.observer.start()
try:
while True:
time.sleep(5)
except:
self.observer.stop()
print ("Error")
self.observer.join()
class Handler(FileSystemEventHandler):
@staticmethod
def on_any_event(event):
domain = os.path.basename(event.src_path).replace('.zone', '')
if event.is_directory:
return None
elif not re.match('^[a-zA-Z\d-]{,63}(\.[a-zA-Z\d-]{,5})$', domain):
return None
elif event.event_type == 'created':
outputLog('Created => ' + domain +'\n'+ outputCmd(['rndc', 'reconfig', ' ' + domain]))
elif event.event_type == 'deleted':
outputLog('Deleted => ' + domain +'\n'+ outputCmd(['rndc', 'delzone', ' ' + domain]))
if __name__ == '__main__':
w = Watcher()
w.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment