diff options
-rw-r--r-- | index.php | 1 | ||||
-rw-r--r-- | src/Command/RunCommand.php | 17 | ||||
-rw-r--r-- | src/Module/AptModule.php | 48 | ||||
-rw-r--r-- | src/Module/ModuleInterface.php | 6 | ||||
-rw-r--r-- | src/Module/Modules/AptModule.php | 54 | ||||
-rw-r--r-- | src/Task.php | 22 |
6 files changed, 81 insertions, 67 deletions
@@ -1,4 +1,3 @@ -#!/usr/bin/env php <?php require __DIR__ . '/vendor/autoload.php'; diff --git a/src/Command/RunCommand.php b/src/Command/RunCommand.php index 048e94c..145b2d5 100644 --- a/src/Command/RunCommand.php +++ b/src/Command/RunCommand.php @@ -7,6 +7,7 @@ use phpseclib3\Crypt\PublicKeyLoader; use phpseclib3\Net\SSH2; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class RunCommand extends Command @@ -14,12 +15,13 @@ class RunCommand extends Command protected static $defaultName = 'run'; protected function configure() - {} + { + $this->addOption('config', 'c', InputOption::VALUE_REQUIRED, 'Path to config file', getcwd() . '/config.php'); + } - protected function execute(InputInterface $input, OutputInterface $output) + protected function execute(InputInterface $input, OutputInterface $output): int { - $cwd = getcwd(); - $config = include $cwd . '/config.php'; + $config = include $input->getOption('config'); global $ssh; $ssh = new SSH2($config['host']); @@ -28,17 +30,18 @@ class RunCommand extends Command } $commands = []; - foreach ($config['tasks'] as $task) { + foreach ($config['tasks'] as $taskName => $task) { /**@var Task $task*/ if (! $task->module->checkState()) { - $output->writeln('Adding commands from ' . get_class($task->module)); + $output->writeln($taskName . ': Adding commands from ' . get_class($task->module)); array_push($commands, ...$task->module->getCommands()); } else { - $output->writeln('Skipping commands from ' . get_class($task->module)); + $output->writeln($taskName . ': Skipping commands from ' . get_class($task->module)); } } + // run commands in single exec call $ssh->exec(implode(PHP_EOL, $commands)); return Command::SUCCESS; diff --git a/src/Module/AptModule.php b/src/Module/AptModule.php deleted file mode 100644 index ff4cb95..0000000 --- a/src/Module/AptModule.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php - -namespace PHPIAC\Module; - -use phpseclib3\Net\SSH2; - -class AptModule implements ModuleInterface -{ - public function __construct( - private string $package, - private string $state = State::PRESENT - ) {} - - public function checkState(): bool - { - global $ssh; - /**@var SSH2 $ssh*/ - $ssh->enablePTY(); - $ssh->exec("which $this->package"); - - if ($this->state === State::PRESENT) { - $state = ! empty($ssh->read()); - } - else if ($this->state === State::ABSENT) { - $state = empty($ssh->read()); - } - - $ssh->disablePTY(); - - return $state; - } - - public function getCommands(): array - { - if ($this->state === State::PRESENT) { - return [ - "sudo apt install -y $this->package", - ]; - } - else if ($this->state === State::ABSENT) { - return [ - "sudo apt remove -y $this->package", - ]; - } - - return []; - } -} diff --git a/src/Module/ModuleInterface.php b/src/Module/ModuleInterface.php index 2963b5f..649a095 100644 --- a/src/Module/ModuleInterface.php +++ b/src/Module/ModuleInterface.php @@ -4,7 +4,13 @@ namespace PHPIAC\Module; interface ModuleInterface { + /** + * @return bool + */ public function checkState(): bool; + /** + * @return array + */ public function getCommands(): array; } diff --git a/src/Module/Modules/AptModule.php b/src/Module/Modules/AptModule.php new file mode 100644 index 0000000..ccf4892 --- /dev/null +++ b/src/Module/Modules/AptModule.php @@ -0,0 +1,54 @@ +<?php + +namespace PHPIAC\Module\Modules; + +use PHPIAC\Module\ModuleInterface; +use PHPIAC\Module\State; +use phpseclib3\Net\SSH2; + +class AptModule implements ModuleInterface +{ + /** + * AptModule constructor. + * + * @param string $package + * @param string $state + */ + public function __construct( + private string $package, + private string $state = State::PRESENT + ) {} + + /** + * @inheritDoc + */ + public function checkState(): bool + { + global $ssh; + /**@var SSH2 $ssh*/ + $ssh->enablePTY(); + + $ssh->exec("dpkg -l $this->package | grep 'ii'"); + $dpkg = $ssh->read(); + + $state = match ($this->state) { + State::PRESENT => str_starts_with($dpkg, 'ii'), + State::ABSENT => str_contains($dpkg, 'no packages found'), + }; + + $ssh->disablePTY(); + + return $state; + } + + /** + * @inheritDoc + */ + public function getCommands(): array + { + return match ($this->state) { + State::PRESENT => ["sudo apt install -y $this->package"], + State::ABSENT => ["sudo apt remove -y $this->package"], + }; + } +} diff --git a/src/Task.php b/src/Task.php index 598f55c..a5698ea 100644 --- a/src/Task.php +++ b/src/Task.php @@ -6,22 +6,22 @@ use PHPIAC\Module\ModuleInterface; class Task { - public function __construct( - public ModuleInterface $module, - public array $vars, - ) {} + public ModuleInterface $module; + /** + * Task constructor. + */ + public function __construct() {} + + /** + * @param ModuleInterface $module + * + * @return $this + */ public function setModule(ModuleInterface $module): self { $this->module = $module; return $this; } - - public function setVars(array $vars): self - { - $this->vars = $vars; - - return $this; - } } |