""" This module contains the signal handlers of the :py:mod:`userdbs` app. """ from __future__ import unicode_literals import logging from django.db.models.signals import post_delete, post_save from django.dispatch import receiver from passlib.utils import generate_password from mysqltasks.tasks import (create_mysql_database, create_mysql_user, delete_mysql_database, delete_mysql_user, set_mysql_userpassword) from pgsqltasks.tasks import (create_pgsql_database, create_pgsql_user, delete_pgsql_database, delete_pgsql_user, set_pgsql_userpassword) from taskresults.models import TaskResult from .models import DB_TYPES, DatabaseUser, UserDatabase, password_set _LOGGER = logging.getLogger(__name__) @receiver(password_set, sender=DatabaseUser) def handle_dbuser_password_set(sender, instance, password, **kwargs): """ Signal handler triggered by password changes for :py:class:`userdbs.models.DatabaseUser` instances. """ if instance.db_type == DB_TYPES.mysql: taskresult = TaskResult.objects.create_task_result( 'handle_dbuser_password_set', set_mysql_userpassword.s(instance.name, password), 'mysql password change') _LOGGER.info( 'MySQL password change has been requested in task %s', taskresult.task_id) elif instance.db_type == DB_TYPES.pgsql: taskresult = TaskResult.objects.create_task_result( 'handle_dbuser_password_set', set_pgsql_userpassword.s(instance.name, password), 'pgsql password change') _LOGGER.info( 'PostgreSQL password change has been requested in task %s', taskresult.task_id) else: _LOGGER.warning( 'Password change has been requested for unknown database %s' ' the request has been ignored.', instance.db_type) @receiver(post_save, sender=DatabaseUser) def handle_dbuser_created(sender, instance, created, **kwargs): """ Signal handler triggered after the creation of or updates to :py:class:`userdbs.models.DatabaseUser` instances. """ if created: password = kwargs.get('password', generate_password()) # TODO: send GPG encrypted mail with this information if instance.db_type == DB_TYPES.mysql: taskresult = TaskResult.objects.create_task_result( 'handle_dbuser_created', create_mysql_user.s(instance.name, password), 'mysql user creation') _LOGGER.info( 'A new MySQL user %s creation has been requested in task %s', instance.name, taskresult.task_id) elif instance.db_type == DB_TYPES.pgsql: taskresult = TaskResult.objects.create_task_result( 'handle_dbuser_created', create_pgsql_user.s(instance.name, password), 'pgsql user creation') _LOGGER.info( 'A new PostgreSQL user %s creation has been requested in task' ' %s', instance.name, taskresult.task_id) else: _LOGGER.warning( 'created DatabaseUser for unknown database type %s', instance.db_type) _LOGGER.debug( 'database user %s has been %s', instance, created and "created" or "updated") @receiver(post_delete, sender=DatabaseUser) def handle_dbuser_deleted(sender, instance, **kwargs): """ Signal handler triggered after the deletion of :py:class:`userdbs.models.DatabaseUser` instances. """ if instance.db_type == DB_TYPES.mysql: taskresult = TaskResult.objects.create_task_result( 'handle_dbuser_deleted', delete_mysql_user.s(instance.name), 'mysql user deletion') _LOGGER.info( 'MySQL user %s deletion has been requested in task %s', instance.name, taskresult.task_id) elif instance.db_type == DB_TYPES.pgsql: taskresult = TaskResult.objects.create_task_result( 'handle_dbuser_deleted', delete_pgsql_user.s(instance.name), 'pgsql user deletion') _LOGGER.info( 'PostgreSQL user %s deletion has been requested in task %s', instance.name, taskresult.task_id) else: _LOGGER.warning( 'deleted DatabaseUser %s for unknown database type %s', instance.name, instance.db_type) _LOGGER.debug( 'database user %s has been deleted', instance) @receiver(post_save, sender=UserDatabase) def handle_userdb_created(sender, instance, created, **kwargs): """ Signal handler triggered after the creation of or updates to :py:class:`userdbs.models.UserDatabase` instances. """ if created: if instance.db_user.db_type == DB_TYPES.mysql: taskresult = TaskResult.objects.create_task_result( 'handle_userdb_created', create_mysql_database.s( instance.db_name, instance.db_user.name), 'mysql database creation') _LOGGER.info( 'The creation of a new MySQL database %s has been requested in' ' task %s', instance.db_name, taskresult.task_id) elif instance.db_user.db_type == DB_TYPES.pgsql: taskresult = TaskResult.objects.create_task_result( 'handle_userdb_created', create_pgsql_database.s( instance.db_name, instance.db_user.name), 'pgsql database creation') _LOGGER.info( 'The creation of a new PostgreSQL database %s has been' ' requested in task %s', instance.db_name, taskresult.task_id) else: _LOGGER.warning( 'created UserDatabase for unknown database type %s', instance.db_user.db_type) _LOGGER.debug( 'database %s has been %s', instance, created and "created" or "updated") @receiver(post_delete, sender=UserDatabase) def handle_userdb_deleted(sender, instance, **kwargs): """ Signal handler triggered after the deletion of :py:class:`userdbs.models.UserDatabase` instances. """ if instance.db_user.db_type == DB_TYPES.mysql: taskresult = TaskResult.objects.create_task_result( 'handle_userdb_deleted', delete_mysql_database.s(instance.db_name, instance.db_user.name), 'mysql database deletion') _LOGGER.info( 'The deletion of MySQL database %s has been requested in task %s', instance.db_name, taskresult.task_id) elif instance.db_user.db_type == DB_TYPES.pgsql: taskresult = TaskResult.objects.create_task_result( 'handle_userdb_deleted', delete_pgsql_database.s(instance.db_name), 'pgsql database deletion') _LOGGER.info( 'The deletion of PostgreSQL database %s has been requested in ' ' task %s', instance.db_name, taskresult.task_id) else: _LOGGER.warning( 'deleted UserDatabase %s of unknown type %s', instance.db_name, instance.db_type) pass _LOGGER.debug( 'database %s has been deleted', instance)