210 lines
5.2 KiB
Bash
210 lines
5.2 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# Add PKG_FILE_MODES to OpenWrt Makefiles
|
||
|
|
# Automatically detects RPCD scripts and adds correct permissions
|
||
|
|
#
|
||
|
|
# Usage: ./add-pkg-file-modes.sh [module-path]
|
||
|
|
# ./add-pkg-file-modes.sh --all (process all luci-app-* modules)
|
||
|
|
|
||
|
|
set -e
|
||
|
|
|
||
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
|
|
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
||
|
|
|
||
|
|
# Colors
|
||
|
|
RED='\033[0;31m'
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
YELLOW='\033[1;33m'
|
||
|
|
BLUE='\033[0;34m'
|
||
|
|
NC='\033[0m' # No Color
|
||
|
|
|
||
|
|
log_info() {
|
||
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
||
|
|
}
|
||
|
|
|
||
|
|
log_success() {
|
||
|
|
echo -e "${GREEN}[OK]${NC} $1"
|
||
|
|
}
|
||
|
|
|
||
|
|
log_warning() {
|
||
|
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
||
|
|
}
|
||
|
|
|
||
|
|
log_error() {
|
||
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
||
|
|
}
|
||
|
|
|
||
|
|
# Detect RPCD scripts in a module
|
||
|
|
detect_rpcd_scripts() {
|
||
|
|
local module_path="$1"
|
||
|
|
local rpcd_dir="$module_path/root/usr/libexec/rpcd"
|
||
|
|
|
||
|
|
if [ ! -d "$rpcd_dir" ]; then
|
||
|
|
return
|
||
|
|
fi
|
||
|
|
|
||
|
|
find "$rpcd_dir" -type f -name "luci.*" 2>/dev/null | while read script; do
|
||
|
|
basename "$script"
|
||
|
|
done
|
||
|
|
}
|
||
|
|
|
||
|
|
# Detect helper scripts in a module
|
||
|
|
detect_helper_scripts() {
|
||
|
|
local module_path="$1"
|
||
|
|
local helper_dir="$module_path/root/usr/libexec"
|
||
|
|
|
||
|
|
if [ ! -d "$helper_dir" ]; then
|
||
|
|
return
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Find .sh files in subdirectories (not in rpcd/)
|
||
|
|
find "$helper_dir" -type f -name "*.sh" ! -path "*/rpcd/*" 2>/dev/null | while read script; do
|
||
|
|
echo "$script" | sed "s|^$module_path/root||"
|
||
|
|
done
|
||
|
|
}
|
||
|
|
|
||
|
|
# Generate PKG_FILE_MODES line
|
||
|
|
generate_pkg_file_modes() {
|
||
|
|
local module_name="$1"
|
||
|
|
local rpcd_scripts="$2"
|
||
|
|
local helper_scripts="$3"
|
||
|
|
|
||
|
|
local modes=""
|
||
|
|
|
||
|
|
# Add RPCD scripts
|
||
|
|
for script in $rpcd_scripts; do
|
||
|
|
if [ -z "$modes" ]; then
|
||
|
|
modes="/usr/libexec/rpcd/$script:755"
|
||
|
|
else
|
||
|
|
modes="$modes \\\\\n\\t/usr/libexec/rpcd/$script:755"
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
# Add helper scripts
|
||
|
|
for script in $helper_scripts; do
|
||
|
|
if [ -z "$modes" ]; then
|
||
|
|
modes="$script:755"
|
||
|
|
else
|
||
|
|
modes="$modes \\\\\n\\t$script:755"
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
if [ -n "$modes" ]; then
|
||
|
|
echo -e "# File permissions (RPCD scripts must be executable)\nPKG_FILE_MODES:=$modes"
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# Check if Makefile already has PKG_FILE_MODES
|
||
|
|
has_pkg_file_modes() {
|
||
|
|
local makefile="$1"
|
||
|
|
grep -q "^PKG_FILE_MODES:=" "$makefile" 2>/dev/null
|
||
|
|
}
|
||
|
|
|
||
|
|
# Add PKG_FILE_MODES to Makefile
|
||
|
|
add_to_makefile() {
|
||
|
|
local makefile="$1"
|
||
|
|
local pkg_file_modes="$2"
|
||
|
|
|
||
|
|
if [ ! -f "$makefile" ]; then
|
||
|
|
log_error "Makefile not found: $makefile"
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Check if already exists
|
||
|
|
if has_pkg_file_modes "$makefile"; then
|
||
|
|
log_warning "PKG_FILE_MODES already exists in $makefile"
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Find the line with 'include $(TOPDIR)/feeds/luci/luci.mk'
|
||
|
|
if ! grep -q "include.*luci.mk" "$makefile"; then
|
||
|
|
log_error "Cannot find luci.mk include in $makefile"
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Create backup
|
||
|
|
cp "$makefile" "$makefile.bak"
|
||
|
|
|
||
|
|
# Insert PKG_FILE_MODES before the include line
|
||
|
|
awk -v modes="$pkg_file_modes" '
|
||
|
|
/^include.*luci\.mk/ {
|
||
|
|
print ""
|
||
|
|
print modes
|
||
|
|
print ""
|
||
|
|
}
|
||
|
|
{ print }
|
||
|
|
' "$makefile.bak" > "$makefile"
|
||
|
|
|
||
|
|
log_success "Added PKG_FILE_MODES to $makefile"
|
||
|
|
rm -f "$makefile.bak"
|
||
|
|
}
|
||
|
|
|
||
|
|
# Process a single module
|
||
|
|
process_module() {
|
||
|
|
local module_path="$1"
|
||
|
|
local module_name=$(basename "$module_path")
|
||
|
|
|
||
|
|
log_info "Processing $module_name..."
|
||
|
|
|
||
|
|
# Detect scripts
|
||
|
|
local rpcd_scripts=$(detect_rpcd_scripts "$module_path")
|
||
|
|
local helper_scripts=$(detect_helper_scripts "$module_path")
|
||
|
|
|
||
|
|
if [ -z "$rpcd_scripts" ] && [ -z "$helper_scripts" ]; then
|
||
|
|
log_warning "No executable scripts found in $module_name"
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Generate PKG_FILE_MODES
|
||
|
|
local pkg_file_modes=$(generate_pkg_file_modes "$module_name" "$rpcd_scripts" "$helper_scripts")
|
||
|
|
|
||
|
|
if [ -z "$pkg_file_modes" ]; then
|
||
|
|
log_warning "Could not generate PKG_FILE_MODES for $module_name"
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Add to Makefile
|
||
|
|
local makefile="$module_path/Makefile"
|
||
|
|
add_to_makefile "$makefile" "$pkg_file_modes"
|
||
|
|
|
||
|
|
# Show what was added
|
||
|
|
echo ""
|
||
|
|
echo " Scripts found:"
|
||
|
|
[ -n "$rpcd_scripts" ] && echo " RPCD: $(echo $rpcd_scripts | tr '\n' ' ')"
|
||
|
|
[ -n "$helper_scripts" ] && echo " Helper: $(echo $helper_scripts | tr '\n' ' ')"
|
||
|
|
echo ""
|
||
|
|
}
|
||
|
|
|
||
|
|
# Main
|
||
|
|
main() {
|
||
|
|
echo "================================================"
|
||
|
|
echo " PKG_FILE_MODES Auto-Configurator v0.3.1"
|
||
|
|
echo "================================================"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
if [ "$1" = "--all" ]; then
|
||
|
|
log_info "Processing all luci-app-* modules..."
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
find "$PROJECT_ROOT" -maxdepth 1 -type d -name "luci-app-*" | sort | while read module_path; do
|
||
|
|
process_module "$module_path"
|
||
|
|
done
|
||
|
|
|
||
|
|
elif [ -n "$1" ] && [ -d "$1" ]; then
|
||
|
|
process_module "$1"
|
||
|
|
|
||
|
|
else
|
||
|
|
log_error "Usage: $0 [module-path] | --all"
|
||
|
|
log_info "Examples:"
|
||
|
|
log_info " $0 ../luci-app-secubox"
|
||
|
|
log_info " $0 --all"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
echo "================================================"
|
||
|
|
echo " Processing complete!"
|
||
|
|
echo "================================================"
|
||
|
|
}
|
||
|
|
|
||
|
|
main "$@"
|