the-custodian/docs/changes/CUST-WP-0073/existing-k3s-host-r1/unit_transform.py

41 lines
1.6 KiB
Python
Raw Normal View History

"""Pure reviewed k3s unit transformation. No write, reload or restart capability."""
import hashlib
import os
from pathlib import Path
import re
import stat
BEFORE = 'b5398c385430ce225faadc1f3724597fe4b05dd999a04b8abbca64d4b0d68c0e'
AFTER = '866ea58bfab00215e5bd3352287ebb0230d4ddb7dd3ed4b1cd853e74c6698d7d'
PATH = Path('/etc/systemd/system/k3s.service')
def transform(raw, *, before=BEFORE, after=AFTER):
if hashlib.sha256(raw).hexdigest() != before:
raise ValueError('unit_preimage_changed')
candidate, count = re.subn(rb'(--write-kubeconfig-mode(?:=|[ \t]+)[\x22\x27]?)644\b', rb'\g<1>600', raw)
if count != 1 or len(candidate) != len(raw) or sum(a != b for a,b in zip(raw,candidate)) != 2:
raise ValueError('unit_change_not_exact')
if hashlib.sha256(candidate).hexdigest() != after:
raise ValueError('unit_candidate_mismatch')
return candidate
def prepare():
# Open without symlink following and bind metadata/read to the same object.
fd = os.open(PATH, os.O_RDONLY | os.O_NOFOLLOW)
try:
st = os.fstat(fd)
if (not stat.S_ISREG(st.st_mode) or stat.S_IMODE(st.st_mode) != 0o644
or (st.st_uid, st.st_gid, st.st_dev, st.st_ino) != (0,0,2049,7875)
or st.st_nlink != 1):
raise ValueError('unit_identity_changed')
with os.fdopen(os.dup(fd), 'rb') as stream:
candidate = transform(stream.read())
end = os.fstat(fd)
if (end.st_mtime_ns,end.st_ctime_ns,end.st_size) != (st.st_mtime_ns,st.st_ctime_ns,st.st_size):
raise ValueError('unit_changed_during_read')
return candidate
finally:
os.close(fd)