HEX
Server: LiteSpeed
System: Linux atali.colombiahosting.com.co 5.14.0-570.12.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC Tue May 13 06:11:55 EDT 2025 x86_64
User: coopserp (1713)
PHP: 8.2.29
Disabled: dl,exec,passthru,proc_open,proc_close,shell_exec,memory_limit,system,popen,curl_multi_exec,show_source,symlink,link,leak,listen,diskfreespace,tmpfile,ignore_user_abord,highlight_file,source,show_source,fpaththru,virtual,posix_ctermid,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid,posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix,posix_getppid,posix_getpwnam,posix_getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_isatty,posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setsid,posix_setid,posix_times,posix_ttyname,posix_uname,proc_get_status,proc_nice,proc_terminate
Upload Files
File: //opt/cloudlinux/venv/lib64/python3.11/site-packages/ssa/internal/tools.py
# -*- coding: utf-8 -*-

# Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2021 All Rights Reserved
#
# Licensed under CLOUD LINUX LICENSE AGREEMENT
# http://cloudlinux.com/docs/LICENSE.TXT

import logging
import signal
import sys
from typing import Union, Iterable, Callable

from .utils import switch_schedstats, no_xray_active_tasks
from ..modules.processor import RequestProcessor

logger = logging.getLogger('tools')


def log_on_receive(signum: int, frame) -> None:
    """
    Signal handler to log received signal
    """
    logger.info('Received sig: %i (%s)', signum, signum)


def sigterm_received(signum: int, frame) -> None:
    """
    Signal handler to dump collected statistics and switch off schedstats
    """
    logger.info('Received sig: %i', signum)
    RequestProcessor().flush_buffer()
    logger.info('Dumped successfully after %i signal, exiting...', signum)
    # disable throttling detection kernel mechanism
    # if there is no X-Ray tracing tasks active
    if no_xray_active_tasks():
        logger.info('No X-Ray tasks running, switching schedstats off')
        switch_schedstats(enabled=False)
    sys.exit(0)


def register_a_signal(signum: int, sighandler: Callable) -> None:
    """
    Register given sighandler for given signum
    """
    try:
        signal.signal(signum, sighandler)
        logger.info('Registered %s', signum)
    except (OSError, ValueError) as e:
        logger.info('Skipped %s because of %s', signum, e)


def register_sigterm():
    """
    Register a dump handler for SIGTERM signal
    """
    register_a_signal(signal.SIGTERM, sigterm_received)


def register_signals(signals: Union[int, Iterable] = None,
                     handler: Callable = log_on_receive) -> None:
    """
    Register given handler for given signal or range of signals
    If no signals given, add given handler for all available signals
    """
    if signals is None:
        # register all available signals
        for sig in signal.Signals:
            register_a_signal(sig, handler)
    else:
        if isinstance(signals, int):
            # register single signal
            register_a_signal(signals, handler)
        else:
            # register range of signals
            for sig in signals:
                register_a_signal(sig, handler)