secubox-openwrt/package/secubox/luci-app-simplex/root/usr/libexec/rpcd/luci.simplex
CyberMind-FR db847ba1cd feat(simplex): Add SimpleX Chat self-hosted messaging servers
Integrate SimpleX Chat SMP and XFTP servers for privacy-focused messaging:

- secubox-app-simplex: Backend with LXC container management
  - SMP server for message relay (port 5223)
  - XFTP server for encrypted file sharing (port 443)
  - Auto-download of SimpleX binaries for aarch64/x86_64
  - TLS certificate generation (self-signed or Let's Encrypt)
  - Firewall and HAProxy integration

- luci-app-simplex: LuCI dashboard with:
  - Service status monitoring
  - Server address display with copy-to-clipboard
  - Full configuration forms for SMP, XFTP, and TLS
  - Install/certificate management actions

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 12:53:41 +01:00

188 lines
5.3 KiB
Bash

#!/bin/sh
. /lib/functions.sh
. /usr/share/libubox/jshn.sh
SIMPLEX_DIR="/srv/simplex"
SMP_DIR="$SIMPLEX_DIR/smp"
XFTP_DIR="$SIMPLEX_DIR/xftp"
case "$1" in
list)
echo '{"status":{},"start":{},"stop":{},"restart":{},"install":{},"get_addresses":{},"init_certs":{"hostname":"str"},"logs":{"service":"str","lines":"int"},"get_stats":{}}'
;;
call)
case "$2" in
status)
json_init
# Get configuration
enabled=$(uci -q get simplex.main.enabled)
smp_enabled=$(uci -q get simplex.smp.enabled)
xftp_enabled=$(uci -q get simplex.xftp.enabled)
smp_hostname=$(uci -q get simplex.smp.hostname)
xftp_hostname=$(uci -q get simplex.xftp.hostname)
smp_port=$(uci -q get simplex.smp.port || echo "5223")
xftp_port=$(uci -q get simplex.xftp.port || echo "443")
json_add_boolean "enabled" ${enabled:-0}
json_add_boolean "smp_enabled" ${smp_enabled:-1}
json_add_boolean "xftp_enabled" ${xftp_enabled:-1}
json_add_string "smp_hostname" "$smp_hostname"
json_add_string "xftp_hostname" "$xftp_hostname"
json_add_int "smp_port" $smp_port
json_add_int "xftp_port" $xftp_port
# Check LXC
if command -v lxc-info >/dev/null 2>&1; then
json_add_boolean "lxc_available" 1
# Check container status
if lxc-info -n simplex >/dev/null 2>&1; then
json_add_boolean "container_exists" 1
if lxc-info -n simplex -s 2>/dev/null | grep -q "RUNNING"; then
json_add_string "container_status" "running"
else
json_add_string "container_status" "stopped"
fi
else
json_add_boolean "container_exists" 0
json_add_string "container_status" "not_installed"
fi
else
json_add_boolean "lxc_available" 0
json_add_boolean "container_exists" 0
json_add_string "container_status" "lxc_not_installed"
fi
# Check server processes
if pgrep smp-server >/dev/null 2>&1; then
json_add_string "smp_status" "running"
else
json_add_string "smp_status" "stopped"
fi
if pgrep xftp-server >/dev/null 2>&1; then
json_add_string "xftp_status" "running"
else
json_add_string "xftp_status" "stopped"
fi
# Check binaries exist
if [ -x "$SIMPLEX_DIR/bin/smp-server" ]; then
json_add_boolean "smp_binary_exists" 1
else
json_add_boolean "smp_binary_exists" 0
fi
if [ -x "$SIMPLEX_DIR/bin/xftp-server" ]; then
json_add_boolean "xftp_binary_exists" 1
else
json_add_boolean "xftp_binary_exists" 0
fi
json_dump
;;
start)
/etc/init.d/simplex start >/dev/null 2>&1
echo '{"success":true}'
;;
stop)
/etc/init.d/simplex stop >/dev/null 2>&1
echo '{"success":true}'
;;
restart)
/etc/init.d/simplex restart >/dev/null 2>&1
echo '{"success":true}'
;;
install)
output=$(/usr/sbin/simplexctl install 2>&1)
code=$?
json_init
json_add_boolean "success" $((code == 0))
json_add_string "output" "$output"
json_dump
;;
get_addresses)
json_init
# SMP address
smp_enabled=$(uci -q get simplex.smp.enabled)
if [ "$smp_enabled" = "1" ] && [ -f "$SMP_DIR/fingerprint" ]; then
smp_fp=$(cat "$SMP_DIR/fingerprint" 2>/dev/null)
smp_host=$(uci -q get simplex.smp.hostname)
smp_port=$(uci -q get simplex.smp.port || echo "5223")
[ -n "$smp_fp" ] && [ -n "$smp_host" ] && \
json_add_string "smp_address" "smp://${smp_fp}@${smp_host}:${smp_port}"
json_add_string "smp_fingerprint" "$smp_fp"
fi
# XFTP address
xftp_enabled=$(uci -q get simplex.xftp.enabled)
if [ "$xftp_enabled" = "1" ] && [ -f "$XFTP_DIR/fingerprint" ]; then
xftp_fp=$(cat "$XFTP_DIR/fingerprint" 2>/dev/null)
xftp_host=$(uci -q get simplex.xftp.hostname)
xftp_port=$(uci -q get simplex.xftp.port || echo "443")
[ -n "$xftp_fp" ] && [ -n "$xftp_host" ] && \
json_add_string "xftp_address" "xftp://${xftp_fp}@${xftp_host}:${xftp_port}"
json_add_string "xftp_fingerprint" "$xftp_fp"
fi
json_dump
;;
init_certs)
read -r input
hostname=$(echo "$input" | jsonfilter -e '@.hostname' 2>/dev/null)
output=$(/usr/sbin/simplexctl init-certs "$hostname" 2>&1)
code=$?
json_init
json_add_boolean "success" $((code == 0))
json_add_string "output" "$output"
json_dump
;;
logs)
read -r input
service=$(echo "$input" | jsonfilter -e '@.service' 2>/dev/null)
lines=$(echo "$input" | jsonfilter -e '@.lines' 2>/dev/null)
[ -z "$lines" ] && lines=50
logs=$(/usr/sbin/simplexctl logs "$service" "$lines" 2>&1 | tail -100)
json_init
json_add_string "logs" "$logs"
json_dump
;;
get_stats)
json_init
# Storage stats
if [ -d "$XFTP_DIR/files" ]; then
storage_used=$(du -sb "$XFTP_DIR/files" 2>/dev/null | cut -f1)
file_count=$(find "$XFTP_DIR/files" -type f 2>/dev/null | wc -l)
json_add_int "storage_used" ${storage_used:-0}
json_add_int "file_count" ${file_count:-0}
else
json_add_int "storage_used" 0
json_add_int "file_count" 0
fi
# Parse storage quota
quota=$(uci -q get simplex.xftp.storage_quota || echo "10G")
quota_bytes=$(echo "$quota" | sed -e 's/G/*1024*1024*1024/' -e 's/M/*1024*1024/' -e 's/K/*1024/' | bc 2>/dev/null || echo "10737418240")
json_add_int "storage_quota" $quota_bytes
json_dump
;;
esac
;;
esac
exit 0