This file is indexed.

/usr/lib/python3/dist-packages/curtin/futil.py is in python3-curtin 18.1-5-g572ae5d6-0ubuntu1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
# This file is part of curtin. See LICENSE file for copyright and license info.

import grp
import pwd
import os
import warnings

from .util import write_file, target_path
from .log import LOG


def chownbyid(fname, uid=None, gid=None):
    if uid in [None, -1] and gid in [None, -1]:
        return
    os.chown(fname, uid, gid)


def decode_perms(perm, default=0o644):
    try:
        if perm is None:
            return default
        if isinstance(perm, (int, float)):
            # Just 'downcast' it (if a float)
            return int(perm)
        else:
            # Force to string and try octal conversion
            return int(str(perm), 8)
    except (TypeError, ValueError):
        return default


def chownbyname(fname, user=None, group=None):
    uid = -1
    gid = -1
    try:
        if user:
            uid = pwd.getpwnam(user).pw_uid
        if group:
            gid = grp.getgrnam(group).gr_gid
    except KeyError as e:
        raise OSError("Unknown user or group: %s" % (e))
    chownbyid(fname, uid, gid)


def extract_usergroup(ug_pair):
    if not ug_pair:
        return (None, None)
    ug_parted = ug_pair.split(':', 1)
    u = ug_parted[0].strip()
    if len(ug_parted) == 2:
        g = ug_parted[1].strip()
    else:
        g = None
    if not u or u == "-1" or u.lower() == "none":
        u = None
    if not g or g == "-1" or g.lower() == "none":
        g = None
    return (u, g)


def write_finfo(path, content, owner="-1:-1", perms="0644"):
    (u, g) = extract_usergroup(owner)
    omode = "w"
    if isinstance(content, bytes):
        omode = "wb"
    write_file(path, content, mode=decode_perms(perms), omode=omode)
    chownbyname(path, u, g)


def write_files(files, base_dir=None):
    """Write files described in the dictionary 'files'

    paths are assumed under 'base_dir', which will default to '/'.
    A trailing '/' will be applied if not present.

    files is a dictionary where each entry has:
       path: /file1
       content: (bytes or string)
       permissions: (optional, default=0644)
       owner: (optional, default -1:-1): string of 'uid:gid'."""
    for (key, info) in files.items():
        if not info.get('path'):
            LOG.warn("Warning, write_files[%s] had no 'path' entry", key)
            continue

        write_finfo(path=target_path(base_dir, info['path']),
                    content=info.get('content', ''),
                    owner=info.get('owner', "-1:-1"),
                    perms=info.get('permissions', info.get('perms', "0644")))


def _legacy_write_files(cfg, base_dir=None):
    """Backwards compatibility for curthooks.write_files (LP: #1731709)
    It needs to work like:
        curthooks.write_files(cfg, target)
    cfg is a 'cfg' dictionary with a 'write_files' entry in it.
    """
    warnings.warn(
        "write_files use from curtin.util is deprecated. "
        "Please use curtin.futil.write_files.", DeprecationWarning)
    return write_files(cfg.get('write_files', {}), base_dir=base_dir)

# vi: ts=4 expandtab syntax=python