Backend package (secubox-app-repo): - repoctl CLI for managing local package repository - repo-sync script to download packages from GitHub releases - uhttpd-based server on port 8888 - UCI configuration at /etc/config/repo - RPCD handler for LuCI integration - Auto-sync cron support (configurable interval) Frontend package (luci-app-repo): - Dashboard showing repository status and package counts - Sync button to trigger package downloads - Log viewer for sync operations - Usage instructions for opkg configuration Supported architectures: - x86_64, aarch64_cortex-a72, aarch64_generic - mips_24kc, mipsel_24kc Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
138 lines
4.5 KiB
Bash
Executable File
138 lines
4.5 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
. /lib/functions.sh
|
|
. /usr/share/libubox/jshn.sh
|
|
|
|
REPO_DIR="/srv/repo.secubox.in"
|
|
LOG_FILE="/var/log/repo-sync.log"
|
|
|
|
case "$1" in
|
|
list)
|
|
echo '{"status":{},"config":{},"packages":{"arch":"string"},"sync":{"version":"string"},"logs":{"lines":"number"}}'
|
|
;;
|
|
call)
|
|
case "$2" in
|
|
status)
|
|
json_init
|
|
|
|
# Load config
|
|
config_load repo
|
|
config_get enabled main enabled "1"
|
|
config_get version main version "unknown"
|
|
config_get github_repo main github_repo ""
|
|
config_get port main port "8888"
|
|
config_get last_sync main last_sync ""
|
|
config_get auto_sync main auto_sync "0"
|
|
config_get sync_interval main sync_interval "6"
|
|
|
|
json_add_boolean "enabled" "$enabled"
|
|
json_add_string "version" "$version"
|
|
json_add_string "github_repo" "$github_repo"
|
|
json_add_int "port" "$port"
|
|
json_add_string "last_sync" "$last_sync"
|
|
json_add_boolean "auto_sync" "$auto_sync"
|
|
json_add_int "sync_interval" "$sync_interval"
|
|
|
|
# Server status
|
|
if netstat -tln 2>/dev/null | grep -q ":$port "; then
|
|
json_add_boolean "running" 1
|
|
else
|
|
json_add_boolean "running" 0
|
|
fi
|
|
|
|
# Package counts by architecture
|
|
json_add_object "architectures"
|
|
for dir in "$REPO_DIR/luci"/*; do
|
|
[ -d "$dir" ] || continue
|
|
arch=$(basename "$dir")
|
|
count=$(ls "$dir"/*.ipk 2>/dev/null | wc -l)
|
|
json_add_int "$arch" "$count"
|
|
done
|
|
json_close_object
|
|
|
|
json_dump
|
|
;;
|
|
|
|
config)
|
|
json_init
|
|
config_load repo
|
|
|
|
config_get enabled main enabled "1"
|
|
config_get version main version ""
|
|
config_get github_repo main github_repo ""
|
|
config_get port main port "8888"
|
|
config_get auto_sync main auto_sync "0"
|
|
config_get sync_interval main sync_interval "6"
|
|
|
|
json_add_boolean "enabled" "$enabled"
|
|
json_add_string "version" "$version"
|
|
json_add_string "github_repo" "$github_repo"
|
|
json_add_int "port" "$port"
|
|
json_add_boolean "auto_sync" "$auto_sync"
|
|
json_add_int "sync_interval" "$sync_interval"
|
|
|
|
json_dump
|
|
;;
|
|
|
|
packages)
|
|
read -r input
|
|
json_load "$input"
|
|
json_get_var arch arch "x86_64"
|
|
|
|
json_init
|
|
json_add_string "arch" "$arch"
|
|
json_add_array "packages"
|
|
|
|
dir="$REPO_DIR/luci/$arch"
|
|
if [ -d "$dir" ]; then
|
|
for ipk in "$dir"/*.ipk; do
|
|
[ -f "$ipk" ] || continue
|
|
name=$(basename "$ipk")
|
|
size=$(stat -c%s "$ipk" 2>/dev/null || echo 0)
|
|
json_add_object ""
|
|
json_add_string "name" "$name"
|
|
json_add_int "size" "$size"
|
|
json_close_object
|
|
done
|
|
fi
|
|
|
|
json_close_array
|
|
json_dump
|
|
;;
|
|
|
|
sync)
|
|
read -r input
|
|
json_load "$input"
|
|
json_get_var version version ""
|
|
|
|
if [ -n "$version" ]; then
|
|
uci set repo.main.version="$version"
|
|
uci commit repo
|
|
fi
|
|
|
|
# Run sync in background
|
|
/usr/sbin/repo-sync &
|
|
|
|
json_init
|
|
json_add_boolean "started" 1
|
|
json_add_string "message" "Sync started in background"
|
|
json_dump
|
|
;;
|
|
|
|
logs)
|
|
read -r input
|
|
json_load "$input"
|
|
json_get_var lines lines 50
|
|
|
|
json_init
|
|
if [ -f "$LOG_FILE" ]; then
|
|
json_add_string "logs" "$(tail -n "$lines" "$LOG_FILE" | sed 's/"/\\"/g' | tr '\n' '|')"
|
|
else
|
|
json_add_string "logs" ""
|
|
fi
|
|
json_dump
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|