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>
188 lines
5.3 KiB
Bash
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
|