Skip to content

Commit

Permalink
Interfaces: Diagnostics: Ping - refactor diagnostics tool (#6378)
Browse files Browse the repository at this point in the history
  • Loading branch information
AdSchellevis committed Mar 16, 2023
1 parent b528952 commit dd6cfba
Show file tree
Hide file tree
Showing 10 changed files with 655 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
<?php

/**
* Copyright (C) 2023 Deciso B.V.
*
* 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.
*
*/

namespace OPNsense\Diagnostics\Api;

use OPNsense\Base\ApiMutableModelControllerBase;
use OPNsense\Core\Backend;

class PingController extends ApiMutableModelControllerBase
{
protected static $internalModelName = 'ping';
protected static $internalModelClass = 'OPNsense\Diagnostics\Ping';
private static $ping_dir = '/tmp/ping';

/**
* set / create ping job
*/
public function setAction()
{
$result = parent::setAction();
if (empty($result['validations'])) {
$mdl = $this->getModel();
$result['result'] = 'ok';
$result['uuid'] = $mdl->settings->generateUUID();
@mkdir(self::$ping_dir);
$nodes = $mdl->settings->getNodes();
foreach ($nodes as $key => $value) {
if (is_array($value)) {
$items = [];
foreach ($value as $itemkey => $itemval) {
if (!empty($itemval['selected'])) {
$items[] = $itemkey;
}
}
$nodes[$key] = implode(',', $items);
}
}
file_put_contents(
sprintf('%s/%s.json', self::$ping_dir, $result['uuid']),
json_encode($nodes)
);
}
return $result;
}

/**
* start ping job
*/
public function startAction($jobid)
{
$result = ['status' => 'failed'];
if ($this->request->isPost()) {
$this->sessionClose();
$payload = json_decode((new Backend())->configdpRun('interface ping start', [$jobid]) ?? '', true);
if (!empty($payload)) {
$result = $payload;
}
}
return $result;
}

/**
* stop ping job
*/
public function stopAction($jobid)
{
$result = ['status' => 'failed'];
if ($this->request->isPost()) {
$this->sessionClose();
$payload = json_decode((new Backend())->configdpRun('interface ping stop', [$jobid]) ?? '', true);
if (!empty($payload)) {
$result = $payload;
}
}
return $result;
}

/**
* remove ping job
*/
public function removeAction($jobid)
{
$result = ['status' => 'failed'];
if ($this->request->isPost()) {
$this->sessionClose();
$payload = json_decode((new Backend())->configdpRun('interface ping remove', [$jobid]) ?? '', true);
if (!empty($payload)) {
$result = $payload;
}
}
return $result;
}

/**
* search current ping jobs
*/
public function searchJobsAction()
{
$this->sessionClose();
$data = json_decode((new Backend())->configdRun('interface ping list') ?? '', true);
$records = (!empty($data) && !empty($data['jobs'])) ? $data['jobs'] : [];
return $this->searchRecordsetBase($records);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

/**
* Copyright (C) 2023 Deciso B.V.
*
* 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.
*
*/

namespace OPNsense\Diagnostics;

use OPNsense\Base\IndexController;

/**
* Class PingController
* @package OPNsense\Diagnostics
*/
class PingController extends IndexController
{
public function indexAction()
{
$this->view->pick('OPNsense/Diagnostics/ping');
$this->view->pingForm = $this->getForm("ping");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<form>
<field>
<id>ping.settings.hostname</id>
<label>Hostname or IP</label>
<type>text</type>
<help><![CDATA[Hostname or address to ping.]]></help>
</field>
<field>
<id>ping.settings.fam</id>
<label>Address Family</label>
<type>dropdown</type>
</field>
<field>
<id>ping.settings.source_address</id>
<label>Source address</label>
<type>text</type>
<help><![CDATA[Optional source address.]]></help>
</field>
<field>
<id>ping.settings.packetsize</id>
<label>Packet size</label>
<type>text</type>
<help><![CDATA[Specify the number of data bytes to be sent.]]></help>
</field>
<field>
<id>ping.settings.disable_frag</id>
<label>Do not fragment</label>
<type>checkbox</type>
<help>
Disable fragmentation.
Can be helpful to determine the maximum size a transport is able to send.
Keep in mind this is the payload size, an IP and ICMP header are added.
</help>
</field>
<field>
<id>ping.settings.description</id>
<label>Description</label>
<type>text</type>
<help>Description to be displayed in the "jobs" tab.</help>
</field>
</form>
3 changes: 2 additions & 1 deletion src/opnsense/mvc/app/models/OPNsense/Core/ACL/ACL.xml
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,8 @@
<page-diagnostics-ping>
<name>Diagnostics: Ping</name>
<patterns>
<pattern>diag_ping.php*</pattern>
<pattern>ui/diagnostics/ping</pattern>
<pattern>api/diagnostics/ping/*</pattern>
</patterns>
</page-diagnostics-ping>
<page-diagnostics-rebootsystem>
Expand Down
2 changes: 1 addition & 1 deletion src/opnsense/mvc/app/models/OPNsense/Core/Menu/Menu.xml
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@
<Diagnostics order="970" cssClass="fa fa-medkit fa-fw">
<DNSLookup VisibleName="DNS Lookup" url="/ui/diagnostics/dns_diagnostics"/>
<PacketCapture VisibleName="Packet Capture" url="/ui/diagnostics/packet_capture"/>
<Ping url="/diag_ping.php"/>
<Ping url="/ui/diagnostics/ping"/>
<TestPort VisibleName="Port Probe" url="/diag_testport.php"/>
<Traceroute VisibleName="Trace Route" url="/diag_traceroute.php"/>
</Diagnostics>
Expand Down
36 changes: 36 additions & 0 deletions src/opnsense/mvc/app/models/OPNsense/Diagnostics/Ping.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

/**
* Copyright (C) 2023 Deciso B.V.
*
* 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.
*/

namespace OPNsense\Diagnostics;

use OPNsense\Base\BaseModel;

class Ping extends BaseModel
{
}
40 changes: 40 additions & 0 deletions src/opnsense/mvc/app/models/OPNsense/Diagnostics/Ping.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<model>
<mount>:memory:</mount>
<version>1.0.0</version>
<description>
OPNsense Ping Diagnostics
</description>
<items>
<settings>
<hostname type="HostnameField">
<Required>Y</Required>
<ValidationMessage>Provide a valid hostname or address to ping</ValidationMessage>
</hostname>
<fam type="OptionField">
<Required>Y</Required>
<default>ip</default>
<OptionValues>
<ip>IPv4</ip>
<ip6>IPv6</ip6>
</OptionValues>
</fam>
<source_address type="NetworkField">
<Required>N</Required>
<NetMaskAllowed>N</NetMaskAllowed>
<ValidationMessage>Provide a valid source address</ValidationMessage>
</source_address>
<packetsize type="IntegerField">
<MinimumValue>1</MinimumValue>
<MaximumValue>65535</MaximumValue>
</packetsize>
<disable_frag type="BooleanField">
<default>0</default>
</disable_frag>
<description type="TextField">
<Required>N</Required>
<mask>/^(.){1,255}$/u</mask>
<ValidationMessage>Description should be a string between 1 and 255 characters</ValidationMessage>
</description>
</settings>
</items>
</model>
Loading

0 comments on commit dd6cfba

Please sign in to comment.