Driver Manager v2.0.0 - LSPosed-style rewrite
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>
This commit is contained in:
148
scripts/api.sh
Normal file
148
scripts/api.sh
Normal file
@@ -0,0 +1,148 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user