%PDF- %PDF-
| Direktori : /backups/router/usr/local/opnsense/mvc/app/controllers/OPNsense/IPsec/Api/ |
| Current File : //backups/router/usr/local/opnsense/mvc/app/controllers/OPNsense/IPsec/Api/SessionsController.php |
<?php
/*
* Copyright (C) 2022 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\IPsec\Api;
use OPNsense\Base\ApiControllerBase;
use OPNsense\Core\Backend;
use OPNsense\Core\Config;
use OPNsense\IPsec\Swanctl;
/**
* Class SessionsController
* @package OPNsense\IPsec\Api
*/
class SessionsController extends ApiControllerBase
{
private function list_status()
{
return json_decode((new Backend())->configdRun('ipsec list status'), true);
}
/**
* Search phase 1 session entries
* @return array
*/
public function searchPhase1Action()
{
$records = [];
$config = Config::getInstance()->object();
$data = $this->list_status();
$phase1s = [];
if (!empty($config->ipsec->phase1)) {
foreach ($config->ipsec->phase1 as $p1) {
if (!empty((string)$p1->ikeid)) {
$phase1s[(string)$p1->ikeid] = (string)$p1->descr;
}
}
}
foreach ((new Swanctl())->Connections->Connection->iterateItems() as $node_uuid => $node) {
$phase1s[(string)$node_uuid] = (string)$node->description;
}
if (!empty($data)) {
foreach ($data as $conn => $payload) {
$record = $payload;
if (preg_match('/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/', $conn) == 1) {
$record['ikeid'] = $conn;
} else {
$record['ikeid'] = substr(explode('-', $conn)[0], 3);
}
$record['phase1desc'] = null;
$record['name'] = $conn;
if (!empty($phase1s[$record['ikeid']])) {
$record['phase1desc'] = $phase1s[$record['ikeid']];
}
$record['connected'] = !empty($record['sas']);
/* aggregate child-sas [phase2] information */
$agg_fields = [
'bytes-in' => 0,
'bytes-out' => 0,
'packets-in' => 0,
'packets-out' => 0
];
$record['install-time'] = null;
foreach ($record['sas'] as $sa) {
if (!empty($sa['child-sas'])) {
foreach ($sa['child-sas'] as $csa) {
foreach (array_keys($agg_fields) as $fieldname) {
$agg_fields[$fieldname] += $csa[$fieldname];
}
$record['install-time'] = max($record['install-time'], $csa['install-time']);
}
}
}
$record = array_merge($record, $agg_fields);
unset($record['children']);
unset($record['sas']);
$records[] = $record;
}
}
return $this->searchRecordsetBase($records);
}
/**
* Search phase 2 session entries
* @return array
*/
public function searchPhase2Action()
{
$records = [];
$selected_conn = $this->request->getPost('id', 'string', '');
$config = Config::getInstance()->object();
$data = $this->list_status();
$reqids = [];
if (!empty($config->ipsec->phase2)) {
foreach ($config->ipsec->phase2 as $p2) {
if (!empty((string)$p2->reqid)) {
$reqids[(string)$p2->reqid] = [
'ikeid' => (string)$p2->ikeid,
'phase2desc' => (string)$p2->descr
];
}
}
}
$phase2s = [];
foreach ((new Swanctl())->children->child->iterateItems() as $node_uuid => $node) {
$phase2s[(string)$node_uuid] = [
'ikeid' => (string)$node->connection,
'phase2desc' => (string)$node->description
];
}
if (!empty($data[$selected_conn]) && !empty($data[$selected_conn]['sas'])) {
foreach ($data[$selected_conn]['sas'] as $sa) {
if (!empty($sa['child-sas'])) {
foreach ($sa['child-sas'] as $conn => $csa) {
$record = $csa;
$record['remote-host'] = $sa['remote-host'];
if (!empty($reqids[$csa['reqid']])) {
$record = array_merge($record, $reqids[$csa['reqid']]);
} elseif (!empty($phase2s[$csa['name']])) {
$record = array_merge($record, $phase2s[$csa['name']]);
}
foreach ($record as $key => $val) {
if (is_array($val)) {
$record[$key] = implode(' , ', $val);
}
}
$records[] = $record;
}
}
}
}
return $this->searchRecordsetBase($records);
}
/**
* connect a session
* @param string $id md 5 hash to identify the spd entry
* @return array
*/
public function connectAction($id)
{
if ($this->request->isPost()) {
(new Backend())-> configdpRun('ipsec connect', [$id]);
return ["result" => "ok"];
}
return ["result" => "failed"];
}
/**
* disconnect a session
* @param string $id md 5 hash to identify the spd entry
* @return array
*/
public function disconnectAction($id)
{
if ($this->request->isPost()) {
(new Backend())-> configdpRun('ipsec disconnect', [$id]);
return ["result" => "ok"];
}
return ["result" => "failed"];
}
}