This commit is contained in:
root
2026-05-18 08:36:28 +00:00
parent e638a4656c
commit efa5533032
20 changed files with 368 additions and 49 deletions

View File

@@ -367,6 +367,47 @@ detect_preferred_lan_ip() {
hostname -I 2>/dev/null | tr ' ' '\n' | grep -E '^[0-9]+\.' | grep -Ev '^(127\.|169\.254\.)' | head -n 1
}
sync_mdns_hosts_entry() {
local preferred_lan_ip
preferred_lan_ip="$(detect_preferred_lan_ip || true)"
python3 - <<PY
from pathlib import Path
hosts = Path("/etc/hosts")
host_alias = "${HOSTNAME_ALIAS}"
preferred_lan_ip = "${preferred_lan_ip}".strip()
host_lines = hosts.read_text(encoding="utf-8").splitlines()
next_host_lines = []
loopback_written = False
lan_written = False
for raw in host_lines:
stripped = raw.strip()
if not stripped or stripped.startswith("#"):
next_host_lines.append(raw)
continue
parts = raw.split()
names = parts[1:]
if parts[0] == "127.0.1.1":
next_host_lines.append(f"127.0.1.1\t{host_alias}")
loopback_written = True
continue
if f"{host_alias}.local" in names:
if preferred_lan_ip and not lan_written:
next_host_lines.append(f"{preferred_lan_ip}\t{host_alias}.local")
lan_written = True
continue
next_host_lines.append(raw)
if not loopback_written:
next_host_lines.append(f"127.0.1.1\t{host_alias}")
if preferred_lan_ip and not lan_written:
next_host_lines.append(f"{preferred_lan_ip}\t{host_alias}.local")
hosts.write_text("\\n".join(next_host_lines) + "\\n", encoding="utf-8")
PY
}
neko_nat1to1_is_usable() {
local candidate="$1"
local iface
@@ -414,6 +455,7 @@ service_mdns_status() {
service_mdns_start() {
hostnamectl set-hostname "$HOSTNAME_ALIAS"
sync_mdns_hosts_entry
systemctl restart avahi-daemon
kv message "mDNS hostname refreshed"
}
@@ -1251,6 +1293,90 @@ redroid_resolved_image() {
esac
}
redroid_binderfs_ready() {
[ -e /dev/binderfs/binder-control ]
}
redroid_legacy_binder_devices_ready() {
[ -e /dev/binder ] && [ -e /dev/hwbinder ] && [ -e /dev/vndbinder ]
}
redroid_binder_mode() {
if redroid_binderfs_ready; then
printf '%s\n' binderfs
return 0
fi
if redroid_legacy_binder_devices_ready; then
printf '%s\n' legacy
return 0
fi
return 1
}
redroid_binder_is_provisionable() {
redroid_binder_mode >/dev/null 2>&1 && return 0
grep -qw binder /proc/filesystems 2>/dev/null
}
redroid_support_detail() {
if redroid_binderfs_ready; then
printf '%s' "binderfs mounted"
return 0
fi
if redroid_legacy_binder_devices_ready; then
printf '%s' "legacy binder devices available"
return 0
fi
if grep -qw binder /proc/filesystems 2>/dev/null; then
printf '%s' "binder filesystem supported but not mounted"
return 0
fi
printf '%s' "binder kernel support unavailable"
}
ensure_redroid_host_support() {
if redroid_binder_mode >/dev/null 2>&1; then
return 0
fi
if have modprobe; then
modprobe binder_linux devices=binder,hwbinder,vndbinder >/dev/null 2>&1 || \
modprobe binder_linux >/dev/null 2>&1 || true
fi
if redroid_binder_mode >/dev/null 2>&1; then
return 0
fi
if grep -qw binder /proc/filesystems 2>/dev/null; then
mkdir -p /dev/binderfs
if have mountpoint; then
if ! mountpoint -q /dev/binderfs 2>/dev/null; then
mount -t binder binder /dev/binderfs >/dev/null 2>&1 || \
mount -t binderfs binderfs /dev/binderfs >/dev/null 2>&1 || true
fi
elif ! grep -qE '[[:space:]]/dev/binderfs[[:space:]]' /proc/mounts 2>/dev/null; then
mount -t binder binder /dev/binderfs >/dev/null 2>&1 || \
mount -t binderfs binderfs /dev/binderfs >/dev/null 2>&1 || true
fi
fi
redroid_binder_mode >/dev/null 2>&1
}
redroid_container_matches_host_support() {
local name="$1"
case "$(redroid_binder_mode 2>/dev/null || true)" in
binderfs)
docker inspect -f '{{range .Mounts}}{{println .Destination}}{{end}}' "$name" 2>/dev/null | grep -qx '/dev/binderfs'
;;
legacy)
docker inspect -f '{{range .HostConfig.Devices}}{{println .PathOnHost}}{{end}}' "$name" 2>/dev/null | grep -qx '/dev/binder' && \
docker inspect -f '{{range .HostConfig.Devices}}{{println .PathOnHost}}{{end}}' "$name" 2>/dev/null | grep -qx '/dev/hwbinder' && \
docker inspect -f '{{range .HostConfig.Devices}}{{println .PathOnHost}}{{end}}' "$name" 2>/dev/null | grep -qx '/dev/vndbinder'
;;
*)
return 1
;;
esac
}
service_redroid_status() {
if [ "${ENABLE_REDROID:-1}" != "1" ]; then
kv available 0
@@ -1266,17 +1392,28 @@ service_redroid_status() {
kv detail "docker not installed"
return 0
fi
local default_name running_line all_lines
local default_name running_line all_lines binder_detail
default_name="$(redroid_default_name)"
binder_detail="$(redroid_support_detail)"
running_line="$(docker ps --format '{{.Names}} {{.Status}} {{.Ports}}' 2>/dev/null | grep -E "^${REDROID_INSTANCE_PREFIX}-|^${default_name} " | head -n1 || true)"
all_lines="$(docker ps -a --format '{{.Names}} {{.Image}} {{.Status}} {{.Ports}}' 2>/dev/null | grep -i redroid || true)"
if ! redroid_binder_mode >/dev/null 2>&1 && ! redroid_binder_is_provisionable; then
kv available 0
kv running 0
kv status unavailable
kv host "${HOSTNAME_ALIAS}.local"
kv port "$REDROID_DEFAULT_PORT"
kv url ""
kv detail "${binder_detail}; image=$(redroid_resolved_image); default=${default_name}; adb=${HOSTNAME_ALIAS}.local:${REDROID_DEFAULT_PORT}"
return 0
fi
kv available 1
kv running "$([ -n "$running_line" ] && echo 1 || echo 0)"
kv status "$([ -n "$running_line" ] && echo online || echo stopped)"
kv host "${HOSTNAME_ALIAS}.local"
kv port "$REDROID_DEFAULT_PORT"
kv url ""
kv detail "${all_lines:-image=$(redroid_resolved_image); default=${default_name}; adb=${HOSTNAME_ALIAS}.local:${REDROID_DEFAULT_PORT}; boot=${REDROID_BOOT_ARGS}; expect_gms=${REDROID_EXPECT_GMS}; expect_magisk=${REDROID_EXPECT_MAGISK}}"
kv detail "${all_lines:-binder=${binder_detail}; image=$(redroid_resolved_image); default=${default_name}; adb=${HOSTNAME_ALIAS}.local:${REDROID_DEFAULT_PORT}; boot=${REDROID_BOOT_ARGS}; expect_gms=${REDROID_EXPECT_GMS}; expect_magisk=${REDROID_EXPECT_MAGISK}}"
}
service_redroid_start() {
@@ -1292,15 +1429,26 @@ service_redroid_start() {
name="$(redroid_default_name)"
image="$(redroid_resolved_image)"
data_dir="${REDROID_DATA_PREFIX}-${name}"
if ! ensure_redroid_host_support; then
kv message "Redroid host prerequisites unavailable: $(redroid_support_detail)"
exit 1
fi
mkdir -p "$data_dir"
if docker ps --format '{{.Names}}' 2>/dev/null | grep -qx "$name"; then
kv message "Redroid already running"
exit 0
if redroid_container_matches_host_support "$name"; then
kv message "Redroid already running"
exit 0
fi
docker rm -f "$name" >/dev/null
fi
if docker ps -a --format '{{.Names}}' 2>/dev/null | grep -qx "$name"; then
docker start "$name" >/dev/null
kv message "Redroid container started"
exit 0
if ! redroid_container_matches_host_support "$name"; then
docker rm -f "$name" >/dev/null
else
docker start "$name" >/dev/null
kv message "Redroid container started"
exit 0
fi
fi
docker run -d \
--name "$name" \
@@ -1311,9 +1459,12 @@ service_redroid_start() {
-v "${data_dir}:/data" \
-e "REDROID_GPU_MODE=${REDROID_GPU_MODE:-guest}" \
-e "REDROID_DEVICE_PROFILE=${REDROID_DEVICE_PROFILE:-pixel-7-pro}" \
$( [ "${REDROID_ADB_INSECURE:-1}" = "1" ] && printf '%s ' '-e' 'REDROID_ADB_INSECURE=1' ) \
$( [ -e /dev/kvm ] && printf '%s ' '--device' '/dev/kvm' ) \
$( [ -d /dev/dri ] && printf '%s ' '-v /dev/dri:/dev/dri' ) \
$( [ -d /dev/dma_heap ] && printf '%s ' '-v /dev/dma_heap:/dev/dma_heap' ) \
$( [ -d /dev/binderfs ] && printf '%s ' '-v /dev/binderfs:/dev/binderfs' ) \
$( redroid_binderfs_ready && printf '%s ' '-v' '/dev/binderfs:/dev/binderfs' ) \
$( redroid_legacy_binder_devices_ready && printf '%s ' '--device' '/dev/binder' '--device' '/dev/hwbinder' '--device' '/dev/vndbinder' ) \
$( [ -e /dev/rga ] && printf '%s ' '--device /dev/rga' ) \
$( [ -e /dev/mpp_service ] && printf '%s ' '--device /dev/mpp_service' ) \
"$image" ${REDROID_BOOT_ARGS:-} >/dev/null