GRAYBYTE WORDPRESS FILE MANAGER2495

Server IP : 149.255.58.128 / Your IP : 216.73.216.184
System : Linux cloud516.thundercloud.uk 5.14.0-427.26.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Jul 17 15:51:13 EDT 2024 x86_64
PHP Version : 8.2.28
Disable Function : allow_url_include, apache_child_terminate, apache_setenv, exec, passthru, pcntl_exec, posix_kill, posix_mkfifo, posix_getpwuid, posix_setpgid, posix_setsid, posix_setuid, posix_setgid, posix_seteuid, posix_setegid, posix_uname, proc_close, proc_get_status, proc_open, proc_terminate, shell_exec, show_source, system
cURL : ON | WGET : ON | Sudo : OFF | Pkexec : OFF
Directory : /usr/lib/python3.9/site-packages/dnf-plugins/
Upload Files :
Current_dir [ Not Writeable ] Document_root [ Writeable ]

Command :


Current File : /usr/lib/python3.9/site-packages/dnf-plugins//universal_hooks.py
#!/usr/bin/python3

# Copyright (c) 2020, cPanel, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import abc
import glob
import logging
import os
from os import path
import re
import subprocess
import sys
import tempfile

from dnf import Plugin

# this logger is configured by the dnf CLI, but error() is not shown by default (but is with -v)
# LOG = logging.getLogger("dnf")

LOG = logging.getLogger(__name__)
LOG.setLevel(logging.ERROR)
LOG.addHandler(logging.StreamHandler(sys.stderr))


class UniversalHooksPlugin(Plugin):
    name = 'universal-hooks'

    def __init__(self, base, cli):
        super().__init__(base, cli)
        self.hook_root = '/etc/dnf/universal-hooks'

    def pre_config(self):
        _run_dir(path.join(self.hook_root, self.pre_config.__name__), LOG)

    def config(self):
        _run_dir(path.join(self.hook_root, self.config.__name__), LOG)

    def resolved(self):
        _run_dir(path.join(self.hook_root, self.resolved.__name__), LOG)

    def sack(self):
        _run_dir(path.join(self.hook_root, self.sack.__name__), LOG)

    def pre_transaction(self):
        name = self.pre_transaction.__name__
        _run_pkg_dirs(self.hook_root, LOG, name, DnfTransactionInfo(self.base.transaction))
        _run_dir(path.join(self.hook_root, name), LOG)

    def transaction(self):
        name = self.transaction.__name__
        _run_pkg_dirs(self.hook_root, LOG, name, DnfTransactionInfo(self.base.transaction))
        _run_dir(path.join(self.hook_root, name), LOG)


class FileSystem(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def glob(self, pathname):
        pass

    @abc.abstractmethod
    def isdir(self, pathname):
        pass

    @abc.abstractmethod
    def access(self, path, mode):
        pass

    @abc.abstractmethod
    def NamedTemporaryFile(self, mode, encoding):
        pass


class RealFileSystem(FileSystem):
    def glob(self, pathname):
        return glob.glob(pathname)

    def isdir(self, pathname):
        return path.isdir(pathname)

    def access(self, path, mode):
        return os.access(path, mode)

    def NamedTemporaryFile(self, mode, encoding):
        return tempfile.NamedTemporaryFile(mode=mode, encoding=encoding)


fs = RealFileSystem()


def _run_dir(hook_dir, log, args=''):
    if not fs.isdir(hook_dir):
        return None

    for script in sorted(fs.glob(hook_dir + "/*")):
        if fs.isdir(script):
            continue

        if fs.access(script, os.X_OK):
            cmdline = f'{script} {args}'
            completed = subprocess.run(cmdline, shell=True)  # todo change args to a list, shell=False
            if 0 != completed.returncode:
                log.error("!!! %s did not exit cleanly: %d", cmdline, completed.returncode)
        else:
            log.error("!!! %s is not executable", script)


class TransactionInfo(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def getMembers(self):
        pass


class DnfTransactionInfo(TransactionInfo):
    def __init__(self, transaction) -> None:
        self.transaction = transaction

    def getMembers(self):
        return self.transaction


def _run_pkg_dirs(base_dir, log, slot, tinfo):
    """

    :param str base_dir:
    :param logging.Logger log:
    :param str slot:
    :param TransactionInfo tinfo:
    """

    wildcard_path = path.join(base_dir, 'multi_pkgs', slot)
    dir_matchers = _make_dir_matchers(wildcard_path)
    wildcard_to_run = {}

    with fs.NamedTemporaryFile(mode='w', encoding='utf-8') as temp_pkg_file:
        members_seen = {}
        members = tinfo.getMembers()
        for member in sorted(set(members), key=lambda m: m.name):
            pkg = member.name
            if pkg in members_seen:
                continue

            members_seen[pkg] = 1

            temp_pkg_file.write(pkg + "\n")

            _run_dir(path.join(base_dir, 'pkgs', pkg, slot), log)

            for wildcard_dir, matcher in dir_matchers.items():
                if matcher.search(pkg):
                    wildcard_to_run[wildcard_dir] = 1

        # the file may be used by a subprocess, so make sure it is flushed to kernel
        temp_pkg_file.flush()

        for wildcard_dir in wildcard_to_run:
            _run_dir(path.join(wildcard_path, wildcard_dir), log, "--pkg_list=" + temp_pkg_file.name)


def _make_dir_matchers(wc_slot_dir):
    dir_matchers = {}
    for pth in fs.glob(wc_slot_dir + "/*"):
        if fs.isdir(pth):
            pth = path.basename(path.normpath(pth))
            dir_matchers[pth] = _regex_from_dir(pth)
    return dir_matchers


def _regex_from_dir(path):
    expr = path.replace("__WILDCARD__", ".*")
    return re.compile("^" + expr + "$")

[ Back ]
Name
Size
Last Modified
Owner / Group
Permissions
Options
..
--
March 19 2025 22:42:16
0 / root
0755
__pycache__
--
May 14 2025 21:42:23
0 / root
0755
builddep.py
9.127 KB
September 09 2022 11:42:50
0 / root
0644
changelog.py
4.851 KB
September 09 2022 11:42:50
0 / root
0644
config_manager.py
10.63 KB
September 09 2022 11:42:50
0 / root
0644
copr.py
29.588 KB
September 09 2022 11:42:50
0 / root
0644
debug.py
12.264 KB
September 09 2022 11:42:50
0 / root
0644
debuginfo-install.py
10.824 KB
September 09 2022 11:42:50
0 / root
0644
download.py
12.041 KB
September 09 2022 11:42:50
0 / root
0644
generate_completion_cache.py
3.855 KB
September 09 2022 11:42:50
0 / root
0644
groups_manager.py
13.215 KB
September 09 2022 11:42:50
0 / root
0644
kpatch.py
8.123 KB
April 05 2023 20:40:53
0 / root
0644
needs_restarting.py
10.987 KB
October 02 2024 13:18:37
0 / root
0644
repoclosure.py
6.887 KB
September 09 2022 11:42:50
0 / root
0644
repodiff.py
11.206 KB
September 09 2022 11:42:50
0 / root
0644
repograph.py
3.996 KB
September 09 2022 11:42:50
0 / root
0644
repomanage.py
10.322 KB
September 09 2022 11:42:50
0 / root
0644
reposync.py
14.305 KB
September 09 2022 11:42:50
0 / root
0644
spacewalk.py
13.876 KB
February 26 2025 09:32:58
0 / root
0644
system_upgrade.py
26.876 KB
October 02 2024 13:18:37
0 / root
0644
universal_hooks.py
5.778 KB
May 06 2025 19:28:09
0 / root
0755

GRAYBYTE WORDPRESS FILE MANAGER @ 2025
CONTACT ME
Static GIF