MOON
Server: Apache
System: Linux server30c.hostingraja.org 3.10.0-962.3.2.lve1.5.63.el7.x86_64 #1 SMP Fri Oct 8 12:03:35 UTC 2021 x86_64
User: jibhires (1887)
PHP: 8.1.30
Disabled: show_source, system, shell_exec, passthru, exec, popen, proc_open, allow_url_fopen, symlink, escapeshellcmd, pcntl_exec
Upload Files
File: //opt/imunify360/venv/lib/python3.11/site-packages/im360/plugins/resident/shared_disabled_rules.py
from asyncio import Event
from logging import getLogger

from defence360agent.contracts.plugins import MessageSource
from defence360agent.model.simplification import run_in_executor
from defence360agent.subsys import web_server
from defence360agent.utils import recurring_check
from im360.model.incident import DisabledRule
from im360.subsys.panels.hosting_panel import HostingPanel
from im360.subsys.shared_disabled_rules import DisabledRulesWatcher

log = getLogger(__name__)


class SharedDisabledRules(MessageSource):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.__loop = None
        self.__task = None
        self.__event = Event()
        self.__watcher = None
        self.__panel = HostingPanel()

    async def create_source(self, loop, unused_sink):
        if self.__task is not None:
            return
        self.__loop = loop
        self.__watcher = DisabledRulesWatcher(
            loop, on_change_cb=self.__event.set
        )
        self.__task = loop.create_task(self.__update_rules())

    async def shutdown(self):
        if self.__watcher is not None:
            self.__watcher.close()
        if self.__task is not None:
            self.__task.cancel()

    @recurring_check(0)
    async def __update_rules(self):
        try:
            await self.__event.wait()
        finally:
            self.__event.clear()
        rules = await run_in_executor(
            self.__loop, lambda: DisabledRule.get_global_disabled("modsec")
        )
        await self.__panel.sync_global_disabled_rules(rules)
        await web_server.graceful_restart()
        # WARN: This log is for rpm-tests, do not remove it!
        log.info(
            "%d shared disabled rules loaded.",
            self.__watcher.count(),
        )