From: "André Erdmann" <dywi@mailerd.de> To: gentoo-commits@lists.gentoo.org Subject: [gentoo-commits] proj/R_overlay:master commit in: roverlay/tools/, roverlay/config/, roverlay/ Date: Sun, 30 Jun 2013 15:58:11 +0000 (UTC) [thread overview] Message-ID: <1372194481.df58d07cbadab7bdd5f6a494355c8dac9f840d09.dywi@gentoo> (raw) commit: df58d07cbadab7bdd5f6a494355c8dac9f840d09 Author: André Erdmann <dywi <AT> mailerd <DOT> de> AuthorDate: Tue Jun 25 21:08:01 2013 +0000 Commit: André Erdmann <dywi <AT> mailerd <DOT> de> CommitDate: Tue Jun 25 21:08:01 2013 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=df58d07c EVENT_HOOK_RESTRICT, roverlay.hook --- roverlay/config/const.py | 4 ++ roverlay/config/entrymap.py | 29 +++++--- roverlay/hook.py | 169 ++++++++++++++++++++++++++++++++++++++++++++ roverlay/main.py | 7 +- roverlay/tools/shenv.py | 22 ++---- 5 files changed, 204 insertions(+), 27 deletions(-) diff --git a/roverlay/config/const.py b/roverlay/config/const.py index 4ee9d45..f9a2e14 100644 --- a/roverlay/config/const.py +++ b/roverlay/config/const.py @@ -78,6 +78,10 @@ _CONSTANTS = dict ( manifest_implementation = 'default', ), + EVENT_HOOK = dict ( + default_exe_relpath = [ 'hooks', 'mux.sh' ], + ), + TOOLS = dict ( EBUILD = dict ( exe = "/usr/bin/ebuild", diff --git a/roverlay/config/entrymap.py b/roverlay/config/entrymap.py index 136b4b5..6a282d9 100644 --- a/roverlay/config/entrymap.py +++ b/roverlay/config/entrymap.py @@ -306,6 +306,12 @@ CONFIG_ENTRY_MAP = dict ( value_type = yesno, ), + overlay_distmap_file = dict ( + path = [ 'OVERLAY', 'DISTMAP', 'dbfile', ] + value_type = 'fs_file', + description = 'distmap file', + ), + # * alias backup_desc = 'overlay_backup_desc', eclass = 'overlay_eclass', @@ -316,6 +322,7 @@ CONFIG_ENTRY_MAP = dict ( distdir_strategy = 'overlay_distdir_strategy', distdir_flat = 'overlay_distdir_flat', distdir_verify = 'overlay_distdir_verify', + distmap_file = 'overlay_distmap_file', # --- overlay @@ -449,14 +456,22 @@ CONFIG_ENTRY_MAP = dict ( description = 'filter shell env', ), - hook_script = dict ( - path = [ 'SHELL_ENV', 'hook', ], - value_type = 'fs_file', + event_hook = dict ( + path = [ 'EVENT_HOOK', 'exe', ], + value_type = 'fs_file', description = 'script that is run on certain events, e.g. overlay_success', ), + event_hook_restrict = dict ( + path = [ 'EVENT_HOOK', 'restrict', ], + value_type = 'list:str', + description = 'mask for running hooks', + ), + + # * alias - hook = 'hook_script', + hook = 'event_hook', + hook_restrict = 'event_hook_restrict', # == other == @@ -467,12 +482,6 @@ CONFIG_ENTRY_MAP = dict ( description = 'directory for cache data', ), - tmpdir = dict ( - path = [ 'TMPDIR', 'root', ], - value_type = 'fs_dir', - description = 'directory for temporary data', - ), - nosync = dict ( value_type = yesno, description = 'forbid/allow syncing with remotes', diff --git a/roverlay/hook.py b/roverlay/hook.py new file mode 100644 index 0000000..3b13315 --- /dev/null +++ b/roverlay/hook.py @@ -0,0 +1,169 @@ +# R overlay -- run roverlay hooks (shell scripts) +# -*- coding: utf-8 -*- +# Copyright (C) 2013 André Erdmann <dywi@mailerd.de> +# Distributed under the terms of the GNU General Public License; +# either version 2 of the License, or (at your option) any later version. + +import os.path +import logging + +import roverlay.config +import roverlay.tools.shenv + +__all__ = [ 'run_hook', 'phase_allowed', ] + +LOGGER = logging.getLogger ( 'event_hook' ) + + +_EVENT_SCRIPT = None + +# None|iterable _EVENT_RESTRICT +_EVENT_RESTRICT = None + +# int _EVENT_POLICY +# -1: no policy (allow all) +# 0: not configured +# 1: allow unless in _EVENT_RESTRICT (blacklist) +# 2: deny unless in _EVENT_RESTRICT (whitelist) +# 4: deny all +_EVENT_POLICY = 0 + +def setup(): + global _EVENT_SCRIPT + global _EVENT_POLICY + global _EVENT_RESTRICT + + _EVENT_SCRIPT = roverlay.config.get ( 'EVENT_HOOK.exe', False ) + if _EVENT_SCRIPT is False: + a_dir = roverlay.config.get ( 'OVERLAY.additions_dir', None ) + if a_dir: + s = os.path.join ( + a_dir, + *roverlay.config.get_or_fail ( 'EVENT_HOOK.default_exe_relpath' ) + ) + if os.path.isfile ( s ): + _EVENT_SCRIPT = s + # -- end if _EVENT_SCRIPT + + conf_restrict = roverlay.config.get ( 'EVENT_HOOK.restrict', False ) + + if conf_restrict: + # tristate None,False,True + is_whitelist = None + allow = set() + deny = set() + for p in conf_restrict: + if p == '*': + # "allow all" + is_whitelist = False + elif p == '-*': + # "deny all" + is_whitelist = True + elif p == '-' or p == '+': + # empty + pass + elif p[0] == '-': + # deny <k> + k = p[1:].lower() + deny.add ( k ) + try: + allow.remove ( k ) + except KeyError: + pass + else: + # allow <k> + k = ( p[1:] if p[0] == '+' else p ).lower() + allow.add ( k ) + try: + deny.remove ( k ) + except KeyError: + pass + # -- end for; + + if is_whitelist is None: + # allow is set => is whitelist + # neither allow nor deny are set => deny allow + is_whitelist = bool ( allow or not deny ) + # -- end if is_whitelist #1 + + if is_whitelist: + if allow: + _EVENT_RESTRICT = frozenset ( allow ) + _EVENT_POLICY = 2 + else: + _EVENT_POLICY = 4 + elif deny: + _EVENT_RESTRICT = frozenset ( deny ) + _EVENT_POLICY = 1 + else: + _EVENT_POLICY = -1 + # -- end if is_whitelist #2 + else: + _EVENT_POLICY = -1 + # -- end if conf_restrict +# --- end of setup (...) --- + +def phase_allowed ( phase ): + if _EVENT_POLICY == -1: + return True + elif _EVENT_POLICY == 1: + # allow unless in restrict + if phase not in _EVENT_RESTRICT: + return True + else: + LOGGER.debug ( + "phase {!r} denied by blacklist policy.".format ( phase ) + ) + elif _EVENT_POLICY == 2: + # deny unless in restrict + if phase in _EVENT_RESTRICT: + return True + else: + LOGGER.debug ( + "phase {!r} denied by whitelist policy.".format ( phase ) + ) + elif _EVENT_POLICY == 4: + LOGGER.debug ( + "phase {!r} denied by 'deny all' policy".format ( phase ) + ) + else: + LOGGER.warning ( + "phase {!r} denied by undefined policy {} (fix this)".format ( + phase, _EVENT_POLICY + ) + ) + # -- end if _EVENT_POLICY + + # default return + return False +# --- end of phase_allowed (...) --- + +def phase_allowed_nolog ( phase ): + return ( + _EVENT_POLICY == -1 + ) or ( + _EVENT_POLICY == 1 and phase not in _EVENT_RESTRICT + ) or ( + _EVENT_POLICY == 2 and phase in _EVENT_RESTRICT + ) +# --- end of phase_allowed_nolog (...) --- + +def run ( phase ): + if _EVENT_SCRIPT is None: + LOGGER.warning ( + "hook module not initialized - doing that now (FIXME!)" + ) + setup() + + + + if _EVENT_SCRIPT and phase_allowed ( phase ): + return roverlay.tools.shenv.run_script ( + _EVENT_SCRIPT, phase, return_success=True + ) + else: + # nop + return True +# --- end of run (...) --- + +run_hook = run diff --git a/roverlay/main.py b/roverlay/main.py index 901cbcf..4822e21 100644 --- a/roverlay/main.py +++ b/roverlay/main.py @@ -289,7 +289,7 @@ def main ( # this hook should be called _after_ verifying the overlay # (verification is not implemented yet) # - if not roverlay.tools.shenv.run_hook ( 'overlay_success' ): + if not roverlay.hook.run ( 'overlay_success' ): die ( "overlay_success hook returned non-zero", DIE.OV_CREATE ) set_action_done ( "create" ) @@ -476,7 +476,7 @@ def main ( from roverlay.overlay.creator import OverlayCreator import roverlay.config - import roverlay.tools.shenv + import roverlay.hook except ImportError: if HIDE_EXCEPTIONS: die ( "Cannot import roverlay modules!", DIE.IMPORT ) @@ -491,6 +491,9 @@ def main ( # -- run + # initialize roverlay.hook + roverlay.hook.setup() + # always run sync 'cause commands = {create,sync,apply_rules} # and create,apply_rules implies (no)sync run_sync() diff --git a/roverlay/tools/shenv.py b/roverlay/tools/shenv.py index 85644d4..f0c054b 100644 --- a/roverlay/tools/shenv.py +++ b/roverlay/tools/shenv.py @@ -1,4 +1,4 @@ -# R overlay -- tools, run roverlay hooks (shell scripts) +# R overlay -- tools, shell script environment # -*- coding: utf-8 -*- # Copyright (C) 2013 André Erdmann <dywi@mailerd.de> # Distributed under the terms of the GNU General Public License; @@ -8,6 +8,7 @@ import logging import os import subprocess import tempfile +import time import roverlay.config @@ -18,7 +19,6 @@ import roverlay.util # _SHELL_ENV, _SHELL_INTPR are created when calling run_script() # _SHELL_ENV = None -_SHELL_ENV_SCRIPT = None #_SHELL_INTPR = None LOGGER = logging.getLogger ( 'shenv' ) @@ -287,7 +287,11 @@ def run_script ( script, phase, return_success=False, logger=None ): output = script_call.communicate() except: - script_call.kill() + try: + script_call.terminate() + time.sleep ( 1 ) + finally: + script_call.kill() raise @@ -327,15 +331,3 @@ def run_script ( script, phase, return_success=False, logger=None ): else: return script_call # --- end of run_script (...) --- - -def run_hook ( phase ): - global _SHELL_ENV_SCRIPT - if _SHELL_ENV_SCRIPT is None: - _SHELL_ENV_SCRIPT = roverlay.config.get ( 'SHELL_ENV.hook', False ) - - if _SHELL_ENV_SCRIPT: - return run_script ( _SHELL_ENV_SCRIPT, phase, return_success=True ) - else: - # nop - return True -# --- end of run_hook (...) ---
WARNING: multiple messages have this Message-ID (diff)
From: "André Erdmann" <dywi@mailerd.de> To: gentoo-commits@lists.gentoo.org Subject: [gentoo-commits] proj/R_overlay:gsoc13/next commit in: roverlay/tools/, roverlay/config/, roverlay/ Date: Tue, 25 Jun 2013 21:10:35 +0000 (UTC) [thread overview] Message-ID: <1372194481.df58d07cbadab7bdd5f6a494355c8dac9f840d09.dywi@gentoo> (raw) Message-ID: <20130625211035.hAGyNPBNH-MbNbJkk45p1UdlI5fLrMkIXBBMuhfQZX0@z> (raw) commit: df58d07cbadab7bdd5f6a494355c8dac9f840d09 Author: André Erdmann <dywi <AT> mailerd <DOT> de> AuthorDate: Tue Jun 25 21:08:01 2013 +0000 Commit: André Erdmann <dywi <AT> mailerd <DOT> de> CommitDate: Tue Jun 25 21:08:01 2013 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=df58d07c EVENT_HOOK_RESTRICT, roverlay.hook --- roverlay/config/const.py | 4 ++ roverlay/config/entrymap.py | 29 +++++--- roverlay/hook.py | 169 ++++++++++++++++++++++++++++++++++++++++++++ roverlay/main.py | 7 +- roverlay/tools/shenv.py | 22 ++---- 5 files changed, 204 insertions(+), 27 deletions(-) diff --git a/roverlay/config/const.py b/roverlay/config/const.py index 4ee9d45..f9a2e14 100644 --- a/roverlay/config/const.py +++ b/roverlay/config/const.py @@ -78,6 +78,10 @@ _CONSTANTS = dict ( manifest_implementation = 'default', ), + EVENT_HOOK = dict ( + default_exe_relpath = [ 'hooks', 'mux.sh' ], + ), + TOOLS = dict ( EBUILD = dict ( exe = "/usr/bin/ebuild", diff --git a/roverlay/config/entrymap.py b/roverlay/config/entrymap.py index 136b4b5..6a282d9 100644 --- a/roverlay/config/entrymap.py +++ b/roverlay/config/entrymap.py @@ -306,6 +306,12 @@ CONFIG_ENTRY_MAP = dict ( value_type = yesno, ), + overlay_distmap_file = dict ( + path = [ 'OVERLAY', 'DISTMAP', 'dbfile', ] + value_type = 'fs_file', + description = 'distmap file', + ), + # * alias backup_desc = 'overlay_backup_desc', eclass = 'overlay_eclass', @@ -316,6 +322,7 @@ CONFIG_ENTRY_MAP = dict ( distdir_strategy = 'overlay_distdir_strategy', distdir_flat = 'overlay_distdir_flat', distdir_verify = 'overlay_distdir_verify', + distmap_file = 'overlay_distmap_file', # --- overlay @@ -449,14 +456,22 @@ CONFIG_ENTRY_MAP = dict ( description = 'filter shell env', ), - hook_script = dict ( - path = [ 'SHELL_ENV', 'hook', ], - value_type = 'fs_file', + event_hook = dict ( + path = [ 'EVENT_HOOK', 'exe', ], + value_type = 'fs_file', description = 'script that is run on certain events, e.g. overlay_success', ), + event_hook_restrict = dict ( + path = [ 'EVENT_HOOK', 'restrict', ], + value_type = 'list:str', + description = 'mask for running hooks', + ), + + # * alias - hook = 'hook_script', + hook = 'event_hook', + hook_restrict = 'event_hook_restrict', # == other == @@ -467,12 +482,6 @@ CONFIG_ENTRY_MAP = dict ( description = 'directory for cache data', ), - tmpdir = dict ( - path = [ 'TMPDIR', 'root', ], - value_type = 'fs_dir', - description = 'directory for temporary data', - ), - nosync = dict ( value_type = yesno, description = 'forbid/allow syncing with remotes', diff --git a/roverlay/hook.py b/roverlay/hook.py new file mode 100644 index 0000000..3b13315 --- /dev/null +++ b/roverlay/hook.py @@ -0,0 +1,169 @@ +# R overlay -- run roverlay hooks (shell scripts) +# -*- coding: utf-8 -*- +# Copyright (C) 2013 André Erdmann <dywi@mailerd.de> +# Distributed under the terms of the GNU General Public License; +# either version 2 of the License, or (at your option) any later version. + +import os.path +import logging + +import roverlay.config +import roverlay.tools.shenv + +__all__ = [ 'run_hook', 'phase_allowed', ] + +LOGGER = logging.getLogger ( 'event_hook' ) + + +_EVENT_SCRIPT = None + +# None|iterable _EVENT_RESTRICT +_EVENT_RESTRICT = None + +# int _EVENT_POLICY +# -1: no policy (allow all) +# 0: not configured +# 1: allow unless in _EVENT_RESTRICT (blacklist) +# 2: deny unless in _EVENT_RESTRICT (whitelist) +# 4: deny all +_EVENT_POLICY = 0 + +def setup(): + global _EVENT_SCRIPT + global _EVENT_POLICY + global _EVENT_RESTRICT + + _EVENT_SCRIPT = roverlay.config.get ( 'EVENT_HOOK.exe', False ) + if _EVENT_SCRIPT is False: + a_dir = roverlay.config.get ( 'OVERLAY.additions_dir', None ) + if a_dir: + s = os.path.join ( + a_dir, + *roverlay.config.get_or_fail ( 'EVENT_HOOK.default_exe_relpath' ) + ) + if os.path.isfile ( s ): + _EVENT_SCRIPT = s + # -- end if _EVENT_SCRIPT + + conf_restrict = roverlay.config.get ( 'EVENT_HOOK.restrict', False ) + + if conf_restrict: + # tristate None,False,True + is_whitelist = None + allow = set() + deny = set() + for p in conf_restrict: + if p == '*': + # "allow all" + is_whitelist = False + elif p == '-*': + # "deny all" + is_whitelist = True + elif p == '-' or p == '+': + # empty + pass + elif p[0] == '-': + # deny <k> + k = p[1:].lower() + deny.add ( k ) + try: + allow.remove ( k ) + except KeyError: + pass + else: + # allow <k> + k = ( p[1:] if p[0] == '+' else p ).lower() + allow.add ( k ) + try: + deny.remove ( k ) + except KeyError: + pass + # -- end for; + + if is_whitelist is None: + # allow is set => is whitelist + # neither allow nor deny are set => deny allow + is_whitelist = bool ( allow or not deny ) + # -- end if is_whitelist #1 + + if is_whitelist: + if allow: + _EVENT_RESTRICT = frozenset ( allow ) + _EVENT_POLICY = 2 + else: + _EVENT_POLICY = 4 + elif deny: + _EVENT_RESTRICT = frozenset ( deny ) + _EVENT_POLICY = 1 + else: + _EVENT_POLICY = -1 + # -- end if is_whitelist #2 + else: + _EVENT_POLICY = -1 + # -- end if conf_restrict +# --- end of setup (...) --- + +def phase_allowed ( phase ): + if _EVENT_POLICY == -1: + return True + elif _EVENT_POLICY == 1: + # allow unless in restrict + if phase not in _EVENT_RESTRICT: + return True + else: + LOGGER.debug ( + "phase {!r} denied by blacklist policy.".format ( phase ) + ) + elif _EVENT_POLICY == 2: + # deny unless in restrict + if phase in _EVENT_RESTRICT: + return True + else: + LOGGER.debug ( + "phase {!r} denied by whitelist policy.".format ( phase ) + ) + elif _EVENT_POLICY == 4: + LOGGER.debug ( + "phase {!r} denied by 'deny all' policy".format ( phase ) + ) + else: + LOGGER.warning ( + "phase {!r} denied by undefined policy {} (fix this)".format ( + phase, _EVENT_POLICY + ) + ) + # -- end if _EVENT_POLICY + + # default return + return False +# --- end of phase_allowed (...) --- + +def phase_allowed_nolog ( phase ): + return ( + _EVENT_POLICY == -1 + ) or ( + _EVENT_POLICY == 1 and phase not in _EVENT_RESTRICT + ) or ( + _EVENT_POLICY == 2 and phase in _EVENT_RESTRICT + ) +# --- end of phase_allowed_nolog (...) --- + +def run ( phase ): + if _EVENT_SCRIPT is None: + LOGGER.warning ( + "hook module not initialized - doing that now (FIXME!)" + ) + setup() + + + + if _EVENT_SCRIPT and phase_allowed ( phase ): + return roverlay.tools.shenv.run_script ( + _EVENT_SCRIPT, phase, return_success=True + ) + else: + # nop + return True +# --- end of run (...) --- + +run_hook = run diff --git a/roverlay/main.py b/roverlay/main.py index 901cbcf..4822e21 100644 --- a/roverlay/main.py +++ b/roverlay/main.py @@ -289,7 +289,7 @@ def main ( # this hook should be called _after_ verifying the overlay # (verification is not implemented yet) # - if not roverlay.tools.shenv.run_hook ( 'overlay_success' ): + if not roverlay.hook.run ( 'overlay_success' ): die ( "overlay_success hook returned non-zero", DIE.OV_CREATE ) set_action_done ( "create" ) @@ -476,7 +476,7 @@ def main ( from roverlay.overlay.creator import OverlayCreator import roverlay.config - import roverlay.tools.shenv + import roverlay.hook except ImportError: if HIDE_EXCEPTIONS: die ( "Cannot import roverlay modules!", DIE.IMPORT ) @@ -491,6 +491,9 @@ def main ( # -- run + # initialize roverlay.hook + roverlay.hook.setup() + # always run sync 'cause commands = {create,sync,apply_rules} # and create,apply_rules implies (no)sync run_sync() diff --git a/roverlay/tools/shenv.py b/roverlay/tools/shenv.py index 85644d4..f0c054b 100644 --- a/roverlay/tools/shenv.py +++ b/roverlay/tools/shenv.py @@ -1,4 +1,4 @@ -# R overlay -- tools, run roverlay hooks (shell scripts) +# R overlay -- tools, shell script environment # -*- coding: utf-8 -*- # Copyright (C) 2013 André Erdmann <dywi@mailerd.de> # Distributed under the terms of the GNU General Public License; @@ -8,6 +8,7 @@ import logging import os import subprocess import tempfile +import time import roverlay.config @@ -18,7 +19,6 @@ import roverlay.util # _SHELL_ENV, _SHELL_INTPR are created when calling run_script() # _SHELL_ENV = None -_SHELL_ENV_SCRIPT = None #_SHELL_INTPR = None LOGGER = logging.getLogger ( 'shenv' ) @@ -287,7 +287,11 @@ def run_script ( script, phase, return_success=False, logger=None ): output = script_call.communicate() except: - script_call.kill() + try: + script_call.terminate() + time.sleep ( 1 ) + finally: + script_call.kill() raise @@ -327,15 +331,3 @@ def run_script ( script, phase, return_success=False, logger=None ): else: return script_call # --- end of run_script (...) --- - -def run_hook ( phase ): - global _SHELL_ENV_SCRIPT - if _SHELL_ENV_SCRIPT is None: - _SHELL_ENV_SCRIPT = roverlay.config.get ( 'SHELL_ENV.hook', False ) - - if _SHELL_ENV_SCRIPT: - return run_script ( _SHELL_ENV_SCRIPT, phase, return_success=True ) - else: - # nop - return True -# --- end of run_hook (...) ---
next reply other threads:[~2013-06-30 15:58 UTC|newest] Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top 2013-06-30 15:58 André Erdmann [this message] 2013-06-25 21:10 ` [gentoo-commits] proj/R_overlay:gsoc13/next commit in: roverlay/tools/, roverlay/config/, roverlay/ André Erdmann -- strict thread matches above, loose matches on Subject: below -- 2013-09-06 11:10 [gentoo-commits] proj/R_overlay:master " André Erdmann 2013-09-05 10:24 André Erdmann 2013-06-26 17:29 [gentoo-commits] proj/R_overlay:gsoc13/next " André Erdmann 2013-06-30 15:58 ` [gentoo-commits] proj/R_overlay:master " André Erdmann
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1372194481.df58d07cbadab7bdd5f6a494355c8dac9f840d09.dywi@gentoo \ --to=dywi@mailerd.de \ --cc=gentoo-commits@lists.gentoo.org \ --cc=gentoo-dev@lists.gentoo.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox