62 lines
2.4 KiB
Python
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())
|