79 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
| # from __future__ import absolute_import, unicode_literals
 | |
| from celery import Task
 | |
| from celery import shared_task
 | |
| import logging
 | |
| from django.conf import settings
 | |
| from server.settings import get_sysconfig
 | |
| import importlib
 | |
| from django.core.cache import cache
 | |
| import requests
 | |
| import subprocess
 | |
| from server.settings import SD_PWD
 | |
| 
 | |
| # 实例化myLogger
 | |
| myLogger = logging.getLogger('log')
 | |
| 
 | |
| @shared_task
 | |
| def send_mail_task(**args):
 | |
|     config = get_sysconfig()
 | |
|     subject = args.get('subject', '500')
 | |
|     args['subject'] = '{}:{}_{}_{}'.format(
 | |
|         settings.SYS_NAME, settings.SYS_VERSION, config['base']['base_name_short'], subject)
 | |
|     args['from_email'] = args.get('from_email', settings.EMAIL_HOST_USER)
 | |
|     args['recipient_list'] = args.get(
 | |
|         'recipient_list',  settings.EMAIL_DEVELOPERS if hasattr(settings, 'EMAIL_DEVELOPERS') else [settings.EMAIL_HOST_USER])
 | |
|     cache_key = f'error_mail_{subject}'
 | |
|     email_tuple = cache.get(cache_key)
 | |
|     if email_tuple is None:
 | |
|         email_tuple = (0, True)
 | |
|         cache.set(cache_key, email_tuple, 60)
 | |
|     email_count, email_enable = email_tuple
 | |
|     if email_enable:
 | |
|         email_count += 1
 | |
|         if email_count > 4:
 | |
|             email_enable = False
 | |
|             # 如果频率高于每分钟4封,则自动屏蔽半小时
 | |
|             cache.set(cache_key, (email_count, email_enable), 1800)
 | |
|             args['subject'] = args['subject'] + '_发送频繁'
 | |
|         else:
 | |
|             cache.set(cache_key, (email_count, True), 60)
 | |
|         if getattr(settings, 'JUMP_MAIL_ENABLED', False):
 | |
|             requests.post(settings.JUMP_MAIL_URL, json=args)
 | |
|         else:
 | |
|             from django.core.mail import send_mail
 | |
|             send_mail(**args)
 | |
| 
 | |
| class CustomTask(Task):
 | |
|     """
 | |
|     自定义的任务回调
 | |
|     """
 | |
| 
 | |
|     def on_failure(self, exc, task_id, args, kwargs, einfo):
 | |
|         detail ='Task {0} raised exception: {1!r}\n{2!r}'.format(
 | |
|                     task_id, exc, einfo.traceback)
 | |
|         myLogger.error(detail)
 | |
|         send_mail_task.delay(subject=f'task_error_{self.name}', message=detail)
 | |
|         return super().on_failure(exc, task_id, args, kwargs, einfo)
 | |
| 
 | |
| @shared_task(base=CustomTask)
 | |
| def ctask_run(func_str: str, *args, **kwargs):
 | |
|     """通用celery函数/将普通函数转为celery执行/也可直接运行
 | |
|     """
 | |
|     module, func = func_str.rsplit(".", 1)
 | |
|     m = importlib.import_module(module)
 | |
|     f = getattr(m, func)
 | |
|     f(*args, **kwargs)
 | |
| 
 | |
| 
 | |
| @shared_task(base=CustomTask)
 | |
| def restart_ntp():
 | |
|     """更新服务器时间
 | |
|     """
 | |
| 
 | |
|         # 执行命令
 | |
|     command = 'echo "{}" | sudo -S systemctl restart ntp'.format(SD_PWD)
 | |
|     result = subprocess.run(command, shell=True, capture_output=True, text=True)
 | |
|     if result.returncode == 0:
 | |
|         myLogger.info("NTP service restarted successfully.")
 | |
|     else:
 | |
|         myLogger.error(f"Error restarting NTP service: {result.stderr}") |