From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) by finch.gentoo.org (Postfix) with ESMTP id A73471381F3 for ; Mon, 16 Sep 2013 13:43:32 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id A4B73E09C1; Mon, 16 Sep 2013 13:43:28 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 02216E0A5E for ; Mon, 16 Sep 2013 13:43:27 +0000 (UTC) Received: from hornbill.gentoo.org (hornbill.gentoo.org [94.100.119.163]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id CB0C333EAE6 for ; Mon, 16 Sep 2013 13:43:26 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by hornbill.gentoo.org (Postfix) with ESMTP id 7DEB6E545E for ; Mon, 16 Sep 2013 13:43:25 +0000 (UTC) From: "André Erdmann" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "André Erdmann" Message-ID: <1379327562.b6d2a9ad04f59e59feca8a14e98470fda1451ad1.dywi@gentoo> Subject: [gentoo-commits] proj/R_overlay:master commit in: roverlay/setupscript/, roverlay/ X-VCS-Repository: proj/R_overlay X-VCS-Files: roverlay/fsutil.py roverlay/setupscript/runtime.py X-VCS-Directories: roverlay/setupscript/ roverlay/ X-VCS-Committer: dywi X-VCS-Committer-Name: André Erdmann X-VCS-Revision: b6d2a9ad04f59e59feca8a14e98470fda1451ad1 X-VCS-Branch: master Date: Mon, 16 Sep 2013 13:43:25 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Archives-Salt: 38b3de57-fb84-4359-bb8e-86a1364f0890 X-Archives-Hash: 14c2914fe73f6949c0142c60b455c55a commit: b6d2a9ad04f59e59feca8a14e98470fda1451ad1 Author: André Erdmann mailerd de> AuthorDate: Mon Sep 16 10:32:03 2013 +0000 Commit: André Erdmann mailerd de> CommitDate: Mon Sep 16 10:32:42 2013 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=b6d2a9ad roverlay/fsutil: RWX, FsPermissions --- roverlay/fsutil.py | 198 +++++++++++++++++++++++++++++----------- roverlay/setupscript/runtime.py | 8 +- 2 files changed, 148 insertions(+), 58 deletions(-) diff --git a/roverlay/fsutil.py b/roverlay/fsutil.py index 7f3296a..2cf0baa 100644 --- a/roverlay/fsutil.py +++ b/roverlay/fsutil.py @@ -115,57 +115,147 @@ def get_bitwise_sum ( iterable, initial_value=None ): return ret # --- end of get_bitwise_sum (...) --- -def get_stat_mode ( mode_str ): +class RWX ( object ): + + @classmethod + def from_str ( cls, s, strict=False ): + readable, writable, executable = False, False, False + + if strict: + _s = s.lower() + readable = _s[0] == 'r' + writable = _s[1] == 'w' + executable = _s[2] == 'x' + + elif s: + for char in s.lower(): + if char == 'r': + readable = True + elif char == 'w': + writable = True + elif char == 'x': + executable = True + # -- end for + # -- end if + + return cls ( readable, writable, executable ) + # --- end of from_str (...) --- + + @classmethod + def from_bitmask ( cls, mode, rwx_bits ): + return cls ( + mode & rwx_bits[0], mode & rwx_bits[1], mode & rwx_bits[2], + ) + # --- end of from_bitmask (...) --- + + def __init__ ( self, readable, writable, executable ): + super ( RWX, self ).__init__() + self.readable = bool ( readable ) + self.writable = bool ( writable ) + self.executable = bool ( executable ) + # --- end of __init__ (...) --- + + def __hash__ ( self ): + return id ( self ) + # --- end of __hash__ (...) --- + + def __repr__ ( self ): + return "<{cls.__name__}({val}) at 0x{addr:x}>".format ( + cls = self.__class__, + val = self.get_str(), + addr = id ( self ), + ) + # --- end of __repr__ (...) --- + + def get_str ( self, fillchar='-' ): + return ( + ( 'r' if self.readable else fillchar ) + + ( 'w' if self.writable else fillchar ) + + ( 'x' if self.executable else fillchar ) + ) + # --- end of get_str (...) --- + + __str__ = get_str + + def get_bitmask ( self, rwx_bits ): + ret = 0 + if self.readable: + ret |= rwx_bits[0] + + if self.writable: + ret |= rwx_bits[1] + + if self.executable: + ret |= rwx_bits[2] + + return ret + # --- end of get_bitmask (...) --- + +# --- end of RWX --- + + +class FsPermissions ( object ): - def iter_mode_values ( mode_str ): - # rwxrwxrwx - # 012345678 - # r -> pos % 3 == 0 - # w -> pos % 3 == 1 - # x -> pos % 3 == 2 - - - # COULDFIX: parse sticky bit etc. (not necessary, currently) - if len ( mode_str ) > 9: - raise ValueError ( mode_str ) - - for pos, char in enumerate ( mode_str ): - if char != '-': - block = pos // 3 - subpos = pos % 3 - if subpos == 0: - # r - assert char == 'r' - if block == 0: - yield stat.S_IRUSR - elif block == 1: - yield stat.S_IRGRP - else: - yield stat.S_IROTH - - elif subpos == 1: - # w - assert char == 'w' - if block == 0: - yield stat.S_IWUSR - elif block == 1: - yield stat.S_IWGRP - else: - yield stat.S_IWOTH - - elif subpos == 2: - # x - assert char == 'x' - if block == 0: - yield stat.S_IXUSR - elif block == 1: - yield stat.S_IXGRP - else: - yield stat.S_IXOTH - - # --- end of iter_mode_values (...) --- - - return get_bitwise_sum ( iter_mode_values ( mode_str ) ) + USR_BITS = ( stat.S_IRUSR, stat.S_IWUSR, stat.S_IXUSR ) + GRP_BITS = ( stat.S_IRGRP, stat.S_IWGRP, stat.S_IXGRP ) + OTH_BITS = ( stat.S_IROTH, stat.S_IWOTH, stat.S_IXOTH ) + + @classmethod + def from_str ( cls, s, strict=False ): + rwx_user = RWX.from_str ( s[0:3], strict=strict ) + rwx_group = RWX.from_str ( s[3:6], strict=strict ) + rwx_others = RWX.from_str ( s[6:9], strict=strict ) + return cls ( rwx_user, rwx_group, rwx_others ) + # --- end of from_str (...) --- + + @classmethod + def from_stat_mode ( cls, stat_mode ): + return cls ( + RWX.from_bitmask ( stat_mode, cls.USR_BITS ), + RWX.from_bitmask ( stat_mode, cls.GRP_BITS ), + RWX.from_bitmask ( stat_mode, cls.OTH_BITS ), + ) + # --- end of from_stat_mode (...) --- + + def __init__ ( self, rwx_user, rwx_group, rwx_others ): + super ( FsPermissions, self ).__init__() + self.user = rwx_user + self.group = rwx_group + self.others = rwx_others + # --- end of __init__ (...) --- + + def __repr__ ( self ): + return "<{cls.__name__}({val}) at 0x{addr:x}>".format ( + cls = self.__class__, + val = self.get_str(), + addr = id ( self ), + ) + # --- end of __repr__ (...) --- + + def get_str ( self, fillchar='-' ): + return "".join ( + rwx.get_str ( fillchar=fillchar ) + for rwx in ( self.user, self.group, self.others ) + ) + # --- end of get_str (...) --- + + __str__ = get_str + + def get_stat_mode ( self ): + return ( + self.user.get_bitmask ( self.USR_BITS ) | + self.group.get_bitmask ( self.GRP_BITS ) | + self.others.get_bitmask ( self.OTH_BITS ) + ) + # --- end of get_stat_mode (...) --- + + __int__ = get_stat_mode + __index__ = get_stat_mode + +# --- end of FsPermissions --- + +def get_stat_mode ( mode_str ): + return FsPermissions.from_str ( mode_str ).get_stat_mode() # --- end of get_stat_mode (...) --- class ChownChmod ( object ): @@ -176,8 +266,8 @@ class ChownChmod ( object ): self.pretend = bool ( pretend ) do_chown = uid is not None or gid is not None - self.uid = -1 if uid is None else uid - self.gid = -1 if gid is None else gid + self.uid = -1 if uid is None else int ( uid ) + self.gid = -1 if gid is None else int ( gid ) if do_chown: self.chown_str = "chown {uid:d}:{gid:d} {{}}".format ( @@ -197,7 +287,7 @@ class ChownChmod ( object ): elif isinstance ( mode, str ): self.mode = get_stat_mode ( mode ) else: - self.mode = mode + self.mode = int ( mode ) if self.mode is None: self.chmod_str = "NO CHMOD {}" @@ -447,7 +537,7 @@ class VirtualFsOperations ( AbstractFsOperations ): self.info ( ret + "\n" ) def chmod_chown_recursive ( self, root ): - for word in self.perm_env.chmod_chown_recursive ( root ): + for word in self.perm_env.chown_chmod_recursive ( root ): if word is not None: self.info ( word + "\n" ) diff --git a/roverlay/setupscript/runtime.py b/roverlay/setupscript/runtime.py index 6ce804b..f7a38cc 100644 --- a/roverlay/setupscript/runtime.py +++ b/roverlay/setupscript/runtime.py @@ -264,10 +264,10 @@ class SetupEnvironment ( roverlay.runtime.IndependentRuntimeEnvironment ): LOG_LEVEL = logging.INFO - SHARED_DIR_MODE = roverlay.fsutil.get_stat_mode ( "rwxrwxr-x" ) - PRIVATE_DIR_MODE = roverlay.fsutil.get_stat_mode ( "rwxr-x---" ) - SHARED_FILE_MODE = roverlay.fsutil.get_stat_mode ( "rw-rw-r--" ) - PRIVATE_FILE_MODE = roverlay.fsutil.get_stat_mode ( "rw-r-----" ) + SHARED_DIR_MODE = "rwxrwxr-x" + PRIVATE_DIR_MODE = "rwxr-x---" + SHARED_FILE_MODE = "rw-rw-r--" + PRIVATE_FILE_MODE = "rw-r-----" def __init__ ( self, *args, **kwargs ): super ( SetupEnvironment, self ).__init__ ( *args, **kwargs )