This commit is contained in:
eric
2026-05-19 07:49:56 +00:00
parent 78e1308063
commit 585bcd9500
112 changed files with 61939 additions and 23 deletions

View File

@@ -13,6 +13,13 @@ def env(name: str, default: str) -> str:
return value if value not in {None, ""} else default
def env_enabled(name: str, default: bool = False) -> bool:
raw = os.environ.get(name)
if raw in {None, ""}:
return default
return raw.strip().lower() in {"1", "true", "yes", "on", "enable", "enabled"}
def q(value: str) -> str:
return json.dumps(str(value), ensure_ascii=False)
@@ -49,6 +56,8 @@ def render(count: int) -> str:
base_profile = env("NEKO_PROFILE_HOST_DIR", str(Path.cwd() / "data" / "chromium-profile-v2"))
http_base = int(env("NEKO_HTTP_PORT", "9200"))
mux_base = int(env("NEKO_WEBRTC_TCPMUX", "52300"))
managed_policies = env_enabled("NEKO_MANAGED_POLICIES", False)
policy_dir = "./policies" if managed_policies else "./no-managed-policies"
lines = [
"# Generated by tools/render_neko_compose.py - do not hand-edit",
@@ -85,6 +94,7 @@ def render(count: int) -> str:
' NEKO_PLUGINS_DIR: "/etc/neko/plugins/"',
f" NEKO_START_URL: {q(start_url)}",
f" NEKO_BROWSER_RENDER_MODE: {q(render_mode)}",
f" NEKO_MANAGED_POLICIES: {q('1' if managed_policies else '0')}",
f" NEKO_WEBRTC_EPR: {q(epr)}",
f" NEKO_WEBRTC_TCPMUX: {q(tcp_mux)}",
f" NEKO_WEBRTC_UDPMUX: {q(udp_mux)}",
@@ -96,8 +106,14 @@ def render(count: int) -> str:
" volumes:",
f" - {q(f'{profile}:/home/neko/.config/chromium')}",
f" - {q(f'{profile}:/home/neko/.config/google-chrome')}",
' - "./policies:/etc/chromium/policies/managed:ro"',
' - "./policies:/etc/opt/chrome/policies/managed:ro"',
f" - {q(f'{policy_dir}:/etc/chromium/policies/managed:ro')}",
f" - {q(f'{policy_dir}:/etc/chromium-browser/policies/managed:ro')}",
f" - {q(f'{policy_dir}:/etc/opt/chrome/policies/managed:ro')}",
' - "./external-extensions:/opt/google/chrome/extensions:ro"',
' - "./external-extensions:/usr/share/chromium/extensions:ro"',
' - "./external-extensions:/usr/share/chromium-browser/extensions:ro"',
' - "./tampermonkey-seed:/etc/neko/tampermonkey-seed:ro"',
' - "./youtube-auto-dismiss-extension:/etc/neko/youtube-auto-dismiss-extension:ro"',
' - "./provisioning:/var/www/provisioning:ro"',
' - "./browser-launch.sh:/etc/neko/browser-launch.sh:ro"',
f" - {q(f'./{supervisor_conf}:/etc/neko/supervisord/{supervisor_conf}:ro')}",

View File

@@ -285,6 +285,7 @@ def verify_neko(checks: list[dict[str, Any]], env: dict[str, str], *, timeout: f
if not env_flag(env, "ENABLE_NEKO", True):
check(checks, "neko_enabled", "Neko enabled", True, required=False, detail="disabled")
return
managed_policies = env_flag(env, "NEKO_MANAGED_POLICIES", False)
docker_ok, names, err = docker_ps_names()
check(
checks,
@@ -332,6 +333,30 @@ def verify_neko(checks: list[dict[str, Any]], env: dict[str, str], *, timeout: f
detail=(out or err2).strip(),
hint="Make services/neko/browser-launch.sh executable and restart Neko.",
)
code, out, err2 = docker_exec(
name,
"find /etc/chromium/policies/managed /etc/chromium-browser/policies/managed /etc/opt/chrome/policies/managed "
"-maxdepth 1 -type f -name '*.json' -print 2>/dev/null | head -1",
timeout=timeout,
)
policy_file = out.strip()
check(
checks,
f"neko_{idx}_personal_policy_mode",
f"{name} personal Chrome policy mode",
bool(policy_file) if managed_policies else not bool(policy_file),
required=True,
detail=(
f"managed policy enabled: {policy_file}"
if managed_policies and policy_file
else ("no managed policy JSON" if not policy_file else f"unexpected managed policy: {policy_file}")
),
hint=(
"NEKO_MANAGED_POLICIES=1 should mount services/neko/policies into Chrome policy dirs."
if managed_policies
else "Default personal mode should mount services/neko/no-managed-policies over Chrome policy dirs."
),
)
code, out, err2 = docker_exec(name, "supervisorctl status tampermonkey-provisioning", timeout=timeout)
check(
checks,
@@ -356,7 +381,14 @@ def verify_neko(checks: list[dict[str, Any]], env: dict[str, str], *, timeout: f
)
code, out, err2 = docker_exec(
name,
"grep -R -a -l 'YouTube Studio Auto Dismiss' /home/neko/.config/google-chrome/Default /home/neko/.config/chromium/Default 2>/dev/null | head -1",
"for base in /home/neko/.config/google-chrome/Default /home/neko/.config/chromium/Default; do "
"for area in 'Local Extension Settings' 'Managed Extension Settings'; do "
"dir=\"$base/$area/dhdgffkkebhmkfjojejmpbldmpobfkfo\"; "
"if [ -d \"$dir\" ] && grep -R -a -l 'YouTube Studio Auto Dismiss' \"$dir\" 2>/dev/null | head -1; then exit 0; fi; "
"done; done; "
"for cmd in /proc/[0-9]*/cmdline; do "
"tr '\\0' '\\n' <\"$cmd\" 2>/dev/null | grep -q -- '--load-extension=.*youtube-auto-dismiss-extension' && echo '--load-extension youtube-auto-dismiss-extension' && exit 0; "
"done; exit 1",
timeout=timeout,
)
check(
@@ -364,8 +396,13 @@ def verify_neko(checks: list[dict[str, Any]], env: dict[str, str], *, timeout: f
f"neko_{idx}_tm_storage",
f"{name} Tampermonkey script imported",
code == 0 and bool(out.strip()),
required=True,
detail=out.strip() or err2.strip() or "not found",
hint="Open Neko once or restart the browser so Chrome policy imports the provisioning payload.",
hint=(
"Open Neko once or restart the browser so Chrome policy imports the provisioning payload."
if managed_policies
else "Restart Neko so browser-launch.sh copies services/neko/tampermonkey-seed into the personal profile."
),
)