-
Notifications
You must be signed in to change notification settings - Fork 0
Restore fresh runtime setup and resident outcomes #52
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -270,9 +270,10 @@ print(bridge, subnet) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ensure_network() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| local owner="$1" installation network labels bridge_name | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| local owner="$1" installation network labels bridge_name network_path | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| installation="$(owner_installation "$owner")" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| network="1helm-$installation" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| network_path="$NETWORKS_ROOT/$network.json" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Linux IFNAMSIZ is 15 chars; keep a stable, installation-scoped bridge name. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| bridge_name="1h${installation:0:12}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if "${PODMAN[@]}" network exists "$network"; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -283,17 +284,43 @@ labels=json.loads(sys.argv[1] or "{}") | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if labels.get("com.1helm.managed") != "true" or labels.get("com.1helm.installation") != sys.argv[2]: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| raise SystemExit("network ownership labels do not match") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| PY | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Netavark 1.4 starts aardvark-dns through a user systemd scope. A root | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # helper invoked by the system service has no user bus, so the advertised | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # gateway DNS listener never exists and every resident lookup times out. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # These are 1Helm-owned JSON network definitions; disable only that broken | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # plugin and let containers inherit the host's working resolvers instead. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if [[ -f "$network_path" && ! -L "$network_path" ]] \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| && grep -q '"dns_enabled"[[:space:]]*:[[:space:]]*true' "$network_path"; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| python3 - "$network_path" <<'PY' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import json, os, stat, sys, tempfile | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| path=sys.argv[1] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| info=os.lstat(path) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if not stat.S_ISREG(info.st_mode) or stat.S_ISLNK(info.st_mode) or info.st_uid != 0 or info.st_gid != 0: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| raise SystemExit("owned network definition is not a safe root-owned file") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| with open(path, encoding="utf-8") as source: network=json.load(source) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| labels=network.get("labels") or network.get("Labels") or {} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if labels.get("com.1helm.managed") != "true": raise SystemExit("refusing to change an unmanaged network") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| network["dns_enabled"]=False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| descriptor,candidate=tempfile.mkstemp(prefix=".1helm-network-",dir=os.path.dirname(path)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| try: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| with os.fdopen(descriptor,"w",encoding="utf-8") as destination: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| json.dump(network,destination,indent=5); destination.write("\n"); destination.flush(); os.fsync(destination.fileno()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| os.chmod(candidate,stat.S_IMODE(info.st_mode)); os.chown(candidate,0,0); os.replace(candidate,path) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| finally: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if os.path.exists(candidate): os.unlink(candidate) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| PY | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| else | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Prefer a stable IFNAMSIZ-safe bridge name when the backend supports Docker- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # style bridge options (netavark). Debian bookworm's CNI backend rejects | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # com.docker.network.bridge.name; fall back to a labeled default bridge and | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # let ensure_guest_egress read the real interface from network inspect. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| create_out="" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if ! create_out="$("${PODMAN[@]}" network create --disable-dns=false \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if ! create_out="$("${PODMAN[@]}" network create --disable-dns \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --opt "com.docker.network.bridge.name=${bridge_name}" \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --label com.1helm.managed=true --label "com.1helm.installation=$installation" "$network" 2>&1)"; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if grep -qiE 'unsupported (bridge )?network option|unknown network option' <<<"$create_out"; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "${PODMAN[@]}" network create --disable-dns=false \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "${PODMAN[@]}" network create --disable-dns \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --label com.1helm.managed=true --label "com.1helm.installation=$installation" "$network" >/dev/null \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| || die "channel network could not be created" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| else | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -671,27 +698,51 @@ create_container() { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| start_container() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| local name="$1" owner="$2" state network | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| local name="$1" owner="$2" state network root network_ready container_ok=0 network_ok=0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| verify_container "$name" "$owner" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| network="$(network_name "$owner")" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| root="$(channel_root "$name")" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| network_ready="$root/network-ready-v1" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| network="$(ensure_network "$owner")" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Re-assert egress on every start: Docker and host firewall reloads can drop | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # our FORWARD/NAT inserts after boot or package updates. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if "${PODMAN[@]}" network exists "$network"; then ensure_guest_egress "$network"; fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| state="$(container_state "$name")" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # An update from the earlier aardvark-backed contract must restart a running | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # retained container once so Podman regenerates /etc/resolv.conf from the | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # now host-inherited network definition. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if [[ "$state" == running && ! -f "$network_ready" ]]; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "${PODMAN[@]}" stop --time 90 "$name" >/dev/null | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| state="stopped" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if [[ "$state" != running ]]; then "${PODMAN[@]}" start "$name" >/dev/null; fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for _ in {1..100}; do | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Podman can briefly fail name-based --user lookup while it reconstructs | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # its ephemeral runroot after a host reboot even though the persisted | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # image passwd database is intact. These identities are pinned by the | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # installed runtime manifest and image contract, so use their numeric form | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # for the readiness probe and every subsequent exec boundary. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if "${PODMAN[@]}" exec --user 0:0 "$name" /bin/sh -c 'test "$(cat /var/lib/1helm/owner)" = "$1" && test -d /workspace && test -d /home/agent' 1helm-start "$owner" >/dev/null 2>&1; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if "${PODMAN[@]}" exec --user 0:0 "$name" /bin/sh -c \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'test "$(cat /var/lib/1helm/owner)" = "$1" && test -d /workspace && test -d /home/agent' \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 1helm-start "$owner" >/dev/null 2>&1; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| verify_container "$name" "$owner" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| container_ok=1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| break | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| sleep 0.1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| done | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
718
to
732
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win Wrap the ownership/storage health-check exec in This loop retries 🐛 Proposed fix to bound the ownership/storage probe for _ in {1..100}; do
- if "${PODMAN[@]}" exec --user 0:0 "$name" /bin/sh -c \
+ if timeout 7 "${PODMAN[@]}" exec --user 0:0 "$name" /bin/sh -c \
'test "$(cat /var/lib/1helm/owner)" = "$1" && test -d /workspace && test -d /home/agent' \
1helm-start "$owner" >/dev/null 2>&1; then📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| die "container did not pass its ownership and storage health check" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [[ "$container_ok" -eq 1 ]] || die "container did not pass its ownership and storage health check" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if [[ ! -f "$network_ready" ]]; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for _ in {1..5}; do | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if timeout 7 "${PODMAN[@]}" exec --user "$AGENT_UID:$AGENT_GID" "$name" /usr/bin/python3 -c \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'import socket; s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.close(); socket.getaddrinfo("example.com",443,type=socket.SOCK_STREAM); c=socket.create_connection(("example.com",443),3); c.close()' \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| >/dev/null 2>&1; then network_ok=1; break; fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| sleep 0.2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| done | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [[ "$network_ok" -eq 1 ]] || die "container did not pass its network socket, public DNS, and TCP egress health check" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| printf '%s\n' 'host-dns-and-public-tcp-v1' >"$network_ready" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| chown root:root "$network_ready" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| chmod 0600 "$network_ready" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| stop_container() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -902,7 +953,7 @@ case "$operation" in | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ;; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ready) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| (($# == 0)) || die "ready takes no arguments" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for command in find flock getfacl iptables podman python3 setfacl sha256sum stat tar; do command -v "$command" >/dev/null || die "missing $command"; done | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for command in find flock getfacl iptables podman python3 setfacl sha256sum stat tar timeout; do command -v "$command" >/dev/null || die "missing $command"; done | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [[ -r "$CONTAINERFILE" ]] || die "installed OCI image recipe is missing" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "${PODMAN[@]}" info >/dev/null | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| printf '{"ready":true,"version":"%s","engine":"podman"}\n' "$RUNTIME_VERSION" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -30,6 +30,32 @@ fi | |
| for command in crun find flock getfacl iptables podman python3 setfacl sha256sum stat sudo tar visudo; do command -v "$command" >/dev/null || { echo "Missing OCI prerequisite after setup: $command" >&2; exit 1; }; done | ||
| [[ "$(stat -fc %T /sys/fs/cgroup)" == cgroup2fs ]] || { echo "1Helm OCI resource controls require cgroup v2." >&2; exit 1; } | ||
|
|
||
| # Ubuntu ships an AppArmor attachment for /usr/bin/crun whose nominally | ||
| # unconfined profile can still inherit the outer container host's address-family | ||
| # restrictions. On a nested systemd host that manifests inside every resident | ||
| # as EPERM from socket(2), even though the 1Helm host itself has internet. Add | ||
| # only the missing address-family grants to crun's supported local include; the | ||
| # outer host/container profile remains the isolation boundary. | ||
| NESTED_CRUN_PROFILE="/etc/apparmor.d/local/crun" | ||
| NESTED_CRUN_MARKER="# Managed by 1Helm: allow resident OCI network sockets on nested hosts." | ||
| container_virt="$(systemd-detect-virt --container 2>/dev/null || true)" | ||
| apparmor_enabled="$(cat /sys/module/apparmor/parameters/enabled 2>/dev/null || true)" | ||
| if [[ -n "$container_virt" && "$container_virt" != none && "$apparmor_enabled" =~ ^[Yy]$ && -r /etc/apparmor.d/crun ]]; then | ||
| command -v apparmor_parser >/dev/null || { echo "Nested AppArmor OCI setup requires apparmor_parser." >&2; exit 1; } | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win 🧩 Analysis chain🏁 Script executed: #!/usr/bin/env bash
set -euo pipefail
# Confirm that the installer provisions the command it requires.
grep -nE 'apt-get install.*apparmor|for command in .*apparmor_parser' \
site/public/install-oci-runtime.sh
# Run on each supported Ubuntu/Debian base image.
command -v apparmor_parserRepository: gitcommit90/1Helm Length of output: 155 🏁 Script executed: #!/usr/bin/env bash
set -euo pipefail
printf '%s\n' '--- installer context ---'
sed -n '1,90p' site/public/install-oci-runtime.sh
printf '%s\n' '--- AppArmor references ---'
rg -n -C 3 'apparmor|apt-get install|command -v' site/public/install-oci-runtime.shRepository: gitcommit90/1Helm Length of output: 8609 🏁 Script executed: #!/usr/bin/env bash
set -euo pipefail
python3 - <<'PY'
from pathlib import Path
import re
path = Path("site/public/install-oci-runtime.sh")
text = path.read_text()
install_lines = [
line.strip() for line in text.splitlines()
if "apt-get install" in line
]
command_loops = [
line.strip() for line in text.splitlines()
if re.search(r"for command in", line)
]
print("apt install lines:")
print("\n".join(install_lines))
print("command prerequisite loops:")
print("\n".join(command_loops))
print("apparmor in install set:", any(re.search(r"\bapparmor\b", line) for line in install_lines))
print("apparmor_parser in prerequisite loops:",
any("apparmor_parser" in line for line in command_loops))
PYRepository: gitcommit90/1Helm Length of output: 826 🌐 Web query:
💡 Result: In both Debian and Ubuntu, the Citations:
Install the AppArmor parser before requiring it. Add 🤖 Prompt for AI Agents |
||
| if [[ ! -e "$NESTED_CRUN_PROFILE" ]]; then | ||
| install -d -o root -g root -m 0755 "$(dirname "$NESTED_CRUN_PROFILE")" | ||
| profile_candidate="$(mktemp)" | ||
| printf '%s\nnetwork inet,\nnetwork inet6,\n' "$NESTED_CRUN_MARKER" >"$profile_candidate" | ||
| install -o root -g root -m 0644 "$profile_candidate" "$NESTED_CRUN_PROFILE" | ||
| rm -f -- "$profile_candidate" | ||
| elif ! grep -Eq '^[[:space:]]*network[[:space:]]+inet[[:space:]]*,' "$NESTED_CRUN_PROFILE" \ | ||
| || ! grep -Eq '^[[:space:]]*network[[:space:]]+inet6[[:space:]]*,' "$NESTED_CRUN_PROFILE"; then | ||
| echo "The existing AppArmor local/crun policy does not permit resident IPv4 and IPv6 sockets; 1Helm left the custom policy unchanged." >&2 | ||
| exit 1 | ||
| fi | ||
| apparmor_parser -r /etc/apparmor.d/crun | ||
| fi | ||
|
|
||
| install -d -o root -g root -m 0755 /etc/1helm "$RECIPE_ROOT" /usr/libexec | ||
| install -d -o root -g root -m 0711 "$STATE_ROOT/runtime/oci" "$STATE_ROOT/runtime/oci/channels" | ||
| install -d -o root -g root -m 0700 "$STATE_ROOT/runtime/oci/storage" "$STATE_ROOT/runtime/oci/backups" "$STATE_ROOT/runtime/oci/networks" | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -14,6 +14,7 @@ HOST_CONTRACT_PATHS=( | |
| /usr/libexec/1helm-oci-runtime | ||
| /etc/1helm/oci-runtime-v1.conf | ||
| /etc/sudoers.d/1helm-oci-runtime | ||
| /etc/apparmor.d/local/crun | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win Reload the crun AppArmor profile during rollback. A failed transaction can reload the new local profile before rollback. Each rollback restores
📍 Affects 3 files
🤖 Prompt for AI Agents |
||
| /etc/tmpfiles.d/1helm-oci.conf | ||
| /usr/lib/1helm-oci/Containerfile.oci | ||
| /usr/lib/1helm-oci/channel-machine.oci.tar | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
Repository: gitcommit90/1Helm
Length of output: 260
🏁 Script executed:
Repository: gitcommit90/1Helm
Length of output: 30242
🏁 Script executed:
Repository: gitcommit90/1Helm
Length of output: 26319
🏁 Script executed:
Repository: gitcommit90/1Helm
Length of output: 394
Clear
network-ready-v1when creating a new container from retained channel storage. Thecreateand restore paths preserve the marker, so a new container can skip the network health check at lines 734-745.🤖 Prompt for AI Agents