icingaweb2-module-director/application/clicommands/SyncruleCommand.php

131 lines
3.6 KiB
PHP

<?php
namespace Icinga\Module\Director\Clicommands;
use Icinga\Module\Director\Cli\Command;
use Icinga\Module\Director\Objects\SyncRule;
/**
* Deal with Director Sync Rules
*
* Use this command to check or trigger your defined Sync Rules
*/
class SyncruleCommand extends Command
{
/**
* List defined Sync Rules
*
* This shows a table with your defined Sync Rules, their IDs and
* current state. As triggering a Sync requires an ID, this is where
* you can look up the desired ID.
*
* USAGE
*
* icingacli director syncrule list
*/
public function listAction()
{
$rules = SyncRule::loadAll($this->db());
if (empty($rules)) {
echo "No Sync Rule has been defined\n";
return;
}
printf("%4s | %s\n", 'ID', 'Sync Rule name');
printf("-----+%s\n", str_repeat('-', 64));
foreach ($rules as $rule) {
$state = $rule->get('sync_state');
printf("%4d | %s\n", $rule->get('id'), $rule->get('rule_name'));
printf(" | -> %s%s\n", $state, $state === 'failing' ? ': ' . $rule->get('last_error_message') : '');
}
}
/**
* Check a given Sync Rule for changes
*
* This command runs a complete Sync in memory but doesn't persist eventual changes.
*
* USAGE
*
* icingacli director syncrule check --id <id>
*
* OPTIONS
*
* --id <id> A Sync Rule ID. Use the list command to figure out
* --benchmark Show timing and memory usage details
*/
public function checkAction()
{
$rule = $this->getSyncRule();
$rule->checkForChanges();
$this->showSyncStateDetails($rule);
}
/**
* Trigger a Sync Run for a given Sync Rule
*
* This command builds new objects according your Sync Rule, compares them
* with existing ones and persists eventual changes.
*
* USAGE
*
* icingacli director syncrule run --id <id>
*
* OPTIONS
*
* --id <id> A Sync Rule ID. Use the list command to figure out
* --benchmark Show timing and memory usage details
*/
public function runAction()
{
$rule = $this->getSyncRule();
if ($rule->applyChanges()) {
print "New data has been imported\n";
$this->showSyncStateDetails($rule);
} else {
print "Nothing has been changed, imported data is still up to date\n";
}
}
/**
* @return SyncRule
*/
protected function getSyncRule()
{
return SyncRule::load($this->params->getRequired('id'), $this->db());
}
/**
* @param SyncRule $rule
* @throws \Icinga\Exception\IcingaException
*/
protected function showSyncStateDetails(SyncRule $rule)
{
echo $this->getSyncStateDescription($rule) . "\n";
}
/**
* @param SyncRule $rule
* @return string
* @throws \Icinga\Exception\IcingaException
*/
protected function getSyncStateDescription(SyncRule $rule)
{
switch ($rule->get('sync_state')) {
case 'unknown':
return "It's currently unknown whether we are in sync with this rule."
. ' You should either check for changes or trigger a new Sync Run.';
case 'in-sync':
return 'This Sync Rule is in sync';
case 'pending-changes':
return 'There are pending changes for this Sync Rule. You should'
. ' trigger a new Sync Run.';
case 'failing':
return 'This Sync Rule failed: '. $rule->get('last_error_message');
}
}
}