From 76fc9a89cf54b8af1feb348391160a495ed3f119 Mon Sep 17 00:00:00 2001 From: lobanov_v Date: Sun, 27 Sep 2026 13:33:12 +0000 Subject: [PATCH] Init --- rustdesk-monitor-root | 38 ++++++++++++ rustdesk-monitor.sh | 132 +++++++++++++++++++++++++++++++++++++++++ rustdesk-template.json | 68 +++++++++++++++++++++ rustdesk.conf | 7 +++ 4 files changed, 245 insertions(+) create mode 100755 rustdesk-monitor-root create mode 100755 rustdesk-monitor.sh create mode 100644 rustdesk-template.json create mode 100644 rustdesk.conf diff --git a/rustdesk-monitor-root b/rustdesk-monitor-root new file mode 100755 index 0000000..cf4be2f --- /dev/null +++ b/rustdesk-monitor-root @@ -0,0 +1,38 @@ +#!/bin/bash +set -euo pipefail + +HBBR="hbbr" + +PID="$(docker inspect -f '{{.State.Pid}}' "$HBBR")" + +if [ -z "$PID" ] || [ "$PID" = "0" ]; then + echo "hbbr container is not running" >&2 + exit 1 +fi + +get_connections() { + nsenter -t "$PID" -n ss -H -tn state established '( sport = :21117 )' +} + +case "${1:-}" in + connections) + get_connections | wc -l + ;; + + sessions) + count="$(get_connections | wc -l)" + echo $((count / 2)) + ;; + + relay_ips) + get_connections | + awk '{print $4}' | + sed -E 's/^\[::ffff:([^]]+)\]:[0-9]+$/\1/' | + sort -u + ;; + + *) + echo "Usage: $0 {connections|sessions|relay_ips}" >&2 + exit 2 + ;; +esac diff --git a/rustdesk-monitor.sh b/rustdesk-monitor.sh new file mode 100755 index 0000000..081029e --- /dev/null +++ b/rustdesk-monitor.sh @@ -0,0 +1,132 @@ +#!/bin/bash + +DB="/opt/docker-composes/rustdesk/data/db_v2.sqlite3" +HBBR="hbbr" +PORT="21117" + +case "$1" in + + peers) + sqlite3 "$DB" "SELECT COUNT(*) FROM peer;" + ;; + + peer_ip) + ID="$2" + + sqlite3 -noheader "$DB" \ + "SELECT json_extract(info, '\$.ip') FROM peer WHERE id='$ID';" | + sed 's/^::ffff://' + ;; + + discovery) + sqlite3 -separator '|' -noheader "$DB" \ + "SELECT id, json_extract(info, '$.ip') + FROM peer + ORDER BY created_at DESC;" | + while IFS='|' read -r id ip; do + ip="${ip#::ffff:}" + printf '%s|%s\n' "$id" "$ip" + done | + jq -R -s ' + split("\n") + | map(select(length > 0)) + | map(split("|")) + | map({ + "{#RD_ID}": .[0], + "{#RD_IP}": .[1] + }) + ' + ;; + + connections) + PID="$(docker inspect -f '{{.State.Pid}}' "$HBBR" 2>/dev/null)" || exit 1 + + if [ -z "$PID" ] || [ "$PID" = "0" ]; then + echo "0" + exit 0 + fi + + nsenter -t "$PID" -n \ + ss -H -tn state established '( sport = :21117 )' 2>/dev/null | + wc -l + ;; + + sessions) + PID="$(docker inspect -f '{{.State.Pid}}' "$HBBR" 2>/dev/null)" || exit 1 + + if [ -z "$PID" ] || [ "$PID" = "0" ]; then + echo "0" + exit 0 + fi + + CONNECTIONS="$( + nsenter -t "$PID" -n \ + ss -H -tn state established '( sport = :21117 )' 2>/dev/null | + wc -l + )" + + echo $((CONNECTIONS / 2)) + ;; + + relay_ips) + nsenter -t "$(docker inspect -f '{{.State.Pid}}' "$HBBR")" -n \ + ss -H -tn state established '( sport = :21117 )' | + awk '{print $4}' | + sed -E 's/^\[::ffff:([^]]+)\]:[0-9]+$/\1/' | + sort -u + ;; + + relay_json) + nsenter -t "$(docker inspect -f '{{.State.Pid}}' "$HBBR")" -n \ + ss -H -tn state established '( sport = :21117 )' | + awk '{print $5}' | + sed -E \ + -e 's/^\[::ffff://g' \ + -e 's/\]:[0-9]+$//g' | + sort -u | + jq -R -s ' + split("\n") + | map(select(length > 0)) + | { + connections: length, + ips: . + } + ' + ;; + + json) + peers=$(sqlite3 "$DB" "SELECT COUNT(*) FROM peer;") + + connections=$( + nsenter -t "$(docker inspect -f '{{.State.Pid}}' "$HBBR")" -n \ + ss -H -tn state established '( sport = :21117 )' | + wc -l + ) + + sessions=$((connections / 2)) + + jq -n \ + --argjson peers "$peers" \ + --argjson connections "$connections" \ + --argjson sessions "$sessions" \ + '{ + peers: $peers, + relay_connections: $connections, + relay_sessions: $sessions + }' + ;; + + *) + echo "Usage:" + echo " $0 peers" + echo " $0 peer_ip " + echo " $0 discovery" + echo " $0 connections" + echo " $0 sessions" + echo " $0 relay_ips" + echo " $0 relay_json" + echo " $0 json" + exit 1 + ;; + +esac diff --git a/rustdesk-template.json b/rustdesk-template.json new file mode 100644 index 0000000..878d11b --- /dev/null +++ b/rustdesk-template.json @@ -0,0 +1,68 @@ +{ + "zabbix_export": { + "version": "7.4", + "template_groups": [ + { + "uuid": "7df96b18c230490a9a0a9e2307226338", + "name": "Templates" + } + ], + "templates": [ + { + "uuid": "bb7c728f07ff43c187a70cf61aae1a1b", + "template": "RustDesk Server", + "name": "RustDesk Server", + "groups": [ + { + "name": "Templates" + } + ], + "items": [ + { + "uuid": "4550fe89cde7477a974210abaf0f5ccc", + "name": "RustDesk registered peers", + "key": "rustdesk.peers" + }, + { + "uuid": "f1b2839caeb84ac4b8b0e336853e7d99", + "name": "RustDesk relay connections", + "key": "rustdesk.relay.connections" + }, + { + "uuid": "fabf8178f3a54fa5adb701360eb88218", + "name": "Active Relay IPs", + "key": "rustdesk.relay.ips", + "delay": "30s", + "value_type": "TEXT", + "tags": [ + { + "tag": "rustdesk" + } + ] + }, + { + "uuid": "046a2e8a9e884c71ae753dca55e2bf29", + "name": "RustDesk active relay sessions", + "key": "rustdesk.relay.sessions" + } + ], + "discovery_rules": [ + { + "uuid": "d89ea98929724208be92148d557aa891", + "name": "RustDesk registered peers discovery", + "key": "rustdesk.discovery", + "delay": "1h", + "item_prototypes": [ + { + "uuid": "60cf331e09b74ee6abfebff30e7cc3d3", + "name": "RustDesk peer {#RD_ID} IP", + "key": "rustdesk.peer.ip[{#RD_ID}]", + "value_type": "TEXT" + } + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/rustdesk.conf b/rustdesk.conf new file mode 100644 index 0000000..a4f8c95 --- /dev/null +++ b/rustdesk.conf @@ -0,0 +1,7 @@ +UserParameter=rustdesk.peers,/usr/local/bin/rustdesk-monitor.sh peers +UserParameter=rustdesk.peer.ip[*],/usr/local/bin/rustdesk-monitor.sh peer_ip "$1" +UserParameter=rustdesk.discovery,/usr/local/bin/rustdesk-monitor.sh discovery +UserParameter=rustdesk.relay.connections,sudo /usr/local/sbin/rustdesk-monitor-root connections +UserParameter=rustdesk.relay.sessions,sudo /usr/local/sbin/rustdesk-monitor-root sessions +UserParameter=rustdesk.relay.ips,sudo /usr/local/sbin/rustdesk-monitor-root relay_ips +UserParameter=rustdesk.json,/usr/local/bin/rustdesk-monitor.sh json