secubox-openwrt/secubox-tools/fix-permissions.sh
CyberMind-FR 31a87c5d7a feat(structure): reorganize luci-app packages into package/secubox/ + appstore migration
Major structural reorganization and feature additions:

## Folder Reorganization
- Move 17 luci-app-* packages to package/secubox/ (except luci-app-secubox core hub)
- Update all tooling to support new structure:
  - secubox-tools/quick-deploy.sh: search both locations
  - secubox-tools/validate-modules.sh: validate both directories
  - secubox-tools/fix-permissions.sh: fix permissions in both locations
  - .github/workflows/test-validate.yml: build from both paths
- Update README.md links to new package/secubox/ paths

## AppStore Migration (Complete)
- Add catalog entries for all remaining luci-app packages:
  - network-tweaks.json: Network optimization tools
  - secubox-bonus.json: Documentation & demos hub
- Total: 24 apps in AppStore catalog (22 existing + 2 new)
- New category: 'documentation' for docs/demos/tutorials

## VHost Manager v2.0 Enhancements
- Add profile activation system for Internal Services and Redirects
- Implement createVHost() API wrapper for template-based deployment
- Fix Virtual Hosts view rendering with proper LuCI patterns
- Fix RPCD backend shell script errors (remove invalid local declarations)
- Extend backend validation for nginx return directives (redirect support)
- Add section_id parameter for named VHost profiles
- Add Remove button to Redirects page for feature parity
- Update README to v2.0 with comprehensive feature documentation

## Network Tweaks Dashboard
- Close button added to component details modal

Files changed: 340+ (336 renames with preserved git history)
Packages affected: 19 luci-app, 2 secubox-app, 1 theme, 4 tools

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-01 14:59:38 +01:00

189 lines
6.6 KiB
Bash
Executable File

#!/bin/bash
#
# SecuBox Permission Fix Script
# Automatically fixes file permissions for LuCI modules
#
# CRITICAL PERMISSIONS:
# - RPCD scripts (root/usr/libexec/rpcd/*): 755 (rwxr-xr-x) - Must be executable
# - CSS files (htdocs/**/*.css): 644 (rw-r--r--) - Web server readable
# - JS files (htdocs/**/*.js): 644 (rw-r--r--) - Web server readable
#
set -e
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
LOCAL_MODE=false
REMOTE_MODE=false
ROUTER=""
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
--local)
LOCAL_MODE=true
shift
;;
--remote)
REMOTE_MODE=true
ROUTER="${2:-root@192.168.8.191}"
shift 2
;;
*)
echo "Usage: $0 [--local] [--remote [router]]"
echo ""
echo " --local Fix permissions in local source tree (development)"
echo " --remote [addr] Fix permissions on router (default: root@192.168.8.191)"
echo ""
echo "If no option specified, fixes both local and remote."
exit 1
;;
esac
done
# If neither specified, do both
if [ "$LOCAL_MODE" = false ] && [ "$REMOTE_MODE" = false ]; then
LOCAL_MODE=true
REMOTE_MODE=true
ROUTER="root@192.168.8.191"
fi
echo "========================================"
echo "SecuBox Permission Fix"
echo "========================================"
echo ""
# Helper function to collect all luci-app directories
get_luci_apps() {
find . -maxdepth 1 -type d -name 'luci-app-*' 2>/dev/null
find package/secubox -maxdepth 1 -type d -name 'luci-app-*' 2>/dev/null
}
# Fix local permissions
if [ "$LOCAL_MODE" = true ]; then
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BLUE}Fixing Local Source Permissions${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
RPCD_FIXED=0
CSS_FIXED=0
JS_FIXED=0
while IFS= read -r module_dir; do
[[ ! -d "$module_dir" ]] && continue
module_name=$(basename "$module_dir")
# Fix RPCD scripts (must be executable: 755)
rpcd_dir="$module_dir/root/usr/libexec/rpcd"
if [ -d "$rpcd_dir" ]; then
while IFS= read -r script; do
if [ -n "$script" ] && [ ! -x "$script" ]; then
chmod 755 "$script"
echo "$module_name: RPCD $(basename $script) → 755"
((RPCD_FIXED++))
fi
done < <(find "$rpcd_dir" -type f ! -name "*.md" 2>/dev/null)
fi
# Fix CSS files (must be readable: 644)
htdocs_dir="$module_dir/htdocs"
if [ -d "$htdocs_dir" ]; then
while IFS= read -r css_file; do
if [ -n "$css_file" ]; then
current_perms=$(stat -c "%a" "$css_file" 2>/dev/null)
if [ "$current_perms" != "644" ]; then
chmod 644 "$css_file"
echo "$module_name: $(basename $css_file) $current_perms → 644"
((CSS_FIXED++))
fi
fi
done < <(find "$htdocs_dir" -name "*.css" -type f 2>/dev/null)
# Fix JS files (must be readable: 644)
while IFS= read -r js_file; do
if [ -n "$js_file" ]; then
current_perms=$(stat -c "%a" "$js_file" 2>/dev/null)
if [ "$current_perms" != "644" ]; then
chmod 644 "$js_file"
echo "$module_name: $(basename $js_file) $current_perms → 644"
((JS_FIXED++))
fi
fi
done < <(find "$htdocs_dir" -name "*.js" -type f 2>/dev/null)
fi
done < <(get_luci_apps)
echo ""
echo -e "${GREEN}Local Permissions Fixed:${NC}"
echo " RPCD scripts: $RPCD_FIXED"
echo " CSS files: $CSS_FIXED"
echo " JS files: $JS_FIXED"
echo ""
fi
# Fix remote permissions
if [ "$REMOTE_MODE" = true ]; then
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BLUE}Fixing Remote Permissions ($ROUTER)${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
# Test connection
if ! ssh "$ROUTER" "echo 'Connection OK'" >/dev/null 2>&1; then
echo -e "${YELLOW}⚠️ Cannot connect to $ROUTER${NC}"
echo " → Check router IP and SSH access"
exit 1
fi
echo " → Fixing RPCD script permissions (755)..."
ssh "$ROUTER" "find /usr/libexec/rpcd -name 'luci.*' -type f -exec chmod 755 {} \;" 2>/dev/null || true
echo " → Fixing CSS file permissions (644)..."
ssh "$ROUTER" "find /www/luci-static/resources -name '*.css' -type f -exec chmod 644 {} \;" 2>/dev/null || true
echo " → Fixing JS file permissions (644)..."
ssh "$ROUTER" "find /www/luci-static/resources -name '*.js' -type f -exec chmod 644 {} \;" 2>/dev/null || true
# Verify no files left with 600
REMAINING_600=$(ssh "$ROUTER" "find /www/luci-static/resources -type f \( -name '*.js' -o -name '*.css' \) -perm 600 | wc -l" 2>/dev/null || echo "0")
echo ""
if [ "$REMAINING_600" -eq 0 ]; then
echo -e "${GREEN}✓ All remote permissions fixed!${NC}"
else
echo -e "${YELLOW}⚠️ Warning: $REMAINING_600 files still have 600 permissions${NC}"
fi
echo ""
echo " → Clearing LuCI cache..."
ssh "$ROUTER" "rm -f /tmp/luci-indexcache /tmp/luci-modulecache/* 2>/dev/null" || true
echo " → Restarting services..."
ssh "$ROUTER" "/etc/init.d/rpcd restart && /etc/init.d/uhttpd restart" >/dev/null 2>&1 || true
echo ""
echo -e "${GREEN}✓ Remote permissions fixed and services restarted${NC}"
echo ""
fi
echo "========================================"
echo -e "${GREEN}✓ Permission Fix Complete!${NC}"
echo "========================================"
echo ""
if [ "$LOCAL_MODE" = true ]; then
echo "Next steps:"
echo " 1. Run validation: ./secubox-tools/validate-modules.sh"
echo " 2. Build packages: ./secubox-tools/local-build.sh build"
echo " 3. Deploy to router"
fi
if [ "$REMOTE_MODE" = true ]; then
echo "Test modules in browser (use private mode: Ctrl+Shift+N)"
echo " → https://192.168.8.191/cgi-bin/luci/admin/secubox"
fi