secubox-openwrt/package/secubox/luci-app-mmpm/root/usr/libexec/rpcd/luci.mmpm
CyberMind-FR 0be687b89b feat(hexojs): Add Build & Publish LuCI interface for Gitea workflow
- Add publish_to_www RPCD method to publish static files to /www/blog
- Add Build & Publish card in sync.js with configurable publish path
- Add generate RPC call for building site
- Fix file permissions for all RPCD scripts and init.d scripts
- Bump luci-app-hexojs to 1.0.0-r3

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26 16:18:40 +01:00

346 lines
7.5 KiB
Bash
Executable File

#!/bin/sh
#
# RPCD backend for MMPM LuCI interface
# Copyright (C) 2026 CyberMind.fr (SecuBox)
#
. /lib/functions.sh
LXC_NAME="magicmirror2"
MMPM_BIN="/usr/local/bin/mmpm"
# Get MMPM status
get_status() {
local running=0
local installed=0
local gui_running=0
local version=""
local web_url=""
# Check if MM2 container is running
local mm2_running=0
if lxc-info -n "$LXC_NAME" -s 2>/dev/null | grep -q "RUNNING"; then
mm2_running=1
# Check if MMPM is installed
if lxc-attach -n "$LXC_NAME" -- test -x "$MMPM_BIN" 2>/dev/null; then
installed=1
version=$(lxc-attach -n "$LXC_NAME" -- $MMPM_BIN version 2>/dev/null | head -1 || echo "unknown")
# Check GUI status from MMPM ui --url (needs PATH for pm2)
local ui_url=$(lxc-attach -n "$LXC_NAME" -- sh -c "export PATH=/usr/local/bin:/opt/nodejs/node-v24.13.0/bin:\$PATH && $MMPM_BIN ui --url 2>/dev/null" | grep -oE 'http://[^[:space:]]+')
if [ -n "$ui_url" ]; then
gui_running=1
web_url="$ui_url"
fi
fi
fi
local enabled=$(uci -q get mmpm.main.enabled || echo "0")
local port=$(echo "$web_url" | grep -oE ':[0-9]+$' | tr -d ':')
[ -z "$port" ] && port="7890"
cat <<EOF
{
"mm2_running": $([ "$mm2_running" = "1" ] && echo "true" || echo "false"),
"installed": $([ "$installed" = "1" ] && echo "true" || echo "false"),
"gui_running": $([ "$gui_running" = "1" ] && echo "true" || echo "false"),
"enabled": $([ "$enabled" = "1" ] && echo "true" || echo "false"),
"version": "$version",
"port": $port,
"web_url": "$web_url"
}
EOF
}
# Get configuration
get_config() {
local enabled=$(uci -q get mmpm.main.enabled || echo "0")
local port=$(uci -q get mmpm.main.port || echo "7891")
local address=$(uci -q get mmpm.main.address || echo "0.0.0.0")
cat <<EOF
{
"enabled": $([ "$enabled" = "1" ] && echo "true" || echo "false"),
"port": $port,
"address": "$address"
}
EOF
}
# Install MMPM
install_mmpm() {
local result=$(/usr/sbin/mmpmctl install 2>&1)
local rc=$?
if [ $rc -eq 0 ]; then
echo '{"success":true,"message":"MMPM installed successfully"}'
else
local escaped=$(echo "$result" | sed 's/"/\\"/g' | tr '\n' ' ')
echo "{\"success\":false,\"message\":\"$escaped\"}"
fi
}
# Update MMPM
update_mmpm() {
local result=$(/usr/sbin/mmpmctl update 2>&1)
local rc=$?
if [ $rc -eq 0 ]; then
echo '{"success":true,"message":"MMPM updated successfully"}'
else
local escaped=$(echo "$result" | sed 's/"/\\"/g' | tr '\n' ' ')
echo "{\"success\":false,\"message\":\"$escaped\"}"
fi
}
# Service control
service_start() {
/etc/init.d/mmpm start >/dev/null 2>&1
sleep 2
get_status
}
service_stop() {
/etc/init.d/mmpm stop >/dev/null 2>&1
sleep 1
get_status
}
service_restart() {
/etc/init.d/mmpm restart >/dev/null 2>&1
sleep 2
get_status
}
# Search modules
search_modules() {
local query="$1"
if [ -z "$query" ]; then
echo '{"modules":[],"error":"Query required"}'
return
fi
if ! lxc-info -n "$LXC_NAME" -s 2>/dev/null | grep -q "RUNNING"; then
echo '{"modules":[],"error":"MagicMirror2 not running"}'
return
fi
local results=$(lxc-attach -n "$LXC_NAME" -- $MMPM_BIN search "$query" --json 2>/dev/null)
if [ -n "$results" ]; then
echo "$results"
else
echo '{"modules":[]}'
fi
}
# List installed modules
list_modules() {
if ! lxc-info -n "$LXC_NAME" -s 2>/dev/null | grep -q "RUNNING"; then
echo '{"modules":[],"error":"MagicMirror2 not running"}'
return
fi
local results=$(lxc-attach -n "$LXC_NAME" -- $MMPM_BIN list --json 2>/dev/null)
if [ -n "$results" ]; then
echo "$results"
else
echo '{"modules":[]}'
fi
}
# Install module
install_module() {
local name="$1"
if [ -z "$name" ]; then
echo '{"success":false,"message":"Module name required"}'
return
fi
local result=$(/usr/sbin/mmpmctl install-module "$name" 2>&1)
local rc=$?
if [ $rc -eq 0 ]; then
echo '{"success":true,"message":"Module installed successfully"}'
else
local escaped=$(echo "$result" | sed 's/"/\\"/g' | tr '\n' ' ')
echo "{\"success\":false,\"message\":\"$escaped\"}"
fi
}
# Remove module
remove_module() {
local name="$1"
if [ -z "$name" ]; then
echo '{"success":false,"message":"Module name required"}'
return
fi
local result=$(/usr/sbin/mmpmctl remove "$name" 2>&1)
local rc=$?
if [ $rc -eq 0 ]; then
echo '{"success":true,"message":"Module removed successfully"}'
else
local escaped=$(echo "$result" | sed 's/"/\\"/g' | tr '\n' ' ')
echo "{\"success\":false,\"message\":\"$escaped\"}"
fi
}
# Upgrade modules
upgrade_modules() {
local name="$1"
local result=$(/usr/sbin/mmpmctl upgrade $name 2>&1)
local rc=$?
if [ $rc -eq 0 ]; then
echo '{"success":true,"message":"Modules upgraded successfully"}'
else
local escaped=$(echo "$result" | sed 's/"/\\"/g' | tr '\n' ' ')
echo "{\"success\":false,\"message\":\"$escaped\"}"
fi
}
# Get web URL for iframe
get_web_url() {
local web_url=""
local port="7890"
# Get actual URL from MMPM if available
if lxc-info -n "$LXC_NAME" -s 2>/dev/null | grep -q "RUNNING"; then
if lxc-attach -n "$LXC_NAME" -- test -x "$MMPM_BIN" 2>/dev/null; then
web_url=$(lxc-attach -n "$LXC_NAME" -- sh -c "export PATH=/usr/local/bin:/opt/nodejs/node-v24.13.0/bin:\$PATH && $MMPM_BIN ui --url 2>/dev/null" | grep -oE 'http://[^[:space:]]+')
if [ -n "$web_url" ]; then
port=$(echo "$web_url" | grep -oE ':[0-9]+$' | tr -d ':')
fi
fi
fi
# Fallback if not running
if [ -z "$web_url" ]; then
local router_ip=$(uci -q get network.lan.ipaddr || echo "192.168.1.1")
web_url="http://$router_ip:$port"
fi
cat <<EOF
{
"web_url": "$web_url",
"port": $port
}
EOF
}
# Set configuration
set_config() {
local key="$1"
local value="$2"
if [ -z "$key" ] || [ -z "$value" ]; then
echo '{"success":false,"message":"Key and value required"}'
return
fi
case "$value" in
true) value="1" ;;
false) value="0" ;;
esac
uci set "mmpm.main.$key=$value"
uci commit mmpm
echo '{"success":true}'
}
# RPCD list method
case "$1" in
list)
cat <<EOF
{
"get_status": {},
"get_config": {},
"get_web_url": {},
"install_mmpm": {},
"update_mmpm": {},
"service_start": {},
"service_stop": {},
"service_restart": {},
"search_modules": {"query": "string"},
"list_modules": {},
"install_module": {"name": "string"},
"remove_module": {"name": "string"},
"upgrade_modules": {"name": "string"},
"set_config": {"key": "string", "value": "string"}
}
EOF
;;
call)
case "$2" in
get_status)
get_status
;;
get_config)
get_config
;;
get_web_url)
get_web_url
;;
install_mmpm)
install_mmpm
;;
update_mmpm)
update_mmpm
;;
service_start)
service_start
;;
service_stop)
service_stop
;;
service_restart)
service_restart
;;
search_modules)
read -r input
query=$(echo "$input" | jsonfilter -e '@.query' 2>/dev/null)
search_modules "$query"
;;
list_modules)
list_modules
;;
install_module)
read -r input
name=$(echo "$input" | jsonfilter -e '@.name' 2>/dev/null)
install_module "$name"
;;
remove_module)
read -r input
name=$(echo "$input" | jsonfilter -e '@.name' 2>/dev/null)
remove_module "$name"
;;
upgrade_modules)
read -r input
name=$(echo "$input" | jsonfilter -e '@.name' 2>/dev/null)
upgrade_modules "$name"
;;
set_config)
read -r input
key=$(echo "$input" | jsonfilter -e '@.key' 2>/dev/null)
value=$(echo "$input" | jsonfilter -e '@.value' 2>/dev/null)
set_config "$key" "$value"
;;
*)
echo '{"error":"Unknown method"}'
;;
esac
;;
*)
echo '{"error":"Unknown command"}'
;;
esac