secubox-openwrt/package/secubox/luci-app-zigbee2mqtt/root/usr/libexec/rpcd/luci.zigbee2mqtt
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

182 lines
5.1 KiB
Bash
Executable File

#!/bin/sh
. /usr/share/libubox/jshn.sh
CONFIG="zigbee2mqtt"
SERVICE="/etc/init.d/zigbee2mqtt"
CTL="/usr/sbin/zigbee2mqttctl"
load_config() {
json_init
json_add_string "serial_port" "$(uci -q get ${CONFIG}.main.serial_port || echo /dev/ttyACM0)"
json_add_string "mqtt_host" "$(uci -q get ${CONFIG}.main.mqtt_host || echo mqtt://127.0.0.1:1883)"
json_add_string "mqtt_username" "$(uci -q get ${CONFIG}.main.mqtt_username || printf '')"
json_add_string "mqtt_password" "$(uci -q get ${CONFIG}.main.mqtt_password || printf '')"
json_add_string "base_topic" "$(uci -q get ${CONFIG}.main.base_topic || echo zigbee2mqtt)"
json_add_string "frontend_port" "$(uci -q get ${CONFIG}.main.frontend_port || echo 8080)"
json_add_string "channel" "$(uci -q get ${CONFIG}.main.channel || echo 11)"
json_add_string "data_path" "$(uci -q get ${CONFIG}.main.data_path || echo /srv/zigbee2mqtt)"
json_add_string "image" "$(uci -q get ${CONFIG}.main.image || echo ghcr.io/koenkk/zigbee2mqtt:latest)"
json_add_string "timezone" "$(uci -q get ${CONFIG}.main.timezone || echo UTC)"
json_add_boolean "enabled" "$( [ "$(uci -q get ${CONFIG}.main.enabled || echo 0)" = "1" ] && echo 1 || echo 0)"
}
diagnostics() {
local serial="$(uci -q get ${CONFIG}.main.serial_port || echo /dev/ttyACM0)"
json_add_object "diagnostics"
json_add_boolean "cgroups" "$( [ -d /sys/fs/cgroup ] && echo 1 || echo 0 )"
json_add_boolean "docker" "$( command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1 && echo 1 || echo 0 )"
json_add_boolean "serial_device" "$( [ -c "$serial" ] && echo 1 || echo 0 )"
json_add_boolean "usb_module" "$( lsmod 2>/dev/null | grep -q 'cdc_acm' && echo 1 || echo 0 )"
json_add_boolean "service_file" "$( [ -x "$SERVICE" ] && echo 1 || echo 0 )"
json_close_object
}
status() {
json_init
load_config
json_add_object "service"
json_add_boolean "enabled" "$( "$SERVICE" enabled >/dev/null 2>&1 && echo 1 || echo 0 )"
json_add_boolean "running" "$( "$SERVICE" status >/dev/null 2>&1 && echo 1 || echo 0 )"
json_close_object
diagnostics
json_add_array "container"
docker ps -a --filter "name=secbx-zigbee2mqtt" --format '{{.Names}}|{{.Status}}' 2>/dev/null | while IFS='|' read -r name st; do
json_add_object
json_add_string "name" "$name"
json_add_string "status" "$st"
json_close_object
done
json_close_array
json_dump
}
apply() {
read input
json_load "$input"
json_get_var serial_port serial_port
json_get_var mqtt_host mqtt_host
json_get_var mqtt_username mqtt_username
json_get_var mqtt_password mqtt_password
json_get_var base_topic base_topic
json_get_var frontend_port frontend_port
json_get_var channel channel
json_get_var data_path data_path
json_get_var image image
json_get_var timezone timezone
json_get_var enabled enabled
[ -n "$serial_port" ] && uci set ${CONFIG}.main.serial_port="$serial_port"
[ -n "$mqtt_host" ] && uci set ${CONFIG}.main.mqtt_host="$mqtt_host"
[ -n "$mqtt_username" ] && uci set ${CONFIG}.main.mqtt_username="$mqtt_username"
[ -n "$mqtt_password" ] && uci set ${CONFIG}.main.mqtt_password="$mqtt_password"
[ -n "$base_topic" ] && uci set ${CONFIG}.main.base_topic="$base_topic"
[ -n "$frontend_port" ] && uci set ${CONFIG}.main.frontend_port="$frontend_port"
[ -n "$channel" ] && uci set ${CONFIG}.main.channel="$channel"
[ -n "$data_path" ] && uci set ${CONFIG}.main.data_path="$data_path"
[ -n "$image" ] && uci set ${CONFIG}.main.image="$image"
[ -n "$timezone" ] && uci set ${CONFIG}.main.timezone="$timezone"
[ -n "$enabled" ] && uci set ${CONFIG}.main.enabled="$enabled"
uci commit ${CONFIG}
if [ "$enabled" = "1" ]; then
"$SERVICE" enable >/dev/null 2>&1
else
"$SERVICE" disable >/dev/null 2>&1
fi
"$SERVICE" restart >/dev/null 2>&1
json_init
json_add_boolean "success" 1
json_dump
}
logs() {
read input
json_load "$input"
json_get_var tail tail
tail=${tail:-200}
json_init
json_add_array "lines"
$CTL logs --tail "$tail" 2>&1 | while IFS= read -r line; do
json_add_string "" "$line"
done
json_close_array
json_dump
}
control() {
read input
json_load "$input"
json_get_var action action
case "$action" in
start) "$SERVICE" start ;;
stop) "$SERVICE" stop ;;
restart) "$SERVICE" restart ;;
*) json_init; json_add_boolean "success" 0; json_add_string "error" "invalid action"; json_dump; return ;;
esac
json_init
json_add_boolean "success" 1
json_dump
}
update() {
$CTL update >/dev/null 2>&1
json_init
json_add_boolean "success" 1
json_dump
}
run_helper() {
local command="$1"
shift
local output
output=$("$CTL" "$command" "$@" 2>&1)
local rc=$?
json_init
if [ "$rc" -eq 0 ]; then
json_add_boolean "success" 1
else
json_add_boolean "success" 0
fi
[ -n "$output" ] && json_add_string "output" "$output"
json_dump
}
install() {
run_helper install
}
check() {
run_helper check
}
case "$1" in
list)
cat <<'JSON'
{
"status": {},
"apply": {},
"logs": {},
"control": {},
"update": {},
"install": {},
"check": {}
}
JSON
;;
call)
case "$2" in
status) status ;;
apply) apply ;;
logs) logs ;;
control) control ;;
update) update ;;
install) install ;;
check) check ;;
*) json_init; json_add_string "error" "unknown method"; json_dump ;;
esac
;;
esac