Merge pull request #732 from Nebukadneza/add_front_certificate_reload
Add certificate watcher for external certs to reload nginxmaster
commit
6ca8ed437d
@ -0,0 +1,63 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
"""
|
||||||
|
Certificate watcher which reloads nginx or reconfigures it, depending on what
|
||||||
|
happens to externally supplied certificates. Only executed by start.py in case
|
||||||
|
of TLS_FLAVOR=[mail, cert]
|
||||||
|
"""
|
||||||
|
|
||||||
|
from os.path import exists, split as path_split
|
||||||
|
from os import system
|
||||||
|
import time
|
||||||
|
from watchdog.observers import Observer
|
||||||
|
from watchdog.events import FileSystemEventHandler, FileDeletedEvent, \
|
||||||
|
FileCreatedEvent, FileModifiedEvent, FileMovedEvent
|
||||||
|
|
||||||
|
class ChangeHandler(FileSystemEventHandler):
|
||||||
|
"watchdog-handler listening on any event, executing the correct configuration/reload steps"
|
||||||
|
@staticmethod
|
||||||
|
def reload_nginx():
|
||||||
|
"merely reload nginx without re-configuring everything"
|
||||||
|
if exists("/var/run/nginx.pid"):
|
||||||
|
print("Reloading a running nginx")
|
||||||
|
system("nginx -s reload")
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def reexec_config():
|
||||||
|
"execute a reconfiguration of the system, which also reloads"
|
||||||
|
print("Reconfiguring system")
|
||||||
|
system("/config.py")
|
||||||
|
|
||||||
|
def on_any_event(self, event):
|
||||||
|
"event-listener checking if the affected files are the cert-files we're interested in"
|
||||||
|
if event.is_directory:
|
||||||
|
return
|
||||||
|
|
||||||
|
filename = path_split(event.src_path)[-1]
|
||||||
|
if isinstance(event, FileMovedEvent):
|
||||||
|
filename = path_split(event.dest_path)[-1]
|
||||||
|
|
||||||
|
if filename in ['cert.pem', 'key.pem']:
|
||||||
|
# all cases except for FileModified need re-configure
|
||||||
|
if isinstance(event, (FileCreatedEvent, FileMovedEvent, FileDeletedEvent)):
|
||||||
|
ChangeHandler.reexec_config()
|
||||||
|
# file modification needs only a nginx reload without config.py
|
||||||
|
elif isinstance(event, FileModifiedEvent):
|
||||||
|
ChangeHandler.reload_nginx()
|
||||||
|
# cert files have been moved away, re-configure
|
||||||
|
elif isinstance(event, FileMovedEvent) and path_split(event.src_path)[-1] in ['cert.pem', 'key.pem']:
|
||||||
|
ChangeHandler.reexec_config()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
observer = Observer()
|
||||||
|
handler = ChangeHandler()
|
||||||
|
observer.schedule(handler, "/certs", recursive=False)
|
||||||
|
observer.start()
|
||||||
|
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
time.sleep(1)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
observer.stop()
|
||||||
|
|
||||||
|
observer.join()
|
Loading…
Reference in New Issue