feat: new output formats Dnsmasq nfset and ipset, ClashX, Keenetic KVAS

This commit is contained in:
Rekryt
2024-09-04 16:42:20 +03:00
parent 1fdc844f45
commit ef457a1fda
9 changed files with 130 additions and 12 deletions

View File

@@ -0,0 +1,32 @@
<?php
namespace OpenCCK\App\Controller;
class ClashxController extends TextController {
const DELIMITER = "\n";
/**
* @param array $response
* @return string
* Поддерживаемые типы правил в ClashX:
* DOMAIN-SUFFIX — для доменов по суффиксу.
* DOMAIN — для конкретных доменов.
* DOMAIN-KEYWORD — для доменов, содержащих определённые ключевые слова.
* IP-CIDR — для IP-адресов и IPv4-сетей.
* IP-CIDR6 — для IPv6-сетей.
* SRC-IP-CIDR — для исходных IP-адресов или сетей.
* SRC-IP-CIDR6 — для исходных IPv6-адресов или сетей.
* GEOIP — для определения страны по IP.
*/
protected function render(array $response): string {
$data = $this->request->getQueryParameter('data') ?? '';
$handlers = [
'domains' => fn(string $row) => 'DOMAIN-SUFFIX,' . $row,
'ip4' => fn(string $row) => 'IP-CIDR,' . $row . '/32',
'ip6' => fn(string $row) => 'IP-CIDR6,' . $row . '/128',
'cidr4' => fn(string $row) => 'IP-CIDR,' . $row,
'cidr6' => fn(string $row) => 'IP-CIDR6,' . $row,
];
return implode($this::DELIMITER, array_map($handlers[$data] ?? fn(string $row) => $row, $response));
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace OpenCCK\App\Controller;
class IpsetController extends TextController {
const DELIMITER = "\n";
/**
* @param array $response
* @return string
*/
protected function render(array $response): string {
$data = $this->request->getQueryParameter('data') ?? '';
return implode(
$this::DELIMITER,
array_map(fn(string $row) => 'ipset=/' . $row . '/vpn_' . $data, $response)
);
}
}

View File

@@ -0,0 +1,26 @@
<?php
namespace OpenCCK\App\Controller;
/**
* Format Keenetic (KVAS)
*/
class KvasController extends TextController {
const DELIMITER = "\n";
/**
* @param array $response
* @return string
*/
protected function render(array $response): string {
$data = $this->request->getQueryParameter('data') ?? '';
$handlers = [
'domains' => fn(string $row) => '*' . $row,
'ip4' => fn(string $row) => $row . '/32',
'ip6' => fn(string $row) => $row . '/128',
'cidr4' => fn(string $row) => $row,
'cidr6' => fn(string $row) => $row,
];
return implode($this::DELIMITER, array_map($handlers[$data] ?? fn(string $row) => $row, $response));
}
}

View File

@@ -14,7 +14,7 @@ class MikrotikController extends AbstractIPListController {
$sites = SiteFactory::normalizeArray($this->request->getQueryParameters()['site'] ?? []);
$data = $this->request->getQueryParameter('data') ?? '';
if ($data == '') {
return "# Error: The 'data' GET parameter is required in the URL to access this page, but it cannot have the value 'All'";
return "# Error: The 'data' GET parameter is required in the URL to access this page";
}
$response = [];

View File

@@ -0,0 +1,26 @@
<?php
namespace OpenCCK\App\Controller;
class NfsetController extends TextController {
const DELIMITER = "\n";
/**
* @param array $response
* @return string
*/
protected function render(array $response): string {
$data = $this->request->getQueryParameter('data') ?? '';
$prefix = 'nftset=/';
$suffix = '#inet#fw4#vpn_';
$handlers = [
'domains' => fn(string $row) => $prefix . $row . '/4' . $suffix . $data,
'ip4' => fn(string $row) => $prefix . $row . '/4' . $suffix . $data,
'ip6' => fn(string $row) => $prefix . $row . '/6' . $suffix . $data,
'cidr4' => fn(string $row) => $prefix . $row . '/4' . $suffix . $data,
'cidr6' => fn(string $row) => $prefix . $row . '/6' . $suffix . $data,
];
return implode($this::DELIMITER, array_map($handlers[$data] ?? fn(string $row) => $row, $response));
}
}

View File

@@ -15,7 +15,7 @@ class TextController extends AbstractIPListController {
$sites = SiteFactory::normalizeArray($this->request->getQueryParameters()['site'] ?? []);
$data = $this->request->getQueryParameter('data') ?? '';
if ($data == '') {
return "# Error: The 'data' GET parameter is required in the URL to access this page, but it cannot have the value 'All'";
return "# Error: The 'data' GET parameter is required in the URL to access this page";
}
$response = [];
@@ -29,9 +29,16 @@ class TextController extends AbstractIPListController {
}
}
return implode(
$this::DELIMITER,
return $this->render(
SiteFactory::normalizeArray($response, in_array($data, ['ipv4', 'ipv6', 'cidr4', 'cidr6']))
);
}
/**
* @param array $response
* @return string
*/
protected function render(array $response): string {
return implode($this::DELIMITER, $response);
}
}