mirror of https://github.com/jumpserver/jumpserver
				
				
				
			
		
			
				
	
	
		
			97 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
# -*- coding: utf-8 -*-
 | 
						|
#
 | 
						|
import json
 | 
						|
 | 
						|
from django.dispatch import receiver
 | 
						|
from django.db.models.signals import post_save, pre_save
 | 
						|
from django.conf import LazySettings, empty, global_settings
 | 
						|
from django.db.utils import ProgrammingError, OperationalError
 | 
						|
from django.core.cache import cache
 | 
						|
 | 
						|
from jumpserver.utils import current_request
 | 
						|
from common.utils import get_logger, ssh_key_gen
 | 
						|
from common.signals import django_ready
 | 
						|
from .models import Setting
 | 
						|
 | 
						|
logger = get_logger(__file__)
 | 
						|
 | 
						|
 | 
						|
@receiver(post_save, sender=Setting, dispatch_uid="my_unique_identifier")
 | 
						|
def refresh_settings_on_changed(sender, instance=None, **kwargs):
 | 
						|
    if instance:
 | 
						|
        instance.refresh_setting()
 | 
						|
 | 
						|
 | 
						|
@receiver(django_ready)
 | 
						|
def monkey_patch_settings(sender, **kwargs):
 | 
						|
    logger.debug("Monkey patch settings")
 | 
						|
    cache_key_prefix = '_SETTING_'
 | 
						|
    custom_need_cache_settings = [
 | 
						|
        'AUTHENTICATION_BACKENDS', 'TERMINAL_HOST_KEY',
 | 
						|
    ]
 | 
						|
    custom_no_cache_settings = [
 | 
						|
        'BASE_DIR', 'VERSION', 'AUTH_OPENID',
 | 
						|
    ]
 | 
						|
    django_settings = dir(global_settings)
 | 
						|
    uncached_settings = [i for i in django_settings if i.isupper()]
 | 
						|
    uncached_settings = [i for i in uncached_settings if not i.startswith('EMAIL')]
 | 
						|
    uncached_settings = [i for i in uncached_settings if not i.startswith('SESSION_REDIS')]
 | 
						|
    uncached_settings = [i for i in uncached_settings if i not in custom_need_cache_settings]
 | 
						|
    uncached_settings.extend(custom_no_cache_settings)
 | 
						|
 | 
						|
    def monkey_patch_getattr(self, name):
 | 
						|
        if name not in uncached_settings:
 | 
						|
            key = cache_key_prefix + name
 | 
						|
            cached = cache.get(key)
 | 
						|
            if cached is not None:
 | 
						|
                return cached
 | 
						|
        if self._wrapped is empty:
 | 
						|
            self._setup(name)
 | 
						|
        val = getattr(self._wrapped, name)
 | 
						|
        return val
 | 
						|
 | 
						|
    def monkey_patch_setattr(self, name, value):
 | 
						|
        key = cache_key_prefix + name
 | 
						|
        cache.set(key, value, None)
 | 
						|
        if name == '_wrapped':
 | 
						|
            self.__dict__.clear()
 | 
						|
        else:
 | 
						|
            self.__dict__.pop(name, None)
 | 
						|
        super(LazySettings, self).__setattr__(name, value)
 | 
						|
 | 
						|
    def monkey_patch_delattr(self, name):
 | 
						|
        super(LazySettings, self).__delattr__(name)
 | 
						|
        self.__dict__.pop(name, None)
 | 
						|
        key = cache_key_prefix + name
 | 
						|
        cache.delete(key)
 | 
						|
 | 
						|
    try:
 | 
						|
        cache.delete_pattern(cache_key_prefix+'*')
 | 
						|
        LazySettings.__getattr__ = monkey_patch_getattr
 | 
						|
        LazySettings.__setattr__ = monkey_patch_setattr
 | 
						|
        LazySettings.__delattr__ = monkey_patch_delattr
 | 
						|
        Setting.refresh_all_settings()
 | 
						|
    except (ProgrammingError, OperationalError):
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
@receiver(django_ready)
 | 
						|
def auto_generate_terminal_host_key(sender, **kwargs):
 | 
						|
    try:
 | 
						|
        if Setting.objects.filter(name='TERMINAL_HOST_KEY').exists():
 | 
						|
            return
 | 
						|
        private_key, public_key = ssh_key_gen()
 | 
						|
        value = json.dumps(private_key)
 | 
						|
        Setting.objects.create(name='TERMINAL_HOST_KEY', value=value)
 | 
						|
    except:
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
@receiver(pre_save, dispatch_uid="my_unique_identifier")
 | 
						|
def on_create_set_created_by(sender, instance=None, **kwargs):
 | 
						|
    if getattr(instance, '_ignore_auto_created_by', False) is True:
 | 
						|
        return
 | 
						|
    if hasattr(instance, 'created_by') and not instance.created_by:
 | 
						|
        if current_request and current_request.user.is_authenticated:
 | 
						|
            instance.created_by = current_request.user.name
 |