From d662097d1d2ea4ce35e4d165f1f60cea6e32d2e4 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Thu, 30 Nov 2023 08:41:52 +0100 Subject: [PATCH] Dashboard : Reporting - OpenVPN server instances missing. closes https://github.com/opnsense/core/issues/7038 --- src/etc/inc/rrd.inc | 24 ++++------------ .../app/models/OPNsense/OpenVPN/OpenVPN.php | 28 +++++++++++++++++++ 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/etc/inc/rrd.inc b/src/etc/inc/rrd.inc index 946dea4c8..6005d8379 100644 --- a/src/etc/inc/rrd.inc +++ b/src/etc/inc/rrd.inc @@ -123,12 +123,9 @@ function rrd_configure($verbose = false, $bootup = false) $ifdescrs = get_configured_interface_with_descr(); /* IPsec counters */ $ifdescrs['ipsec'] = "IPsec"; - /* OpenVPN server counters */ - if (isset($config['openvpn']['openvpn-server'])) { - foreach ($config['openvpn']['openvpn-server'] as $server) { - $serverid = "ovpns" . $server['vpnid']; - $ifdescrs[$serverid] = $server['description'] ?? ""; - } + $ovpn_servers = (new OPNsense\OpenVPN\OpenVPN())->serverDevices(); + foreach ($ovpn_servers as $ifname => $data) { + $ifdescrs[$ifname] = $data['descr']; } /* process all real and pseudo interfaces */ @@ -232,7 +229,7 @@ function rrd_configure($verbose = false, $bootup = false) } /* OpenVPN, set up the rrd file */ - if (stristr($ifname, "ovpns")) { + if (isset($ovpn_servers[$ifname])) { if (!file_exists("$rrddbpath$ifname$vpnusers")) { $rrdcreate = "$rrdtool create $rrddbpath$ifname$vpnusers --step $rrdvpninterval "; $rrdcreate .= "DS:users:GAUGE:$vpnvalid:0:10000 "; @@ -249,24 +246,15 @@ function rrd_configure($verbose = false, $bootup = false) if ($bootup) { mwexec("$rrdtool update $rrddbpath$ifname$vpnusers N:U"); } - - if (isset($config['openvpn']['openvpn-server'])) { - foreach ($config['openvpn']['openvpn-server'] as $server) { - if ("ovpns{$server['vpnid']}" == $ifname) { - $port = $server['local_port']; - $vpnid = $server['vpnid']; - } - } - } $rrdupdatesh .= "\n"; - $rrdupdatesh .= "# polling vpn users for interface $ifname $realif port $port\n"; + $rrdupdatesh .= "# polling vpn users for interface $ifname\n"; $rrdupdatesh .= "list_current_users() {\n"; $rrdupdatesh .= " sleep 0.2\n"; $rrdupdatesh .= " echo \"status 2\"\n"; $rrdupdatesh .= " sleep 0.2\n"; $rrdupdatesh .= " echo \"quit\"\n"; $rrdupdatesh .= "}\n"; - $rrdupdatesh .= "OVPN=`list_current_users | nc -U /var/etc/openvpn/server{$vpnid}.sock | awk -F\",\" '/^CLIENT_LIST/ {print \$2}' | wc -l | awk '{print $1}'`\n"; + $rrdupdatesh .= "OVPN=`list_current_users | nc -U {$ovpn_servers[$ifname]['sockFilename']} | awk -F\",\" '/^CLIENT_LIST/ {print \$2}' | wc -l | awk '{print $1}'`\n"; $rrdupdatesh .= "$rrdtool update $rrddbpath$ifname$vpnusers N:\${OVPN}\n"; } diff --git a/src/opnsense/mvc/app/models/OPNsense/OpenVPN/OpenVPN.php b/src/opnsense/mvc/app/models/OPNsense/OpenVPN/OpenVPN.php index d9846bbbe..7115cbe74 100644 --- a/src/opnsense/mvc/app/models/OPNsense/OpenVPN/OpenVPN.php +++ b/src/opnsense/mvc/app/models/OPNsense/OpenVPN/OpenVPN.php @@ -248,6 +248,34 @@ class OpenVPN extends BaseModel return false; } + /** + * @return array of server devices (legacy and mvc) + */ + public function serverDevices() + { + $result = []; + foreach ($this->Instances->Instance->iterateItems() as $node_uuid => $node) { + if (!empty((string)$node->enabled) && (string)$node->role == 'server') { + $result[(string)$node->__devname] = [ + 'descr' => (string)$node->description ?? '', + 'sockFilename' => (string)$node->sockFilename + ]; + } + } + $cfg = Config::getInstance()->object(); + if (isset($cfg->openvpn) && isset($cfg->openvpn->{'openvpn-server'})) { + foreach ($cfg->openvpn->{'openvpn-server'} as $item) { + if (empty((string)$item->disable)) { + $result[sprintf("ovpns%s", $item->vpnid)] = [ + 'descr' => (string)$item->description ?? '', + 'sockFilename' => "/var/etc/openvpn/server{$item->vpnid}.sock" + ]; + } + } + } + return $result; + } + /** * Find unique instance properties, either from legacy or mvc model * Offers glue between both worlds.