diff --git a/fritzinfluxdb/classes/fritzbox/service_definitions/vpn_data.py b/fritzinfluxdb/classes/fritzbox/service_definitions/vpn_data.py index b58176e..b84e8be 100644 --- a/fritzinfluxdb/classes/fritzbox/service_definitions/vpn_data.py +++ b/fritzinfluxdb/classes/fritzbox/service_definitions/vpn_data.py @@ -94,7 +94,7 @@ def prepare_json_response_data(response): ) lua_services.append({ - "name": "VPN Users", + "name": "VPN Users - IPSec", "os_min_versions": "7.39", "method": "POST", "params": { @@ -118,7 +118,7 @@ def prepare_json_response_data(response): "next": { "type": str, "value_function": lambda data: data.get("connected"), - "tags_function": lambda data: {"name": data.get("name")} + "tags_function": lambda data: {"name": data.get("name"), "vpntype": "IPSec"} }, "exclude_filter_function": lambda data: not isinstance(grab(data, "data.init.userConnections"), dict) }, @@ -128,7 +128,7 @@ def prepare_json_response_data(response): "next": { "type": str, "value_function": lambda data: data.get("active"), - "tags_function": lambda data: {"name": data.get("name")} + "tags_function": lambda data: {"name": data.get("name"), "vpntype": "IPSec"} }, "exclude_filter_function": lambda data: not isinstance(grab(data, "data.init.userConnections"), dict) }, @@ -138,7 +138,7 @@ def prepare_json_response_data(response): "next": { "type": str, "value_function": lambda data: data.get("virtualAddress"), - "tags_function": lambda data: {"name": data.get("name")} + "tags_function": lambda data: {"name": data.get("name"), "vpntype": "IPSec"} }, "exclude_filter_function": lambda data: not isinstance(grab(data, "data.init.userConnections"), dict) }, @@ -148,7 +148,7 @@ def prepare_json_response_data(response): "next": { "type": str, "value_function": lambda data: data.get("address"), - "tags_function": lambda data: {"name": data.get("name")} + "tags_function": lambda data: {"name": data.get("name"), "vpntype": "IPSec"} }, "exclude_filter_function": lambda data: not isinstance(grab(data, "data.init.userConnections"), dict) }, @@ -160,8 +160,86 @@ def prepare_json_response_data(response): if x.get("connected") is True] ) ), + "tags_function": lambda data: {"vpntype": "IPSec"}, "exclude_filter_function": lambda data: not isinstance(grab(data, "data.init.userConnections"), dict) } } } ) + +lua_services.append({ + "name": "VPN Users - WireGuard", + "os_versions": [ + "7.39", + "7.50" + ], + "method": "POST", + "params": { + "page": "shareWireguard", + "xhrId": "all", + "xhr": 1, + }, + "response_parser": prepare_json_response_data, + "value_instances": { + "myfritz_host_name": { + "data_path": "data.init.server", + "type": str + }, + "vpn_type": { + "data_path": "data.init.type", # currently falsely returns "IPSec Xauth PSK" + "type": str + }, + "vpn_user_connected": { + "data_path": "data.init.boxConnections", + "type": dict, + "next": { + "type": str, + "value_function": lambda data: data.get("connected"), + "tags_function": lambda data: {"name": data.get("name"), "vpntype": "WireGuard"} + }, + "exclude_filter_function": lambda data: not isinstance(grab(data, "data.init.boxConnections"), dict) + }, + "vpn_user_active": { + "data_path": "data.init.boxConnections", + "type": dict, + "next": { + "type": str, + "value_function": lambda data: data.get("active"), + "tags_function": lambda data: {"name": data.get("name"), "vpntype": "WireGuard"} + }, + "exclude_filter_function": lambda data: not isinstance(grab(data, "data.init.boxConnections"), dict) + }, + "vpn_user_virtual_address": { + "data_path": "data.init.boxConnections", + "type": dict, + "next": { + "type": str, + "value_function": lambda data: data.get("remoteNet"), + "tags_function": lambda data: {"name": data.get("name"), "vpntype": "WireGuard"} + }, + "exclude_filter_function": lambda data: not isinstance(grab(data, "data.init.boxConnections"), dict) + }, + "vpn_user_remote_address": { + "data_path": "data.init.boxConnections", + "type": dict, + "next": { + "type": str, + "value_function": lambda data: data.get("remoteIp"), + "tags_function": lambda data: {"name": data.get("name"), "vpntype": "WireGuard"} + }, + "exclude_filter_function": lambda data: not isinstance(grab(data, "data.init.boxConnections"), dict) + }, + "vpn_user_num_active": { + "type": int, + "value_function": (lambda data: + len( + [x for x in grab(data, "data.init.boxConnections", fallback=dict()).values() + if x.get("connected") is True] + ) + ), + "tags_function": lambda data: {"vpntype": "WireGuard"}, + "exclude_filter_function": lambda data: not isinstance(grab(data, "data.init.boxConnections"), dict) + } + } + } +) diff --git a/grafana/influx2_dashboards/fritzbox_system_dashboard.json b/grafana/influx2_dashboards/fritzbox_system_dashboard.json index 2855c16..3826dff 100644 --- a/grafana/influx2_dashboards/fritzbox_system_dashboard.json +++ b/grafana/influx2_dashboards/fritzbox_system_dashboard.json @@ -4707,7 +4707,7 @@ "measurement": "/^$measurement$/", "orderByTime": "ASC", "policy": "default", - "query": "from(bucket: v.defaultBucket)\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"${measurement}\" and r.box == \"${boxtag}\" and r._field == \"vpn_user_num_active\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> drop(columns: [\"box\", \"_measurement\", \"_start\", \"_stop\"])", + "query": "from(bucket: v.defaultBucket)\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r._measurement == \"${measurement}\" and r.box == \"${boxtag}\" and r._field == \"vpn_user_num_active\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> drop(columns: [\"box\", \"_measurement\", \"_start\", \"_stop\", \"vpntype\"])", "refId": "A", "resultFormat": "time_series", "select": [ @@ -4808,7 +4808,7 @@ "measurement": "/^$measurement$/", "orderByTime": "ASC", "policy": "default", - "query": "from(bucket: v.defaultBucket)\n |> range(start: -1d)\n |> filter(fn: (r) => r._measurement == \"${measurement}\" and r.box == \"${boxtag}\" and\n (\n r._field == \"myfritz_host_name\" or\n r._field == \"vpn_type\" or\n r._field == \"vpn_user_num_active\"\n ) \n )\n |> last()\n |> toString()\n |> drop(columns: [\"box\", \"_measurement\", \"_start\", \"_stop\", \"_time\"])\n |> map(fn: (r) => ({\n r with _field:\n if r._field == \"myfritz_host_name\" then \"MyFritz Hostname\"\n else if r._field == \"vpn_type\" then \"VPN Type\"\n else if r._field == \"vpn_user_num_active\" then \"VPN User Active\"\n else r._field\n })\n )\n", + "query": "from(bucket: v.defaultBucket)\n |> range(start: -1d)\n |> filter(fn: (r) => r._measurement == \"${measurement}\" and r.box == \"${boxtag}\" and\n (\n r._field == \"myfritz_host_name\" or\n r._field == \"vpn_type\" or\n r._field == \"vpn_user_num_active\"\n ) \n )\n |> last()\n |> toString()\n |> drop(columns: [\"box\", \"_measurement\", \"_start\", \"_stop\", \"_time\", \"vpntype\"])\n |> map(fn: (r) => ({\n r with _field:\n if r._field == \"myfritz_host_name\" then \"MyFritz Hostname\"\n else if r._field == \"vpn_type\" then \"VPN Type\"\n else if r._field == \"vpn_user_num_active\" then \"VPN User Active\"\n else r._field\n })\n )\n", "refId": "A", "resultFormat": "time_series", "select": [ @@ -5277,7 +5277,7 @@ "measurement": "/^$measurement$/", "orderByTime": "ASC", "policy": "default", - "query": "from(bucket: v.defaultBucket)\n |> range(start: -1d)\n |> filter(fn: (r) => r._measurement == \"${measurement}\" and r.box == \"${boxtag}\" and\n (\n r._field == \"vpn_user_active\" or\n r._field == \"vpn_user_connected\" or\n r._field == \"vpn_user_virtual_address\" or\n r._field == \"vpn_user_remote_address\"\n ) \n )\n |> last()\n |> drop(columns: [\"box\", \"_measurement\", \"_start\", \"_stop\", \"_time\"])\n\n", + "query": "from(bucket: v.defaultBucket)\n |> range(start: -1d)\n |> filter(fn: (r) => r._measurement == \"${measurement}\" and r.box == \"${boxtag}\" and\n (\n r._field == \"vpn_user_active\" or\n r._field == \"vpn_user_connected\" or\n r._field == \"vpn_user_virtual_address\" or\n r._field == \"vpn_user_remote_address\"\n ) \n )\n |> last()\n |> drop(columns: [\"box\", \"_measurement\", \"_start\", \"_stop\", \"_time\", \"vpntype\"])\n\n", "refId": "A", "resultFormat": "table", "select": [