jumpserver/apps/terminal/tasks.py

95 lines
3.1 KiB
Python
Raw Normal View History

2016-11-13 14:34:38 +00:00
# -*- coding: utf-8 -*-
#
2022-11-14 10:48:21 +00:00
import datetime
2017-11-14 01:44:16 +00:00
from celery import shared_task
from celery.utils.log import get_task_logger
from django.core.files.storage import default_storage
2022-11-14 10:48:21 +00:00
from django.utils import timezone
2023-02-16 10:32:04 +00:00
from django.utils.translation import gettext_lazy as _
from ops.celery.decorator import (
2022-11-01 03:52:51 +00:00
register_as_period_task, after_app_ready_start,
after_app_shutdown_clean_periodic
)
2022-11-01 03:52:51 +00:00
from orgs.utils import tmp_to_builtin_org
from .backends import server_replay_storage
2022-11-14 10:48:21 +00:00
from .models import (
2023-02-16 10:32:04 +00:00
Status, Session, Task, AppletHostDeployment
2022-11-14 10:48:21 +00:00
)
from .utils import find_session_replay_local
2017-12-04 08:41:00 +00:00
CACHE_REFRESH_INTERVAL = 10
2017-12-04 12:15:47 +00:00
RUNNING = False
logger = get_task_logger(__name__)
2016-11-13 14:34:38 +00:00
2017-11-14 01:44:16 +00:00
2023-02-02 07:57:06 +00:00
@shared_task(verbose_name=_('Periodic delete terminal status'))
@register_as_period_task(interval=3600)
@after_app_ready_start
@after_app_shutdown_clean_periodic
def delete_terminal_status_period():
yesterday = timezone.now() - datetime.timedelta(days=7)
Status.objects.filter(date_created__lt=yesterday).delete()
2017-12-04 08:41:00 +00:00
2023-02-02 07:57:06 +00:00
@shared_task(verbose_name=_('Clean orphan session'))
@register_as_period_task(interval=600)
2018-03-06 09:05:36 +00:00
@after_app_ready_start
@after_app_shutdown_clean_periodic
2018-03-06 09:05:36 +00:00
def clean_orphan_session():
active_sessions = Session.objects.filter(is_finished=False)
for session in active_sessions:
# finished task
Task.objects.filter(args=str(session.id), is_finished=False).update(
is_finished=True, date_finished=timezone.now()
)
# finished session
if session.is_active():
continue
session.is_finished = True
session.date_end = timezone.now()
session.save()
2023-02-02 07:57:06 +00:00
@shared_task(verbose_name=_('Upload session replay to external storage'))
def upload_session_replay_to_external_storage(session_id):
logger.info(f'Start upload session to external storage: {session_id}')
session = Session.objects.filter(id=session_id).first()
if not session:
logger.error(f'Session db item not found: {session_id}')
return
2022-11-01 03:52:51 +00:00
local_path, foobar = find_session_replay_local(session)
if not local_path:
logger.error(f'Session replay not found, may be upload error: {local_path}')
return
2022-11-01 03:52:51 +00:00
abs_path = default_storage.path(local_path)
remote_path = session.get_relative_path_by_local_path(abs_path)
ok, err = server_replay_storage.upload(abs_path, remote_path)
if not ok:
logger.error(f'Session replay upload to external error: {err}')
return
2022-11-01 03:52:51 +00:00
try:
default_storage.delete(local_path)
except:
pass
return
2022-10-28 10:19:44 +00:00
@shared_task(verbose_name=_('Run applet host deployment'), activity_callback=lambda did: ([did], ))
2022-10-28 10:19:44 +00:00
def run_applet_host_deployment(did):
2022-11-01 03:52:51 +00:00
with tmp_to_builtin_org(system=1):
deployment = AppletHostDeployment.objects.get(id=did)
deployment.start()
2022-11-14 10:48:21 +00:00
@shared_task(verbose_name=_('Install applet'), activity_callback=lambda did, applet_id: ([did],))
2022-11-14 10:48:21 +00:00
def run_applet_host_deployment_install_applet(did, applet_id):
with tmp_to_builtin_org(system=1):
deployment = AppletHostDeployment.objects.get(id=did)
deployment.install_applet(applet_id)