From 5060f5c95c2c1b6bde35366d30f9e1511bafa1cb Mon Sep 17 00:00:00 2001 From: David Harrigan Date: Sat, 14 Oct 2017 04:10:43 +0900 Subject: [PATCH] net/zerotier: Add Basic API Functionality (#320) This commit brings basic API functionality to the Zerotier plugin. It allows the user to retrieve "Global" Zerotier information, peers that are talking with this node and details on configured (and enabled) networks. This version of the plugin provides a space for the Zerotier API key to be input and saved, but it is not used for Basic API functionality. The zerotier-cli client is used directly to query for global, peers and network information. If the API functionality is extended to allow for creating and modifying Zerotier information from this plugin, then the API key will be required at that point. It is introduced here for the sake of convenience for later down the line. Various other small changes include general code cleanups, renaming of some UI facing labels and improved layout design. -=david=- Fixes: #260 --- net/zerotier/Makefile | 2 +- .../src/etc/inc/plugins.inc.d/zerotier.inc | 9 +- ...erController.php => NetworkController.php} | 163 +++++----- .../Zerotier/Api/SettingsController.php | 102 +++++++ .../OPNsense/Zerotier/IndexController.php | 4 +- .../OPNsense/Zerotier/OverviewController.php | 70 +++++ .../OPNsense/Zerotier/forms/dialogNetwork.xml | 4 +- .../forms/{global.xml => settings.xml} | 9 +- .../models/OPNsense/Zerotier/Menu/Menu.xml | 5 +- .../app/models/OPNsense/Zerotier/Zerotier.xml | 6 +- .../app/views/OPNsense/Zerotier/index.volt | 38 +-- .../app/views/OPNsense/Zerotier/overview.volt | 284 ++++++++++++++++++ .../conf/actions.d/actions_zerotier.conf | 36 +++ 13 files changed, 608 insertions(+), 124 deletions(-) rename net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/Api/{ZerotierController.php => NetworkController.php} (58%) create mode 100644 net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/Api/SettingsController.php create mode 100644 net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/OverviewController.php rename net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/forms/{global.xml => settings.xml} (54%) create mode 100644 net/zerotier/src/opnsense/mvc/app/views/OPNsense/Zerotier/overview.volt diff --git a/net/zerotier/Makefile b/net/zerotier/Makefile index 1aa41e2be..5ff20188d 100644 --- a/net/zerotier/Makefile +++ b/net/zerotier/Makefile @@ -1,5 +1,5 @@ PLUGIN_NAME= zerotier -PLUGIN_VERSION= 1.2.0 +PLUGIN_VERSION= 1.3.0 PLUGIN_COMMENT= Virtual Networks That Just Work PLUGIN_DEPENDS= zerotier PLUGIN_MAINTAINER= dharrigan@gmail.com diff --git a/net/zerotier/src/etc/inc/plugins.inc.d/zerotier.inc b/net/zerotier/src/etc/inc/plugins.inc.d/zerotier.inc index e0804a84c..3f2cd08d1 100644 --- a/net/zerotier/src/etc/inc/plugins.inc.d/zerotier.inc +++ b/net/zerotier/src/etc/inc/plugins.inc.d/zerotier.inc @@ -29,8 +29,13 @@ function zerotier_enabled() { - $zerotier = new \OPNsense\Zerotier\Zerotier(); - return (string)$zerotier->enabled == '1'; + $mdlZerotier = new \OPNsense\Zerotier\Zerotier(); + return isEnabled($mdlZerotier); +} + +function isEnabled($node) +{ + return $node->enabled->__toString() == "1"; } function zerotier_services() diff --git a/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/Api/ZerotierController.php b/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/Api/NetworkController.php similarity index 58% rename from net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/Api/ZerotierController.php rename to net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/Api/NetworkController.php index 26624e80f..bc8de1402 100644 --- a/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/Api/ZerotierController.php +++ b/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/Api/NetworkController.php @@ -29,43 +29,21 @@ namespace OPNsense\Zerotier\Api; +require_once 'plugins.inc.d/zerotier.inc'; + use \OPNsense\Base\ApiMutableModelControllerBase; use \OPNsense\Base\UIModelGrid; use \OPNsense\Core\Backend; use \OPNsense\Core\Config; use \OPNsense\Zerotier\Zerotier; -class ZerotierController extends ApiMutableModelControllerBase +class NetworkController extends ApiMutableModelControllerBase { static protected $internalModelName = 'Zerotier'; static protected $internalModelClass = '\OPNsense\Zerotier\Zerotier'; - public function getAction() - { - $result = array(); - if ($this->request->isGet()) { - $mdlZerotier = $this->getModel(); - $result['zerotier'] = $mdlZerotier->getNodes(); - } - return $result; - } - - public function setAction() - { - $result = array("result" => "failed"); - if($this->request->isPost()) { - $mdlZerotier = $this->getModel(); - $mdlZerotier->setNodes($this->request->getPost("zerotier")); - $mdlZerotier->serializeToConfig(); - Config::getInstance()->save(); - $enabled = $this->isEnabled($mdlZerotier); - $result["result"] = $this->toggleZerotierService($enabled); - } - return $result; - } - - public function searchNetworkAction() + public function searchAction() { $this->sessionClose(); $mdlZerotier = $this->getModel(); @@ -76,7 +54,7 @@ class ZerotierController extends ApiMutableModelControllerBase ); } - public function getNetworkAction($uuid = null) + public function getAction($uuid = null) { $mdlZerotier = $this->getModel(); if ($uuid != null) { @@ -91,30 +69,52 @@ class ZerotierController extends ApiMutableModelControllerBase return array(); } - public function setNetworkAction() + public function infoAction($uuid = null) + { + $mdlZerotier = $this->getModel(); + if ($uuid != null) { + $network = $mdlZerotier->getNodeByReference('networks.network.' . $uuid); + if ($network != null) { + $networkId = $network->networkId->__toString(); + return array + ( + "title" => gettext("Information on network") . " " . $networkId, + "message" => $this->listZerotierNetwork($networkId) + ); + } + } + return array(); + } + + public function setAction($uuid = null) { $result = array("result" => "failed"); - if ($this->request->isPost()) { - $mdlZerotier = new Zerotier(); - $mdlZerotier->setNodes($this->request->getPost("network")); - $validationMessages = $mdlZerotier->performValidation(); - foreach ($validationMessages as $field => $msg) { - if (!array_key_exists("validation", $result)) { - $result["validations"] = array(); + if ($this->request->isPost() && $this->request->hasPost("network")) { + if($uuid != null) { + $mdlZerotier = $this->getModel(); + $network = $mdlZerotier->getNodeByReference('networks.network.' . $uuid); + if($network != null) { + $network->setNodes($this->request->getPost("network")); + $validationMessages = $mdlZerotier->performValidation(); + foreach ($validationMessages as $field => $msg) { + if (!array_key_exists("validation", $result)) { + $result["validations"] = array(); + } + $result["validation"]["network.".$msg->getField()] = $msg->getMessage(); + } + if ($validationMessages->count() == 0) { + unset($result["validations"]); + $mdlZerotier->serializeToConfig(); + Config::getInstance()->save(); + $result["result"] = "saved"; + } } - $result["validation"]["network.".$msg->getField()] = $msg->getMessage(); - } - if ($validationMessages->count() == 0) { - unset($result["validations"]); - $mdlZerotier->serializeToConfig(); - Config::getInstance()->save(); - $result["result"] = "saved"; } } return $result; } - public function addNetworkAction() + public function addAction() { $result = array("result" => "failed"); if ($this->request->isPost() && $this->request->hasPost("network")) { @@ -137,20 +137,20 @@ class ZerotierController extends ApiMutableModelControllerBase return $result; } - public function delNetworkAction($uuid = null) + public function delAction($uuid = null) { $result = array("result" => "failed"); if ($this->request->isPost()) { - $mdlZerotier = $this->getModel(); if ($uuid != null) { - if (!$this->isEnabled($mdlZerotier)) { + $mdlZerotier = $this->getModel(); + if (!isEnabled($mdlZerotier)) { $result["result"] = "service_not_enabled"; return $result; } - $node = $mdlZerotier->getNodeByReference('networks.network.' . $uuid); - if ($this->isEnabled($node)) { + $network = $mdlZerotier->getNodeByReference('networks.network.' . $uuid); + if (isEnabled($network)) { # Ensure we remove the interface before deleting the network - $this->toggleZerotierNetwork($node->networkId, 0); + $this->toggleZerotierNetwork($network->networkId, 0); } if ($mdlZerotier->networks->network->del($uuid)) { $mdlZerotier->serializeToConfig(); @@ -164,24 +164,24 @@ class ZerotierController extends ApiMutableModelControllerBase return $result; } - public function toggleNetworkAction($uuid) + public function toggleAction($uuid = null) { $result = array("result" => "failed"); if ($this->request->isPost()) { - $mdlZerotier = $this->getModel(); if ($uuid != null) { - if (!$this->isEnabled($mdlZerotier)) { + $mdlZerotier = $this->getModel(); + if (!isEnabled($mdlZerotier)) { $result["result"] = "service_not_enabled"; return $result; } - $node = $mdlZerotier->getNodeByReference('networks.network.' . $uuid); - if ($node != null) { - $networkId = $node->networkId; - if ($this->isEnabled($node)) { - $node->enabled = "0"; + $network = $mdlZerotier->getNodeByReference('networks.network.' . $uuid); + if ($network != null) { + $networkId = $network->networkId; + if (isEnabled($network)) { + $network->enabled = "0"; $result['result'] = $this->toggleZerotierNetwork($networkId, 0); } else { - $node->enabled = "1"; + $network->enabled = "1"; $result['result'] = $this->toggleZerotierNetwork($networkId, 1); } $mdlZerotier->serializeToConfig(); @@ -192,49 +192,22 @@ class ZerotierController extends ApiMutableModelControllerBase return $result; } - public function statusAction() - { - $mdlZerotier = $this->getModel(); - $enabled = (string)$mdlZerotier->enabled == '1'; - - $backend = new Backend(); - $response = $backend->configdRun('zerotier status'); - - if (strpos($response, "not running") > 0) { - if ($enabled) { - $status = "stopped"; - } else { - $status = "disabled"; - } - } elseif (strpos($response, "is running") > 0) { - $status = "running"; - } elseif (!$enabled) { - $status = "disabled"; - } else { - $status = "unknown"; - } - - return array("result" => $status); - } - private function toggleZerotierNetwork($networkId, $enabled) { - $backend = new Backend(); $action = $enabled ? 'join' : 'leave'; - return trim($backend->configdRun("zerotier $action $networkId")); + return trim((new Backend())->configdRun("zerotier $action $networkId")); } - private function toggleZerotierService($enabled) + private function listZerotierNetwork($networkId) { - $backend = new Backend(); - $backend->configdRun("template reload OPNsense/zerotier"); - $action = $enabled ? "start" : "stop"; - return trim($backend->configdRun("zerotier $action")); - } - - private function isEnabled($node) - { - return $node->enabled->__toString() == "1"; + $zerotierNetworks = trim((new Backend())->configdRun("zerotier listnetworks")); + $zerotierNetworks = explode("200 listnetworks", $zerotierNetworks); + foreach($zerotierNetworks as $zerotierNetwork) { + if(strpos($zerotierNetwork, $networkId) !== false) { + return $zerotierNetwork; + } + } + return gettext("Unable to obtain Zerotier information for network") . " " . $networkId . "! " . gettext("Is the network enabled?"); } } diff --git a/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/Api/SettingsController.php b/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/Api/SettingsController.php new file mode 100644 index 000000000..6432d9ac5 --- /dev/null +++ b/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/Api/SettingsController.php @@ -0,0 +1,102 @@ +request->isGet()) { + $mdlZerotier = $this->getModel(); + $result = array("zerotier" => $mdlZerotier->getNodes()); + } + return $result; + } + + public function setAction() + { + $result = array("result" => "failed"); + if($this->request->isPost() && $this->request->hasPost("zerotier")) { + $mdlZerotier = $this->getModel(); + $mdlZerotier->setNodes($this->request->getPost("zerotier")); + $mdlZerotier->serializeToConfig(); + Config::getInstance()->save(); + $enabled = isEnabled($mdlZerotier); + $result["result"] = $this->toggleZerotierService($enabled); + } + return $result; + } + + public function statusAction() + { + $mdlZerotier = $this->getModel(); + $enabled = isEnabled($mdlZerotier); + + $response = trim((new Backend())->configdRun('zerotier status')); + + if (strpos($response, "not running") > 0) { + if (isEnabled($mdlZerotier)) { + $status = "stopped"; + } else { + $status = "disabled"; + } + } elseif (strpos($response, "is running") > 0) { + $status = "running"; + } elseif (!$enabled) { + $status = "disabled"; + } else { + $status = "unknown"; + } + + return array("result" => $status); + } + + private function toggleZerotierService($enabled) + { + $backend = new Backend(); + $backend->configdRun("template reload OPNsense/zerotier"); + $action = $enabled ? "start" : "stop"; + return trim($backend->configdRun("zerotier $action")); + } + +} diff --git a/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/IndexController.php b/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/IndexController.php index 1e4eac172..8579ea595 100644 --- a/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/IndexController.php +++ b/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/IndexController.php @@ -33,9 +33,9 @@ class IndexController extends \OPNsense\Base\IndexController { public function indexAction() { - $this->view->title = "VPN: Zerotier"; + $this->view->title = gettext("VPN : Zerotier : Settings"); $this->view->pick('OPNsense/Zerotier/index'); - $this->view->globalForm = $this->getForm("global"); + $this->view->settingsForm = $this->getForm("settings"); $this->view->dialogNetworkForm = $this->getForm("dialogNetwork"); } } diff --git a/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/OverviewController.php b/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/OverviewController.php new file mode 100644 index 000000000..6eab68659 --- /dev/null +++ b/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/OverviewController.php @@ -0,0 +1,70 @@ +view->title = gettext("VPN : Zerotier : Overview"); + $this->view->pick('OPNsense/Zerotier/overview'); + $this->view->information = $this->information(); + $this->view->networks = $this->listNetworks(); + $this->view->peers = $this->listPeers(); + } + + private function information() + { + return $this->invokeConfigdRun("info_json"); + } + + private function listNetworks() + { + return $this->invokeConfigdRun("listnetworks_json"); + } + + private function listPeers() + { + return $this->invokeConfigdRun("listpeers_json"); + } + + private function invokeConfigdRun($action) + { + if(!zerotier_enabled()) { + return (object)[]; + } + $result = json_decode(trim((new Backend())->configdRun("zerotier $action")), true); + return $result !== null ? $result : (object)[]; + } +} diff --git a/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/forms/dialogNetwork.xml b/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/forms/dialogNetwork.xml index 7f153b64b..c8789ac0d 100644 --- a/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/forms/dialogNetwork.xml +++ b/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/forms/dialogNetwork.xml @@ -7,8 +7,8 @@ network.description - + text - Description to help identify this network + Local Description to help identify this network diff --git a/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/forms/global.xml b/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/forms/settings.xml similarity index 54% rename from net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/forms/global.xml rename to net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/forms/settings.xml index 3ab096cc8..7c569b293 100644 --- a/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/forms/global.xml +++ b/net/zerotier/src/opnsense/mvc/app/controllers/OPNsense/Zerotier/forms/settings.xml @@ -5,12 +5,17 @@ checkbox This will activate the Zerotier service + + zerotier.apiAccessToken + + text + Access Token used for the Zerotier API service + zerotier.localconf textbox 10 - Contains configuration options that apply to the local node + A JSON document containing configuration options that apply to the local node - diff --git a/net/zerotier/src/opnsense/mvc/app/models/OPNsense/Zerotier/Menu/Menu.xml b/net/zerotier/src/opnsense/mvc/app/models/OPNsense/Zerotier/Menu/Menu.xml index 55c880fef..75af8d0db 100644 --- a/net/zerotier/src/opnsense/mvc/app/models/OPNsense/Zerotier/Menu/Menu.xml +++ b/net/zerotier/src/opnsense/mvc/app/models/OPNsense/Zerotier/Menu/Menu.xml @@ -1,5 +1,8 @@ - + + + + diff --git a/net/zerotier/src/opnsense/mvc/app/models/OPNsense/Zerotier/Zerotier.xml b/net/zerotier/src/opnsense/mvc/app/models/OPNsense/Zerotier/Zerotier.xml index a4487fa67..d081852fb 100644 --- a/net/zerotier/src/opnsense/mvc/app/models/OPNsense/Zerotier/Zerotier.xml +++ b/net/zerotier/src/opnsense/mvc/app/models/OPNsense/Zerotier/Zerotier.xml @@ -3,12 +3,16 @@ Zerotier - Virtual Networks That Just Work. - 1.2.0 + 1.3.0 0 Y + + + N + N diff --git a/net/zerotier/src/opnsense/mvc/app/views/OPNsense/Zerotier/index.volt b/net/zerotier/src/opnsense/mvc/app/views/OPNsense/Zerotier/index.volt index c06f06806..44a4272de 100644 --- a/net/zerotier/src/opnsense/mvc/app/views/OPNsense/Zerotier/index.volt +++ b/net/zerotier/src/opnsense/mvc/app/views/OPNsense/Zerotier/index.volt @@ -31,7 +31,7 @@ POSSIBILITY OF SUCH DAMAGE. $(document).ready(function() { - var zerotierSettings = {'global': '/api/zerotier/zerotier/get'}; + var zerotierSettings = {'settings': '/api/zerotier/settings/get'}; mapDataToFormUI(zerotierSettings).done(function(data) { formatTokenizersUI(); @@ -40,28 +40,29 @@ POSSIBILITY OF SUCH DAMAGE. $("#grid-networks").UIBootgrid( { - search: '/api/zerotier/zerotier/searchNetwork', - get:'/api/zerotier/zerotier/getNetwork/', - set:'/api/zerotier/zerotier/setNetwork/', - add:'/api/zerotier/zerotier/addNetwork/', - del:'/api/zerotier/zerotier/delNetwork/', - toggle:'/api/zerotier/zerotier/toggleNetwork/' + search: '/api/zerotier/network/search', + get:'/api/zerotier/network/get/', + set:'/api/zerotier/network/set/', + add:'/api/zerotier/network/add/', + del:'/api/zerotier/network/del/', + info:'/api/zerotier/network/info/', + toggle:'/api/zerotier/network/toggle/' } ); - ajaxCall(url="/api/zerotier/zerotier/status", sendData={}, callback=function(data, status) { + ajaxGet(url="/api/zerotier/settings/status", sendData={}, callback=function(data, status) { updateServiceStatusUI(data['result']); toggleNetworksTab(data['result']); }); - $("#btn_save_global").click(function() { - $("#global_progress").addClass("fa fa-spinner fa-pulse"); - saveFormToEndpoint(url="/api/zerotier/zerotier/set", formid="global", callback_ok=function(data, status) { - ajaxCall(url="/api/zerotier/zerotier/status", sendData={}, callback=function(data, status) { + $("#btn_save_settings").click(function() { + $("#settings_progress").addClass("fa fa-spinner fa-pulse"); + saveFormToEndpoint(url="/api/zerotier/settings/set", formid="settings", callback_ok=function(data, status) { + ajaxGet(url="/api/zerotier/settings/status", sendData={}, callback=function(data, status) { updateServiceStatusUI(data['result']); toggleNetworksTab(data['result']); }); - $("#global_progress").removeClass("fa fa-spinner fa-pulse"); + $("#settings_progress").removeClass("fa fa-spinner fa-pulse"); }); }); @@ -83,14 +84,14 @@ POSSIBILITY OF SUCH DAMAGE.
-
+
- {{ partial("layout_partials/base_form", ['fields': globalForm, 'id': 'global', 'apply_btn_id': 'btn_save_global']) }} + {{ partial("layout_partials/base_form", ['fields': settingsForm, 'id': 'settings', 'apply_btn_id': 'btn_save_settings']) }}
@@ -98,8 +99,9 @@ POSSIBILITY OF SUCH DAMAGE. {{ lang._('Enabled') }} - {{ lang._('Network Id') }} - {{ lang._('Description') }} + {{ lang._('Network Id') }} + {{ lang._('Local Description') }} + {{ lang._('Commands') }} {{ lang._('ID') }} diff --git a/net/zerotier/src/opnsense/mvc/app/views/OPNsense/Zerotier/overview.volt b/net/zerotier/src/opnsense/mvc/app/views/OPNsense/Zerotier/overview.volt new file mode 100644 index 000000000..11691e251 --- /dev/null +++ b/net/zerotier/src/opnsense/mvc/app/views/OPNsense/Zerotier/overview.volt @@ -0,0 +1,284 @@ +{# + +OPNsense® is Copyright © 2014 – 2017 by Deciso B.V. +Copyright (C) 2017 David Harrigan + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +#} + +{% set networksFirstRow = true, peersFirstRow = true %} + + + + + +
+
+ + + {% for key, value in information %} + {% set value = value | default('null') %} + + + {% if value is type ('boolean') %} + + {% elseif key == "config" %} + {% set config = value %} + {% set settings = config["settings"] %} + + {% else %} + + {% endif %} + + {% elsefor %} + + {% endfor %} + +
{{ key | e }}{{ value ? 'true' : 'false' }} + + + + + + + + + + + + + + + + + + + +
{{ lang._("physical") }}{{ config["physical"] ? 'true' : 'false' }}
{{ lang._("settings") }}{{ lang._("portMappingEnabled") }}{{ lang._("primaryPort") }}{{ lang._("softwareUpdate") }}{{ lang._("softwareUpdateChannel") }}
 {{ settings["portMappingEnabled"] ? 'true' : 'false' }}{{ settings["primaryPort"] | default('null') | e }}{{ settings["softwareUpdate"] | default('null') | e }}{{ settings["softwareUpdateChannel"] | default('null') | e }}
+
{{ value | e}}
{{ lang._("Unable to retrieve Zerotier information. Is the service enabled and is there internet connectivity?") }}
+
+
+
+
+
+ {% for network in networks %} +
+
+ + + + + + +
+ + {{ lang._("Network Id") }} : {{ network['nwid'] | e }} ({{ network['name'] | e }}) + {% if networksFirstRow == true %} + {% set networksFirstRow = false %} +
+   +
+ {% endif %} +
+
+
+ + + {% for key, value in network %} + {% set value = value | default('null') %} + + + {% if value is type('boolean') %} + + {% elseif value is iterable %} + + {% else %} + + {% endif %} + + {% endfor %} + +
{{ key | e }}{{ value == true ? 'true' : 'false' }} + + {% if key == "assignedAddresses" %} + + + + + + {% if value|length > 0 %} + {% for index in 0..value|length - 1 %} + + + + {% endfor %} + {% else %} + + + + {% endif %} + + {% elseif key == "routes" %} + + + + + + + + + + {% if value|length > 0 %} + {% for index in 0..value|length - 1 %} + {% set route = value[index] %} + + + + + + + {% endfor %} + {% else %} + + {% endif %} + + {% endif %} +
{{ lang._("Addresses") }}
{{ value[index] | e }}
{{ lang._("No addresses currently defined.") }}
{{ lang._("target") }}{{ lang._("via") }}{{ lang._("metric") }}{{ lang._("flags") }}
{{ route["target"] | e }}{{ route["via"] | e }}{{ route["metric"] | e }}{{ route["flags"] | e }}
{{ lang._("No routes currently defined.") }}
+
{{ value | e }}
+
+
+ {% elsefor %} + {{ lang._("Unable to retrieve Zerotier network information. Is the service enabled, do you have enabled networks and is there internet connectivity?") }} + {% endfor %} +
+
+
+
+
+
+
+
+ {% for peer in peers %} +
+
+ + + + + + +
+ + {{ lang._("Peer") }} : {{ peer['address'] | e }} ({{ peer['role'] | e }}) + {% if peersFirstRow == true %} + {% set peersFirstRow = false %} +
+   +
+ {% endif %} +
+
+
+ + + {% for key, value in peer %} + {% set value = value | default('null') %} + + + {% if value is type('boolean') %} + + {% elseif value is iterable %} + + {% else %} + + {% endif %} + + {% endfor %} + +
{{ key | e }}{{ value == true ? 'true' : 'false' }} + + {% if key == "paths" %} + + + + + + + + + + + + + + {% if value|length > 0 %} + {% for index in 0..value|length - 1 %} + {% set path = value[index] %} + + + + + + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + + {% endif %} +
{{ lang._("active") }}{{ lang._("address") }}{{ lang._("expired") }}{{ lang._("lastReceive") }}{{ lang._("lastSend") }}{{ lang._("linkQuality") }}{{ lang._("preferred") }}{{ lang._("trustedPathId") }}
{{ path["active"] | e }}{{ path["address"] | e }}{{ path["expired"] ? 'true' : 'false' }}{{ path["lastReceive"] | e }}{{ path["lastSend"] | e }}{{ path["linkQuality"] | e }}{{ path["preferred"] | e }}{{ path["trustedPathId"] | e }}
{{ lang._("No routes currently defined.") }}
+
{{ value | e }}
+
+
+ {% elsefor %} + {{ lang._("Unable to retrieve Zerotier peer information. Is the service enabled and is there internet connectivity?") }} + {% endfor %} +
+
+
+
+
diff --git a/net/zerotier/src/opnsense/service/conf/actions.d/actions_zerotier.conf b/net/zerotier/src/opnsense/service/conf/actions.d/actions_zerotier.conf index 8dd1fd3c3..5df6767c1 100644 --- a/net/zerotier/src/opnsense/service/conf/actions.d/actions_zerotier.conf +++ b/net/zerotier/src/opnsense/service/conf/actions.d/actions_zerotier.conf @@ -33,3 +33,39 @@ command:/usr/local/bin/zerotier-cli parameters: leave %s type:script_output message:Leaving Zerotier Network + +[info] +command:/usr/local/bin/zerotier-cli info +parameters: +type:script_output +message:Listing Zerotier Info + +[listnetworks] +command:/usr/local/bin/zerotier-cli listnetworks +parameters: +type:script_output +message:Listing Zerotier Networks + +[listpeers] +command:/usr/local/bin/zerotier-cli listpeers +parameters: +type:script_output +message:Listing Zerotier Peers + +[info_json] +command:/usr/local/bin/zerotier-cli -j info +parameters: +type:script_output +message:Listing Zerotier Info (as JSON) + +[listnetworks_json] +command:/usr/local/bin/zerotier-cli -j listnetworks +parameters: +type:script_output +message:Listing Zerotier Networks (as JSON) + +[listpeers_json] +command:/usr/local/bin/zerotier-cli -j listpeers +parameters: +type:script_output +message:Listing Zerotier Peers (as JSON)