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