Complete rewrite with: - Per-app driver scoping via mount namespace isolation (LSPosed-style) - System-wide driver mode selection - .ko kernel module manager with autoload and dependency tracking - Driver integrity protection (monitor/enforce modes) - Driver registry with auto-discovery and SHA256 hashing - LSPosed-style dark WebUI with 6 tabs: Dashboard, Drivers, Apps, Modules, Protection, Logs - RESTful API handler for WebUI communication - Zygote process monitor for auto-applying scopes to new app launches Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
149 lines
5.1 KiB
Bash
149 lines
5.1 KiB
Bash
#!/system/bin/sh
|
|
# Driver Manager v2 - WebUI API Handler
|
|
# Processes commands from KernelSU WebUI via ksu.exec()
|
|
|
|
MODDIR=${MODDIR:-/data/adb/modules/driver-manager}
|
|
. "$MODDIR/scripts/core.sh"
|
|
|
|
CONFIGDIR="$MODDIR/config"
|
|
|
|
# Route: system
|
|
api_system() {
|
|
case "$1" in
|
|
info)
|
|
local device=$(cat "$CONFIGDIR/device.json" 2>/dev/null || echo '{}')
|
|
local kernel=$(uname -r 2>/dev/null)
|
|
local uptime=$(cat /proc/uptime 2>/dev/null | awk '{print $1}')
|
|
echo "{\"device\": $device, \"kernel\": \"$kernel\", \"uptime\": \"$uptime\"}"
|
|
;;
|
|
logs)
|
|
local logfile="${2:-service}"
|
|
local lines="${3:-100}"
|
|
local f="$LOGDIR/${logfile}.log"
|
|
if [ -f "$f" ]; then
|
|
local content=$(tail -n "$lines" "$f" | sed 's/"/\\"/g' | tr '\n' '|')
|
|
echo "{\"log\": \"$content\", \"file\": \"$logfile\"}"
|
|
else
|
|
echo '{"log": "", "file": "'"$logfile"'"}'
|
|
fi
|
|
;;
|
|
*)
|
|
echo '{"error": "Unknown system command"}'
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Route: drivers
|
|
api_drivers() {
|
|
case "$1" in
|
|
list) sh "$MODDIR/scripts/driver_registry.sh" list ;;
|
|
scan) sh "$MODDIR/scripts/driver_registry.sh" scan ;;
|
|
get) sh "$MODDIR/scripts/driver_registry.sh" get "$2" ;;
|
|
count) echo "{\"count\": $(sh "$MODDIR/scripts/driver_registry.sh" count)}" ;;
|
|
verify) sh "$MODDIR/scripts/driver_registry.sh" verify "$2" ;;
|
|
add_variant) sh "$MODDIR/scripts/driver_registry.sh" add_variant "$2" "$3" "$4" ;;
|
|
*) echo '{"error": "Unknown drivers command"}' ;;
|
|
esac
|
|
}
|
|
|
|
# Route: scope
|
|
api_scope() {
|
|
case "$1" in
|
|
list) sh "$MODDIR/scripts/scope_manager.sh" list ;;
|
|
set) sh "$MODDIR/scripts/scope_manager.sh" set "$2" "$3" "$4" "$5" "$6" ;;
|
|
remove) sh "$MODDIR/scripts/scope_manager.sh" remove "$2" ;;
|
|
apply) sh "$MODDIR/scripts/scope_manager.sh" apply ;;
|
|
unmount) sh "$MODDIR/scripts/scope_manager.sh" unmount_all ;;
|
|
*) echo '{"error": "Unknown scope command"}' ;;
|
|
esac
|
|
}
|
|
|
|
# Route: ko (kernel modules)
|
|
api_ko() {
|
|
case "$1" in
|
|
list) sh "$MODDIR/scripts/ko_manager.sh" list ;;
|
|
load) sh "$MODDIR/scripts/ko_manager.sh" load "$2" "$3" ;;
|
|
unload) sh "$MODDIR/scripts/ko_manager.sh" unload "$2" ;;
|
|
unload_all) sh "$MODDIR/scripts/ko_manager.sh" unload_all ;;
|
|
info) sh "$MODDIR/scripts/ko_manager.sh" info "$2" ;;
|
|
autoload) sh "$MODDIR/scripts/ko_manager.sh" set_autoload "$2" "$3" ;;
|
|
*) echo '{"error": "Unknown ko command"}' ;;
|
|
esac
|
|
}
|
|
|
|
# Route: protect
|
|
api_protect() {
|
|
case "$1" in
|
|
status) sh "$MODDIR/scripts/protect.sh" status ;;
|
|
check) sh "$MODDIR/scripts/protect.sh" check ;;
|
|
baseline) sh "$MODDIR/scripts/protect.sh" baseline ;;
|
|
mode) sh "$MODDIR/scripts/protect.sh" mode "$2" ;;
|
|
driver) sh "$MODDIR/scripts/protect.sh" protect "$2" "$3" ;;
|
|
changelog) sh "$MODDIR/scripts/protect.sh" changelog "$2" ;;
|
|
*) echo '{"error": "Unknown protect command"}' ;;
|
|
esac
|
|
}
|
|
|
|
# Route: apps
|
|
api_apps() {
|
|
case "$1" in
|
|
list)
|
|
echo '{"apps":['
|
|
local first=true
|
|
# List installed packages with labels
|
|
pm list packages -f 2>/dev/null | while IFS= read -r line; do
|
|
local apk=$(echo "$line" | sed 's/package:\(.*\)=\(.*\)/\1/')
|
|
local pkg=$(echo "$line" | sed 's/package:\(.*\)=\(.*\)/\2/')
|
|
[ -z "$pkg" ] && continue
|
|
|
|
# Get app label via dumpsys (fast path)
|
|
local label=$(dumpsys package "$pkg" 2>/dev/null | grep -m1 'applicationInfo' -A5 | grep -o 'label=[^ ]*' | cut -d= -f2)
|
|
[ -z "$label" ] && label="$pkg"
|
|
|
|
# Check if system app
|
|
local system="false"
|
|
echo "$apk" | grep -q '/system/' && system="true"
|
|
|
|
[ "$first" = true ] && first=false || echo ","
|
|
echo " {\"package\": \"$pkg\", \"label\": \"$label\", \"system\": $system}"
|
|
done
|
|
echo ']}'
|
|
;;
|
|
*)
|
|
echo '{"error": "Unknown apps command"}'
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Route: settings
|
|
api_settings() {
|
|
case "$1" in
|
|
get)
|
|
cat "$CONFIGDIR/settings.json" 2>/dev/null || echo '{}'
|
|
;;
|
|
set)
|
|
local key="$2" value="$3"
|
|
json_set "$CONFIGDIR/settings.json" "$key" "$value"
|
|
echo "{\"status\": \"ok\", \"$key\": \"$value\"}"
|
|
;;
|
|
*)
|
|
echo '{"error": "Unknown settings command"}'
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# --- Main router ---
|
|
ROUTE="$1"
|
|
shift
|
|
|
|
case "$ROUTE" in
|
|
system) api_system "$@" ;;
|
|
drivers) api_drivers "$@" ;;
|
|
scope) api_scope "$@" ;;
|
|
ko) api_ko "$@" ;;
|
|
protect) api_protect "$@" ;;
|
|
apps) api_apps "$@" ;;
|
|
settings) api_settings "$@" ;;
|
|
*) echo '{"error": "Unknown route. Routes: system, drivers, scope, ko, protect, apps, settings"}' ;;
|
|
esac
|