mirror of https://github.com/jumpserver/jumpserver
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.4 KiB
47 lines
1.4 KiB
from django.db.models.signals import post_save
|
|
from django.dispatch import receiver
|
|
from django.utils.functional import LazyObject
|
|
|
|
from common.decorators import on_transaction_commit
|
|
from common.utils import get_logger
|
|
from common.utils.connection import RedisPubSub
|
|
from ..const import TaskNameType
|
|
from ..models import Task, Session
|
|
from ..utils import DBPortManager
|
|
|
|
db_port_manager: DBPortManager
|
|
|
|
logger = get_logger(__file__)
|
|
|
|
|
|
class ComponentEventChan(LazyObject):
|
|
def _setup(self):
|
|
self._wrapped = RedisPubSub('fm.component_event_chan')
|
|
|
|
|
|
component_event_chan = ComponentEventChan()
|
|
|
|
|
|
@receiver(post_save, sender=Task)
|
|
@on_transaction_commit
|
|
def on_task_created(sender, instance: Task, created, **kwargs):
|
|
if not created and instance.is_finished:
|
|
# 当组件完成 task 时,修改 session 的 lock 状态
|
|
session_id = instance.args
|
|
name = instance.name
|
|
if name == TaskNameType.lock_session:
|
|
Session.lock_session(session_id)
|
|
elif name == TaskNameType.unlock_session:
|
|
Session.unlock_session(session_id)
|
|
logger.debug(f"signal task post save: {instance.name}, "
|
|
f"session: {session_id}, "
|
|
f"is_finished: {instance.is_finished}")
|
|
return
|
|
event = {
|
|
"type": instance.name,
|
|
"payload": {
|
|
"id": str(instance.id),
|
|
},
|
|
}
|
|
component_event_chan.publish(event)
|