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

305 lines
7.4 KiB
Bash
Executable File

#!/bin/sh
# RPCD backend for CyberFeed LuCI App
. /lib/functions.sh
CYBERFEED_BIN="/usr/bin/cyberfeed"
RSSBRIDGE_BIN="/usr/bin/rss-bridge-setup"
OUTPUT_DIR="/tmp/cyberfeed/output"
CONFIG_FILE="/etc/cyberfeed/feeds.conf"
json_init() {
JSON_OUTPUT=""
}
json_add_string() {
local key="$1" val="$2"
val=$(echo "$val" | sed 's/"/\\"/g; s/\\/\\\\/g')
[ -n "$JSON_OUTPUT" ] && JSON_OUTPUT="$JSON_OUTPUT,"
JSON_OUTPUT="$JSON_OUTPUT\"$key\":\"$val\""
}
json_add_int() {
local key="$1" val="$2"
[ -n "$JSON_OUTPUT" ] && JSON_OUTPUT="$JSON_OUTPUT,"
JSON_OUTPUT="$JSON_OUTPUT\"$key\":$val"
}
json_add_bool() {
local key="$1" val="$2"
[ -n "$JSON_OUTPUT" ] && JSON_OUTPUT="$JSON_OUTPUT,"
if [ "$val" = "1" ] || [ "$val" = "true" ]; then
JSON_OUTPUT="$JSON_OUTPUT\"$key\":true"
else
JSON_OUTPUT="$JSON_OUTPUT\"$key\":false"
fi
}
json_dump() {
echo "{$JSON_OUTPUT}"
}
# Get service status
get_status() {
local enabled=$(uci -q get cyberfeed.main.enabled || echo 0)
local feed_count=0
local item_count=0
local last_sync=0
local rssbridge_enabled=$(uci -q get cyberfeed.rssbridge.enabled || echo 0)
local rssbridge_running="false"
if [ -f "${OUTPUT_DIR}/feeds.json" ]; then
item_count=$(grep -o '"title"' "${OUTPUT_DIR}/feeds.json" 2>/dev/null | wc -l)
item_count=${item_count:-0}
last_sync=$(stat -c %Y "${OUTPUT_DIR}/feeds.json" 2>/dev/null || echo 0)
fi
if [ -f "$CONFIG_FILE" ]; then
feed_count=$(grep -v "^#" "$CONFIG_FILE" 2>/dev/null | grep -c "|" || echo 0)
fi
if [ "$rssbridge_enabled" = "1" ]; then
if pgrep -f "rss-bridge\|php.*3000" >/dev/null 2>&1; then
rssbridge_running="true"
fi
fi
cat << EOF
{
"enabled": $enabled,
"feed_count": $feed_count,
"item_count": $item_count,
"last_sync": $last_sync,
"rssbridge_enabled": $rssbridge_enabled,
"rssbridge_running": $rssbridge_running
}
EOF
}
# Get feeds list
get_feeds() {
local feeds="[]"
if [ -x "$CYBERFEED_BIN" ]; then
feeds=$($CYBERFEED_BIN list)
fi
echo "{\"feeds\":$feeds}"
}
# Get feed items
get_items() {
local items="[]"
if [ -f "${OUTPUT_DIR}/feeds.json" ]; then
items=$(cat "${OUTPUT_DIR}/feeds.json")
fi
echo "{\"items\":$items}"
}
# Add a feed
add_feed() {
local name="$1"
local url="$2"
local type="${3:-rss}"
local category="${4:-custom}"
if [ -z "$name" ] || [ -z "$url" ]; then
echo '{"success":false,"error":"Name and URL are required"}'
return
fi
# Validate name (alphanumeric and underscore only)
if ! echo "$name" | grep -qE '^[a-zA-Z0-9_-]+$'; then
echo '{"success":false,"error":"Invalid name format"}'
return
fi
# Check for duplicates
if grep -q "^${name}|" "$CONFIG_FILE" 2>/dev/null; then
echo '{"success":false,"error":"Feed already exists"}'
return
fi
echo "${name}|${url}|${type}|${category}" >> "$CONFIG_FILE"
echo '{"success":true}'
}
# Delete a feed
delete_feed() {
local name="$1"
if [ -z "$name" ]; then
echo '{"success":false,"error":"Name is required"}'
return
fi
if grep -q "^${name}|" "$CONFIG_FILE" 2>/dev/null; then
sed -i "/^${name}|/d" "$CONFIG_FILE"
rm -f "/tmp/cyberfeed/cache/${name}.xml"
echo '{"success":true}'
else
echo '{"success":false,"error":"Feed not found"}'
fi
}
# Sync feeds
sync_feeds() {
if [ -x "$CYBERFEED_BIN" ]; then
$CYBERFEED_BIN sync >/dev/null 2>&1 &
echo '{"success":true,"message":"Sync started"}'
else
echo '{"success":false,"error":"CyberFeed not installed"}'
fi
}
# Get config
get_config() {
local enabled=$(uci -q get cyberfeed.main.enabled || echo 0)
local refresh=$(uci -q get cyberfeed.main.refresh_interval || echo 5)
local max_items=$(uci -q get cyberfeed.main.max_items || echo 20)
local cache_ttl=$(uci -q get cyberfeed.main.cache_ttl || echo 300)
local rssbridge_enabled=$(uci -q get cyberfeed.rssbridge.enabled || echo 0)
local rssbridge_port=$(uci -q get cyberfeed.rssbridge.port || echo 3000)
cat << EOF
{
"enabled": $enabled,
"refresh_interval": $refresh,
"max_items": $max_items,
"cache_ttl": $cache_ttl,
"rssbridge_enabled": $rssbridge_enabled,
"rssbridge_port": $rssbridge_port
}
EOF
}
# Save config
save_config() {
local enabled="$1"
local refresh="$2"
local max_items="$3"
local cache_ttl="$4"
local rssbridge_enabled="$5"
local rssbridge_port="$6"
[ -n "$enabled" ] && uci set cyberfeed.main.enabled="$enabled"
[ -n "$refresh" ] && uci set cyberfeed.main.refresh_interval="$refresh"
[ -n "$max_items" ] && uci set cyberfeed.main.max_items="$max_items"
[ -n "$cache_ttl" ] && uci set cyberfeed.main.cache_ttl="$cache_ttl"
[ -n "$rssbridge_enabled" ] && uci set cyberfeed.rssbridge.enabled="$rssbridge_enabled"
[ -n "$rssbridge_port" ] && uci set cyberfeed.rssbridge.port="$rssbridge_port"
uci commit cyberfeed
# Restart service if needed
/etc/init.d/cyberfeed reload 2>/dev/null
echo '{"success":true}'
}
# RSS-Bridge status
rssbridge_status() {
if [ -x "$RSSBRIDGE_BIN" ]; then
$RSSBRIDGE_BIN status
else
echo '{"installed":false,"enabled":false,"running":false}'
fi
}
# RSS-Bridge install
rssbridge_install() {
if [ -x "$RSSBRIDGE_BIN" ]; then
$RSSBRIDGE_BIN install >/dev/null 2>&1 &
echo '{"success":true,"message":"Installation started"}'
else
echo '{"success":false,"error":"Setup script not found"}'
fi
}
# RSS-Bridge start/stop
rssbridge_control() {
local action="$1"
if [ -x "$RSSBRIDGE_BIN" ]; then
$RSSBRIDGE_BIN "$action" >/dev/null 2>&1
echo '{"success":true}'
else
echo '{"success":false,"error":"Setup script not found"}'
fi
}
# RPCD interface
case "$1" in
list)
cat << 'EOF'
{
"get_status": {},
"get_feeds": {},
"get_items": {},
"add_feed": {"name":"str","url":"str","type":"str","category":"str"},
"delete_feed": {"name":"str"},
"sync_feeds": {},
"get_config": {},
"save_config": {"enabled":"int","refresh_interval":"int","max_items":"int","cache_ttl":"int","rssbridge_enabled":"int","rssbridge_port":"int"},
"rssbridge_status": {},
"rssbridge_install": {},
"rssbridge_control": {"action":"str"}
}
EOF
;;
call)
case "$2" in
get_status)
get_status
;;
get_feeds)
get_feeds
;;
get_items)
get_items
;;
add_feed)
read -r input
name=$(echo "$input" | jsonfilter -e '@.name' 2>/dev/null)
url=$(echo "$input" | jsonfilter -e '@.url' 2>/dev/null)
type=$(echo "$input" | jsonfilter -e '@.type' 2>/dev/null)
category=$(echo "$input" | jsonfilter -e '@.category' 2>/dev/null)
add_feed "$name" "$url" "$type" "$category"
;;
delete_feed)
read -r input
name=$(echo "$input" | jsonfilter -e '@.name' 2>/dev/null)
delete_feed "$name"
;;
sync_feeds)
sync_feeds
;;
get_config)
get_config
;;
save_config)
read -r input
enabled=$(echo "$input" | jsonfilter -e '@.enabled' 2>/dev/null)
refresh=$(echo "$input" | jsonfilter -e '@.refresh_interval' 2>/dev/null)
max_items=$(echo "$input" | jsonfilter -e '@.max_items' 2>/dev/null)
cache_ttl=$(echo "$input" | jsonfilter -e '@.cache_ttl' 2>/dev/null)
rssbridge_enabled=$(echo "$input" | jsonfilter -e '@.rssbridge_enabled' 2>/dev/null)
rssbridge_port=$(echo "$input" | jsonfilter -e '@.rssbridge_port' 2>/dev/null)
save_config "$enabled" "$refresh" "$max_items" "$cache_ttl" "$rssbridge_enabled" "$rssbridge_port"
;;
rssbridge_status)
rssbridge_status
;;
rssbridge_install)
rssbridge_install
;;
rssbridge_control)
read -r input
action=$(echo "$input" | jsonfilter -e '@.action' 2>/dev/null)
rssbridge_control "$action"
;;
*)
echo '{"error":"Unknown method"}'
;;
esac
;;
esac