From b997d5ba5bffa0cf4a34efcd902c218b88fbd4d1 Mon Sep 17 00:00:00 2001 From: Emmo Emminghaus Date: Sat, 10 Nov 2018 21:43:45 +0100 Subject: [PATCH] move code from borg.helpers.usergroup to borg.platform.posix --- src/borg/archive.py | 2 +- src/borg/helpers/__init__.py | 1 - src/borg/helpers/parseformat.py | 5 ++- src/borg/helpers/usergroup.py | 50 ---------------------------- src/borg/platform/__init__.py | 1 + src/borg/platform/darwin.pyx | 2 +- src/borg/platform/freebsd.pyx | 2 +- src/borg/platform/linux.pyx | 4 +-- src/borg/platform/posix.pyx | 58 +++++++++++++++++++++++++++++++++ 9 files changed, 66 insertions(+), 59 deletions(-) delete mode 100644 src/borg/helpers/usergroup.py diff --git a/src/borg/archive.py b/src/borg/archive.py index cf8976428..95ed2d8de 100644 --- a/src/borg/archive.py +++ b/src/borg/archive.py @@ -29,7 +29,7 @@ from .helpers import Manifest from .helpers import hardlinkable from .helpers import ChunkIteratorFileWrapper, open_item from .helpers import Error, IntegrityError, set_ec -from .helpers import uid2user, user2uid, gid2group, group2gid +from .platform import uid2user, user2uid, gid2group, group2gid from .helpers import parse_timestamp, to_localtime from .helpers import OutputTimestamp, format_timedelta, format_file_size, file_status, FileSize from .helpers import safe_encode, safe_decode, make_path_safe, remove_surrogates diff --git a/src/borg/helpers/__init__.py b/src/borg/helpers/__init__.py index d8e74d344..5fbe62836 100644 --- a/src/borg/helpers/__init__.py +++ b/src/borg/helpers/__init__.py @@ -16,7 +16,6 @@ from .parseformat import * # NOQA from .process import * # NOQA from .progress import * # NOQA from .time import * # NOQA -from .usergroup import * # NOQA from .yes import * # NOQA from .msgpack import is_slow_msgpack, int_to_bigint, bigint_to_int, get_limited_unpacker diff --git a/src/borg/helpers/parseformat.py b/src/borg/helpers/parseformat.py index a332509f1..3d3707370 100644 --- a/src/borg/helpers/parseformat.py +++ b/src/borg/helpers/parseformat.py @@ -19,7 +19,6 @@ logger = create_logger() from .errors import Error from .fs import get_keys_dir from .time import OutputTimestamp, format_time, to_localtime, safe_timestamp, safe_s -from .usergroup import uid2user from .. import __version__ as borg_version from .. import __version_tuple__ as borg_version_tuple from ..constants import * # NOQA @@ -179,7 +178,7 @@ def format_line(format, data): def replace_placeholders(text): """Replace placeholders in text with their values.""" - from ..platform import fqdn, hostname + from ..platform import fqdn, hostname, getosusername current_time = datetime.now(timezone.utc) data = { 'pid': os.getpid(), @@ -188,7 +187,7 @@ def replace_placeholders(text): 'hostname': hostname, 'now': DatetimeWrapper(current_time.astimezone(None)), 'utcnow': DatetimeWrapper(current_time), - 'user': uid2user(os.getuid(), os.getuid()), + 'user': getosusername(), 'uuid4': str(uuid.uuid4()), 'borgversion': borg_version, 'borgmajor': '%d' % borg_version_tuple[:1], diff --git a/src/borg/helpers/usergroup.py b/src/borg/helpers/usergroup.py deleted file mode 100644 index fdb4677c5..000000000 --- a/src/borg/helpers/usergroup.py +++ /dev/null @@ -1,50 +0,0 @@ -import grp -import pwd -from functools import lru_cache - - -@lru_cache(maxsize=None) -def uid2user(uid, default=None): - try: - return pwd.getpwuid(uid).pw_name - except KeyError: - return default - - -@lru_cache(maxsize=None) -def user2uid(user, default=None): - try: - return user and pwd.getpwnam(user).pw_uid - except KeyError: - return default - - -@lru_cache(maxsize=None) -def gid2group(gid, default=None): - try: - return grp.getgrgid(gid).gr_name - except KeyError: - return default - - -@lru_cache(maxsize=None) -def group2gid(group, default=None): - try: - return group and grp.getgrnam(group).gr_gid - except KeyError: - return default - - -def posix_acl_use_stored_uid_gid(acl): - """Replace the user/group field with the stored uid/gid - """ - from .parseformat import safe_decode, safe_encode - entries = [] - for entry in safe_decode(acl).split('\n'): - if entry: - fields = entry.split(':') - if len(fields) == 4: - entries.append(':'.join([fields[0], fields[3], fields[2]])) - else: - entries.append(entry) - return safe_encode('\n'.join(entries)) diff --git a/src/borg/platform/__init__.py b/src/borg/platform/__init__.py index afe1bc135..3bb9ac68b 100644 --- a/src/borg/platform/__init__.py +++ b/src/borg/platform/__init__.py @@ -19,6 +19,7 @@ if not sys.platform.startswith(('win32', )): from .posix import process_alive, local_pid_alive # posix swidth implementation works for: linux, freebsd, darwin, openindiana, cygwin from .posix import swidth + from .posix import uid2user, user2uid, gid2group, group2gid, getosusername if sys.platform.startswith('linux'): # pragma: linux only from .linux import API_VERSION as OS_API_VERSION diff --git a/src/borg/platform/darwin.pyx b/src/borg/platform/darwin.pyx index 342320eae..8dea07535 100644 --- a/src/borg/platform/darwin.pyx +++ b/src/borg/platform/darwin.pyx @@ -2,7 +2,7 @@ import os from libc.stdint cimport uint32_t -from ..helpers import user2uid, group2gid +from .posix import user2uid, group2gid from ..helpers import safe_decode, safe_encode from .xattr import _listxattr_inner, _getxattr_inner, _setxattr_inner, split_string0 diff --git a/src/borg/platform/freebsd.pyx b/src/borg/platform/freebsd.pyx index e52752fa3..d89a3f4ee 100644 --- a/src/borg/platform/freebsd.pyx +++ b/src/borg/platform/freebsd.pyx @@ -1,6 +1,6 @@ import os -from ..helpers import posix_acl_use_stored_uid_gid +from .posix import posix_acl_use_stored_uid_gid from ..helpers import safe_encode, safe_decode from .xattr import _listxattr_inner, _getxattr_inner, _setxattr_inner, split_lstring diff --git a/src/borg/platform/linux.pyx b/src/borg/platform/linux.pyx index ec93c44aa..7b963c9e3 100644 --- a/src/borg/platform/linux.pyx +++ b/src/borg/platform/linux.pyx @@ -3,8 +3,8 @@ import re import stat import subprocess -from ..helpers import posix_acl_use_stored_uid_gid -from ..helpers import user2uid, group2gid +from .posix import posix_acl_use_stored_uid_gid +from .posix import user2uid, group2gid from ..helpers import safe_decode, safe_encode from .base import SyncFile as BaseSyncFile from .base import safe_fadvise diff --git a/src/borg/platform/posix.pyx b/src/borg/platform/posix.pyx index 8d84a95c5..979974284 100644 --- a/src/borg/platform/posix.pyx +++ b/src/borg/platform/posix.pyx @@ -1,5 +1,10 @@ import errno import os +# begin moved form helpers/usergroup.py +import grp +import pwd +from functools import lru_cache +# end moved from libc.errno cimport errno as c_errno @@ -61,3 +66,56 @@ def local_pid_alive(pid): return False # Any other error (eg. permissions) means that the process ID refers to a live process. return True + +# begin moved form helpers/usergroup.py + +@lru_cache(maxsize=None) +def uid2user(uid, default=None): + try: + return pwd.getpwuid(uid).pw_name + except KeyError: + return default + + +@lru_cache(maxsize=None) +def user2uid(user, default=None): + try: + return user and pwd.getpwnam(user).pw_uid + except KeyError: + return default + + +@lru_cache(maxsize=None) +def gid2group(gid, default=None): + try: + return grp.getgrgid(gid).gr_name + except KeyError: + return default + + +@lru_cache(maxsize=None) +def group2gid(group, default=None): + try: + return group and grp.getgrnam(group).gr_gid + except KeyError: + return default + + +def posix_acl_use_stored_uid_gid(acl): + """Replace the user/group field with the stored uid/gid + """ + from ..helpers import safe_decode, safe_encode + entries = [] + for entry in safe_decode(acl).split('\n'): + if entry: + fields = entry.split(':') + if len(fields) == 4: + entries.append(':'.join([fields[0], fields[3], fields[2]])) + else: + entries.append(entry) + return safe_encode('\n'.join(entries)) +#end moved + +def getosusername(): + """Return the os user name.""" + return uid2user(os.getuid(), os.getuid())