Files
apex.ermnvldmr.com/ci/scripts/init-node/provisioning/manual_bundle.py
T

62 lines
2.4 KiB
Python

"""Install an immutable watchdog bundle from the operator's checkout."""
import io
import os
from pathlib import Path
import shutil
import stat
import sys
import tarfile
import tempfile
def _trusted(path):
info = path.lstat()
if not stat.S_ISDIR(info.st_mode) or info.st_uid != os.geteuid() or info.st_mode & 0o022:
raise RuntimeError(f"Untrusted provisioning directory: {path}")
def install(root=Path('/')):
source = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(source))
from provisioning.bundle import _bundle_from_source
data, digest = _bundle_from_source(source)
# All ancestors from the filesystem root must be protected before publishing code.
parent = root
_trusted(parent)
for component in ('usr', 'local', 'lib', 'apex-provisioner'):
parent = parent / component
parent.mkdir(mode=0o755, exist_ok=True)
_trusted(parent)
destination = parent / digest
with tempfile.TemporaryDirectory(prefix='.install-', dir=parent) as temporary:
stage = Path(temporary) / 'bundle'
stage.mkdir(mode=0o755)
with tarfile.open(fileobj=io.BytesIO(data)) as archive:
for member in archive:
if not member.isfile() or '..' in Path(member.name).parts or Path(member.name).is_absolute():
raise RuntimeError('Invalid provisioning bundle member')
target = stage / member.name
target.parent.mkdir(mode=0o755, parents=True, exist_ok=True)
with archive.extractfile(member) as source_file, target.open('xb') as output:
shutil.copyfileobj(source_file, output)
target.chmod(member.mode)
try:
os.rename(stage, destination)
except OSError:
_trusted(destination)
installed, existing_digest = _bundle_from_source(destination)
if existing_digest != digest or installed != data:
raise RuntimeError('Installed provisioning bundle differs from the checkout') from None
for path in destination.rglob('*'):
info = path.lstat()
if info.st_uid != os.geteuid() or info.st_mode & 0o022 or path.is_symlink():
raise RuntimeError(f'Untrusted installed provisioning file: {path}') from None
return destination
if __name__ == '__main__':
if os.geteuid() != 0:
raise SystemExit('Run bundle installation as root.')
print(install())