def CheckConfigBackendReturnTypes(): option = None success = True try: option = "config_file" getFile() option = "ip" getIP() option = "port" getPort() option = "logfile" getLogfile() option = "loglevel" getLoglevel() option = "user" getUser() option = "group" getGroup() option = "scriptname" getScriptname() option = "checkMimeTypes" getCheckMimeTypes() option = "allowedMimeTypes" getAllowedMimeTypes() option = "script_stdout" getScriptStdout() option = "script_stderr" getScriptStderr() option = "encryption" getEncryption() option = "runScriptWithSudo" getRunScriptWithSudo() option = "debug" getDebug() success = True except error.ConfigBackendReturnTypeError as e: log.writeLogLV( config_backend.getLogfile(), "Return-Type-Error in Config-Backend's option '%s' (is: %s, expected: %s)\n" % (option, e.getWrongType(), e.getRightType()), log.LOGLEVEL["warning"], ) success = False except error.ConfigBackendReturnValueError as e: log.writeLogLV( config_backend.getLogfile(), "Return-Value-Error in Config-Backend's option '%s' (is: %s, expected: %s)\n" % (option, e.getWrongValue(), e.getRightValue()), log.LOGLEVEL["warning"], ) success = False return success
def openSocket(): try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) if config_backend.getEncryption() is None: s.connect((config_backend.getIP(), config_backend.getPort())) return s else: ssl_sock = ssl.wrap_socket(s) ssl_sock.connect((config_backend.getIP(), config_backend.getPort())) return ssl_sock except Exception as e: log.writeLogLV(config_backend.getLogfile(), "Konnte keine Verbindung zum Server aufbauen (%s:%s). Fehler: %s\n" % (config_backend.getIP(), config_backend.getPort(), e.args), log.LOGLEVEL["fatal"]) if config_backend.getDebug(): print traceback.print_exc() exit(1)
def checkPermissions(): """ Modulinterne Berechtigungsprüfung, die nur von der Data-Backend- Zwischenschicht aufgerufen werden sollte. Diese Funktion dient zur Überprüfung der Berechtigungen der Dateien, die dieses Data-Backend-Modul benutzt. Alle anderen Integritätsprüfungen werden von der Zwischenschicht erledigt. """ try: file = open(FILENAME_CLIENTS, "a") file.close() except: log.writeLogLV(config_backend.getLogfile(), "Data-Backend-File-Modul: Die Client-Datei kann nicht zum Schreiben geöffnet werden\n", log.LOGLEVEL['warning']) try: file = open(FILENAME_GROUPS, "a") file.close() except: log.writeLogLV(config_backend.getLogfile(), "Data-Backend-File-Modul: Die Gruppen-Datei kann nicht zum Schreiben geöffnet werden\n", log.LOGLEVEL['warning']) try: file = open(FILENAME_SCRIPTS, "a") file.close() except: log.writeLogLV(config_backend.getLogfile(), "Data-Backend-File-Modul: Die Skript-Datei kann nicht zum Schreiben geöffnet werden\n", log.LOGLEVEL['warning'])
def loadDataBackend(backendName): """ Beschreibung: Lädt ein Data-Backend-Modul. Prüft vorher, ob das Modul auch verwendet werden kann. Parameter: (string)backendName: Pfad zum Data-Backend-Modul im Python "Import"-Stil. Das Modul muss mindestens im gleichen Ordner sein, wie das Programm, das das Modul lädt, oder aber in einem Unterordner. Rückgabewert: Verweis auf das Data-Backend-Modul Exceptions: Wirft selbst keine """ try: return checkDataBackend(backendName) except ImportError as e: log.writeLogLV(config_backend.getLogfile(), "Konnte das Modul '%s' nicht importieren. Originale Fehlermeldung: %s" % (backendName, e.args), log.LOGLEVEL["fatal"]) except AttributeError as e: log.writeLogLV(config_backend.getLogfile(), "Eine benötigte Funktion ist im Modul '%s' nicht vorhanden. Originale Fehlermeldung: %s\n" % (backendName, e.args), log.LOGLEVEL["fatal"]) except Exception as e: log.writeLogLV(config_backend.getLogfile(), "Unbekannter Fehler im Modul '%s'. Originale Fehlermeldung: %s" % (backendName, e.args), log.LOGLEVEL["fatal"]) if config_backend.getDebug(): print traceback.print_exc() print
config_backend.setMaxQueue(cmd_max_queue) if not cmd_skip_integrity_test is None: config_backend.setSkipIntegrityTest(cmd_skip_integrity_test) if not cmd_debug is None: config_backend.setDebug(cmd_debug) if not cmd_interface is None: config_backend.setIP(cmd_interface) if not cmd_port is None: config_backend.setPort(cmd_port) if not cmd_verbosity is 0: config_backend.setLoglevel(str(config_backend.getLoglevel() + cmd_verbosity)) # Prüfe, ob im Config-Backend auch gültige Werte gespeichert sind if config_backend.checkConfigBackend(): log.writeLogLV(config_backend.getLogfile(), "Config-Backend erfolgreich geladen (Modul: %s)\n" % config_backend.getServerConfigBackend(), log.LOGLEVEL["info"]) else: log.writeLogBuffer("Es wurden Fehler im Serverconfig-Backend-Modul gefunden (Modul: %s)\n" % config_backend.getServerConfigBackend(), log.LOGLEVEL["error"]) sys.exit(1) # Schreibe Logs aus dem temporären Logfile in das Logfile, das im Config-Backend eingetragen ist log.writeLogBufferToFile(config_backend.getLogfile()) # zeige einen Config-Dump an (nur bei loglovel: debug) log.writeLogLV(config_backend.getLogfile(), "%s" % config_backend.printConfig(), log.LOGLEVEL["debug"]) # Bevor der User und die Gruppe umgeschaltet werden, müssen die Berechtigungen der # Logdatei umgestellt werden damit der neue Benutzer darin auch schreiben darf.
config_backend.setUser(cmd_user) if not cmd_group is None: config_backend.setGroup(cmd_group) if not cmd_debug is None: config_backend.setDebug(cmd_debug) if not cmd_interface is None: config_backend.setIP(cmd_interface) if not cmd_port is None: config_backend.setPort(cmd_port) if not cmd_verbosity is 0: config_backend.setLoglevel(str(config_backend.getLoglevel() + cmd_verbosity)) # Prüfe, ob im Config-Backend auch gültige Werte gespeichert sind if config_backend.CheckConfigBackendReturnTypes(): log.writeLogLV(config_backend.getLogfile(), "Config-Backend erfolgreich geladen (Modul: %s)\n" % config_backend.getConfigBackend(), log.LOGLEVEL["info"]) else: log.writeLogBuffer("Es wurden Fehler im Config-Backend-Modul gefunden (Modul: %s)\n" % config_backend.getConfigBackend(), log.LOGLEVEL["error"]) sys.exit(1) # Schreibe Logs aus dem temporären Logfile in das Logfile, das im Config-Backend eingetragen ist log.writeLogBufferToFile(config_backend.getLogfile()) # zeige einen Config-Dump an (nur bei loglovel: debug) log.writeLogLV(config_backend.getLogfile(), "%s" % config_backend.config_backend.printConfig(), log.LOGLEVEL["debug"]) # Bevor der User und die Gruppe umgeschaltet werden, müssen die Berechtigungen der #Logdatei umgestellt werden damit der neue Benutzer darin auch schreiben darf.
def checkDataIntegrity(): """ Beschreibung: Prüft, ob alle Daten im DataBackend korrekt sind (z.B. ob die Clients, die einer Gruppe zugewiesen sind überhaupt existieren, etc) Parameter: keine Rückgabewerte: Keiner (es gibt nur Warnungen aus) Exceptions: <TODO> """ # Rufe die modulinterne Prüfung auf (prüfen der Berechtigungen, etc.) data_backend.checkPermissions() clientnames = data_backend.getClientNames() groupnames = data_backend.getGroupNames() scriptnames = data_backend.getScriptNames() # überprüfe Clients # Später soll hier auch noch geprüft werden, ob z.B. der DNS-Name aufgelöst werden kann, etc. errorcode, allClients = data_backend.getClientsFull() if errorcode is 0: for client in allClients: try: # Prüfe, ob alle benötigten Optionen existieren if not 'created-on' in client: log.writeLogLV(config_backend.getLogfile(), "Client '%s': Benötigte Option ('created-on') nicht gefunden\n" % (client['name']), log.LOGLEVEL["warning"]) if not 'last-seen' in client: log.writeLogLV(config_backend.getLogfile(), "Client '%s': Benötigte Option ('last-seen') nicht gefunden\n" % (client['name']), log.LOGLEVEL["warning"]) # Prüfe, ob die zugewiesenen Skripte existieren if 'scriptmember' in client: for script in ast.literal_eval(client['scriptmember']): if not script in scriptnames: log.writeLogLV(config_backend.getLogfile(), "Client '%s': Zugewiesenes Skript (%s) nicht gefunden\n" % (client['name'], script), log.LOGLEVEL["warning"]) except Exception as e: log.writeLogLV(config_backend.getLogfile(), "Client '%s': Überspringe die Prüfung, da ein Fehler aufgetreten ist (%s)\n" % (client['name'], e), log.LOGLEVEL["warning"]) if config_backend.getDebug(): print traceback.print_exc() # überprüfe Gruppen errorcode, allGroups = data_backend.getGroupsFull() if errorcode is 0: for group in allGroups: try: # Prüfe, ob alle benötigten Optionen existieren if not 'parent' in group: log.writeLogLV(config_backend.getLogfile(), "Gruppe '%s': Benötigte Option ('parent') nicht gefunden\n" % (group['name']), log.LOGLEVEL["warning"]) # Prüfe, ob die Parent-Gruppe existiert elif not group['parent'] in groupnames: log.writeLogLV(config_backend.getLogfile(), "Gruppe '%s': Parent-Gruppe (%s) nicht gefunden\n" % (group['name'], group['parent']), log.LOGLEVEL["warning"]) if 'member' in group: for client in ast.literal_eval(group['member']): if not client in clientnames: log.writeLogLV(config_backend.getLogfile(), "Gruppe '%s': Zugewiesener Client (%s) nicht gefunden\n" % (group['name'], client), log.LOGLEVEL["warning"]) if 'scriptmember' in group: for script in ast.literal_eval(group['scriptmember']): if not script in scriptnames: log.writeLogLV(config_backend.getLogfile(), "Gruppe '%s': Zugewiesenes Script (%s) nicht gefunden\n" % (group['name'], script), log.LOGLEVEL["warning"]) except Exception as e: log.writeLogLV(config_backend.getLogfile(), "Gruppe '%s': Überspringe die Prüfung, da ein Fehler aufgetreten ist (%s)\n" % (group['name'], e), log.LOGLEVEL["warning"]) if config_backend.getDebug(): print traceback.print_exc() # überprüfe Skripte errorcode, allScripts = data_backend.getScriptsFull() if errorcode is 0: for script in allScripts: try: # Prüfe, ob alle benötigten Optionen existieren if not 'path' in script: log.writeLogLV(config_backend.getLogfile(), "Script '%s': Benötigte Option ('path') nicht gefunden\n" % (script['name']), log.LOGLEVEL["warning"]) # Prüfe, ob das Skript im Dateisystem existiert elif not core.doesFileExist(script['path']): log.writeLogLV(config_backend.getLogfile(), "Script '%s': Datei (%s) im Dateisystem nicht gefunden\n" % (script['name'], script['path']), log.LOGLEVEL["warning"]) elif not 'md5' in script: log.writeLogLV(config_backend.getLogfile(), "Script '%s': Benötigte Option ('md5') nicht gefunden\n" % (script['name']), log.LOGLEVEL["warning"]) elif not script['md5'] == core.getMD5(script['path']): log.writeLogLV(config_backend.getLogfile(), "Script '%s': MD5-Summe (%s) stimmt nicht mit der Datei im Dateisystem (%s) überein\n" % (script['name'], script['md5'], core.getMD5(script['path'])), log.LOGLEVEL["warning"]) except Exception as e: log.writeLogLV(config_backend.getLogfile(), "Script '%s': Überspringe die Prüfung, da ein Fehler aufgetreten ist (%s)\n" % (script['name'], e), log.LOGLEVEL["warning"]) if config_backend.getDebug(): print traceback.print_exc()