From ea4fdeb57e4b926d9a741981e355585e9711f80f Mon Sep 17 00:00:00 2001 From: Patrik Kernstock Date: Sun, 16 Oct 2022 14:31:24 +0100 Subject: [PATCH] net/wireguard: Reworked widget (#3117) --- .../Wireguard/Api/GeneralController.php | 92 ++++++++++++++++ .../www/widgets/widgets/wireguard.widget.php | 103 +++++++++++++----- 2 files changed, 165 insertions(+), 30 deletions(-) diff --git a/net/wireguard/src/opnsense/mvc/app/controllers/OPNsense/Wireguard/Api/GeneralController.php b/net/wireguard/src/opnsense/mvc/app/controllers/OPNsense/Wireguard/Api/GeneralController.php index da33e0f57..ba5caabc5 100644 --- a/net/wireguard/src/opnsense/mvc/app/controllers/OPNsense/Wireguard/Api/GeneralController.php +++ b/net/wireguard/src/opnsense/mvc/app/controllers/OPNsense/Wireguard/Api/GeneralController.php @@ -2,6 +2,7 @@ /** * Copyright (C) 2018 Michael Muenz + * Copyright (C) 2022 Patrik Kernstock * * All rights reserved. * @@ -31,9 +32,100 @@ namespace OPNsense\Wireguard\Api; use OPNsense\Base\ApiMutableModelControllerBase; +use OPNsense\Core\Config; +use OPNsense\Core\Backend; class GeneralController extends ApiMutableModelControllerBase { protected static $internalModelClass = '\OPNsense\Wireguard\General'; protected static $internalModelName = 'general'; + + public function getStatusAction() + { + // get wireguard configuration + $config = Config::getInstance()->object(); + $config = $config->OPNsense->wireguard; + + // craft peers array + $peers = []; + $peers_uuid_pubkey = []; + // enabled, name, pubkey + foreach ($config->client->clients->client as $client) { + $peerUuid = (string)$client->attributes()['uuid']; + $peers_uuid_pubkey[$peerUuid] = (string) $client->pubkey; + $peers[$peerUuid] = [ + "name" => (string) $client->name, + "enabled" => (integer) $client->enabled, + "publicKey" => (string) $client->pubkey, + ]; + } + + // prepare and initialize the server array + $status = []; + $peer_pubkey_reference = []; + foreach ($config->server->servers->server as $server) { + if ($server->enabled != "1") continue; + + // build basic server array + $interface = "wg".$server->instance; + $status[$interface] = [ + "instance" => (integer) $server->instance, + "interface" => (string) $interface, + "enabled" => (integer) $server->enabled, + "name" => (string) $server->name, + "peers" => [], + ]; + + // parse and add peers with initial values to array + if (strlen($server->peers) > 0) { + // there is at least one peer defined + $serverPeers = explode(",", (string) $server->peers); + // iteriate over each peer uuid + foreach ($serverPeers as $peerUuid) { + // remember interface and pubkey <> peer-uuid reference for referencing handshake logic below + $peer_pubkey_reference[$interface][$peers_uuid_pubkey[$peerUuid]] = $peerUuid; + // merge peer info and initial values for handshake data + $status[$interface]["peers"][$peerUuid] = array_merge( + $peers[$peerUuid], + [ + "lastHandshake" => "0000-00-00 00:00:00+00:00", + ]); + } + } + } + + // Get latest handshakes by running CLI command locally + $data = (new Backend())->configdRun("wireguard showhandshake"); + + // parse and set handshake to status datastructure + $data = trim($data); + if (strlen($data) !== 0) { + $wgHandshakes = explode("\n", $data); + foreach ($wgHandshakes as $handshake) { + $item = explode("\t", trim($handshake)); + + // set interface name and publickey + $interface = trim($item[0]); + $pubkey = trim($item[1]); + + // calculate handshake time based on local timezone + $epoch = $item[2]; + if ($epoch > 0) { + $dt = new \DateTime("@$epoch"); + $dt->setTimezone(new \DateTimeZone(date_default_timezone_get())); + $latest = $dt->format("Y-m-d H:i:sP"); + + // set handshake + $peerUuid = $peer_pubkey_reference[$interface][$pubkey]; + if (!empty($peerUuid)) { + $status[$interface]["peers"][$peerUuid]["lastHandshake"] = $latest; + } + } + } + } + + return [ + "items" => $status + ]; + } } diff --git a/net/wireguard/src/www/widgets/widgets/wireguard.widget.php b/net/wireguard/src/www/widgets/widgets/wireguard.widget.php index 792743af9..282133216 100644 --- a/net/wireguard/src/www/widgets/widgets/wireguard.widget.php +++ b/net/wireguard/src/www/widgets/widgets/wireguard.widget.php @@ -3,6 +3,7 @@ /* * Copyright (C) 2020 Deciso B.V. * Copyright (C) 2020 D. Domig + * Copyright (C) 2022 Patrik Kernstock * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,50 +31,92 @@ require_once("guiconfig.inc"); require_once("widgets/include/wireguard.inc"); -$data = trim(configd_run('wireguard showhandshake')); +$enabled = ($config["OPNsense"]["wireguard"]["general"]["enabled"] === "1" ? true : false); -$empty = strlen($data) == 0; ?> + + - - - 0): - $dt = new DateTime("@$epoch"); - $dt->setTimezone(new DateTimeZone(date_default_timezone_get())); - $latest = $dt->format(gettext("Y-m-d H:i:sP")); - endif; ?> + + - - - + - - - - - - - - - - +
...
+ +