refactored argument handling

This commit is contained in:
tracer 2022-09-17 18:56:20 +02:00
parent 61b24edfdf
commit b48758bf82
1 changed files with 63 additions and 47 deletions

View File

@ -12,6 +12,7 @@ define(constant_name: 'COLOR_WHITE', value: "\033[37m");
define(constant_name: 'COLOR_DEFAULT', value: "\033[39m"); define(constant_name: 'COLOR_DEFAULT', value: "\033[39m");
use App\Entity\Domain; use App\Entity\Domain;
use App\Entity\DynDNS;
use App\Entity\Nameserver; use App\Entity\Nameserver;
use App\Entity\Panel; use App\Entity\Panel;
use App\Repository\ApikeyRepository; use App\Repository\ApikeyRepository;
@ -20,6 +21,7 @@ use App\Repository\DynDNSRepository;
use App\Repository\NameserverRepository; use App\Repository\NameserverRepository;
use App\Repository\PanelRepository; use App\Repository\PanelRepository;
use Arubacao\TldChecker\Validator; use Arubacao\TldChecker\Validator;
use Exception;
use LucidFrame\Console\ConsoleTable; use LucidFrame\Console\ConsoleTable;
if (php_sapi_name() !== 'cli') { if (php_sapi_name() !== 'cli') {
@ -32,11 +34,10 @@ if (php_sapi_name() !== 'cli') {
*/ */
class CLIController class CLIController
{ {
private int $argumentsCount;
private array $arguments; private array $arguments;
/** /**
* @throws \Exception * @throws Exception
*/ */
public function __construct( public function __construct(
private readonly ApiController $apiController, private readonly ApiController $apiController,
@ -77,24 +78,25 @@ class CLIController
// TODO encrypt the password in the config file, key in config // TODO encrypt the password in the config file, key in config
function runCommand(int $argumentsCount, array $arguments): void function runCommand(array $arguments): void
{ {
$this->argumentsCount = $argumentsCount; if (count($arguments) < 1) {
$this->arguments = $arguments;
$this->logger->debug(message: "runCommand()");
if ($this->argumentsCount < 1) {
$this->showUsage(); $this->showUsage();
exit(0); exit(0);
} }
if (str_contains(haystack: $this->arguments[0], needle: ':')) { $this->logger->debug(message: "runCommand()");
[$command, $subcommand] = explode(separator: ':', string: $this->arguments[0]);
if (str_contains(haystack: $arguments[0], needle: ':')) {
[$command, $subcommand] = explode(separator: ':', string: $arguments[0]);
} else { } else {
$command = $this->arguments[0]; $command = $arguments[0];
$subcommand = ''; $subcommand = '';
} }
$this->arguments = $this->parseArguments(arguments: $arguments);
match ($command) { match ($command) {
'check' => $this->handleChecks(subcommand: $subcommand), 'check' => $this->handleChecks(subcommand: $subcommand),
'panels' => $this->handlePanels(subcommand: $subcommand), 'panels' => $this->handlePanels(subcommand: $subcommand),
@ -215,7 +217,7 @@ class CLIController
function handleCheckSetup(): void function handleCheckSetup(): void
{ {
if ($this->argumentsCount < 2) { if (count($this->arguments) < 2) {
echo 'You need to supply a username.' . PHP_EOL; echo 'You need to supply a username.' . PHP_EOL;
exit(1); exit(1);
} }
@ -482,8 +484,7 @@ class CLIController
break; break;
case 404: case 404:
echo COLOR_RED . ' ' . $result['header'] . COLOR_DEFAULT; echo COLOR_RED . ' ' . $result['header'] . COLOR_DEFAULT;
$arguments = $this->parseArguments(); if (!empty($this->arguments['fix']) && $this->arguments['fix'] == 'yes') {
if (!empty($arguments['fix']) && $arguments['fix'] == 'yes') {
echo ' trying to fix …'; echo ' trying to fix …';
$body = [ $body = [
'name' => $domainName, 'name' => $domainName,
@ -525,22 +526,26 @@ class CLIController
} }
/** /**
* @param array $arguments
* @return array * @return array
*/ */
public function parseArguments(): array public function parseArguments(array $arguments): array
{ {
$this->logger->debug(message: "parseArguments()"); $this->logger->debug(message: "parseArguments()");
$arguments = []; $parsedArguments = [];
foreach ($this->arguments as $argument) { $parseCount = 0;
foreach ($arguments as $argument) {
if (str_contains(haystack: $argument, needle: '=')) { if (str_contains(haystack: $argument, needle: '=')) {
[$key, $value] = explode(separator: '=', string: $argument); [$key, $value] = explode(separator: '=', string: $argument);
$arguments[strtolower(string: $key)] = $value; $parsedArguments[strtolower(string: $key)] = $value;
$parsedArguments[$parseCount++] = $value;
} else { } else {
$arguments[strtolower(string: $argument)] = $argument; $parsedArguments[strtolower(string: $argument)] = $argument;
$parsedArguments[$parseCount++] = $argument;
} }
} }
return $arguments; return $parsedArguments;
} }
/** /**
@ -583,16 +588,14 @@ class CLIController
exit(1); exit(1);
} }
$arguments = $this->parseArguments(); $a = $this->arguments['a'] ?? '';
$aaaa = $this->arguments['aaaa'] ?? '';
$a = $arguments['a'] ?? '';
$aaaa = $arguments['aaaa'] ?? '';
if (empty($a) && empty($aaaa)) { if (empty($a) && empty($aaaa)) {
echo 'At least one IP address is required.' . PHP_EOL; echo 'At least one IP address is required.' . PHP_EOL;
exit(0); exit(0);
} }
$apikey = $arguments['apikey'] ?? ''; $apikey = $this->arguments['apikey'] ?? '';
$self = intval(value: $arguments['self'] ?? 0); $self = intval(value: $this->arguments['self'] ?? 0);
if ($this->panelRepository->findByName(name: $name)) { if ($this->panelRepository->findByName(name: $name)) {
@ -649,15 +652,14 @@ class CLIController
{ {
$this->logger->debug(message: "handlePanelsUpdate()"); $this->logger->debug(message: "handlePanelsUpdate()");
$arguments = $this->parseArguments();
$id = intval(value: $this->arguments[1] ?? 0); $id = intval(value: $this->arguments[1] ?? 0);
$name = $arguments['name'] ?? ''; $name = $this->arguments['name'] ?? '';
$a = $arguments['a'] ?? ''; $a = $this->arguments['a'] ?? '';
$aaaa = $arguments['aaaa'] ?? ''; $aaaa = $this->arguments['aaaa'] ?? '';
$apikey = $arguments['apikey'] ?? ''; $apikey = $this->arguments['apikey'] ?? '';
$self = intval(value: $arguments['self'] ?? 0); $self = intval(value: $this->arguments['self'] ?? 0);
// a workaround for 0 being equal to false …
if ($self == 0) { if ($self == 0) {
$self = -1; $self = -1;
} }
@ -865,8 +867,7 @@ class CLIController
*/ */
function handleApikeysCreate(): void function handleApikeysCreate(): void
{ {
$arguments = $this->parseArguments(); $name = $this->arguments['name'] ?? '';
$name = $arguments['name'] ?? '';
$result = $this->apikeyRepository->create(name: $name); $result = $this->apikeyRepository->create(name: $name);
echo 'API key ' . COLOR_YELLOW . $result['row'] . COLOR_DEFAULT . ' has been generated. Store it in a save place, it cannot be recovered.' . PHP_EOL; echo 'API key ' . COLOR_YELLOW . $result['row'] . COLOR_DEFAULT . ' has been generated. Store it in a save place, it cannot be recovered.' . PHP_EOL;
@ -904,10 +905,10 @@ class CLIController
*/ */
function handleApikeysUpdate(): void function handleApikeysUpdate(): void
{ {
$arguments = $this->parseArguments();
// TODO check for use of id instead of number, mind for all occurences
$id = $this->arguments[1] ?? 0; $id = $this->arguments[1] ?? 0;
$name = $arguments['name'] ?? ''; $name = $this->arguments['name'] ?? '';
if ($id == 0) { if ($id == 0) {
echo 'An ID is required' . PHP_EOL; echo 'An ID is required' . PHP_EOL;
@ -1021,7 +1022,7 @@ class CLIController
*/ */
function handleDynDnsCreate(): void function handleDynDnsCreate(): void
{ {
$name = $this->arguments[1] ?? ""; $name = $this->arguments[1] ?? '';
if (empty($name)) { if (empty($name)) {
echo 'You need to supply the FQDN (hostname).' . PHP_EOL; echo 'You need to supply the FQDN (hostname).' . PHP_EOL;
exit(1); exit(1);
@ -1035,9 +1036,11 @@ class CLIController
exit(1); exit(1);
} }
// TODO remove $password = $this->arguments[2] ?? '';
echo 'fqdn: ' . $name;
var_dump($this->arguments);
die();
$domainParts = explode(separator: '.', string: $name); $domainParts = explode(separator: '.', string: $name);
$reversedParts = array_reverse(array: $domainParts); $reversedParts = array_reverse(array: $domainParts);
$testDomain = ''; $testDomain = '';
@ -1060,12 +1063,25 @@ class CLIController
} }
if ($this->configController->getConfig(configKey: 'verbose')) { if ($this->configController->getConfig(configKey: 'verbose')) {
echo "Found domain: " . $foundDomain . PHP_EOL; echo "Found domain: " . COLOR_YELLOW . $foundDomain . COLOR_DEFAULT . PHP_EOL;
} }
// get host // get host
// inset in db if ($this->dynDNSRepository->findByName(name: $name)) {
if ($this->configController->getConfig(configKey: 'verbose')) {
echo "DynDNS host " . COLOR_YELLOW . $name . COLOR_DEFAULT . "already exists.". PHP_EOL;
exit(0);
}
} else {
if ($this->configController->getConfig(configKey: 'verbose')) {
echo "DynDNS host " . COLOR_YELLOW . $name . COLOR_DEFAULT . "will be created.". PHP_EOL;
// insert in db
$dyndnsHost = new DynDNS();
$dyndnsHost->setName($name);
}
}
// check on NS // check on NS
// => add if missing // => add if missing