# This file is part of cloud-init. See LICENSE file for license information. import contextlib import errno import logging import os import shutil import tempfile from cloudinit import util LOG = logging.getLogger(__name__) _TMPDIR = None _ROOT_TMPDIR = "/run/cloud-init/tmp" _EXE_ROOT_TMPDIR = "/var/tmp/cloud-init" def get_tmp_ancestor(odir=None, needs_exe: bool = False): if odir is not None: return odir if needs_exe: return _EXE_ROOT_TMPDIR if _TMPDIR: return _TMPDIR if os.getuid() == 0: return _ROOT_TMPDIR return os.environ.get("TMPDIR", "/tmp") def _tempfile_dir_arg(odir=None, needs_exe: bool = False): """Return the proper 'dir' argument for tempfile functions. When root, cloud-init will use /run/cloud-init/tmp to avoid any cleaning that a distro boot might do on /tmp (such as systemd-tmpfiles-clean). If the caller of this function (mkdtemp or mkstemp) was provided with a 'dir' argument, then that is respected. @param odir: original 'dir' arg to 'mkdtemp' or other. @param needs_exe: Boolean specifying whether or not exe permissions are needed for tempdir. This is needed because /run is mounted noexec. """ tdir = get_tmp_ancestor(odir, needs_exe) if not os.path.isdir(tdir): os.makedirs(tdir) os.chmod(tdir, 0o1777) if needs_exe: if util.has_mount_opt(tdir, "noexec"): LOG.warning( "Requested temporal dir with exe permission `%s` is" " mounted as noexec", tdir, ) if odir is None and not needs_exe: global _TMPDIR _TMPDIR = tdir return tdir def ExtendedTemporaryFile(**kwargs): kwargs["dir"] = _tempfile_dir_arg( kwargs.pop("dir", None), kwargs.pop("needs_exe", False) ) fh = tempfile.NamedTemporaryFile(**kwargs) # Replace its unlink with a quiet version # that does not raise errors when the # file to unlink has been unlinked elsewhere.. def _unlink_if_exists(path): try: os.unlink(path) except OSError as e: if e.errno != errno.ENOENT: raise e fh.unlink = _unlink_if_exists # Add a new method that will unlink # right 'now' but still lets the exit # method attempt to remove it (which will # not throw due to our del file being quiet # about files that are not there) def unlink_now(): fh.unlink(fh.name) setattr(fh, "unlink_now", unlink_now) return fh @contextlib.contextmanager def tempdir(rmtree_ignore_errors=False, **kwargs): # This seems like it was only added in python 3.2 # Make it since its useful... # See: http://bugs.python.org/file12970/tempdir.patch tdir = mkdtemp(**kwargs) try: yield tdir finally: shutil.rmtree(tdir, ignore_errors=rmtree_ignore_errors) def mkdtemp(dir=None, needs_exe: bool = False, **kwargs): dir = _tempfile_dir_arg(dir, needs_exe) return tempfile.mkdtemp(dir=dir, **kwargs) def mkstemp(dir=None, needs_exe: bool = False, **kwargs): dir = _tempfile_dir_arg(dir, needs_exe) return tempfile.mkstemp(dir=dir, **kwargs)
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
analyze | Folder | 0755 |
|
|
cmd | Folder | 0755 |
|
|
config | Folder | 0755 |
|
|
distros | Folder | 0755 |
|
|
filters | Folder | 0755 |
|
|
handlers | Folder | 0755 |
|
|
mergers | Folder | 0755 |
|
|
net | Folder | 0755 |
|
|
reporting | Folder | 0755 |
|
|
sources | Folder | 0755 |
|
|
__init__.py | File | 0 B | 0644 |
|
apport.py | File | 7.05 KB | 0644 |
|
atomic_helper.py | File | 2.45 KB | 0644 |
|
cloud.py | File | 3.22 KB | 0644 |
|
dmi.py | File | 6.77 KB | 0644 |
|
event.py | File | 2 KB | 0644 |
|
features.py | File | 3.38 KB | 0644 |
|
gpg.py | File | 4.28 KB | 0644 |
|
helpers.py | File | 16.41 KB | 0644 |
|
importer.py | File | 2.43 KB | 0644 |
|
log.py | File | 5.47 KB | 0644 |
|
netinfo.py | File | 22.97 KB | 0644 |
|
persistence.py | File | 2.52 KB | 0644 |
|
registry.py | File | 1022 B | 0644 |
|
safeyaml.py | File | 10.28 KB | 0644 |
|
settings.py | File | 2.02 KB | 0644 |
|
signal_handler.py | File | 1.74 KB | 0644 |
|
simpletable.py | File | 1.93 KB | 0644 |
|
ssh_util.py | File | 22.28 KB | 0644 |
|
stages.py | File | 38.88 KB | 0644 |
|
subp.py | File | 13.23 KB | 0644 |
|
temp_utils.py | File | 3.15 KB | 0644 |
|
templater.py | File | 5.95 KB | 0644 |
|
type_utils.py | File | 703 B | 0644 |
|
url_helper.py | File | 27.32 KB | 0644 |
|
user_data.py | File | 14.43 KB | 0644 |
|
util.py | File | 96.43 KB | 0644 |
|
version.py | File | 565 B | 0644 |
|
warnings.py | File | 3.76 KB | 0644 |
|