summaryrefslogtreecommitdiffstats
path: root/application
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--application/clicommands/BasketCommand.php127
-rw-r--r--application/clicommands/BenchmarkCommand.php152
-rw-r--r--application/clicommands/CommandCommand.php15
-rw-r--r--application/clicommands/CommandsCommand.php14
-rw-r--r--application/clicommands/ConfigCommand.php178
-rw-r--r--application/clicommands/CoreCommand.php16
-rw-r--r--application/clicommands/DaemonCommand.php26
-rw-r--r--application/clicommands/DependencyCommand.php15
-rw-r--r--application/clicommands/EndpointCommand.php19
-rw-r--r--application/clicommands/ExportCommand.php180
-rw-r--r--application/clicommands/HealthCommand.php80
-rw-r--r--application/clicommands/HostCommand.php15
-rw-r--r--application/clicommands/HostgroupCommand.php15
-rw-r--r--application/clicommands/HostgroupsCommand.php14
-rw-r--r--application/clicommands/HostsCommand.php14
-rw-r--r--application/clicommands/HousekeepingCommand.php74
-rw-r--r--application/clicommands/ImportCommand.php62
-rw-r--r--application/clicommands/ImportsourceCommand.php168
-rw-r--r--application/clicommands/JobsCommand.php74
-rw-r--r--application/clicommands/KickstartCommand.php88
-rw-r--r--application/clicommands/MigrationCommand.php66
-rw-r--r--application/clicommands/NotificationCommand.php15
-rw-r--r--application/clicommands/ServiceCommand.php92
-rw-r--r--application/clicommands/ServicegroupCommand.php15
-rw-r--r--application/clicommands/ServicesetCommand.php14
-rw-r--r--application/clicommands/ServicesetsCommand.php15
-rw-r--r--application/clicommands/SyncruleCommand.php195
-rw-r--r--application/clicommands/TimeperiodCommand.php15
-rw-r--r--application/clicommands/UserCommand.php15
-rw-r--r--application/clicommands/UsergroupCommand.php15
-rw-r--r--application/clicommands/ZoneCommand.php15
-rw-r--r--application/controllers/ApiuserController.php9
-rw-r--r--application/controllers/ApiusersController.php9
-rw-r--r--application/controllers/BasketController.php416
-rw-r--r--application/controllers/BasketsController.php53
-rw-r--r--application/controllers/BranchController.php138
-rw-r--r--application/controllers/CommandController.php126
-rw-r--r--application/controllers/CommandsController.php20
-rw-r--r--application/controllers/CommandtemplateController.php16
-rw-r--r--application/controllers/ConfigController.php539
-rw-r--r--application/controllers/CustomvarController.php17
-rw-r--r--application/controllers/DaemonController.php64
-rw-r--r--application/controllers/DashboardController.php78
-rw-r--r--application/controllers/DataController.php406
-rw-r--r--application/controllers/DatafieldController.php40
-rw-r--r--application/controllers/DatafieldcategoryController.php46
-rw-r--r--application/controllers/DependenciesController.php15
-rw-r--r--application/controllers/DependencyController.php63
-rw-r--r--application/controllers/DependencytemplateController.php16
-rw-r--r--application/controllers/DeploymentController.php28
-rw-r--r--application/controllers/EndpointController.php9
-rw-r--r--application/controllers/EndpointsController.php9
-rw-r--r--application/controllers/HealthController.php31
-rw-r--r--application/controllers/HostController.php637
-rw-r--r--application/controllers/HostgroupController.php9
-rw-r--r--application/controllers/HostgroupsController.php9
-rw-r--r--application/controllers/HostsController.php138
-rw-r--r--application/controllers/HosttemplateController.php16
-rw-r--r--application/controllers/ImportrunController.php24
-rw-r--r--application/controllers/ImportsourceController.php375
-rw-r--r--application/controllers/ImportsourcesController.php57
-rw-r--r--application/controllers/IndexController.php79
-rw-r--r--application/controllers/InspectController.php200
-rw-r--r--application/controllers/JobController.php117
-rw-r--r--application/controllers/JobsController.php20
-rw-r--r--application/controllers/KickstartController.php30
-rw-r--r--application/controllers/NotificationController.php85
-rw-r--r--application/controllers/NotificationsController.php31
-rw-r--r--application/controllers/NotificationtemplateController.php16
-rw-r--r--application/controllers/PhperrorController.php43
-rw-r--r--application/controllers/ScheduledDowntimeController.php45
-rw-r--r--application/controllers/ScheduledDowntimesController.php47
-rw-r--r--application/controllers/SchemaController.php113
-rw-r--r--application/controllers/SelfServiceController.php435
-rw-r--r--application/controllers/ServiceController.php311
-rw-r--r--application/controllers/ServiceapplyrulesController.php39
-rw-r--r--application/controllers/ServicegroupController.php9
-rw-r--r--application/controllers/ServicegroupsController.php9
-rw-r--r--application/controllers/ServicesController.php42
-rw-r--r--application/controllers/ServicesetController.php141
-rw-r--r--application/controllers/ServicetemplateController.php16
-rw-r--r--application/controllers/SettingsController.php48
-rw-r--r--application/controllers/SuggestController.php415
-rw-r--r--application/controllers/SyncruleController.php696
-rw-r--r--application/controllers/SyncrulesController.php45
-rw-r--r--application/controllers/TemplatechoiceController.php41
-rw-r--r--application/controllers/TemplatechoicesController.php39
-rw-r--r--application/controllers/TimeperiodController.php33
-rw-r--r--application/controllers/TimeperiodsController.php9
-rw-r--r--application/controllers/TimeperiodtemplateController.php16
-rw-r--r--application/controllers/UserController.php18
-rw-r--r--application/controllers/UsergroupController.php9
-rw-r--r--application/controllers/UsergroupsController.php9
-rw-r--r--application/controllers/UsersController.php13
-rw-r--r--application/controllers/UsertemplateController.php16
-rw-r--r--application/controllers/ZoneController.php9
-rw-r--r--application/controllers/ZonesController.php9
-rw-r--r--application/forms/AddToBasketForm.php129
-rw-r--r--application/forms/ApplyMigrationsForm.php54
-rw-r--r--application/forms/BasketCreateSnapshotForm.php37
-rw-r--r--application/forms/BasketForm.php147
-rw-r--r--application/forms/BasketUploadForm.php147
-rw-r--r--application/forms/CustomvarForm.php26
-rw-r--r--application/forms/DeployConfigForm.php121
-rw-r--r--application/forms/DeployFormsBug7530.php126
-rw-r--r--application/forms/DeploymentLinkForm.php170
-rw-r--r--application/forms/DirectorDatafieldCategoryForm.php36
-rw-r--r--application/forms/DirectorDatafieldForm.php301
-rw-r--r--application/forms/DirectorDatalistEntryForm.php80
-rw-r--r--application/forms/DirectorDatalistForm.php45
-rw-r--r--application/forms/DirectorJobForm.php141
-rw-r--r--application/forms/IcingaAddServiceForm.php183
-rw-r--r--application/forms/IcingaAddServiceSetForm.php123
-rw-r--r--application/forms/IcingaApiUserForm.php25
-rw-r--r--application/forms/IcingaCloneObjectForm.php259
-rw-r--r--application/forms/IcingaCommandArgumentForm.php190
-rw-r--r--application/forms/IcingaCommandForm.php137
-rw-r--r--application/forms/IcingaDeleteObjectForm.php41
-rw-r--r--application/forms/IcingaDependencyForm.php309
-rw-r--r--application/forms/IcingaEndpointForm.php61
-rw-r--r--application/forms/IcingaForgetApiKeyForm.php34
-rw-r--r--application/forms/IcingaGenerateApiKeyForm.php42
-rw-r--r--application/forms/IcingaHostForm.php390
-rw-r--r--application/forms/IcingaHostGroupForm.php40
-rw-r--r--application/forms/IcingaHostSelfServiceForm.php156
-rw-r--r--application/forms/IcingaHostVarForm.php36
-rw-r--r--application/forms/IcingaImportObjectForm.php54
-rw-r--r--application/forms/IcingaMultiEditForm.php324
-rw-r--r--application/forms/IcingaNotificationForm.php298
-rw-r--r--application/forms/IcingaObjectFieldForm.php219
-rw-r--r--application/forms/IcingaScheduledDowntimeForm.php133
-rw-r--r--application/forms/IcingaScheduledDowntimeRangeForm.php110
-rw-r--r--application/forms/IcingaServiceDictionaryMemberForm.php54
-rw-r--r--application/forms/IcingaServiceForm.php806
-rw-r--r--application/forms/IcingaServiceGroupForm.php40
-rw-r--r--application/forms/IcingaServiceSetForm.php135
-rw-r--r--application/forms/IcingaServiceVarForm.php36
-rw-r--r--application/forms/IcingaTemplateChoiceForm.php140
-rw-r--r--application/forms/IcingaTimePeriodForm.php82
-rw-r--r--application/forms/IcingaTimePeriodRangeForm.php105
-rw-r--r--application/forms/IcingaUserForm.php214
-rw-r--r--application/forms/IcingaUserGroupForm.php47
-rw-r--r--application/forms/IcingaZoneForm.php43
-rw-r--r--application/forms/ImportCheckForm.php50
-rw-r--r--application/forms/ImportRowModifierForm.php182
-rw-r--r--application/forms/ImportRunForm.php50
-rw-r--r--application/forms/ImportSourceForm.php163
-rw-r--r--application/forms/KickstartForm.php482
-rw-r--r--application/forms/RemoveLinkForm.php59
-rw-r--r--application/forms/RestoreBasketForm.php77
-rw-r--r--application/forms/RestoreObjectForm.php92
-rw-r--r--application/forms/SelfServiceSettingsForm.php306
-rw-r--r--application/forms/SettingsForm.php238
-rw-r--r--application/forms/SyncCheckForm.php69
-rw-r--r--application/forms/SyncPropertyForm.php444
-rw-r--r--application/forms/SyncRuleForm.php112
-rw-r--r--application/forms/SyncRunForm.php67
-rw-r--r--application/locale/de_DE/LC_MESSAGES/director.mobin0 -> 170714 bytes
-rw-r--r--application/locale/de_DE/LC_MESSAGES/director.po8230
-rw-r--r--application/locale/it_IT/LC_MESSAGES/director.mobin0 -> 148601 bytes
-rw-r--r--application/locale/it_IT/LC_MESSAGES/director.po7431
-rw-r--r--application/locale/ja_JP/LC_MESSAGES/director.mobin0 -> 154051 bytes
-rw-r--r--application/locale/ja_JP/LC_MESSAGES/director.po6186
-rw-r--r--application/locale/translateMe.php12
-rw-r--r--application/views/helpers/FormDataFilter.php564
-rw-r--r--application/views/helpers/FormIplExtensibleSet.php23
-rw-r--r--application/views/helpers/FormSimpleNote.php15
-rw-r--r--application/views/helpers/FormStoredPassword.php60
-rw-r--r--application/views/helpers/RenderPlainObject.php14
-rw-r--r--application/views/scripts/phperror/dependencies.phtml9
-rw-r--r--application/views/scripts/phperror/error.phtml8
-rw-r--r--application/views/scripts/settings/index.phtml7
-rw-r--r--application/views/scripts/suggest/index.phtml3
173 files changed, 39863 insertions, 0 deletions
diff --git a/application/clicommands/BasketCommand.php b/application/clicommands/BasketCommand.php
new file mode 100644
index 0000000..dd2434f
--- /dev/null
+++ b/application/clicommands/BasketCommand.php
@@ -0,0 +1,127 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Date\DateFormatter;
+use Icinga\Module\Director\Cli\Command;
+use Icinga\Module\Director\Core\Json;
+use Icinga\Module\Director\DirectorObject\Automation\Basket;
+use Icinga\Module\Director\DirectorObject\Automation\BasketSnapshot;
+use Icinga\Module\Director\DirectorObject\ObjectPurgeHelper;
+
+/**
+ * Export Director Config Objects
+ */
+class BasketCommand extends Command
+{
+ /**
+ * List configured Baskets
+ *
+ * USAGE
+ *
+ * icingacli director basket list
+ *
+ * OPTIONS
+ */
+ public function listAction()
+ {
+ $db = $this->db()->getDbAdapter();
+ $query = $db->select()
+ ->from('director_basket', 'basket_name')
+ ->order('basket_name');
+ foreach ($db->fetchCol($query) as $name) {
+ echo "$name\n";
+ }
+ }
+
+ /**
+ * JSON-dump for objects related to the given Basket
+ *
+ * USAGE
+ *
+ * icingacli director basket dump --name <basket>
+ *
+ * OPTIONS
+ */
+ public function dumpAction()
+ {
+ $basket = $this->requireBasket();
+ $snapshot = BasketSnapshot::createForBasket($basket, $this->db());
+ echo $snapshot->getJsonDump() . "\n";
+ }
+
+ /**
+ * Take a snapshot for the given Basket
+ *
+ * USAGE
+ *
+ * icingacli director basket snapshot --name <basket>
+ *
+ * OPTIONS
+ */
+ public function snapshotAction()
+ {
+ $basket = $this->requireBasket();
+ $snapshot = BasketSnapshot::createForBasket($basket, $this->db());
+ $snapshot->store();
+ $hexSum = bin2hex($snapshot->get('content_checksum'));
+ printf(
+ "Snapshot '%s' taken for Basket '%s' at %s\n",
+ substr($hexSum, 0, 7),
+ $basket->get('basket_name'),
+ DateFormatter::formatDateTime($snapshot->get('ts_create') / 1000)
+ );
+ }
+
+ /**
+ * Restore a Basket from JSON dump provided on STDIN
+ *
+ * USAGE
+ *
+ * icingacli director basket restore < basket-dump.json
+ *
+ * OPTIONS
+ * --purge <ObjectType>[,<ObjectType] Purge objects of the
+ * Given types. WARNING: this removes ALL objects that are
+ * not shipped with the given basket
+ * --force Purge refuses to purge Objects in case there are
+ * no Objects of a given ObjectType in the provided basket
+ * unless forced to do so
+ */
+ public function restoreAction()
+ {
+ if ($purge = $this->params->get('purge')) {
+ $purge = explode(',', $purge);
+ ObjectPurgeHelper::assertObjectTypesAreEligibleForPurge($purge);
+ }
+ $json = file_get_contents('php://stdin');
+ BasketSnapshot::restoreJson($json, $this->db());
+ if ($purge) {
+ $this->purgeObjectTypes(Json::decode($json), $purge, $this->params->get('force'));
+ }
+ echo "Objects from Basket Snapshot have been restored\n";
+ }
+
+ protected function purgeObjectTypes($objects, array $types, $force = false)
+ {
+ $helper = new ObjectPurgeHelper($this->db());
+ if ($force) {
+ $helper->force();
+ }
+ foreach ($types as $type) {
+ list($className, $typeFilter) = BasketSnapshot::getClassAndObjectTypeForType($type);
+ $helper->purge(
+ isset($objects->$type) ? (array) $objects->$type : [],
+ $className,
+ $typeFilter
+ );
+ }
+ }
+
+ /**
+ */
+ protected function requireBasket()
+ {
+ return Basket::load($this->params->getRequired('name'), $this->db());
+ }
+}
diff --git a/application/clicommands/BenchmarkCommand.php b/application/clicommands/BenchmarkCommand.php
new file mode 100644
index 0000000..6ccd8c8
--- /dev/null
+++ b/application/clicommands/BenchmarkCommand.php
@@ -0,0 +1,152 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Application\Benchmark;
+use Icinga\Data\Filter\Filter;
+use Icinga\Data\Filter\FilterChain;
+use Icinga\Data\Filter\FilterExpression;
+use Icinga\Module\Director\Cli\Command;
+use Icinga\Module\Director\CustomVariable\CustomVariable;
+use Icinga\Module\Director\Data\Db\IcingaObjectFilterRenderer;
+use Icinga\Module\Director\Data\Db\IcingaObjectQuery;
+use Icinga\Module\Director\Objects\HostGroupMembershipResolver;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Objects\IcingaHostVar;
+use Icinga\Module\Director\Objects\IcingaVar;
+
+class BenchmarkCommand extends Command
+{
+ public function testflatfilterAction()
+ {
+ $q = new IcingaObjectQuery('host', $this->db());
+ $filter = Filter::fromQueryString(
+ // 'host.vars.snmp_community="*ub*"&(host.vars.location="London"|host.vars.location="Berlin")'
+ // 'host.vars.snmp_community="*ub*"&(host.vars.location="FRA DC"|host.vars.location="NBG DC")'
+ 'host.vars.priority="*igh"&(host.vars.location="FRA DC"|host.vars.location="NBG DC")'
+ );
+ IcingaObjectFilterRenderer::apply($filter, $q);
+ echo $q->getSql() . "\n";
+
+ print_r($q->listNames());
+ }
+
+ public function rerendervarsAction()
+ {
+ $conn = $this->db();
+ $db = $conn->getDbAdapter();
+ $db->beginTransaction();
+ $query = $db->select()->from(
+ array('v' => 'icinga_var'),
+ array(
+ 'v.varname',
+ 'v.varvalue',
+ 'v.checksum',
+ 'v.rendered_checksum',
+ 'v.rendered',
+ 'format' => "('json')",
+ )
+ );
+ Benchmark::measure('Ready to fetch all vars');
+ $rows = $db->fetchAll($query);
+ Benchmark::measure('Got vars, storing flat');
+ foreach ($rows as $row) {
+ $var = CustomVariable::fromDbRow($row);
+ $rendered = $var->render();
+ $checksum = sha1($rendered, true);
+ if ($checksum === $row->rendered_checksum) {
+ continue;
+ }
+
+ $where = $db->quoteInto('checksum = ?', $row->checksum);
+ $db->update(
+ 'icinga_var',
+ array(
+ 'rendered' => $rendered,
+ 'rendered_checksum' => $checksum
+ ),
+ $where
+ );
+ }
+
+ $db->commit();
+ }
+
+ public function flattenvarsAction()
+ {
+ $conn = $this->db();
+ $db = $conn->getDbAdapter();
+ $db->beginTransaction();
+ $query = $db->select()->from(['v' => 'icinga_host_var'], [
+ 'v.host_id',
+ 'v.varname',
+ 'v.varvalue',
+ 'v.format',
+ 'v.checksum'
+ ]);
+ Benchmark::measure('Ready to fetch all vars');
+ $rows = $db->fetchAll($query);
+ Benchmark::measure('Got vars, storing flat');
+
+ foreach ($rows as $row) {
+ $var = CustomVariable::fromDbRow($row);
+ $checksum = $var->checksum();
+ if (! IcingaVar::exists($checksum, $conn)) {
+ IcingaVar::generateForCustomVar($var, $conn);
+ }
+
+ if ($row->checksum === null) {
+ $where = $db->quoteInto('host_id = ?', $row->host_id)
+ . $db->quoteInto(' AND varname = ?', $row->varname);
+ $db->update('icinga_host_var', ['checksum' => $checksum], $where);
+ }
+ }
+
+ $db->commit();
+ }
+
+ public function resolvehostgroupsAction()
+ {
+ $resolver = new HostGroupMembershipResolver($this->db());
+ $resolver->refreshDb();
+ }
+
+ public function filterAction()
+ {
+ $flat = [];
+
+ /** @var FilterChain|FilterExpression $filter */
+ $filter = Filter::fromQueryString(
+ // 'object_name=*ic*2*&object_type=object'
+ 'vars.bpconfig=*'
+ );
+ Benchmark::measure('ready');
+ $objs = IcingaHost::loadAll($this->db());
+ Benchmark::measure('db done');
+
+ foreach ($objs as $host) {
+ $flat[$host->get('id')] = (object) [];
+ foreach ($host->getProperties() as $k => $v) {
+ $flat[$host->get('id')]->$k = $v;
+ }
+ }
+ Benchmark::measure('objects ready');
+
+ $vars = IcingaHostVar::loadAll($this->db());
+ Benchmark::measure('vars loaded');
+ foreach ($vars as $var) {
+ if (! array_key_exists($var->get('host_id'), $flat)) {
+ // Templates?
+ continue;
+ }
+ $flat[$var->get('host_id')]->{'vars.' . $var->get('varname')} = $var->get('varvalue');
+ }
+ Benchmark::measure('vars done');
+
+ foreach ($flat as $host) {
+ if ($filter->matches($host)) {
+ echo $host->object_name . "\n";
+ }
+ }
+ }
+}
diff --git a/application/clicommands/CommandCommand.php b/application/clicommands/CommandCommand.php
new file mode 100644
index 0000000..5c96442
--- /dev/null
+++ b/application/clicommands/CommandCommand.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\ObjectCommand;
+
+/**
+ * Manage Icinga Commands
+ *
+ * Use this command to show, create, modify or delete Icinga Command
+ * objects
+ */
+class CommandCommand extends ObjectCommand
+{
+}
diff --git a/application/clicommands/CommandsCommand.php b/application/clicommands/CommandsCommand.php
new file mode 100644
index 0000000..9a74337
--- /dev/null
+++ b/application/clicommands/CommandsCommand.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\ObjectsCommand;
+
+/**
+ * List Icinga Commands
+ *
+ * Use this command to list Icinga Command objects
+ */
+class CommandsCommand extends ObjectsCommand
+{
+}
diff --git a/application/clicommands/ConfigCommand.php b/application/clicommands/ConfigCommand.php
new file mode 100644
index 0000000..e313aa4
--- /dev/null
+++ b/application/clicommands/ConfigCommand.php
@@ -0,0 +1,178 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Application\Benchmark;
+use Icinga\Module\Director\Cli\Command;
+use Icinga\Module\Director\Core\Json;
+use Icinga\Module\Director\Deployment\ConditionalDeployment;
+use Icinga\Module\Director\Deployment\DeploymentGracePeriod;
+use Icinga\Module\Director\Deployment\DeploymentStatus;
+use Icinga\Module\Director\IcingaConfig\IcingaConfig;
+use Icinga\Module\Director\Import\SyncUtils;
+
+/**
+ * Generate, show and deploy Icinga 2 configuration
+ */
+class ConfigCommand extends Command
+{
+ /**
+ * Re-render the current configuration
+ */
+ public function renderAction()
+ {
+ $profile = $this->params->shift('profile');
+ if ($profile) {
+ $this->enableDbProfiler();
+ }
+
+ $config = new IcingaConfig($this->db());
+ Benchmark::measure('Rendering config');
+ if ($config->hasBeenModified()) {
+ Benchmark::measure('Config rendered, storing to db');
+ $config->store();
+ Benchmark::measure('All done');
+ $checksum = $config->getHexChecksum();
+ printf(
+ "New config with checksum %s has been generated\n",
+ $checksum
+ );
+ } else {
+ $checksum = $config->getHexChecksum();
+ printf(
+ "Config with checksum %s already exists\n",
+ $checksum
+ );
+ }
+
+ if ($profile) {
+ $this->dumpDbProfile();
+ }
+ }
+
+ protected function dumpDbProfile()
+ {
+ $profiler = $this->getDbProfiler();
+
+ $totalTime = $profiler->getTotalElapsedSecs();
+ $queryCount = $profiler->getTotalNumQueries();
+ $longestTime = 0;
+ $longestQuery = null;
+
+ /** @var \Zend_Db_Profiler_Query $query */
+ foreach ($profiler->getQueryProfiles() as $query) {
+ echo $query->getQuery() . "\n";
+ if ($query->getElapsedSecs() > $longestTime) {
+ $longestTime = $query->getElapsedSecs();
+ $longestQuery = $query->getQuery();
+ }
+ }
+
+ echo 'Executed ' . $queryCount . ' queries in ' . $totalTime . ' seconds' . "\n";
+ echo 'Average query length: ' . $totalTime / $queryCount . ' seconds' . "\n";
+ echo 'Queries per second: ' . $queryCount / $totalTime . "\n";
+ echo 'Longest query length: ' . $longestTime . "\n";
+ echo "Longest query: \n" . $longestQuery . "\n";
+ }
+
+ protected function getDbProfiler()
+ {
+ return $this->db()->getDbAdapter()->getProfiler();
+ }
+
+ protected function enableDbProfiler()
+ {
+ return $this->getDbProfiler()->setEnabled(true);
+ }
+
+ /**
+ * Deploy the current configuration
+ *
+ * USAGE
+ *
+ * icingacli director config deploy [--checksum <checksum>] [--force] [--wait <seconds>]
+ * [--grace-period <seconds>]
+ *
+ * OPTIONS
+ *
+ * --checksum <checksum> Optionally deploy a specific configuration
+ * --force Force a deployment, even when the configuration
+ * hasn't changed
+ * --wait <seconds> Optionally wait until Icinga completed it's
+ * restart
+ * --grace-period <seconds> Do not deploy if a deployment took place
+ * less than <seconds> ago
+ */
+ public function deployAction()
+ {
+ $db = $this->db();
+
+ $checksum = $this->params->get('checksum');
+ if ($checksum) {
+ $config = IcingaConfig::load(hex2bin($checksum), $db);
+ } else {
+ $config = IcingaConfig::generate($db);
+ $checksum = $config->getHexChecksum();
+ }
+
+ $deployer = new ConditionalDeployment($db, $this->api());
+ $deployer->force((bool) $this->params->get('force'));
+ if ($graceTime = $this->params->get('grace-period')) {
+ $deployer->setGracePeriod(new DeploymentGracePeriod((int) $graceTime, $db));
+ if ($this->params->get('force')) {
+ fwrite(STDERR, "WARNING: force overrides Grace period\n");
+ }
+ }
+ $deployer->refresh();
+
+ if ($deployment = $deployer->deploy($config)) {
+ if ($deployer->hasBeenForced()) {
+ echo $deployer->getNoDeploymentReason() . ", deploying anyway\n";
+ }
+ printf("Config '%s' has been deployed\n", $checksum);
+ } else {
+ echo $deployer->getNoDeploymentReason() . "\n";
+ return;
+ }
+
+ if ($timeout = $this->getWaitTime()) {
+ $deployed = $deployer->waitForStartupAfterDeploy($deployment, $timeout);
+ if ($deployed !== true) {
+ $this->fail("Waiting for Icinga restart failed '%s': %s\n", $checksum, $deployed);
+ }
+ }
+ }
+
+ /**
+ * Checks the deployments status
+ */
+ public function deploymentstatusAction()
+ {
+ $db = $this->db();
+ $api = $this->api();
+ $status = new DeploymentStatus($db, $api);
+ $result = $status->getDeploymentStatus($this->params->get('configs'), $this->params->get('activities'));
+ if ($key = $this->params->get('key')) {
+ $result = SyncUtils::getSpecificValue($result, $key);
+ }
+
+ if (is_string($result)) {
+ echo "$result\n";
+ } else {
+ echo Json::encode($result, JSON_PRETTY_PRINT) . "\n";
+ }
+ }
+
+ protected function getWaitTime()
+ {
+ if ($timeout = $this->params->get('wait')) {
+ if (!ctype_digit($timeout)) {
+ $this->fail("--wait must be the number of seconds to wait'");
+ }
+
+ return (int) $timeout;
+ }
+
+ return null;
+ }
+}
diff --git a/application/clicommands/CoreCommand.php b/application/clicommands/CoreCommand.php
new file mode 100644
index 0000000..4927aa5
--- /dev/null
+++ b/application/clicommands/CoreCommand.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\Command;
+use Icinga\Module\Director\PlainObjectRenderer;
+
+class CoreCommand extends Command
+{
+ public function constantsAction()
+ {
+ foreach ($this->api()->getConstants() as $name => $value) {
+ printf("const %s = %s\n", $name, PlainObjectRenderer::render($value));
+ }
+ }
+}
diff --git a/application/clicommands/DaemonCommand.php b/application/clicommands/DaemonCommand.php
new file mode 100644
index 0000000..e89e1da
--- /dev/null
+++ b/application/clicommands/DaemonCommand.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\Command;
+use Icinga\Module\Director\Daemon\BackgroundDaemon;
+
+class DaemonCommand extends Command
+{
+ /**
+ * Run the main Director daemon
+ *
+ * USAGE
+ *
+ * icingacli director daemon run [--db-resource <name>]
+ */
+ public function runAction()
+ {
+ $this->app->getModuleManager()->loadEnabledModules();
+ $daemon = new BackgroundDaemon();
+ if ($dbResource = $this->params->get('db-resource')) {
+ $daemon->setDbResourceName($dbResource);
+ }
+ $daemon->run();
+ }
+}
diff --git a/application/clicommands/DependencyCommand.php b/application/clicommands/DependencyCommand.php
new file mode 100644
index 0000000..ff5cbdc
--- /dev/null
+++ b/application/clicommands/DependencyCommand.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\ObjectCommand;
+
+/**
+ * Manage Icinga Dependencies
+ *
+ * Use this command to show, create, modify or delete Icinga Dependency
+ * objects
+ */
+class DependencyCommand extends ObjectCommand
+{
+}
diff --git a/application/clicommands/EndpointCommand.php b/application/clicommands/EndpointCommand.php
new file mode 100644
index 0000000..f61f4fc
--- /dev/null
+++ b/application/clicommands/EndpointCommand.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\ObjectCommand;
+
+/**
+ * Manage Icinga Endpoints
+ *
+ * Use this command to show, create, modify or delete Icinga Endpoint
+ * objects
+ */
+class EndpointCommand extends ObjectCommand
+{
+ public function statusAction()
+ {
+ print_r($this->api()->getStatus());
+ }
+}
diff --git a/application/clicommands/ExportCommand.php b/application/clicommands/ExportCommand.php
new file mode 100644
index 0000000..2b2119d
--- /dev/null
+++ b/application/clicommands/ExportCommand.php
@@ -0,0 +1,180 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\Command;
+use Icinga\Module\Director\DirectorObject\Automation\ImportExport;
+
+/**
+ * Export Director Config Objects
+ */
+class ExportCommand extends Command
+{
+ /**
+ * Export all ImportSource definitions
+ *
+ * USAGE
+ *
+ * icingacli director export importsources [options]
+ *
+ * OPTIONS
+ *
+ * --no-pretty JSON is pretty-printed per default
+ * Use this flag to enforce unformatted JSON
+ */
+ public function importsourcesAction()
+ {
+ $export = new ImportExport($this->db());
+ echo $this->renderJson(
+ $export->serializeAllImportSources(),
+ !$this->params->shift('no-pretty')
+ );
+ }
+
+ /**
+ * Export all SyncRule definitions
+ *
+ * USAGE
+ *
+ * icingacli director export syncrules [options]
+ *
+ * OPTIONS
+ *
+ * --no-pretty JSON is pretty-printed per default
+ * Use this flag to enforce unformatted JSON
+ */
+ public function syncrulesAction()
+ {
+ $export = new ImportExport($this->db());
+ echo $this->renderJson(
+ $export->serializeAllSyncRules(),
+ !$this->params->shift('no-pretty')
+ );
+ }
+
+ /**
+ * Export all Job definitions
+ *
+ * USAGE
+ *
+ * icingacli director export jobs [options]
+ *
+ * OPTIONS
+ *
+ * --no-pretty JSON is pretty-printed per default
+ * Use this flag to enforce unformatted JSON
+ */
+ public function jobsAction()
+ {
+ $export = new ImportExport($this->db());
+ echo $this->renderJson(
+ $export->serializeAllJobs(),
+ !$this->params->shift('no-pretty')
+ );
+ }
+
+ /**
+ * Export all DataField definitions
+ *
+ * USAGE
+ *
+ * icingacli director export datafields [options]
+ *
+ * OPTIONS
+ *
+ * --no-pretty JSON is pretty-printed per default
+ * Use this flag to enforce unformatted JSON
+ */
+ public function datafieldsAction()
+ {
+ $export = new ImportExport($this->db());
+ echo $this->renderJson(
+ $export->serializeAllDataFields(),
+ !$this->params->shift('no-pretty')
+ );
+ }
+
+ /**
+ * Export all DataList definitions
+ *
+ * USAGE
+ *
+ * icingacli director export datalists [options]
+ *
+ * OPTIONS
+ *
+ * --no-pretty JSON is pretty-printed per default
+ * Use this flag to enforce unformatted JSON
+ */
+ public function datalistsAction()
+ {
+ $export = new ImportExport($this->db());
+ echo $this->renderJson(
+ $export->serializeAllDataLists(),
+ !$this->params->shift('no-pretty')
+ );
+ }
+
+ // /**
+ // * Export all IcingaHostGroup definitions
+ // *
+ // * USAGE
+ // *
+ // * icingacli director export hostgroup [options]
+ // *
+ // * OPTIONS
+ // *
+ // * --no-pretty JSON is pretty-printed per default
+ // * Use this flag to enforce unformatted JSON
+ // */
+ // public function hostgroupAction()
+ // {
+ // $export = new ImportExport($this->db());
+ // echo $this->renderJson(
+ // $export->serializeAllHostGroups(),
+ // !$this->params->shift('no-pretty')
+ // );
+ // }
+ //
+ // /**
+ // * Export all IcingaServiceGroup definitions
+ // *
+ // * USAGE
+ // *
+ // * icingacli director export servicegroup [options]
+ // *
+ // * OPTIONS
+ // *
+ // * --no-pretty JSON is pretty-printed per default
+ // * Use this flag to enforce unformatted JSON
+ // */
+ // public function servicegroupAction()
+ // {
+ // $export = new ImportExport($this->db());
+ // echo $this->renderJson(
+ // $export->serializeAllServiceGroups(),
+ // !$this->params->shift('no-pretty')
+ // );
+ // }
+
+ /**
+ * Export all IcingaTemplateChoiceHost definitions
+ *
+ * USAGE
+ *
+ * icingacli director export hosttemplatechoices [options]
+ *
+ * OPTIONS
+ *
+ * --no-pretty JSON is pretty-printed per default
+ * Use this flag to enforce unformatted JSON
+ */
+ public function hosttemplatechoicesAction()
+ {
+ $export = new ImportExport($this->db());
+ echo $this->renderJson(
+ $export->serializeAllHostTemplateChoices(),
+ !$this->params->shift('no-pretty')
+ );
+ }
+}
diff --git a/application/clicommands/HealthCommand.php b/application/clicommands/HealthCommand.php
new file mode 100644
index 0000000..1635c50
--- /dev/null
+++ b/application/clicommands/HealthCommand.php
@@ -0,0 +1,80 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\CheckPlugin\PluginState;
+use Icinga\Module\Director\Cli\Command;
+use Icinga\Module\Director\Health;
+use Icinga\Module\Director\Cli\PluginOutputBeautifier;
+
+/**
+ * Check Icinga Director Health
+ *
+ * Use this command as a CheckPlugin to monitor your Icinga Director health
+ */
+class HealthCommand extends Command
+{
+ /**
+ * Run health checks
+ *
+ * Use this command to run all or a specific set of Health Checks.
+ *
+ * USAGE
+ *
+ * icingacli director health check [options]
+ *
+ * OPTIONS
+ *
+ * --check <name> Run only a specific set of checks
+ * valid names: config, sync, import, jobs, deployment
+ * --db <name> Use a specific Icinga Web DB resource
+ * --watch <seconds> Refresh every <second>. For interactive use only
+ */
+ public function checkAction()
+ {
+ $health = new Health();
+ if ($name = $this->params->get('db')) {
+ $health->setDbResourceName($name);
+ }
+
+ if ($name = $this->params->get('check')) {
+ $check = $health->getCheck($name);
+ echo PluginOutputBeautifier::beautify($check->getOutput(), $this->screen);
+
+ exit($check->getState()->getNumeric());
+ } else {
+ $state = new PluginState('OK');
+ $checks = $health->getAllChecks();
+
+ $output = [];
+ foreach ($checks as $check) {
+ $state->raise($check->getState());
+ $output[] = $check->getOutput();
+ }
+
+ if ($state->getNumeric() === 0) {
+ echo "Icinga Director: everything is fine\n\n";
+ } else {
+ echo "Icinga Director: there are problems\n\n";
+ }
+
+ $out = PluginOutputBeautifier::beautify(implode("\n", $output), $this->screen);
+ echo $out;
+
+ if (! $this->isBeingWatched()) {
+ exit($state->getNumeric());
+ }
+ }
+ }
+
+ /**
+ * Cli should provide this information, as it shifts the parameter
+ *
+ * @return bool
+ */
+ protected function isBeingWatched()
+ {
+ global $argv;
+ return in_array('--watch', $argv);
+ }
+}
diff --git a/application/clicommands/HostCommand.php b/application/clicommands/HostCommand.php
new file mode 100644
index 0000000..21ec5eb
--- /dev/null
+++ b/application/clicommands/HostCommand.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\ObjectCommand;
+
+/**
+ * Manage Icinga Hosts
+ *
+ * Use this command to show, create, modify or delete Icinga Host
+ * objects
+ */
+class HostCommand extends ObjectCommand
+{
+}
diff --git a/application/clicommands/HostgroupCommand.php b/application/clicommands/HostgroupCommand.php
new file mode 100644
index 0000000..88b17d9
--- /dev/null
+++ b/application/clicommands/HostgroupCommand.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\ObjectCommand;
+
+/**
+ * Manage Icinga Hostgroups
+ *
+ * Use this command to show, create, modify or delete Icinga Hostgroups
+ * objects
+ */
+class HostGroupCommand extends ObjectCommand
+{
+}
diff --git a/application/clicommands/HostgroupsCommand.php b/application/clicommands/HostgroupsCommand.php
new file mode 100644
index 0000000..1007a05
--- /dev/null
+++ b/application/clicommands/HostgroupsCommand.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\ObjectsCommand;
+
+/**
+ * Manage Icinga Hostgroups
+ *
+ * Use this command to list Icinga Hostgroup objects
+ */
+class HostgroupsCommand extends ObjectsCommand
+{
+}
diff --git a/application/clicommands/HostsCommand.php b/application/clicommands/HostsCommand.php
new file mode 100644
index 0000000..3008284
--- /dev/null
+++ b/application/clicommands/HostsCommand.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\ObjectsCommand;
+
+/**
+ * Manage Icinga Hosts
+ *
+ * Use this command to list Icinga Host objects
+ */
+class HostsCommand extends ObjectsCommand
+{
+}
diff --git a/application/clicommands/HousekeepingCommand.php b/application/clicommands/HousekeepingCommand.php
new file mode 100644
index 0000000..974e28d
--- /dev/null
+++ b/application/clicommands/HousekeepingCommand.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Exception\MissingParameterException;
+use Icinga\Module\Director\Cli\Command;
+use Icinga\Module\Director\Db\Housekeeping;
+use Icinga\Module\Director\Db\MembershipHousekeeping;
+
+class HousekeepingCommand extends Command
+{
+ protected $housekeeping;
+
+ public function tasksAction()
+ {
+ if ($pending = $this->params->shift('pending')) {
+ $tasks = $this->housekeeping()->getPendingTaskSummary();
+ } else {
+ $tasks = $this->housekeeping()->getTaskSummary();
+ }
+
+ $len = array_reduce(
+ $tasks,
+ function ($max, $task) {
+ return max(
+ $max,
+ strlen($task->title) + strlen($task->name) + 3
+ );
+ }
+ );
+
+ if (count($tasks)) {
+ print "\n";
+ printf(" %-" . $len . "s | %s\n", 'Housekeeping task (name)', 'Count');
+ printf("-%-" . $len . "s-|-------\n", str_repeat('-', $len));
+ }
+
+ foreach ($tasks as $task) {
+ printf(
+ " %-" . $len . "s | %5d\n",
+ sprintf('%s (%s)', $task->title, $task->name),
+ $task->count
+ );
+ }
+
+ if (count($tasks)) {
+ print "\n";
+ }
+ }
+
+ public function runAction()
+ {
+ if (!$job = $this->params->shift()) {
+ throw new MissingParameterException(
+ 'Job is required, say ALL to run all pending jobs'
+ );
+ }
+
+ if ($job === 'ALL') {
+ $this->housekeeping()->runAllTasks();
+ } else {
+ $this->housekeeping()->runTask($job);
+ }
+ }
+
+ protected function housekeeping()
+ {
+ if ($this->housekeeping === null) {
+ $this->housekeeping = new Housekeeping($this->db());
+ }
+
+ return $this->housekeeping;
+ }
+}
diff --git a/application/clicommands/ImportCommand.php b/application/clicommands/ImportCommand.php
new file mode 100644
index 0000000..3edfff2
--- /dev/null
+++ b/application/clicommands/ImportCommand.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\Command;
+use Icinga\Module\Director\DirectorObject\Automation\ImportExport;
+use Icinga\Module\Director\Objects\ImportSource;
+
+/**
+ * Export Director Config Objects
+ */
+class ImportCommand extends Command
+{
+ /**
+ * Import ImportSource definitions
+ *
+ * USAGE
+ *
+ * icingacli director import importsources < importsources.json
+ *
+ * OPTIONS
+ */
+ public function importsourcesAction()
+ {
+ $json = file_get_contents('php://stdin');
+ $import = new ImportExport($this->db());
+ $count = $import->unserializeImportSources(json_decode($json));
+ echo "$count Import Sources have been imported\n";
+ }
+
+ // /**
+ // * Import an ImportSource definition
+ // *
+ // * USAGE
+ // *
+ // * icingacli director import importsource < importsource.json
+ // *
+ // * OPTIONS
+ // */
+ // public function importsourcection()
+ // {
+ // $json = file_get_contents('php://stdin');
+ // $object = ImportSource::import(json_decode($json), $this->db());
+ // $object->store();
+ // printf("Import Source '%s' has been imported\n", $object->getObjectName());
+ // }
+
+ /**
+ * Import SyncRule definitions
+ *
+ * USAGE
+ *
+ * icingacli director import syncrules < syncrules.json
+ */
+ public function syncrulesAction()
+ {
+ $json = file_get_contents('php://stdin');
+ $import = new ImportExport($this->db());
+ $count = $import->unserializeSyncRules(json_decode($json));
+ echo "$count Sync Rules have been imported\n";
+ }
+}
diff --git a/application/clicommands/ImportsourceCommand.php b/application/clicommands/ImportsourceCommand.php
new file mode 100644
index 0000000..477fdf5
--- /dev/null
+++ b/application/clicommands/ImportsourceCommand.php
@@ -0,0 +1,168 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Application\Benchmark;
+use Icinga\Module\Director\Cli\Command;
+use Icinga\Module\Director\Core\Json;
+use Icinga\Module\Director\Hook\ImportSourceHook;
+use Icinga\Module\Director\Objects\ImportSource;
+
+/**
+ * Deal with Director Import Sources
+ *
+ * Use this command to check or trigger your defined Import Sources
+ */
+class ImportsourceCommand extends Command
+{
+ /**
+ * List defined Import Sources
+ *
+ * This shows a table with your defined Import Sources, their IDs and
+ * current state. As triggering Imports requires an ID, this is where
+ * you can look up the desired ID.
+ *
+ * USAGE
+ *
+ * icingacli director importsource list
+ */
+ public function listAction()
+ {
+ $sources = ImportSource::loadAll($this->db());
+ if (empty($sources)) {
+ echo "No Import Source has been defined\n";
+
+ return;
+ }
+
+ printf("%4s | %s\n", 'ID', 'Import Source name');
+ printf("-----+%s\n", str_repeat('-', 64));
+
+ foreach ($sources as $source) {
+ $state = $source->get('import_state');
+ printf("%4d | %s\n", $source->get('id'), $source->get('source_name'));
+ printf(" | -> %s%s\n", $state, $state === 'failing' ? ': ' . $source->get('last_error_message') : '');
+ }
+ }
+
+ /**
+ * Check a given Import Source for changes
+ *
+ * This command fetches data from the given Import Source and compares it
+ * to the most recently imported data.
+ *
+ * USAGE
+ *
+ * icingacli director importsource check --id <id>
+ *
+ * OPTIONS
+ *
+ * --id <id> An Import Source ID. Use the list command to figure out
+ * --benchmark Show timing and memory usage details
+ */
+ public function checkAction()
+ {
+ $source = $this->getImportSource();
+ $source->checkForChanges();
+ $this->showImportStateDetails($source);
+ }
+
+ /**
+ * Fetch current data from a given Import Source
+ *
+ * This command fetches data from the given Import Source and outputs
+ * them as plain JSON
+ *
+ * USAGE
+ *
+ * icingacli director importsource fetch --id <id>
+ *
+ * OPTIONS
+ *
+ * --id <id> An Import Source ID. Use the list command to figure out
+ * --benchmark Show timing and memory usage details
+ */
+ public function fetchAction()
+ {
+ $source = $this->getImportSource();
+ $source->checkForChanges();
+ $hook = ImportSourceHook::forImportSource($source);
+ Benchmark::measure('Ready to fetch data');
+ $data = $hook->fetchData();
+ $source->applyModifiers($data);
+ Benchmark::measure(sprintf('Got %d rows, ready to dump JSON', count($data)));
+ echo Json::encode($data, JSON_PRETTY_PRINT);
+ }
+
+ /**
+ * Trigger an Import Run for a given Import Source
+ *
+ * This command fetches data from the given Import Source and stores it to
+ * the Director DB, so that the next related Sync Rule run can work with
+ * fresh data. In case data didn't change, nothing is going to be stored.
+ *
+ * USAGE
+ *
+ * icingacli director importsource run --id <id>
+ *
+ * OPTIONS
+ *
+ * --id <id> An Import Source ID. Use the list command to figure out
+ * --benchmark Show timing and memory usage details
+ */
+ public function runAction()
+ {
+ $source = $this->getImportSource();
+
+ if ($source->runImport()) {
+ print "New data has been imported\n";
+ $this->showImportStateDetails($source);
+ } else {
+ print "Nothing has been changed, imported data is still up to date\n";
+ }
+ }
+
+ /**
+ * @return ImportSource
+ */
+ protected function getImportSource()
+ {
+ return ImportSource::loadWithAutoIncId(
+ (int) $this->params->getRequired('id'),
+ $this->db()
+ );
+ }
+
+ /**
+ * @param ImportSource $source
+ * @throws \Icinga\Exception\IcingaException
+ */
+ protected function showImportStateDetails(ImportSource $source)
+ {
+ echo $this->getImportStateDescription($source) . "\n";
+ }
+
+ /**
+ * @param ImportSource $source
+ * @return string
+ * @throws \Icinga\Exception\IcingaException
+ */
+ protected function getImportStateDescription(ImportSource $source)
+ {
+ switch ($source->get('import_state')) {
+ case 'unknown':
+ return "It's currently unknown whether we are in sync with this"
+ . ' Import Source. You should either check for changes or'
+ . ' trigger a new Import Run.';
+ case 'in-sync':
+ return 'This Import Source is in sync';
+ case 'pending-changes':
+ return 'There are pending changes for this Import Source. You'
+ . ' should trigger a new Import Run.';
+ case 'failing':
+ return 'This Import Source failed: ' . $source->get('last_error_message');
+ default:
+ return 'This Import Source has an invalid state: ' . $source->get('import_state');
+ }
+ }
+}
diff --git a/application/clicommands/JobsCommand.php b/application/clicommands/JobsCommand.php
new file mode 100644
index 0000000..1c6297f
--- /dev/null
+++ b/application/clicommands/JobsCommand.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Exception;
+use gipfl\Cli\Process;
+use gipfl\Protocol\JsonRpc\Connection;
+use gipfl\Protocol\NetString\StreamWrapper;
+use Icinga\Module\Director\Cli\Command;
+use Icinga\Module\Director\Daemon\JsonRpcLogWriter as JsonRpcLogWriterAlias;
+use Icinga\Module\Director\Daemon\Logger;
+use Icinga\Module\Director\Objects\DirectorJob;
+use React\EventLoop\Factory as Loop;
+use React\EventLoop\LoopInterface;
+use React\Stream\ReadableResourceStream;
+use React\Stream\WritableResourceStream;
+
+class JobsCommand extends Command
+{
+ public function runAction()
+ {
+ $this->app->getModuleManager()->loadEnabledModules();
+ $loop = Loop::create();
+ if ($this->params->get('rpc')) {
+ $this->enableRpc($loop);
+ }
+ if ($this->params->get('rpc') && $jobId = $this->params->get('id')) {
+ $exitCode = 1;
+ $jobId = (int) $jobId;
+ $loop->futureTick(function () use ($jobId, $loop, &$exitCode) {
+ Process::setTitle('icinga::director::job');
+ try {
+ $this->raiseLimits();
+ $job = DirectorJob::loadWithAutoIncId($jobId, $this->db());
+ Process::setTitle('icinga::director::job (' . $job->get('job_name') . ')');
+ if ($job->run()) {
+ $exitCode = 0;
+ } else {
+ $exitCode = 1;
+ }
+ } catch (Exception $e) {
+ Logger::error($e->getMessage());
+ $exitCode = 1;
+ }
+ $loop->futureTick(function () use ($loop) {
+ $loop->stop();
+ });
+ });
+ } else {
+ Logger::error('This command is no longer available. Please check our Upgrading documentation');
+ $exitCode = 1;
+ }
+
+ $loop->run();
+ exit($exitCode);
+ }
+
+ protected function enableRpc(LoopInterface $loop)
+ {
+ // stream_set_blocking(STDIN, 0);
+ // stream_set_blocking(STDOUT, 0);
+ // print_r(stream_get_meta_data(STDIN));
+ // stream_set_write_buffer(STDOUT, 0);
+ // ini_set('implicit_flush', 1);
+ $netString = new StreamWrapper(
+ new ReadableResourceStream(STDIN, $loop),
+ new WritableResourceStream(STDOUT, $loop)
+ );
+ $jsonRpc = new Connection();
+ $jsonRpc->handle($netString);
+
+ Logger::replaceRunningInstance(new JsonRpcLogWriterAlias($jsonRpc));
+ }
+}
diff --git a/application/clicommands/KickstartCommand.php b/application/clicommands/KickstartCommand.php
new file mode 100644
index 0000000..80aa183
--- /dev/null
+++ b/application/clicommands/KickstartCommand.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\Command;
+use Icinga\Module\Director\KickstartHelper;
+
+/**
+ * Kickstart a Director installation
+ *
+ * Once you prepared your DB resource this command retrieves information about
+ * unapplied database migration and helps applying them.
+ */
+class KickstartCommand extends Command
+{
+ /**
+ * Check whether a kickstart run is required
+ *
+ * This is the case when there is a kickstart.ini in your Directors config
+ * directory and no ApiUser in your Director DB.
+ *
+ * This is mostly for automation, so one could create a Puppet manifest
+ * as follows:
+ *
+ * exec { 'Icinga Director Kickstart':
+ * path => '/usr/local/bin:/usr/bin:/bin',
+ * command => 'icingacli director kickstart run',
+ * onlyif => 'icingacli director kickstart required',
+ * require => Exec['Icinga Director DB migration'],
+ * }
+ *
+ * Exit code 0 means that a kickstart run is required, code 2 that it is
+ * not.
+ */
+ public function requiredAction()
+ {
+ if ($this->kickstart()->isConfigured()) {
+ if ($this->kickstart()->isRequired()) {
+ if ($this->isVerbose) {
+ echo "Kickstart has been configured and should be triggered\n";
+ }
+
+ exit(0);
+ } else {
+ echo "Kickstart configured, execution is not required\n";
+ exit(1);
+ }
+ } else {
+ echo "Kickstart has not been configured\n";
+ exit(2);
+ }
+ }
+
+ /**
+ * Trigger the kickstart helper
+ *
+ * This will connect to the endpoint configured in your kickstart.ini,
+ * store the given API user and import existing objects like zones,
+ * endpoints and commands.
+ *
+ * /etc/icingaweb2/modules/director/kickstart.ini could look as follows:
+ *
+ * [config]
+ * endpoint = "master-node.example.com"
+ *
+ * ; Host can be an IP address or a hostname. Equals to endpoint name
+ * ; if not set:
+ * host = "127.0.0.1"
+ *
+ * ; Port is 5665 if none given
+ * port = 5665
+ *
+ * username = "director"
+ * password = "***"
+ *
+ */
+ public function runAction()
+ {
+ $this->raiseLimits();
+ $this->kickstart()->loadConfigFromFile()->run();
+ exit(0);
+ }
+
+ protected function kickstart()
+ {
+ return new KickstartHelper($this->db());
+ }
+}
diff --git a/application/clicommands/MigrationCommand.php b/application/clicommands/MigrationCommand.php
new file mode 100644
index 0000000..6a4d002
--- /dev/null
+++ b/application/clicommands/MigrationCommand.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\Command;
+use Icinga\Module\Director\Db\Migrations;
+
+/**
+ * Handle DB migrations
+ *
+ * This command retrieves information about unapplied database migration and
+ * helps applying them.
+ */
+class MigrationCommand extends Command
+{
+ /**
+ * Check whether there are pending migrations
+ *
+ * This is mostly for automation, so one could create a Puppet manifest
+ * as follows:
+ *
+ * exec { 'Icinga Director DB migration':
+ * command => 'icingacli director migration run',
+ * onlyif => 'icingacli director migration pending',
+ * }
+ *
+ * Exit code 0 means that there are pending migrations, code 1 that there
+ * are no such. Use --verbose for human readable output
+ */
+ public function pendingAction()
+ {
+ if ($count = $this->migrations()->countPendingMigrations()) {
+ if ($this->isVerbose) {
+ if ($count === 1) {
+ echo "There is 1 pending migration\n";
+ } else {
+ printf("There are %d pending migrations\n", $count);
+ }
+ }
+
+ exit(0);
+ } else {
+ if ($this->isVerbose) {
+ echo "There are no pending migrations\n";
+ }
+
+ exit(1);
+ }
+ }
+
+ /**
+ * Run any pending migrations
+ *
+ * All pending migrations will be silently applied
+ */
+ public function runAction()
+ {
+ $this->migrations()->applyPendingMigrations();
+ exit(0);
+ }
+
+ protected function migrations()
+ {
+ return new Migrations($this->db());
+ }
+}
diff --git a/application/clicommands/NotificationCommand.php b/application/clicommands/NotificationCommand.php
new file mode 100644
index 0000000..bb5402a
--- /dev/null
+++ b/application/clicommands/NotificationCommand.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\ObjectCommand;
+
+/**
+ * Manage Icinga Notifications
+ *
+ * Use this command to show, create, modify or delete Icinga Notification
+ * objects
+ */
+class NotificationCommand extends ObjectCommand
+{
+}
diff --git a/application/clicommands/ServiceCommand.php b/application/clicommands/ServiceCommand.php
new file mode 100644
index 0000000..1bd21e7
--- /dev/null
+++ b/application/clicommands/ServiceCommand.php
@@ -0,0 +1,92 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Cli\Params;
+use Icinga\Module\Director\Cli\ObjectCommand;
+use Icinga\Module\Director\DirectorObject\Lookup\ServiceFinder;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Resolver\OverrideHelper;
+use InvalidArgumentException;
+
+/**
+ * Manage Icinga Services
+ *
+ * Use this command to show, create, modify or delete Icinga Service
+ * objects
+ */
+class ServiceCommand extends ObjectCommand
+{
+ public function setAction()
+ {
+ if (($host = $this->params->get('host')) && $this->params->shift('allow-overrides')) {
+ if ($this->setServiceProperties($host)) {
+ return;
+ }
+ }
+
+ parent::setAction();
+ }
+
+ protected function setServiceProperties($hostname)
+ {
+ $serviceName = $this->getName();
+ $host = IcingaHost::load($hostname, $this->db());
+ $service = ServiceFinder::find($host, $serviceName);
+ if ($service->requiresOverrides()) {
+ self::checkForOverrideSafety($this->params);
+ $properties = $this->remainingParams();
+ unset($properties['host']);
+ OverrideHelper::applyOverriddenVars($host, $serviceName, $properties);
+ $this->persistChanges($host, 'Host', $hostname . " (Overrides for $serviceName)", 'modified');
+ return true;
+ }
+
+ return false;
+ }
+
+ protected static function checkForOverrideSafety(Params $params)
+ {
+ if ($params->shift('replace')) {
+ throw new InvalidArgumentException('--replace is not available for Variable Overrides');
+ }
+ $appends = self::stripPrefixedProperties($params, 'append-');
+ $remove = self::stripPrefixedProperties($params, 'remove-');
+ OverrideHelper::assertVarsForOverrides($appends);
+ OverrideHelper::assertVarsForOverrides($remove);
+ if (!empty($appends)) {
+ throw new InvalidArgumentException('--append- is not available for Variable Overrides');
+ }
+ if (!empty($remove)) {
+ throw new InvalidArgumentException('--remove- is not available for Variable Overrides');
+ }
+ // Alternative, untested:
+ // $this->appendToArrayProperties($object, $appends);
+ // $this->removeProperties($object, $remove);
+ }
+
+ protected function load($name)
+ {
+ return parent::load($this->makeServiceKey($name));
+ }
+
+ protected function exists($name)
+ {
+ return parent::exists($this->makeServiceKey($name));
+ }
+
+ protected function makeServiceKey($name)
+ {
+ if ($host = $this->params->get('host')) {
+ return [
+ 'object_name' => $name,
+ 'host_id' => IcingaHost::load($host, $this->db())->get('id'),
+ ];
+ } else {
+ return [
+ 'object_name' => $name,
+ 'object_type' => 'template',
+ ];
+ }
+ }
+}
diff --git a/application/clicommands/ServicegroupCommand.php b/application/clicommands/ServicegroupCommand.php
new file mode 100644
index 0000000..1c732d4
--- /dev/null
+++ b/application/clicommands/ServicegroupCommand.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\ObjectCommand;
+
+/**
+ * Manage Icinga Servicegroups
+ *
+ * Use this command to show, create, modify or delete Icinga Servicegroups
+ * objects
+ */
+class ServiceGroupCommand extends ObjectCommand
+{
+}
diff --git a/application/clicommands/ServicesetCommand.php b/application/clicommands/ServicesetCommand.php
new file mode 100644
index 0000000..648a42c
--- /dev/null
+++ b/application/clicommands/ServicesetCommand.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+/**
+ * Manage Icinga Service Sets
+ *
+ * Use this command to show, create, modify or delete Icinga Service
+ * objects
+ */
+class ServicesetCommand extends ServiceCommand
+{
+ protected $type = 'ServiceSet';
+}
diff --git a/application/clicommands/ServicesetsCommand.php b/application/clicommands/ServicesetsCommand.php
new file mode 100644
index 0000000..54669d5
--- /dev/null
+++ b/application/clicommands/ServicesetsCommand.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\ObjectsCommand;
+
+/**
+ * Manage Icinga Service Sets
+ *
+ * Use this command to list Icinga Service Set objects
+ */
+class ServicesetsCommand extends ObjectsCommand
+{
+ protected $type = 'ServiceSet';
+}
diff --git a/application/clicommands/SyncruleCommand.php b/application/clicommands/SyncruleCommand.php
new file mode 100644
index 0000000..37a3f0e
--- /dev/null
+++ b/application/clicommands/SyncruleCommand.php
@@ -0,0 +1,195 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\Command;
+use Icinga\Module\Director\Objects\DirectorActivityLog;
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Objects\SyncRule;
+use RuntimeException;
+
+/**
+ * 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();
+ $hasChanges = $rule->checkForChanges();
+ $this->showSyncStateDetails($rule);
+ if ($hasChanges) {
+ $mods = $this->getExpectedModificationCounts($rule);
+ printf(
+ "Expected modifications: %dx create, %dx modify, %dx delete\n",
+ $mods->modify,
+ $mods->create,
+ $mods->delete
+ );
+ }
+
+ exit($this->getSyncStateExitCode($rule));
+ }
+
+ protected function getExpectedModificationCounts(SyncRule $rule)
+ {
+ $modifications = $rule->getExpectedModifications();
+
+ $create = 0;
+ $modify = 0;
+ $delete = 0;
+
+ /** @var IcingaObject $object */
+ foreach ($modifications as $object) {
+ if ($object->hasBeenLoadedFromDb()) {
+ if ($object->shouldBeRemoved()) {
+ $delete++;
+ } else {
+ $modify++;
+ }
+ } else {
+ $create++;
+ }
+ }
+
+ return (object) [
+ DirectorActivityLog::ACTION_CREATE => $create,
+ DirectorActivityLog::ACTION_MODIFY => $modify,
+ DirectorActivityLog::ACTION_DELETE => $delete,
+ ];
+ }
+
+ /**
+ * 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::loadWithAutoIncId(
+ (int) $this->params->getRequired('id'),
+ $this->db()
+ );
+ }
+
+ /**
+ * @param SyncRule $rule
+ */
+ protected function showSyncStateDetails(SyncRule $rule)
+ {
+ echo $this->getSyncStateDescription($rule) . "\n";
+ }
+
+ /**
+ * @param SyncRule $rule
+ * @return string
+ */
+ 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');
+ default:
+ throw new RuntimeException('Invalid sync state: ' . $rule->get('sync_state'));
+ }
+ }
+
+ /**
+ * @param SyncRule $rule
+ * @return string
+ */
+ protected function getSyncStateExitCode(SyncRule $rule)
+ {
+ switch ($rule->get('sync_state')) {
+ case 'unknown':
+ return 3;
+ case 'in-sync':
+ return 0;
+ case 'pending-changes':
+ return 1;
+ case 'failing':
+ return 2;
+ default:
+ throw new RuntimeException('Invalid sync state: ' . $rule->get('sync_state'));
+ }
+ }
+}
diff --git a/application/clicommands/TimeperiodCommand.php b/application/clicommands/TimeperiodCommand.php
new file mode 100644
index 0000000..352289a
--- /dev/null
+++ b/application/clicommands/TimeperiodCommand.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\ObjectCommand;
+
+/**
+ * Manage Icinga Timeperiods
+ *
+ * Use this command to show, create, modify or delete Icinga Timeperiod
+ * objects
+ */
+class TimePeriodCommand extends ObjectCommand
+{
+}
diff --git a/application/clicommands/UserCommand.php b/application/clicommands/UserCommand.php
new file mode 100644
index 0000000..9c4c9d4
--- /dev/null
+++ b/application/clicommands/UserCommand.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\ObjectCommand;
+
+/**
+ * Manage Icinga Users
+ *
+ * Use this command to show, create, modify or delete Icinga User
+ * objects
+ */
+class UserCommand extends ObjectCommand
+{
+}
diff --git a/application/clicommands/UsergroupCommand.php b/application/clicommands/UsergroupCommand.php
new file mode 100644
index 0000000..04ba7c3
--- /dev/null
+++ b/application/clicommands/UsergroupCommand.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\ObjectCommand;
+
+/**
+ * Manage Icinga Usergroups
+ *
+ * Use this command to show, create, modify or delete Icinga Usergroup
+ * objects
+ */
+class UsergroupCommand extends ObjectCommand
+{
+}
diff --git a/application/clicommands/ZoneCommand.php b/application/clicommands/ZoneCommand.php
new file mode 100644
index 0000000..a5c45f9
--- /dev/null
+++ b/application/clicommands/ZoneCommand.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Module\Director\Cli\ObjectCommand;
+
+/**
+ * Manage Icinga Zones
+ *
+ * Use this command to show, create, modify or delete Icinga Zone
+ * objects
+ */
+class ZoneCommand extends ObjectCommand
+{
+}
diff --git a/application/controllers/ApiuserController.php b/application/controllers/ApiuserController.php
new file mode 100644
index 0000000..36438ae
--- /dev/null
+++ b/application/controllers/ApiuserController.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectController;
+
+class ApiuserController extends ObjectController
+{
+}
diff --git a/application/controllers/ApiusersController.php b/application/controllers/ApiusersController.php
new file mode 100644
index 0000000..5597521
--- /dev/null
+++ b/application/controllers/ApiusersController.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectsController;
+
+class ApiusersController extends ObjectsController
+{
+}
diff --git a/application/controllers/BasketController.php b/application/controllers/BasketController.php
new file mode 100644
index 0000000..8733d16
--- /dev/null
+++ b/application/controllers/BasketController.php
@@ -0,0 +1,416 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Exception;
+use gipfl\Diff\HtmlRenderer\InlineDiff;
+use gipfl\Diff\PhpDiff;
+use gipfl\IcingaWeb2\Link;
+use gipfl\Web\Table\NameValueTable;
+use gipfl\Web\Widget\Hint;
+use Icinga\Date\DateFormatter;
+use Icinga\Module\Director\Core\Json;
+use Icinga\Module\Director\Data\Exporter;
+use Icinga\Module\Director\Db;
+use Icinga\Module\Director\DirectorObject\Automation\Basket;
+use Icinga\Module\Director\DirectorObject\Automation\BasketSnapshot;
+use Icinga\Module\Director\DirectorObject\Automation\BasketSnapshotFieldResolver;
+use Icinga\Module\Director\DirectorObject\Automation\CompareBasketObject;
+use Icinga\Module\Director\Forms\AddToBasketForm;
+use Icinga\Module\Director\Forms\BasketCreateSnapshotForm;
+use Icinga\Module\Director\Forms\BasketForm;
+use Icinga\Module\Director\Forms\BasketUploadForm;
+use Icinga\Module\Director\Forms\RestoreBasketForm;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use ipl\Html\Html;
+use Icinga\Module\Director\Web\Table\BasketSnapshotTable;
+
+class BasketController extends ActionController
+{
+ protected $isApified = true;
+
+ protected function basketTabs()
+ {
+ $name = $this->params->get('name');
+ return $this->tabs()->add('show', [
+ 'label' => $this->translate('Basket'),
+ 'url' => 'director/basket',
+ 'urlParams' => ['name' => $name]
+ ])->add('snapshots', [
+ 'label' => $this->translate('Snapshots'),
+ 'url' => 'director/basket/snapshots',
+ 'urlParams' => ['name' => $name]
+ ]);
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ * @throws \Icinga\Exception\MissingParameterException
+ */
+ public function indexAction()
+ {
+ $this->actions()->add(
+ Link::create(
+ $this->translate('Back'),
+ 'director/baskets',
+ null,
+ ['class' => 'icon-left-big']
+ )
+ );
+ $basket = $this->requireBasket();
+ $this->basketTabs()->activate('show');
+ $this->addTitle($basket->get('basket_name'));
+ if ($basket->isEmpty()) {
+ $this->content()->add(Hint::info($this->translate('This basket is empty')));
+ }
+ $this->content()->add(
+ (new BasketForm())->setObject($basket)->handleRequest()
+ );
+ }
+
+ /**
+ * @throws \Icinga\Exception\MissingParameterException
+ */
+ public function addAction()
+ {
+ $this->actions()->add(
+ Link::create(
+ $this->translate('Baskets'),
+ 'director/baskets',
+ null,
+ ['class' => 'icon-tag']
+ )
+ );
+ $this->addSingleTab($this->translate('Add to Basket'));
+ $this->addTitle($this->translate('Add chosen objects to a Configuration Basket'));
+ $form = new AddToBasketForm();
+ $form->setDb($this->db())
+ ->setType($this->params->getRequired('type'))
+ ->setNames($this->url()->getParams()->getValues('names'))
+ ->handleRequest();
+ $this->content()->add($form);
+ }
+
+ public function createAction()
+ {
+ $this->actions()->add(
+ Link::create(
+ $this->translate('back'),
+ 'director/baskets',
+ null,
+ ['class' => 'icon-left-big']
+ )
+ );
+ $this->addSingleTab($this->translate('Create Basket'));
+ $this->addTitle($this->translate('Create a new Configuration Basket'));
+ $form = (new BasketForm())
+ ->setDb($this->db())
+ ->handleRequest();
+ $this->content()->add($form);
+ }
+
+ public function uploadAction()
+ {
+ $this->actions()->add(
+ Link::create(
+ $this->translate('back'),
+ 'director/baskets',
+ null,
+ ['class' => 'icon-left-big']
+ )
+ );
+ $this->addSingleTab($this->translate('Upload a Basket'));
+ $this->addTitle($this->translate('Upload a Configuration Basket'));
+ $form = (new BasketUploadForm())
+ ->setDb($this->db())
+ ->handleRequest();
+ $this->content()->add($form);
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function snapshotsAction()
+ {
+ $name = $this->params->get('name');
+ if ($name === null || $name === '') {
+ $basket = null;
+ } else {
+ $basket = Basket::load($name, $this->db());
+ }
+ if ($basket === null) {
+ $this->addTitle($this->translate('Basket Snapshots'));
+ $this->addSingleTab($this->translate('Snapshots'));
+ } else {
+ $this->addTitle(sprintf(
+ $this->translate('%s: Snapshots'),
+ $basket->get('basket_name')
+ ));
+ $this->basketTabs()->activate('snapshots');
+ }
+ if ($basket !== null) {
+ $this->content()->add(
+ (new BasketCreateSnapshotForm())
+ ->setBasket($basket)
+ ->handleRequest()
+ );
+ }
+ $table = new BasketSnapshotTable($this->db());
+ if ($basket !== null) {
+ $table->setBasket($basket);
+ }
+
+ $table->renderTo($this);
+ }
+
+ /**
+ * @throws \Icinga\Exception\MissingParameterException
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function snapshotAction()
+ {
+ $basket = $this->requireBasket();
+ $snapshot = BasketSnapshot::load([
+ 'basket_uuid' => $basket->get('uuid'),
+ 'ts_create' => $this->params->getRequired('ts'),
+ ], $this->db());
+ $snapSum = bin2hex($snapshot->get('content_checksum'));
+
+ if ($this->params->get('action') === 'download') {
+ $this->getResponse()->setHeader('Content-Type', 'application/json', true);
+ $this->getResponse()->setHeader('Content-Disposition', sprintf(
+ 'attachment; filename=Director-Basket_%s_%s.json',
+ str_replace([' ', '"'], ['_', '_'], iconv(
+ 'UTF-8',
+ 'ISO-8859-1//IGNORE',
+ $basket->get('basket_name')
+ )),
+ substr($snapSum, 0, 7)
+ ));
+ echo $snapshot->getJsonDump();
+ return;
+ }
+
+ $this->addTitle(
+ $this->translate('%s: %s (Snapshot)'),
+ $basket->get('basket_name'),
+ substr($snapSum, 0, 7)
+ );
+
+ $this->actions()->add([
+ Link::create(
+ $this->translate('Show Basket'),
+ 'director/basket',
+ ['name' => $basket->get('basket_name')],
+ ['data-base-target' => '_next']
+ ),
+ Link::create(
+ $this->translate('Restore'),
+ $this->url()->with('action', 'restore'),
+ null,
+ ['class' => 'icon-rewind']
+ ),
+ Link::create(
+ $this->translate('Download'),
+ $this->url()
+ ->with([
+ 'action' => 'download',
+ 'dbResourceName' => $this->getDbResourceName()
+ ]),
+ null,
+ [
+ 'class' => 'icon-download',
+ 'target' => '_blank'
+ ]
+ ),
+ ]);
+
+ $properties = new NameValueTable();
+ $properties->addNameValuePairs([
+ $this->translate('Created') => DateFormatter::formatDateTime($snapshot->get('ts_create') / 1000),
+ $this->translate('Content Checksum') => bin2hex($snapshot->get('content_checksum')),
+ ]);
+ $this->content()->add($properties);
+
+ if ($this->params->get('action') === 'restore') {
+ $form = new RestoreBasketForm();
+ $form
+ ->setSnapshot($snapshot)
+ ->handleRequest();
+ $this->content()->add($form);
+ $targetDbName = $form->getValue('target_db');
+ $connection = $form->getDb();
+ } else {
+ $targetDbName = null;
+ $connection = $this->db();
+ }
+
+ $json = $snapshot->getJsonDump();
+ $this->addSingleTab($this->translate('Snapshot'));
+ $all = Json::decode($json);
+ $exporter = new Exporter($this->db());
+ $fieldResolver = new BasketSnapshotFieldResolver($all, $connection);
+ foreach ($all as $type => $objects) {
+ if ($type === 'Datafield') {
+ // TODO: we should now be able to show all fields and link
+ // to a "diff" for the ones that should be created
+ // $this->content()->add(Html::tag('h2', sprintf('+%d Datafield(s)', count($objects))));
+ continue;
+ }
+ $table = new NameValueTable();
+ $table->addAttributes([
+ 'class' => ['table-basket-changes', 'table-row-selectable'],
+ 'data-base-target' => '_next',
+ ]);
+ foreach ($objects as $key => $object) {
+ $linkParams = [
+ 'name' => $basket->get('basket_name'),
+ 'checksum' => $this->params->get('checksum'),
+ 'ts' => $this->params->get('ts'),
+ 'type' => $type,
+ 'key' => $key,
+ ];
+ if ($targetDbName !== null) {
+ $linkParams['target_db'] = $targetDbName;
+ }
+ try {
+ $current = BasketSnapshot::instanceByIdentifier($type, $key, $connection);
+ if ($current === null) {
+ $table->addNameValueRow(
+ $key,
+ Link::create(
+ Html::tag('strong', ['style' => 'color: green'], $this->translate('new')),
+ 'director/basket/snapshotobject',
+ $linkParams
+ )
+ );
+ continue;
+ }
+ $currentExport = $exporter->export($current);
+ $fieldResolver->tweakTargetIds($currentExport);
+
+ // Ignore originalId
+ if (isset($currentExport->originalId)) {
+ unset($currentExport->originalId);
+ }
+ if (isset($object->originalId)) {
+ unset($object->originalId);
+ }
+ $hasChanged = ! CompareBasketObject::equals($currentExport, $object);
+ $table->addNameValueRow(
+ $key,
+ $hasChanged
+ ? Link::create(
+ Html::tag('strong', ['style' => 'color: orange'], $this->translate('modified')),
+ 'director/basket/snapshotobject',
+ $linkParams
+ )
+ : Html::tag('span', ['style' => 'color: green'], $this->translate('unchanged'))
+ );
+ } catch (Exception $e) {
+ $table->addNameValueRow(
+ $key,
+ Html::tag('a', sprintf(
+ '%s (%s:%d)',
+ $e->getMessage(),
+ basename($e->getFile()),
+ $e->getLine()
+ ))
+ );
+ }
+ }
+ $this->content()->add(Html::tag('h2', $type));
+ $this->content()->add($table);
+ }
+ $this->content()->add(Html::tag('div', ['style' => 'height: 5em']));
+ }
+
+ /**
+ * @throws \Icinga\Exception\MissingParameterException
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function snapshotobjectAction()
+ {
+ $basket = $this->requireBasket();
+ $snapshot = BasketSnapshot::load([
+ 'basket_uuid' => $basket->get('uuid'),
+ 'ts_create' => $this->params->getRequired('ts'),
+ ], $this->db());
+ $snapshotUrl = $this->url()->without('type')->without('key')->setPath('director/basket/snapshot');
+ $type = $this->params->get('type');
+ $key = $this->params->get('key');
+
+ $this->addTitle($this->translate('Single Object Diff'));
+ $this->content()->add(Hint::info(Html::sprintf(
+ $this->translate('Comparing %s "%s" from Snapshot "%s" to current config'),
+ $type,
+ $key,
+ Link::create(
+ substr(bin2hex($snapshot->get('content_checksum')), 0, 7),
+ $snapshotUrl,
+ null,
+ ['data-base-target' => '_next']
+ )
+ )));
+ $this->actions()->add([
+ Link::create(
+ $this->translate('back'),
+ $snapshotUrl,
+ null,
+ ['class' => 'icon-left-big']
+ ),
+ /*
+ Link::create(
+ $this->translate('Restore'),
+ $this->url()->with('action', 'restore'),
+ null,
+ ['class' => 'icon-rewind']
+ )
+ */
+ ]);
+ $exporter = new Exporter($this->db());
+ $json = $snapshot->getJsonDump();
+ $this->addSingleTab($this->translate('Snapshot'));
+ $objects = Json::decode($json);
+ $targetDbName = $this->params->get('target_db');
+ if ($targetDbName === null) {
+ $connection = $this->db();
+ } else {
+ $connection = Db::fromResourceName($targetDbName);
+ }
+ $fieldResolver = new BasketSnapshotFieldResolver($objects, $connection);
+ $objectFromBasket = $objects->$type->$key;
+ unset($objectFromBasket->originalId);
+ CompareBasketObject::normalize($objectFromBasket);
+ $objectFromBasket = Json::encode($objectFromBasket, JSON_PRETTY_PRINT);
+ $current = BasketSnapshot::instanceByIdentifier($type, $key, $connection);
+ if ($current === null) {
+ $current = '';
+ } else {
+ $exported = $exporter->export($current);
+ $fieldResolver->tweakTargetIds($exported);
+ unset($exported->originalId);
+ CompareBasketObject::normalize($exported);
+ $current = Json::encode($exported, JSON_PRETTY_PRINT);
+ }
+
+ if ($current === $objectFromBasket) {
+ $this->content()->add([
+ Hint::ok('Basket equals current object'),
+ Html::tag('pre', $current)
+ ]);
+ } else {
+ $this->content()->add(new InlineDiff(new PhpDiff($current, $objectFromBasket)));
+ }
+ }
+
+ /**
+ * @return Basket
+ * @throws \Icinga\Exception\MissingParameterException
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function requireBasket()
+ {
+ return Basket::load($this->params->getRequired('name'), $this->db());
+ }
+}
diff --git a/application/controllers/BasketsController.php b/application/controllers/BasketsController.php
new file mode 100644
index 0000000..6b50b62
--- /dev/null
+++ b/application/controllers/BasketsController.php
@@ -0,0 +1,53 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use ipl\Html\Html;
+use gipfl\IcingaWeb2\Link;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Web\Table\BasketTable;
+
+class BasketsController extends ActionController
+{
+ protected $isApified = false;
+
+ public function indexAction()
+ {
+ $this->setAutorefreshInterval(10);
+ $this->addSingleTab($this->translate('Baskets'));
+ $this->actions()->add([
+ Link::create(
+ $this->translate('Create'),
+ 'director/basket/create',
+ null,
+ ['class' => 'icon-plus']
+ ),
+ Link::create(
+ $this->translate('Upload'),
+ 'director/basket/upload',
+ null,
+ ['class' => 'icon-upload']
+ ),
+ ]);
+ $this->addTitle($this->translate('Configuration Baskets'));
+ $this->content()->add(Html::tag('p', $this->translate(
+ 'A Configuration Basket references specific Configuration'
+ . ' Objects or all objects of a specific type. It has been'
+ . ' designed to share Templates, Import/Sync strategies and'
+ . ' other base Configuration Objects. It is not a tool to'
+ . ' operate with single Hosts or Services.'
+ )));
+ $this->content()->add(Html::tag('p', $this->translate(
+ 'You can create Basket snapshots at any time, this will persist'
+ . ' a serialized representation of all involved objects at that'
+ . ' moment in time. Snapshots can be exported, imported, shared'
+ . ' and restored - to the very same or another Director instance.'
+ )));
+ $table = (new BasketTable($this->db()))
+ ->setAttribute('data-base-target', '_self');
+ // TODO: temporarily disabled, this was a thing in dipl
+ if (/*$table->hasSearch() || */count($table)) {
+ $table->renderTo($this);
+ }
+ }
+}
diff --git a/application/controllers/BranchController.php b/application/controllers/BranchController.php
new file mode 100644
index 0000000..3b36e83
--- /dev/null
+++ b/application/controllers/BranchController.php
@@ -0,0 +1,138 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use gipfl\Diff\HtmlRenderer\SideBySideDiff;
+use gipfl\Diff\PhpDiff;
+use gipfl\IcingaWeb2\Widget\NameValueTable;
+use Icinga\Module\Director\Data\Db\DbObjectStore;
+use Icinga\Module\Director\Data\Db\DbObjectTypeRegistry;
+use Icinga\Module\Director\Db\Branch\BranchActivity;
+use Icinga\Module\Director\Db\Branch\BranchStore;
+use Icinga\Module\Director\IcingaConfig\IcingaConfig;
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Objects\SyncRule;
+use Icinga\Module\Director\PlainObjectRenderer;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Web\Controller\BranchHelper;
+use Icinga\Module\Director\Web\Widget\IcingaConfigDiff;
+use ipl\Html\Html;
+
+class BranchController extends ActionController
+{
+ use BranchHelper;
+
+ public function init()
+ {
+ parent::init();
+ IcingaObject::setDbObjectStore(new DbObjectStore($this->db(), $this->getBranch()));
+ SyncRule::setDbObjectStore(new DbObjectStore($this->db(), $this->getBranch()));
+ }
+
+ protected function checkDirectorPermissions()
+ {
+ }
+
+ public function activityAction()
+ {
+ $this->assertPermission('director/showconfig');
+ $ts = $this->params->getRequired('ts');
+ $activity = BranchActivity::load($ts, $this->db());
+ $store = new BranchStore($this->db());
+ $branch = $store->fetchBranchByUuid($activity->getBranchUuid());
+ if ($branch->isSyncPreview()) {
+ $this->addSingleTab($this->translate('Sync Preview'));
+ $this->addTitle($this->translate('Expected Modification'));
+ } else {
+ $this->addSingleTab($this->translate('Activity'));
+ $this->addTitle($this->translate('Branch Activity'));
+ }
+
+ $this->content()->add($this->prepareActivityInfo($activity));
+ $this->showActivity($activity);
+ }
+
+ protected function prepareActivityInfo(BranchActivity $activity)
+ {
+ $table = new NameValueTable();
+ $table->addNameValuePairs([
+ $this->translate('Author') => $activity->getAuthor(),
+ $this->translate('Date') => date('Y-m-d H:i:s', $activity->getTimestamp()),
+ $this->translate('Action') => $activity->getAction()
+ . ' ' . preg_replace('/^icinga_/', '', $activity->getObjectTable())
+ . ' ' . $activity->getObjectName(),
+ // $this->translate('Actions') => ['Undo form'],
+ ]);
+ return $table;
+ }
+
+ protected function leftFromActivity(BranchActivity $activity)
+ {
+ if ($activity->isActionCreate()) {
+ return null;
+ }
+ $object = DbObjectTypeRegistry::newObject($activity->getObjectTable(), [], $this->db());
+ $properties = $this->objectTypeFirst($activity->getFormerProperties()->jsonSerialize());
+ foreach ($properties as $key => $value) {
+ $object->set($key, $value);
+ }
+
+ return $object;
+ }
+
+ protected function rightFromActivity(BranchActivity $activity)
+ {
+ if ($activity->isActionDelete()) {
+ return null;
+ }
+ $object = DbObjectTypeRegistry::newObject($activity->getObjectTable(), [], $this->db());
+ if (! $activity->isActionCreate()) {
+ foreach ($activity->getFormerProperties()->jsonSerialize() as $key => $value) {
+ $object->set($key, $value);
+ }
+ }
+ $properties = $this->objectTypeFirst($activity->getModifiedProperties()->jsonSerialize());
+ foreach ($properties as $key => $value) {
+ $object->set($key, $value);
+ }
+
+ return $object;
+ }
+
+ protected function objectTypeFirst($properties)
+ {
+ $properties = (array) $properties;
+ if (isset($properties['object_type'])) {
+ $type = $properties['object_type'];
+ unset($properties['object_type']);
+ $properties = ['object_type' => $type] + $properties;
+ }
+
+ return $properties;
+ }
+
+ protected function showActivity(BranchActivity $activity)
+ {
+ $left = $this->leftFromActivity($activity);
+ $right = $this->rightFromActivity($activity);
+ if ($left instanceof IcingaObject || $right instanceof IcingaObject) {
+ $this->content()->add(new IcingaConfigDiff(
+ $left ? $left->toSingleIcingaConfig() : $this->createEmptyConfig(),
+ $right ? $right->toSingleIcingaConfig() : $this->createEmptyConfig()
+ ));
+ } else {
+ $this->content()->add([
+ Html::tag('h3', $this->translate('Modification')),
+ new SideBySideDiff(new PhpDiff(
+ PlainObjectRenderer::render($left->getProperties()),
+ PlainObjectRenderer::render($right->getProperties())
+ ))
+ ]);
+ }
+ }
+
+ protected function createEmptyConfig()
+ {
+ return new IcingaConfig($this->db());
+ }
+}
diff --git a/application/controllers/CommandController.php b/application/controllers/CommandController.php
new file mode 100644
index 0000000..de0ba54
--- /dev/null
+++ b/application/controllers/CommandController.php
@@ -0,0 +1,126 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use gipfl\Web\Widget\Hint;
+use Icinga\Module\Director\Objects\IcingaCommandArgument;
+use Icinga\Module\Director\Web\Table\BranchedIcingaCommandArgumentTable;
+use ipl\Html\Html;
+use Icinga\Module\Director\Forms\IcingaCommandArgumentForm;
+use Icinga\Module\Director\Objects\IcingaCommand;
+use Icinga\Module\Director\Resolver\CommandUsage;
+use Icinga\Module\Director\Web\Controller\ObjectController;
+use Icinga\Module\Director\Web\Table\IcingaCommandArgumentTable;
+
+class CommandController extends ObjectController
+{
+ /**
+ * @throws \Icinga\Exception\AuthenticationException
+ * @throws \Icinga\Exception\NotFoundError
+ * @throws \Icinga\Security\SecurityException
+ */
+ public function init()
+ {
+ parent::init();
+ $o = $this->object;
+ if ($o && ! $o->isExternal()) {
+ if ($this->getBranch()->isBranch()) {
+ $urlParams = ['uuid' => $o->getUniqueId()->toString()];
+ } else {
+ $urlParams = ['name' => $o->getObjectName()];
+ }
+ $this->tabs()->add('arguments', [
+ 'url' => 'director/command/arguments',
+ 'urlParams' => $urlParams,
+ 'label' => 'Arguments'
+ ]);
+ }
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ * @throws \Zend_Db_Select_Exception
+ */
+ public function indexAction()
+ {
+ if (! $this->getRequest()->isApiRequest()) {
+ $this->showUsage();
+ }
+ parent::indexAction();
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ * @throws \Icinga\Security\SecurityException
+ * @throws \Zend_Db_Select_Exception
+ */
+ public function renderAction()
+ {
+ if ($this->object->isExternal()) {
+ $this->showUsage();
+ }
+
+ parent::renderAction();
+ }
+
+ /**
+ * @throws \Zend_Db_Select_Exception
+ */
+ protected function showUsage()
+ {
+ /** @var IcingaCommand $command */
+ $command = $this->object;
+ if ($command->isInUse()) {
+ $usage = new CommandUsage($command);
+ $this->content()->add(Hint::info(Html::sprintf(
+ $this->translate('This Command is currently being used by %s'),
+ Html::tag('span', null, $usage->getLinks())->setSeparator(', ')
+ ))->addAttributes([
+ 'data-base-target' => '_next'
+ ]));
+ } else {
+ $this->content()->add(Hint::warning($this->translate('This Command is currently not in use')));
+ }
+ }
+
+ public function argumentsAction()
+ {
+ $p = $this->params;
+ /** @var IcingaCommand $o */
+ $o = $this->object;
+ $this->tabs()->activate('arguments');
+ $this->addTitle($this->translate('Command arguments: %s'), $o->getObjectName());
+ $form = (new IcingaCommandArgumentForm)
+ ->setBranch($this->getBranch())
+ ->setCommandObject($o);
+ if ($argument = $p->shift('argument')) {
+ $this->addBackLink('director/command/arguments', [
+ 'name' => $p->get('name')
+ ]);
+ if ($this->branch->isBranch()) {
+ $arguments = $o->arguments();
+ $argument = $arguments->get($argument);
+ // IcingaCommandArgument::create((array) $arguments->get($argument)->toFullPlainObject());
+ // $argument->setBeingLoadedFromDb();
+ } else {
+ $argument = IcingaCommandArgument::load([
+ 'command_id' => $o->get('id'),
+ 'argument_name' => $argument
+ ], $this->db());
+ }
+ $form->setObject($argument);
+ }
+ $form->handleRequest();
+ $this->content()->add([$form]);
+ if ($this->branch->isBranch()) {
+ (new BranchedIcingaCommandArgumentTable($o, $this->getBranch()))->renderTo($this);
+ } else {
+ (new IcingaCommandArgumentTable($o, $this->getBranch()))->renderTo($this);
+ }
+ }
+
+ protected function hasBasketSupport()
+ {
+ return true;
+ }
+}
diff --git a/application/controllers/CommandsController.php b/application/controllers/CommandsController.php
new file mode 100644
index 0000000..246028f
--- /dev/null
+++ b/application/controllers/CommandsController.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectsController;
+
+class CommandsController extends ObjectsController
+{
+ public function indexAction()
+ {
+ parent::indexAction();
+ $validTypes = ['object', 'external_object'];
+ $type = $this->params->get('type', 'object');
+ if (! in_array($type, $validTypes)) {
+ $type = 'object';
+ }
+
+ $this->table->setType($type);
+ }
+}
diff --git a/application/controllers/CommandtemplateController.php b/application/controllers/CommandtemplateController.php
new file mode 100644
index 0000000..ca5f827
--- /dev/null
+++ b/application/controllers/CommandtemplateController.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Objects\IcingaCommand;
+use Icinga\Module\Director\Web\Controller\TemplateController;
+
+class CommandtemplateController extends TemplateController
+{
+ protected function requireTemplate()
+ {
+ return IcingaCommand::load([
+ 'object_name' => $this->params->get('name')
+ ], $this->db());
+ }
+}
diff --git a/application/controllers/ConfigController.php b/application/controllers/ConfigController.php
new file mode 100644
index 0000000..3f8a105
--- /dev/null
+++ b/application/controllers/ConfigController.php
@@ -0,0 +1,539 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use gipfl\Diff\HtmlRenderer\SideBySideDiff;
+use gipfl\Diff\PhpDiff;
+use gipfl\Web\Widget\Hint;
+use Icinga\Data\Filter\Filter;
+use Icinga\Exception\IcingaException;
+use Icinga\Exception\NotFoundError;
+use Icinga\Module\Director\Db\Branch\Branch;
+use Icinga\Module\Director\Deployment\DeploymentStatus;
+use Icinga\Module\Director\Forms\DeployConfigForm;
+use Icinga\Module\Director\Forms\SettingsForm;
+use Icinga\Module\Director\IcingaConfig\IcingaConfig;
+use Icinga\Module\Director\Objects\DirectorDeploymentLog;
+use Icinga\Module\Director\Settings;
+use Icinga\Module\Director\Web\Controller\BranchHelper;
+use Icinga\Module\Director\Web\Table\ActivityLogTable;
+use Icinga\Module\Director\Web\Table\BranchActivityTable;
+use Icinga\Module\Director\Web\Table\ConfigFileDiffTable;
+use Icinga\Module\Director\Web\Table\DeploymentLogTable;
+use Icinga\Module\Director\Web\Table\GeneratedConfigFileTable;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Web\Tabs\InfraTabs;
+use Icinga\Module\Director\Web\Widget\ActivityLogInfo;
+use Icinga\Module\Director\Web\Widget\DeployedConfigInfoHeader;
+use Icinga\Module\Director\Web\Widget\ShowConfigFile;
+use Icinga\Web\Notification;
+use Exception;
+use RuntimeException;
+use ipl\Html\Html;
+use ipl\Html\HtmlString;
+use gipfl\IcingaWeb2\Icon;
+use gipfl\IcingaWeb2\Link;
+use gipfl\IcingaWeb2\Url;
+
+class ConfigController extends ActionController
+{
+ use BranchHelper;
+
+ protected $isApified = true;
+
+ protected function checkDirectorPermissions()
+ {
+ }
+
+ /**
+ * @throws \Icinga\Security\SecurityException
+ */
+ public function deploymentsAction()
+ {
+ if ($this->sendNotFoundForRestApi()) {
+ return;
+ }
+ $this->assertPermission('director/deploy');
+ $this->addTitle($this->translate('Deployments'));
+ try {
+ if (DirectorDeploymentLog::hasUncollected($this->db())) {
+ $this->setAutorefreshInterval(2);
+ } else {
+ $this->setAutorefreshInterval(20);
+ }
+ } catch (Exception $e) {
+ $this->content()->prepend(Hint::warning($e->getMessage()));
+ // No problem, Icinga might be reloading
+ }
+
+ if (! $this->getBranch()->isBranch()) {
+ // TODO: a form!
+ $this->actions()->add(Link::create(
+ $this->translate('Render config'),
+ 'director/config/store',
+ null,
+ ['class' => 'icon-wrench']
+ ));
+ }
+
+ $this->tabs(new InfraTabs($this->Auth()))->activate('deploymentlog');
+ $table = new DeploymentLogTable($this->db());
+ try {
+ // Move elsewhere
+ $table->setActiveStageName(
+ $this->api()->getActiveStageName()
+ );
+ } catch (Exception $e) {
+ // Don't care
+ }
+
+ $table->renderTo($this);
+ }
+
+ /**
+ * @throws NotFoundError
+ * @throws \Icinga\Module\Director\Exception\DuplicateKeyException
+ * @throws \Icinga\Security\SecurityException
+ */
+ public function deployAction()
+ {
+ $request = $this->getRequest();
+ if (! $request->isApiRequest()) {
+ throw new NotFoundError('Not found');
+ }
+
+ if (! $request->isPost()) {
+ throw new RuntimeException(sprintf(
+ 'Unsupported method: %s',
+ $request->getMethod()
+ ));
+ }
+ $this->assertPermission('director/deploy');
+
+ // TODO: require POST
+ $checksum = $this->params->get('checksum');
+ if ($checksum) {
+ $config = IcingaConfig::load(hex2bin($checksum), $this->db());
+ } else {
+ $config = IcingaConfig::generate($this->db());
+ $checksum = $config->getHexChecksum();
+ }
+
+ try {
+ $this->api()->wipeInactiveStages($this->db());
+ } catch (Exception $e) {
+ $this->deploymentFailed($checksum, $e->getMessage());
+ }
+
+ if ($this->api()->dumpConfig($config, $this->db())) {
+ $this->deploymentSucceeded($checksum);
+ } else {
+ $this->deploymentFailed($checksum);
+ }
+ }
+
+ public function deploymentStatusAction()
+ {
+ if ($this->sendNotFoundUnlessRestApi()) {
+ return;
+ }
+ $db = $this->db();
+ $api = $this->api();
+ $status = new DeploymentStatus($db, $api);
+ $result = $status->getDeploymentStatus($this->params->get('configs'), $this->params->get('activities'));
+
+ $this->sendJson($this->getResponse(), (object) $result);
+ }
+
+ /**
+ * @throws \Icinga\Security\SecurityException
+ */
+ public function activitiesAction()
+ {
+ if ($this->sendNotFoundForRestApi()) {
+ return;
+ }
+ $this->assertPermission('director/audit');
+ $this->showOptionalBranchActivity();
+ $this->setAutorefreshInterval(10);
+ $this->tabs(new InfraTabs($this->Auth()))->activate('activitylog');
+ $this->addTitle($this->translate('Activity Log'));
+ $lastDeployedId = $this->db()->getLastDeploymentActivityLogId();
+ $table = new ActivityLogTable($this->db());
+ $table->setLastDeployedId($lastDeployedId);
+ if ($idRangeEx = $this->url()->getParam('idRangeEx')) {
+ $table->applyFilter(Filter::fromQueryString($idRangeEx));
+ }
+ $filter = Filter::fromQueryString(
+ $this->url()->without(['page', 'limit', 'q', 'idRangeEx'])->getQueryString()
+ );
+ $table->applyFilter($filter);
+ if ($this->url()->hasParam('author')) {
+ $this->actions()->add(Link::create(
+ $this->translate('All changes'),
+ $this->url()
+ ->without(['author', 'page']),
+ null,
+ ['class' => 'icon-users', 'data-base-target' => '_self']
+ ));
+ } else {
+ $this->actions()->add(Link::create(
+ $this->translate('My changes'),
+ $this->url()
+ ->with('author', $this->Auth()->getUser()->getUsername())
+ ->without('page'),
+ null,
+ ['class' => 'icon-user', 'data-base-target' => '_self']
+ ));
+ }
+ if ($this->hasPermission('director/deploy') && ! $this->getBranch()->isBranch()) {
+ if ($this->db()->hasDeploymentEndpoint()) {
+ $this->actions()->add(DeployConfigForm::load()
+ ->setDb($this->db())
+ ->setApi($this->api())
+ ->handleRequest());
+ }
+ }
+
+ $table->renderTo($this);
+ }
+
+ /**
+ * @throws IcingaException
+ * @throws \Icinga\Exception\Http\HttpNotFoundException
+ * @throws \Icinga\Exception\ProgrammingError
+ */
+ public function activityAction()
+ {
+ if ($this->sendNotFoundForRestApi()) {
+ return;
+ }
+ $this->assertPermission('director/showconfig');
+ $p = $this->params;
+ $info = new ActivityLogInfo(
+ $this->db(),
+ $p->get('type'),
+ $p->get('name')
+ );
+
+ $info->setChecksum($p->get('checksum'))
+ ->setId($p->get('id'));
+
+ $this->tabs($info->getTabs($this->url()));
+ $info->showTab($this->params->get('show'));
+
+ $this->addTitle($info->getTitle());
+ $this->controls()->prepend($info->getPagination($this->url()));
+ $this->content()->add($info);
+ }
+
+ /**
+ * @throws \Icinga\Security\SecurityException
+ */
+ public function settingsAction()
+ {
+ if ($this->sendNotFoundForRestApi()) {
+ return;
+ }
+ $this->assertPermission('director/admin');
+
+ $this->addSingleTab($this->translate('Settings'))
+ ->addTitle($this->translate('Global Director Settings'));
+ $this->content()->add(
+ SettingsForm::load()
+ ->setSettings(new Settings($this->db()))
+ ->handleRequest()
+ );
+ }
+
+ /**
+ * Show all files for a given config
+ *
+ * @throws \Icinga\Exception\MissingParameterException
+ * @throws \Icinga\Security\SecurityException
+ */
+ public function filesAction()
+ {
+ if ($this->sendNotFoundForRestApi()) {
+ return;
+ }
+ $this->assertPermission('director/showconfig');
+ $config = IcingaConfig::load(
+ hex2bin($this->params->getRequired('checksum')),
+ $this->db()
+ );
+ $deploymentId = $this->params->get('deployment_id');
+
+ $tabs = $this->tabs();
+ if ($deploymentId) {
+ $tabs->add('deployment', [
+ 'label' => $this->translate('Deployment'),
+ 'url' => 'director/deployment',
+ 'urlParams' => ['id' => $deploymentId]
+ ]);
+ }
+
+ $tabs->add('config', [
+ 'label' => $this->translate('Config'),
+ 'url' => $this->url(),
+ ])->activate('config');
+
+ $this->addTitle($this->translate('Generated config'));
+ $this->content()->add(new DeployedConfigInfoHeader(
+ $config,
+ $this->db(),
+ $this->api(),
+ $this->getBranch(),
+ $deploymentId
+ ));
+
+ GeneratedConfigFileTable::load($config, $this->db())
+ ->setActiveFilename($this->params->get('active_file'))
+ ->setDeploymentId($deploymentId)
+ ->renderTo($this);
+ }
+
+ /**
+ * Show a single file
+ *
+ * @throws \Icinga\Exception\MissingParameterException
+ * @throws \Icinga\Security\SecurityException
+ */
+ public function fileAction()
+ {
+ if ($this->sendNotFoundForRestApi()) {
+ return;
+ }
+ $this->assertPermission('director/showconfig');
+ $filename = $this->params->getRequired('file_path');
+ $this->configTabs()->add('file', array(
+ 'label' => $this->translate('Rendered file'),
+ 'url' => $this->url(),
+ ))->activate('file');
+
+ $params = $this->getConfigTabParams();
+ if ('deployment' === $this->params->get('backTo')) {
+ $this->addBackLink('director/deployment', ['id' => $params['deployment_id']]);
+ } else {
+ $params['active_file'] = $filename;
+ $this->addBackLink('director/config/files', $params);
+ }
+
+ $config = IcingaConfig::load(hex2bin($this->params->get('config_checksum')), $this->db());
+ $this->addTitle($this->translate('Config file "%s"'), $filename);
+ $this->content()->add(new ShowConfigFile(
+ $config->getFile($filename),
+ $this->params->get('highlight'),
+ $this->params->get('highlightSeverity')
+ ));
+ }
+
+ /**
+ * TODO: Check if this can be removed
+ *
+ * @throws \Icinga\Security\SecurityException
+ */
+ public function storeAction()
+ {
+ $this->assertPermission('director/deploy');
+ try {
+ $config = IcingaConfig::generate($this->db());
+ } catch (Exception $e) {
+ Notification::error($e->getMessage());
+ $this->redirectNow('director/config/deployments');
+ }
+ $this->redirectNow(
+ Url::fromPath(
+ 'director/config/files',
+ array('checksum' => $config->getHexChecksum())
+ )
+ );
+ }
+
+ /**
+ * @throws \Icinga\Security\SecurityException
+ */
+ public function diffAction()
+ {
+ if ($this->sendNotFoundForRestApi()) {
+ return;
+ }
+ $this->assertPermission('director/showconfig');
+
+ $db = $this->db();
+ $this->addTitle($this->translate('Config diff'));
+ $this->addSingleTab($this->translate('Config diff'));
+
+ $leftSum = $this->params->get('left');
+ $rightSum = $this->params->get('right');
+
+ $configs = $db->enumDeployedConfigs();
+ foreach (array($leftSum, $rightSum) as $sum) {
+ if (! array_key_exists($sum, $configs)) {
+ $configs[$sum] = substr($sum, 0, 7);
+ }
+ }
+
+ $baseUrl = $this->url()->without(['left', 'right']);
+ $this->content()->add(Html::tag('form', ['action' => (string) $baseUrl, 'method' => 'GET'], [
+ new HtmlString($this->view->formSelect(
+ 'left',
+ $leftSum,
+ ['class' => 'autosubmit', 'style' => 'width: 37%'],
+ [null => $this->translate('- please choose -')] + $configs
+ )),
+ Link::create(
+ Icon::create('flapping'),
+ $baseUrl,
+ ['left' => $rightSum, 'right' => $leftSum]
+ ),
+ new HtmlString($this->view->formSelect(
+ 'right',
+ $rightSum,
+ ['class' => 'autosubmit', 'style' => 'width: 37%'],
+ [null => $this->translate('- please choose -')] + $configs
+ )),
+ ]));
+
+ if ($rightSum === null || $leftSum === null || ! strlen($rightSum) || ! strlen($leftSum)) {
+ return;
+ }
+ ConfigFileDiffTable::load($leftSum, $rightSum, $this->db())->renderTo($this);
+ }
+
+ /**
+ * @throws IcingaException
+ * @throws \Icinga\Exception\MissingParameterException
+ */
+ public function filediffAction()
+ {
+ if ($this->sendNotFoundForRestApi()) {
+ return;
+ }
+ $this->assertPermission('director/showconfig');
+
+ $p = $this->params;
+ $db = $this->db();
+ $leftSum = $p->getRequired('left');
+ $rightSum = $p->getRequired('right');
+ $filename = $p->getRequired('file_path');
+
+ $left = IcingaConfig::load(hex2bin($leftSum), $db);
+ $right = IcingaConfig::load(hex2bin($rightSum), $db);
+
+ $this
+ ->addTitle($this->translate('Config file "%s"'), $filename)
+ ->addSingleTab($this->translate('Diff'))
+ ->content()->add(new SideBySideDiff(new PhpDiff(
+ $left->getFile($filename),
+ $right->getFile($filename)
+ )));
+ }
+
+ protected function showOptionalBranchActivity()
+ {
+ if ($this->url()->hasParam('idRangeEx')) {
+ return;
+ }
+ $branch = $this->getBranch();
+ if ($branch->isBranch() && (int) $this->params->get('page', '1') === 1) {
+ $table = new BranchActivityTable($branch->getUuid(), $this->db());
+ if (count($table) > 0) {
+ $this->content()->add(Hint::info(Html::sprintf($this->translate(
+ 'The following modifications are visible in this %s only...'
+ ), Branch::requireHook()->linkToBranch(
+ $branch,
+ $this->Auth(),
+ $this->translate('configuration branch')
+ ))));
+ $this->content()->add($table);
+ $this->content()->add(Html::tag('br'));
+ $this->content()->add(Hint::ok($this->translate(
+ '...and the modifications below are already in the main branch:'
+ )));
+ $this->content()->add(Html::tag('br'));
+ }
+ }
+ }
+
+ /**
+ * @param $checksum
+ */
+ protected function deploymentSucceeded($checksum)
+ {
+ if ($this->getRequest()->isApiRequest()) {
+ $this->sendJson($this->getResponse(), (object) array('checksum' => $checksum));
+ return;
+ } else {
+ $url = Url::fromPath('director/config/deployments');
+ Notification::success(
+ $this->translate('Config has been submitted, validation is going on')
+ );
+ $this->redirectNow($url);
+ }
+ }
+
+ /**
+ * @param $checksum
+ * @param null $error
+ */
+ protected function deploymentFailed($checksum, $error = null)
+ {
+ $extra = $error ? ': ' . $error: '';
+
+ if ($this->getRequest()->isApiRequest()) {
+ $this->sendJsonError($this->getResponse(), 'Config deployment failed' . $extra);
+ return;
+ } else {
+ $url = Url::fromPath('director/config/files', array('checksum' => $checksum));
+ Notification::error(
+ $this->translate('Config deployment failed') . $extra
+ );
+ $this->redirectNow($url);
+ }
+ }
+
+ /**
+ * @return \gipfl\IcingaWeb2\Widget\Tabs
+ */
+ protected function configTabs()
+ {
+ $tabs = $this->tabs();
+
+ if ($this->hasPermission('director/deploy')
+ && $deploymentId = $this->params->get('deployment_id')
+ ) {
+ $tabs->add('deployment', [
+ 'label' => $this->translate('Deployment'),
+ 'url' => 'director/deployment',
+ 'urlParams' => ['id' => $deploymentId]
+ ]);
+ }
+
+ if ($this->hasPermission('director/showconfig')) {
+ $tabs->add('config', [
+ 'label' => $this->translate('Config'),
+ 'url' => 'director/config/files',
+ 'urlParams' => $this->getConfigTabParams()
+ ]);
+ }
+
+ return $tabs;
+ }
+
+ protected function getConfigTabParams()
+ {
+ $params = [
+ 'checksum' => $this->params->get(
+ 'config_checksum',
+ $this->params->get('checksum')
+ )
+ ];
+
+ if ($deploymentId = $this->params->get('deployment_id')) {
+ $params['deployment_id'] = $deploymentId;
+ }
+
+ return $params;
+ }
+}
diff --git a/application/controllers/CustomvarController.php b/application/controllers/CustomvarController.php
new file mode 100644
index 0000000..f0d4574
--- /dev/null
+++ b/application/controllers/CustomvarController.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Web\Table\CustomvarVariantsTable;
+
+class CustomvarController extends ActionController
+{
+ public function variantsAction()
+ {
+ $varName = $this->params->getRequired('name');
+ $this->addSingleTab($this->translate('Custom Variable'))
+ ->addTitle($this->translate('Custom Variable variants: %s'), $varName);
+ CustomvarVariantsTable::create($this->db(), $varName)->renderTo($this);
+ }
+}
diff --git a/application/controllers/DaemonController.php b/application/controllers/DaemonController.php
new file mode 100644
index 0000000..ab0038f
--- /dev/null
+++ b/application/controllers/DaemonController.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use gipfl\Web\Widget\Hint;
+use Icinga\Application\Icinga;
+use Icinga\Module\Director\Daemon\RunningDaemonInfo;
+use Icinga\Module\Director\Web\Tabs\MainTabs;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Web\Widget\BackgroundDaemonDetails;
+use Icinga\Module\Director\Web\Widget\Documentation;
+use ipl\Html\Html;
+
+class DaemonController extends ActionController
+{
+ public function indexAction()
+ {
+ $this->setAutorefreshInterval(10);
+ $this->tabs(new MainTabs($this->Auth(), $this->getDbResourceName()))->activate('daemon');
+ $this->setTitle($this->translate('Director Background Daemon'));
+ // Avoiding layout issues:
+ $this->content()->add(Html::tag('h1', $this->translate('Director Background Daemon')));
+ // TODO: move dashboard titles into controls. Or figure out whether 2.7 "broke" this
+
+ $error = null;
+ try {
+ $db = $this->db()->getDbAdapter();
+ $daemons = $db->fetchAll(
+ $db->select()->from('director_daemon_info')->order('fqdn')->order('username')->order('pid')
+ );
+ } catch (\Exception $e) {
+ $daemons = [];
+ $error = $e->getMessage();
+ }
+
+ if (empty($daemons)) {
+ $documentation = new Documentation(Icinga::app(), $this->Auth());
+ $message = Html::sprintf($this->translate(
+ 'The Icinga Director Background Daemon is not running.'
+ . ' Please check our %s in case you need step by step instructions'
+ . ' showing you how to fix this.'
+ ), $documentation->getModuleLink(
+ $this->translate('documentation'),
+ 'director',
+ '75-Background-Daemon',
+ $this->translate('Icinga Director Background Daemon')
+ ));
+ $this->content()->add(Hint::error([
+ $message,
+ ($error ? [Html::tag('br'), Html::tag('strong', $error)] : null),
+ ]));
+ return;
+ }
+
+ try {
+ foreach ($daemons as $daemon) {
+ $info = new RunningDaemonInfo($daemon);
+ $this->content()->add([new BackgroundDaemonDetails($info, $daemon) /*, $logWindow*/]);
+ }
+ } catch (\Exception $e) {
+ $this->content()->add(Hint::error($e->getMessage()));
+ }
+ }
+}
diff --git a/application/controllers/DashboardController.php b/application/controllers/DashboardController.php
new file mode 100644
index 0000000..95c1cd0
--- /dev/null
+++ b/application/controllers/DashboardController.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Tabs\MainTabs;
+use Icinga\Module\Director\Dashboard\Dashboard;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Web\Form\DbSelectorForm;
+
+class DashboardController extends ActionController
+{
+ protected function checkDirectorPermissions()
+ {
+ // No special permissions required, override parent method
+ }
+
+ protected function addDbSelection()
+ {
+ if ($this->isMultiDbSetup()) {
+ $form = new DbSelectorForm(
+ $this->getResponse(),
+ $this->Window(),
+ $this->listAllowedDbResourceNames()
+ );
+ $this->content()->add($form);
+ $form->handleRequest($this->getServerRequest());
+ }
+ }
+
+ public function indexAction()
+ {
+ if ($this->getRequest()->isGet()) {
+ $this->setAutorefreshInterval(10);
+ }
+
+ $mainDashboards = [
+ 'Objects',
+ 'Alerts',
+ 'Branches',
+ 'Automation',
+ 'Deployment',
+ 'Director',
+ 'Data',
+ ];
+ $this->setTitle($this->translate('Icinga Director - Main Dashboard'));
+ $names = $this->params->getValues('name', $mainDashboards);
+ if (! $this->params->has('name')) {
+ $this->addDbSelection();
+ }
+ if (count($names) === 1) {
+ $name = $names[0];
+ $dashboard = Dashboard::loadByName($name, $this->db());
+ $this->tabs($dashboard->getTabs())->activate($name);
+ } else {
+ $this->tabs(new MainTabs($this->Auth(), $this->getDbResourceName()))->activate('main');
+ }
+
+ $cntDashboards = 0;
+ foreach ($names as $name) {
+ if ($name instanceof Dashboard) {
+ $dashboard = $name;
+ } else {
+ $dashboard = Dashboard::loadByName($name, $this->db());
+ }
+ if ($dashboard->isAvailable()) {
+ $cntDashboards++;
+ $this->content()->add($dashboard);
+ }
+ }
+
+ if ($cntDashboards === 0) {
+ $msg = $this->translate(
+ 'No dashboard available, you might have not enough permissions'
+ );
+ $this->content()->add($msg);
+ }
+ }
+}
diff --git a/application/controllers/DataController.php b/application/controllers/DataController.php
new file mode 100644
index 0000000..ae4bbcf
--- /dev/null
+++ b/application/controllers/DataController.php
@@ -0,0 +1,406 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use gipfl\Web\Widget\Hint;
+use Icinga\Exception\NotFoundError;
+use Icinga\Module\Director\Forms\DirectorDatalistEntryForm;
+use Icinga\Module\Director\Forms\DirectorDatalistForm;
+use Icinga\Module\Director\Forms\IcingaServiceDictionaryMemberForm;
+use Icinga\Module\Director\Objects\DirectorDatalist;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Objects\IcingaService;
+use Icinga\Module\Director\PlainObjectRenderer;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Web\Form\IcingaObjectFieldLoader;
+use Icinga\Module\Director\Web\Table\CustomvarTable;
+use Icinga\Module\Director\Web\Table\DatafieldCategoryTable;
+use Icinga\Module\Director\Web\Table\DatafieldTable;
+use Icinga\Module\Director\Web\Table\DatalistEntryTable;
+use Icinga\Module\Director\Web\Table\DatalistTable;
+use Icinga\Module\Director\Web\Tabs\DataTabs;
+use gipfl\IcingaWeb2\Link;
+use InvalidArgumentException;
+use ipl\Html\Html;
+use ipl\Html\Table;
+
+class DataController extends ActionController
+{
+ public function listsAction()
+ {
+ $this->addTitle($this->translate('Data lists'));
+ $this->actions()->add(
+ Link::create($this->translate('Add'), 'director/data/list', null, [
+ 'class' => 'icon-plus',
+ 'data-base-target' => '_next'
+ ])
+ );
+
+ $this->tabs(new DataTabs())->activate('datalist');
+ (new DatalistTable($this->db()))->renderTo($this);
+ }
+
+ /**
+ * @throws \Icinga\Exception\MissingParameterException
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function listAction()
+ {
+ $form = DirectorDatalistForm::load()
+ ->setSuccessUrl('director/data/lists')
+ ->setDb($this->db());
+
+ if ($name = $this->params->get('name')) {
+ $list = $this->requireList('name');
+ $form->setObject($list);
+ $this->addListActions($list);
+ $this->addTitle(
+ $this->translate('Data List: %s'),
+ $list->get('list_name')
+ )->addListTabs($name, 'list');
+ } else {
+ $this
+ ->addTitle($this->translate('Add a new Data List'))
+ ->addSingleTab($this->translate('Data List'));
+ }
+
+ $this->content()->add($form->handleRequest());
+ }
+
+ public function fieldsAction()
+ {
+ $this->setAutorefreshInterval(10);
+ $this->tabs(new DataTabs())->activate('datafield');
+ $this->addTitle($this->translate('Data Fields'));
+ $this->actions()->add(Link::create(
+ $this->translate('Add'),
+ 'director/datafield/add',
+ null,
+ [
+ 'class' => 'icon-plus',
+ 'data-base-target' => '_next',
+ ]
+ ));
+
+ (new DatafieldTable($this->db()))->renderTo($this);
+ }
+
+ public function fieldcategoriesAction()
+ {
+ $this->setAutorefreshInterval(10);
+ $this->tabs(new DataTabs())->activate('datafieldcategory');
+ $this->addTitle($this->translate('Data Field Categories'));
+ $this->actions()->add(Link::create(
+ $this->translate('Add'),
+ 'director/datafieldcategory/add',
+ null,
+ [
+ 'class' => 'icon-plus',
+ 'data-base-target' => '_next',
+ ]
+ ));
+
+ (new DatafieldCategoryTable($this->db()))->renderTo($this);
+ }
+
+ public function varsAction()
+ {
+ $this->tabs(new DataTabs())->activate('customvars');
+ $this->addTitle($this->translate('Custom Vars - Overview'));
+ (new CustomvarTable($this->db()))->renderTo($this);
+ }
+
+ /**
+ * @throws \Icinga\Exception\MissingParameterException
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function listentryAction()
+ {
+ $entryName = $this->params->get('entry_name');
+ $list = $this->requireList('list');
+ $this->addListActions($list);
+ $listId = $list->get('id');
+ $listName = $list->get('list_name');
+ $title = $title = $this->translate('List Entries') . ': ' . $listName;
+ $this->addTitle($title);
+
+ $form = DirectorDatalistEntryForm::load()
+ ->setSuccessUrl('director/data/listentry', ['list' => $listName])
+ ->setList($list);
+
+ if (null !== $entryName) {
+ $form->loadObject([
+ 'list_id' => $listId,
+ 'entry_name' => $entryName
+ ]);
+ $this->actions()->add(Link::create(
+ $this->translate('back'),
+ 'director/data/listentry',
+ ['list' => $listName],
+ ['class' => 'icon-left-big']
+ ));
+ }
+ $form->handleRequest();
+
+ $this->addListTabs($listName, 'entries');
+
+ $table = new DatalistEntryTable($this->db());
+ $table->getAttributes()->set('data-base-target', '_self');
+ $table->setList($list);
+ $this->content()->add([$form, $table]);
+ }
+
+ public function dictionaryAction()
+ {
+ $connection = $this->db();
+ $this->addSingleTab('Nested Dictionary');
+ $varName = $this->params->get('varname');
+ $instance = $this->url()->getParam('instance');
+ $action = $this->url()->getParam('action');
+ $object = $this->requireObject();
+
+ if ($instance || $action) {
+ $this->actions()->add(
+ Link::create($this->translate('Back'), $this->url()->without(['action', 'instance']), null, [
+ 'class' => 'icon-edit'
+ ])
+ );
+ } else {
+ $this->actions()->add(
+ Link::create($this->translate('Add'), $this->url(), [
+ 'action' => 'add'
+ ], [
+ 'class' => 'icon-edit'
+ ])
+ );
+ }
+ $subjects = $this->prepareSubjectsLabel($object, $varName);
+ $fieldLoader = new IcingaObjectFieldLoader($object);
+ $instances = $this->getCurrentInstances($object, $varName);
+
+ if (empty($instances)) {
+ $this->content()->add(Hint::info(sprintf(
+ $this->translate('No %s have been created yet'),
+ $subjects
+ )));
+ } else {
+ $this->content()->add($this->prepareInstancesTable($instances));
+ }
+
+ $field = $this->getFieldByName($fieldLoader, $varName);
+ $template = $object::load([
+ 'object_name' => $field->getSetting('template_name')
+ ], $connection);
+
+ $form = new IcingaServiceDictionaryMemberForm();
+ $form->setDb($connection);
+ if ($instance) {
+ $instanceObject = $object::create([
+ 'imports' => [$template],
+ 'object_name' => $instance,
+ 'vars' => $instances[$instance]
+ ], $connection);
+ $form->setObject($instanceObject);
+ } elseif ($action === 'add') {
+ $form->presetImports([$template->getObjectName()]);
+ } else {
+ return;
+ }
+ if ($instance) {
+ if (! isset($instances[$instance])) {
+ throw new NotFoundError("There is no such instance: $instance");
+ }
+ $subTitle = sprintf($this->translate('Modify instance: %s'), $instance);
+ } else {
+ $subTitle = $this->translate('Add a new instance');
+ }
+
+ $this->content()->add(Html::tag('h2', ['style' => 'margin-top: 2em'], $subTitle));
+ $form->handleRequest($this->getRequest());
+ $this->content()->add($form);
+ if ($form->succeeded()) {
+ $virtualObject = $form->getObject();
+ $name = $virtualObject->getObjectName();
+ $params = $form->getObject()->getVars();
+ $instances[$name] = $params;
+ if ($name !== $instance) { // Has been renamed
+ unset($instances[$instance]);
+ }
+ ksort($instances);
+ $object->set("vars.$varName", (object)$instances);
+ $object->store();
+ $this->redirectNow($this->url()->without(['instance', 'action']));
+ } elseif ($form->shouldBeDeleted()) {
+ unset($instances[$instance]);
+ if (empty($instances)) {
+ $object->set("vars.$varName", null)->store();
+ } else {
+ $object->set("vars.$varName", (object)$instances)->store();
+ }
+ $this->redirectNow($this->url()->without(['instance', 'action']));
+ }
+ }
+
+ protected function requireObject()
+ {
+ $connection = $this->db();
+ $hostName = $this->params->getRequired('host');
+ $serviceName = $this->params->get('service');
+ if ($serviceName) {
+ $host = IcingaHost::load($hostName, $connection);
+ $object = IcingaService::load([
+ 'host_id' => $host->get('id'),
+ 'object_name' => $serviceName,
+ ], $connection);
+ } else {
+ $object = IcingaHost::load($hostName, $connection);
+ }
+
+ if (! $object->isObject()) {
+ throw new InvalidArgumentException(sprintf(
+ 'Only single objects allowed, %s is a %s',
+ $object->getObjectName(),
+ $object->get('object_type')
+ ));
+ }
+ return $object;
+ }
+
+ protected function shorten($string, $maxLen)
+ {
+ if (strlen($string) <= $maxLen) {
+ return $string;
+ }
+
+ return substr($string, 0, $maxLen) . '...';
+ }
+
+ protected function getFieldByName(IcingaObjectFieldLoader $loader, $name)
+ {
+ foreach ($loader->getFields() as $field) {
+ if ($field->get('varname') === $name) {
+ return $field;
+ }
+ }
+
+ throw new InvalidArgumentException("Found no configured field for '$name'");
+ }
+
+ /**
+ * @param IcingaObject $object
+ * @param $varName
+ * @return array
+ */
+ protected function getCurrentInstances(IcingaObject $object, $varName)
+ {
+ $currentVars = $object->getVars();
+ if (isset($currentVars->$varName)) {
+ $currentValue = $currentVars->$varName;
+ } else {
+ $currentValue = (object)[];
+ }
+ if (is_object($currentValue)) {
+ $currentValue = (array)$currentValue;
+ } else {
+ throw new InvalidArgumentException(sprintf(
+ '"%s" is not a valid Dictionary',
+ json_encode($currentValue)
+ ));
+ }
+ return $currentValue;
+ }
+
+ /**
+ * @param array $currentValue
+ * @param $subjects
+ * @return Hint|Table
+ */
+ protected function prepareInstancesTable(array $currentValue)
+ {
+ $table = new Table();
+ $table->addAttributes([
+ 'class' => 'common-table table-row-selectable'
+ ]);
+ $table->getHeader()->add(
+ Table::row([
+ $this->translate('Key / Instance'),
+ $this->translate('Properties')
+ ], ['style' => 'text-align: left'], 'th')
+ );
+ foreach ($currentValue as $key => $item) {
+ $table->add(Table::row([
+ Link::create($key, $this->url()->with('instance', $key)),
+ str_replace("\n", ' ', $this->shorten(PlainObjectRenderer::render($item), 512))
+ ]));
+ }
+
+ return $table;
+ }
+
+ /**
+ * @param IcingaObject $object
+ * @param $varName
+ * @return string
+ */
+ protected function prepareSubjectsLabel(IcingaObject $object, $varName)
+ {
+ if ($object instanceof IcingaService) {
+ $hostName = $object->get('host');
+ $subjects = $object->getObjectName() . " ($varName)";
+ } else {
+ $hostName = $object->getObjectName();
+ $subjects = sprintf(
+ $this->translate('%s instances'),
+ $varName
+ );
+ }
+ $this->addTitle(sprintf(
+ $this->translate('%s on %s'),
+ $subjects,
+ $hostName
+ ));
+ return $subjects;
+ }
+
+ protected function addListActions(DirectorDatalist $list)
+ {
+ $this->actions()->add(
+ Link::create(
+ $this->translate('Add to Basket'),
+ 'director/basket/add',
+ [
+ 'type' => 'DataList',
+ 'names' => $list->getUniqueIdentifier()
+ ],
+ ['class' => 'icon-tag']
+ )
+ );
+ }
+
+ /**
+ * @param $paramName
+ * @return DirectorDatalist
+ * @throws \Icinga\Exception\MissingParameterException
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function requireList($paramName)
+ {
+ return DirectorDatalist::load($this->params->getRequired($paramName), $this->db());
+ }
+
+ protected function addListTabs($name, $activate)
+ {
+ $this->tabs()->add('list', [
+ 'url' => 'director/data/list',
+ 'urlParams' => ['name' => $name],
+ 'label' => $this->translate('Edit list'),
+ ])->add('entries', [
+ 'url' => 'director/data/listentry',
+ 'urlParams' => ['list' => $name],
+ 'label' => $this->translate('List entries'),
+ ])->activate($activate);
+
+ return $this;
+ }
+}
diff --git a/application/controllers/DatafieldController.php b/application/controllers/DatafieldController.php
new file mode 100644
index 0000000..afad317
--- /dev/null
+++ b/application/controllers/DatafieldController.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Forms\DirectorDatafieldForm;
+use Icinga\Module\Director\Web\Controller\ActionController;
+
+class DatafieldController extends ActionController
+{
+ public function addAction()
+ {
+ $this->indexAction();
+ }
+
+ public function editAction()
+ {
+ $this->indexAction();
+ }
+
+ public function indexAction()
+ {
+ $form = DirectorDatafieldForm::load()
+ ->setDb($this->db());
+
+ if ($id = $this->params->get('id')) {
+ $form->loadObject((int) $id);
+ $this->addTitle(
+ $this->translate('Modify %s'),
+ $form->getObject()->varname
+ );
+ $this->addSingleTab($this->translate('Edit a Field'));
+ } else {
+ $this->addTitle($this->translate('Add a new Data Field'));
+ $this->addSingleTab($this->translate('New Field'));
+ }
+
+ $form->handleRequest();
+ $this->content()->add($form);
+ }
+}
diff --git a/application/controllers/DatafieldcategoryController.php b/application/controllers/DatafieldcategoryController.php
new file mode 100644
index 0000000..32c76ef
--- /dev/null
+++ b/application/controllers/DatafieldcategoryController.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Forms\DirectorDatafieldCategoryForm;
+use Icinga\Module\Director\Web\Controller\ActionController;
+
+class DatafieldcategoryController extends ActionController
+{
+ public function addAction()
+ {
+ $this->indexAction();
+ }
+
+ public function editAction()
+ {
+ $this->indexAction();
+ }
+
+ public function indexAction()
+ {
+ $edit = false;
+
+ if ($name = $this->params->get('name')) {
+ $edit = true;
+ }
+
+ $form = DirectorDatafieldCategoryForm::load()
+ ->setDb($this->db());
+
+ if ($edit) {
+ $form->loadObject($name);
+ $this->addTitle(
+ $this->translate('Modify %s'),
+ $form->getObject()->category_name
+ );
+ $this->addSingleTab($this->translate('Edit a Category'));
+ } else {
+ $this->addTitle($this->translate('Add a new Data Field Category'));
+ $this->addSingleTab($this->translate('New Category'));
+ }
+
+ $form->handleRequest();
+ $this->content()->add($form);
+ }
+}
diff --git a/application/controllers/DependenciesController.php b/application/controllers/DependenciesController.php
new file mode 100644
index 0000000..276dd63
--- /dev/null
+++ b/application/controllers/DependenciesController.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectsController;
+
+class DependenciesController extends ObjectsController
+{
+ protected function addObjectsTabs()
+ {
+ $res = parent::addObjectsTabs();
+ $this->tabs()->remove('index');
+ return $res;
+ }
+}
diff --git a/application/controllers/DependencyController.php b/application/controllers/DependencyController.php
new file mode 100644
index 0000000..9d21cd5
--- /dev/null
+++ b/application/controllers/DependencyController.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Forms\IcingaDependencyForm;
+use Icinga\Module\Director\Web\Controller\ObjectController;
+use Icinga\Module\Director\Objects\IcingaDependency;
+
+class DependencyController extends ObjectController
+{
+ protected $apply;
+
+ /**
+ * @throws \Icinga\Exception\ConfigurationError
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function init()
+ {
+ parent::init();
+
+ if ($apply = $this->params->get('apply')) {
+ $this->apply = IcingaDependency::load(
+ array('object_name' => $apply, 'object_type' => 'template'),
+ $this->db()
+ );
+ }
+ }
+
+ /**
+ * @return \Icinga\Module\Director\Objects\IcingaObject
+ * @throws \Icinga\Exception\ConfigurationError
+ * @throws \Icinga\Exception\InvalidPropertyException
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function loadObject()
+ {
+ if ($this->object === null) {
+ if ($name = $this->params->get('name')) {
+ $params = array('object_name' => $name);
+ $db = $this->db();
+
+ $this->object = IcingaDependency::load($params, $db);
+ } else {
+ parent::loadObject();
+ }
+ }
+
+ return $this->object;
+ }
+
+ /**
+ * Hint: this is never being called. Why?
+ *
+ * @param $form
+ */
+ protected function beforeHandlingAddRequest($form)
+ {
+ /** @var IcingaDependencyForm $form */
+ if ($this->apply) {
+ $form->createApplyRuleFor($this->apply);
+ }
+ }
+}
diff --git a/application/controllers/DependencytemplateController.php b/application/controllers/DependencytemplateController.php
new file mode 100644
index 0000000..e2bc49d
--- /dev/null
+++ b/application/controllers/DependencytemplateController.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Objects\IcingaDependency;
+use Icinga\Module\Director\Web\Controller\TemplateController;
+
+class DependencytemplateController extends TemplateController
+{
+ protected function requireTemplate()
+ {
+ return IcingaDependency::load([
+ 'object_name' => $this->params->get('name')
+ ], $this->db());
+ }
+}
diff --git a/application/controllers/DeploymentController.php b/application/controllers/DeploymentController.php
new file mode 100644
index 0000000..2d35f3c
--- /dev/null
+++ b/application/controllers/DeploymentController.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Objects\DirectorDeploymentLog;
+use Icinga\Module\Director\Web\Widget\DeploymentInfo;
+
+class DeploymentController extends ActionController
+{
+ protected function checkDirectorPermissions()
+ {
+ $this->assertPermission('director/deploy');
+ }
+
+ public function indexAction()
+ {
+ $info = new DeploymentInfo(DirectorDeploymentLog::load(
+ $this->params->get('id'),
+ $this->db()
+ ));
+ $this->addTitle($this->translate('Deployment details'));
+ $this->tabs(
+ $info->getTabs($this->getAuth(), $this->getRequest())
+ )->activate('deployment');
+ $this->content()->add($info);
+ }
+}
diff --git a/application/controllers/EndpointController.php b/application/controllers/EndpointController.php
new file mode 100644
index 0000000..e8a4fb0
--- /dev/null
+++ b/application/controllers/EndpointController.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectController;
+
+class EndpointController extends ObjectController
+{
+}
diff --git a/application/controllers/EndpointsController.php b/application/controllers/EndpointsController.php
new file mode 100644
index 0000000..40501a4
--- /dev/null
+++ b/application/controllers/EndpointsController.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectsController;
+
+class EndpointsController extends ObjectsController
+{
+}
diff --git a/application/controllers/HealthController.php b/application/controllers/HealthController.php
new file mode 100644
index 0000000..4fac4d2
--- /dev/null
+++ b/application/controllers/HealthController.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Tabs\MainTabs;
+use ipl\Html\Html;
+use Icinga\Module\Director\Web\Widget\HealthCheckPluginOutput;
+use Icinga\Module\Director\Health;
+use Icinga\Module\Director\Web\Controller\ActionController;
+
+class HealthController extends ActionController
+{
+ public function indexAction()
+ {
+ $this->setAutorefreshInterval(10);
+ $this->tabs(new MainTabs($this->Auth(), $this->getDbResourceName()))->activate('health');
+ $this->setTitle($this->translate('Director Health'));
+ $health = new Health();
+ $health->setDbResourceName($this->getDbResourceName());
+ $output = new HealthCheckPluginOutput($health);
+ $this->content()->add($output);
+ $this->content()->add([
+ Html::tag('h1', ['class' => 'icon-pin'], $this->translate('Hint: Check Plugin')),
+ Html::tag('p', $this->translate(
+ 'Did you know that you can run this entire Health Check'
+ . ' (or just some sections) as an Icinga Check on a regular'
+ . ' base?'
+ ))
+ ]);
+ }
+}
diff --git a/application/controllers/HostController.php b/application/controllers/HostController.php
new file mode 100644
index 0000000..e107d22
--- /dev/null
+++ b/application/controllers/HostController.php
@@ -0,0 +1,637 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use gipfl\Web\Widget\Hint;
+use Icinga\Module\Director\Monitoring;
+use Icinga\Module\Director\Web\Table\ObjectsTableService;
+use ipl\Html\Html;
+use gipfl\IcingaWeb2\Link;
+use gipfl\IcingaWeb2\Url;
+use gipfl\IcingaWeb2\Widget\Tabs;
+use Exception;
+use Icinga\Module\Director\CustomVariable\CustomVariableDictionary;
+use Icinga\Module\Director\Db\AppliedServiceSetLoader;
+use Icinga\Module\Director\DirectorObject\Lookup\ServiceFinder;
+use Icinga\Module\Director\Forms\IcingaAddServiceForm;
+use Icinga\Module\Director\Forms\IcingaServiceForm;
+use Icinga\Module\Director\Forms\IcingaServiceSetForm;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Objects\IcingaService;
+use Icinga\Module\Director\Objects\IcingaServiceSet;
+use Icinga\Module\Director\Restriction\HostgroupRestriction;
+use Icinga\Module\Director\Repository\IcingaTemplateRepository;
+use Icinga\Module\Director\Web\Controller\ObjectController;
+use Icinga\Module\Director\Web\SelfService;
+use Icinga\Module\Director\Web\Table\IcingaHostAppliedForServiceTable;
+use Icinga\Module\Director\Web\Table\IcingaHostAppliedServicesTable;
+use Icinga\Module\Director\Web\Table\IcingaServiceSetServiceTable;
+
+class HostController extends ObjectController
+{
+ protected function checkDirectorPermissions()
+ {
+ if ($this->isServiceAction() && (new Monitoring())->authCanEditService(
+ $this->Auth(),
+ $this->getParam('name'),
+ $this->getParam('service')
+ )) {
+ return;
+ }
+
+ if ($this->isServicesReadOnlyAction()) {
+ $this->assertPermission('director/monitoring/services-ro');
+ return;
+ }
+
+ if ($this->hasPermission('director/hosts')) { // faster
+ return;
+ }
+
+ if ($this->canModifyHostViaMonitoringPermissions($this->getParam('name'))) {
+ return;
+ }
+
+ $this->assertPermission('director/hosts'); // complain about default hosts permission
+ }
+
+ protected function isServicesReadOnlyAction()
+ {
+ return in_array($this->getRequest()->getActionName(), [
+ 'servicesro',
+ 'findservice',
+ 'invalidservice',
+ ]);
+ }
+
+ protected function isServiceAction()
+ {
+ return in_array($this->getRequest()->getActionName(), [
+ 'servicesro',
+ 'findservice',
+ 'invalidservice',
+ 'servicesetservice',
+ 'appliedservice',
+ 'inheritedservice',
+ ]);
+ }
+
+ protected function canModifyHostViaMonitoringPermissions($hostname)
+ {
+ if ($this->hasPermission('director/monitoring/hosts')) {
+ $monitoring = new Monitoring();
+ return $monitoring->authCanEditHost($this->Auth(), $hostname);
+ }
+
+ return false;
+ }
+
+ /**
+ * @return HostgroupRestriction
+ */
+ protected function getHostgroupRestriction()
+ {
+ return new HostgroupRestriction($this->db(), $this->Auth());
+ }
+
+ public function editAction()
+ {
+ parent::editAction();
+ $this->addOptionalMonitoringLink();
+ }
+
+ public function serviceAction()
+ {
+ $host = $this->getHostObject();
+ $this->addServicesHeader();
+ $this->addTitle($this->translate('Add Service to %s'), $host->getObjectName());
+ $this->content()->add(
+ IcingaAddServiceForm::load()
+ ->setBranch($this->getBranch())
+ ->setHost($host)
+ ->setDb($this->db())
+ ->handleRequest()
+ );
+ }
+
+ public function servicesetAction()
+ {
+ $host = $this->getHostObject();
+ $this->addServicesHeader();
+ $this->addTitle($this->translate('Add Service Set to %s'), $host->getObjectName());
+
+ $this->content()->add(
+ IcingaServiceSetForm::load()
+ ->setBranch($this->getBranch())
+ ->setHost($host)
+ ->setDb($this->db())
+ ->handleRequest()
+ );
+ }
+
+ protected function addServicesHeader()
+ {
+ $host = $this->getHostObject();
+ $hostname = $host->getObjectName();
+ $this->tabs()->activate('services');
+
+ $this->actions()->add(Link::create(
+ $this->translate('Add service'),
+ 'director/host/service',
+ ['name' => $hostname],
+ ['class' => 'icon-plus']
+ ))->add(Link::create(
+ $this->translate('Add service set'),
+ 'director/host/serviceset',
+ ['name' => $hostname],
+ ['class' => 'icon-plus']
+ ));
+ }
+
+ public function findserviceAction()
+ {
+ $host = $this->getHostObject();
+ $this->redirectNow(
+ (new ServiceFinder($host, $this->getAuth()))
+ ->getRedirectionUrl($this->params->get('service'))
+ );
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function invalidserviceAction()
+ {
+ if (! $this->showInfoForNonDirectorService()) {
+ $this->content()->add(Hint::error(sprintf(
+ $this->translate('No such service: %s'),
+ $this->params->get('service')
+ )));
+ }
+
+ $this->servicesAction();
+ }
+
+ protected function showInfoForNonDirectorService()
+ {
+ try {
+ $api = $this->getApiIfAvailable();
+ if ($api) {
+ $name = $this->params->get('name') . '!' . $this->params->get('service');
+ $info = $api->getObject($name, 'Services');
+ if (isset($info->attrs->source_location)) {
+ $source = $info->attrs->source_location;
+ $this->content()->add(Hint::info(Html::sprintf(
+ 'The configuration for this object has not been rendered by'
+ . ' Icinga Director. You can find it on line %s in %s.',
+ Html::tag('strong', null, $source->first_line),
+ Html::tag('strong', null, $source->path)
+ )));
+ }
+ }
+
+ return true;
+ } catch (Exception $e) {
+ return false;
+ }
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function servicesAction()
+ {
+ $this->addServicesHeader();
+ $host = $this->getHostObject();
+ $this->addTitle($this->translate('Services: %s'), $host->getObjectName());
+ $branch = $this->getBranch();
+ $hostHasBeenCreatedInBranch = $branch->isBranch() && $host->get('id');
+ $content = $this->content();
+ $table = (new ObjectsTableService($this->db()))
+ ->setAuth($this->Auth())
+ ->setHost($host)
+ ->setBranch($branch)
+ ->setTitle($this->translate('Individual Service objects'))
+ ->removeQueryLimit();
+
+ if (count($table)) {
+ $content->add($table);
+ }
+
+ /** @var IcingaHost[] $parents */
+ $parents = IcingaTemplateRepository::instanceByObject($this->object)
+ ->getTemplatesFor($this->object, true);
+ foreach ($parents as $parent) {
+ $table = (new ObjectsTableService($this->db()))
+ ->setAuth($this->Auth())
+ ->setBranch($branch)
+ ->setHost($parent)
+ ->setInheritedBy($host)
+ ->removeQueryLimit();
+
+ if (count($table)) {
+ $content->add(
+ $table->setTitle(sprintf(
+ $this->translate('Inherited from %s'),
+ $parent->getObjectName()
+ ))
+ );
+ }
+ }
+
+ if (! $hostHasBeenCreatedInBranch) {
+ $this->addHostServiceSetTables($host);
+ }
+ foreach ($parents as $parent) {
+ $this->addHostServiceSetTables($parent, $host);
+ }
+
+ $appliedSets = AppliedServiceSetLoader::fetchForHost($host);
+ foreach ($appliedSets as $set) {
+ $title = sprintf($this->translate('%s (Applied Service set)'), $set->getObjectName());
+
+ $content->add(
+ IcingaServiceSetServiceTable::load($set)
+ // ->setHost($host)
+ ->setBranch($branch)
+ ->setAffectedHost($host)
+ ->setTitle($title)
+ ->removeQueryLimit()
+ );
+ }
+
+ $table = IcingaHostAppliedServicesTable::load($host)
+ ->setTitle($this->translate('Applied services'));
+
+ if (count($table)) {
+ $content->add($table);
+ }
+ }
+
+ /**
+ * Hint: this duplicates quite some logic from servicesAction. We might want
+ * to clean this up, but as soon as we store fully resolved Services this
+ * will be obsolete anyways
+ *
+ * @throws \Icinga\Exception\NotFoundError
+ * @throws \Icinga\Security\SecurityException
+ * @throws \Icinga\Exception\MissingParameterException
+ */
+ public function servicesroAction()
+ {
+ $this->assertPermission('director/monitoring/services-ro');
+ $host = $this->getHostObject();
+ $service = $this->params->getRequired('service');
+ $db = $this->db();
+ $branch = $this->getBranch();
+ $this->controls()->setTabs(new Tabs());
+ $this->addSingleTab($this->translate('Configuration (read-only)'));
+ $this->addTitle($this->translate('Services on %s'), $host->getObjectName());
+ $content = $this->content();
+
+ $table = (new ObjectsTableService($db))
+ ->setAuth($this->Auth())
+ ->setHost($host)
+ ->setBranch($branch)
+ ->setReadonly()
+ ->highlightService($service)
+ ->setTitle($this->translate('Individual Service objects'));
+
+ if (count($table)) {
+ $content->add($table);
+ }
+
+ /** @var IcingaHost[] $parents */
+ $parents = IcingaTemplateRepository::instanceByObject($this->object)
+ ->getTemplatesFor($this->object, true);
+ foreach ($parents as $parent) {
+ $table = (new ObjectsTableService($db))
+ ->setReadonly()
+ ->setBranch($branch)
+ ->setHost($parent)
+ ->highlightService($service)
+ ->setInheritedBy($host);
+ if (count($table)) {
+ $content->add(
+ $table->setTitle(sprintf(
+ 'Inherited from %s',
+ $parent->getObjectName()
+ ))
+ );
+ }
+ }
+
+ $this->addHostServiceSetTables($host);
+ foreach ($parents as $parent) {
+ $this->addHostServiceSetTables($parent, $host, $service);
+ }
+
+ $appliedSets = AppliedServiceSetLoader::fetchForHost($host);
+ foreach ($appliedSets as $set) {
+ $title = sprintf($this->translate('%s (Applied Service set)'), $set->getObjectName());
+
+ $content->add(
+ IcingaServiceSetServiceTable::load($set)
+ // ->setHost($host)
+ ->setBranch($branch)
+ ->setAffectedHost($host)
+ ->setReadonly()
+ ->highlightService($service)
+ ->setTitle($title)
+ );
+ }
+
+ $table = IcingaHostAppliedServicesTable::load($host)
+ ->setReadonly()
+ ->highlightService($service)
+ ->setTitle($this->translate('Applied services'));
+
+ if (count($table)) {
+ $content->add($table);
+ }
+ }
+
+ /**
+ * @param IcingaHost $host
+ * @param IcingaHost|null $affectedHost
+ */
+ protected function addHostServiceSetTables(IcingaHost $host, IcingaHost $affectedHost = null, $roService = null)
+ {
+ $db = $this->db();
+ if ($affectedHost === null) {
+ $affectedHost = $host;
+ }
+ if ($host->get('id') === null) {
+ return;
+ }
+
+ $query = $db->getDbAdapter()->select()
+ ->from(
+ array('ss' => 'icinga_service_set'),
+ 'ss.*'
+ )->join(
+ array('hsi' => 'icinga_service_set_inheritance'),
+ 'hsi.parent_service_set_id = ss.id',
+ array()
+ )->join(
+ array('hs' => 'icinga_service_set'),
+ 'hs.id = hsi.service_set_id',
+ array()
+ )->where('hs.host_id = ?', $host->get('id'));
+
+ $sets = IcingaServiceSet::loadAll($db, $query, 'object_name');
+ /** @var IcingaServiceSet $set*/
+ foreach ($sets as $name => $set) {
+ $title = sprintf($this->translate('%s (Service set)'), $name);
+ $table = IcingaServiceSetServiceTable::load($set)
+ ->setHost($host)
+ ->setBranch($this->getBranch())
+ ->setAffectedHost($affectedHost)
+ ->setTitle($title);
+ if ($roService) {
+ $table->setReadonly()->highlightService($roService);
+ }
+ $this->content()->add($table);
+ }
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function appliedserviceAction()
+ {
+ $db = $this->db();
+ $host = $this->getHostObject();
+ $serviceId = $this->params->get('service_id');
+ $parent = IcingaService::loadWithAutoIncId($serviceId, $db);
+ $serviceName = $parent->getObjectName();
+
+ $service = IcingaService::create([
+ 'imports' => $parent,
+ 'object_type' => 'apply',
+ 'object_name' => $serviceName,
+ 'host_id' => $host->get('id'),
+ 'vars' => $host->getOverriddenServiceVars($serviceName),
+ ], $db);
+
+ $this->addTitle(
+ $this->translate('Applied service: %s'),
+ $serviceName
+ );
+
+ $this->content()->add(
+ IcingaServiceForm::load()
+ ->setDb($db)
+ ->setBranch($this->getBranch())
+ ->setHost($host)
+ ->setApplyGenerated($parent)
+ ->setObject($service)
+ ->handleRequest()
+ );
+
+ $this->commonForServices();
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function inheritedserviceAction()
+ {
+ $db = $this->db();
+ $host = $this->getHostObject();
+ $serviceName = $this->params->get('service');
+ $from = IcingaHost::load($this->params->get('inheritedFrom'), $this->db());
+
+ $parent = IcingaService::load([
+ 'object_name' => $serviceName,
+ 'host_id' => $from->get('id')
+ ], $this->db());
+
+ // TODO: we want to eventually show the host template name, doesn't work
+ // as template resolution would break.
+ // $parent->object_name = $from->object_name;
+
+ $service = IcingaService::create([
+ 'object_type' => 'apply',
+ 'object_name' => $serviceName,
+ 'host_id' => $host->get('id'),
+ 'imports' => [$parent],
+ 'vars' => $host->getOverriddenServiceVars($serviceName),
+ ], $db);
+
+ $this->addTitle($this->translate('Inherited service: %s'), $serviceName);
+
+ $form = IcingaServiceForm::load()
+ ->setDb($db)
+ ->setBranch($this->getBranch())
+ ->setHost($host)
+ ->setInheritedFrom($from->getObjectName())
+ ->setObject($service)
+ ->handleRequest();
+ $this->content()->add($form);
+ $this->commonForServices();
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function removesetAction()
+ {
+ // TODO: clean this up, use POST
+ $db = $this->db()->getDbAdapter();
+ $query = $db->select()->from(
+ array('ss' => 'icinga_service_set'),
+ array('id' => 'ss.id')
+ )->join(
+ array('si' => 'icinga_service_set_inheritance'),
+ 'si.service_set_id = ss.id',
+ array()
+ )->where(
+ 'si.parent_service_set_id = ?',
+ $this->params->get('setId')
+ )->where('ss.host_id = ?', $this->object->get('id'));
+
+ IcingaServiceSet::loadWithAutoIncId($db->fetchOne($query), $this->db())->delete();
+ $this->redirectNow(
+ Url::fromPath('director/host/services', array(
+ 'name' => $this->object->getObjectName()
+ ))
+ );
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function servicesetserviceAction()
+ {
+ $db = $this->db();
+ $host = $this->getHostObject();
+ $serviceName = $this->params->get('service');
+ $setParams = [
+ 'object_name' => $this->params->get('set'),
+ 'host_id' => $host->get('id')
+ ];
+ $setTemplate = IcingaServiceSet::load($this->params->get('set'), $db);
+ if (IcingaServiceSet::exists($setParams, $db)) {
+ $set = IcingaServiceSet::load($setParams, $db);
+ } else {
+ $set = $setTemplate;
+ }
+
+ $service = IcingaService::load([
+ 'object_name' => $serviceName,
+ 'service_set_id' => $setTemplate->get('id')
+ ], $this->db());
+ $service = IcingaService::create([
+ 'id' => $service->get('id'),
+ 'object_type' => 'apply',
+ 'object_name' => $serviceName,
+ 'host_id' => $host->get('id'),
+ 'imports' => $service->listImportNames(),
+ 'vars' => $host->getOverriddenServiceVars($serviceName),
+ ], $db);
+
+ // $set->copyVarsToService($service);
+ $this->addTitle(
+ $this->translate('%s on %s (from set: %s)'),
+ $serviceName,
+ $host->getObjectName(),
+ $set->getObjectName()
+ );
+
+ $form = IcingaServiceForm::load()
+ ->setDb($db)
+ ->setBranch($this->getBranch())
+ ->setHost($host)
+ ->setServiceSet($set)
+ ->setObject($service)
+ ->handleRequest();
+ $this->tabs()->activate('services');
+ $this->content()->add($form);
+ $this->commonForServices();
+ }
+
+ protected function commonForServices()
+ {
+ $host = $this->object;
+ $this->actions()->add(Link::create(
+ $this->translate('back'),
+ 'director/host/services',
+ ['name' => $host->getObjectName()],
+ ['class' => 'icon-left-big']
+ ));
+ $this->tabs()->activate('services');
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function agentAction()
+ {
+ $selfService = new SelfService($this->getHostObject(), $this->api());
+ if ($os = $this->params->get('download')) {
+ $selfService->handleLegacyAgentDownloads($os);
+ return;
+ }
+
+ $selfService->renderTo($this);
+ $this->tabs()->activate('agent');
+ }
+
+ protected function addOptionalMonitoringLink()
+ {
+ $host = $this->object;
+ try {
+ $mon = $this->monitoring();
+ if ($host->isObject()
+ && $mon->isAvailable()
+ && $mon->hasHost($host->getObjectName())
+ ) {
+ $this->actions()->add(Link::create(
+ $this->translate('Show'),
+ 'monitoring/host/show',
+ ['host' => $host->getObjectName()],
+ [
+ 'class' => 'icon-globe critical',
+ 'data-base-target' => '_next'
+ ]
+ ));
+
+ // Intentionally placed here, show it only for deployed Hosts
+ $this->addOptionalInspectLink();
+ }
+ } catch (Exception $e) {
+ // Silently ignore errors in the monitoring module
+ }
+ }
+
+ protected function addOptionalInspectLink()
+ {
+ if (! $this->hasPermission('director/inspect')) {
+ return;
+ }
+
+ $this->actions()->add(Link::create(
+ $this->translate('Inspect'),
+ 'director/inspect/object',
+ [
+ 'type' => 'host',
+ 'plural' => 'hosts',
+ 'name' => $this->object->getObjectName()
+ ],
+ [
+ 'class' => 'icon-zoom-in',
+ 'data-base-target' => '_next'
+ ]
+ ));
+ }
+
+ /**
+ * @return IcingaHost
+ */
+ protected function getHostObject()
+ {
+ assert($this->object instanceof IcingaHost);
+ return $this->object;
+ }
+}
diff --git a/application/controllers/HostgroupController.php b/application/controllers/HostgroupController.php
new file mode 100644
index 0000000..aa4cc51
--- /dev/null
+++ b/application/controllers/HostgroupController.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectController;
+
+class HostgroupController extends ObjectController
+{
+}
diff --git a/application/controllers/HostgroupsController.php b/application/controllers/HostgroupsController.php
new file mode 100644
index 0000000..2b4b417
--- /dev/null
+++ b/application/controllers/HostgroupsController.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectsController;
+
+class HostgroupsController extends ObjectsController
+{
+}
diff --git a/application/controllers/HostsController.php b/application/controllers/HostsController.php
new file mode 100644
index 0000000..0332072
--- /dev/null
+++ b/application/controllers/HostsController.php
@@ -0,0 +1,138 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use gipfl\IcingaWeb2\Url;
+use Icinga\Data\Filter\Filter;
+use Icinga\Data\Filter\FilterChain;
+use Icinga\Data\Filter\FilterExpression;
+use Icinga\Module\Director\DirectorObject\Automation\ExportInterface;
+use Icinga\Module\Director\Forms\IcingaAddServiceForm;
+use Icinga\Module\Director\Forms\IcingaAddServiceSetForm;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Web\Controller\ObjectsController;
+use gipfl\IcingaWeb2\Link;
+
+class HostsController extends ObjectsController
+{
+ protected $multiEdit = array(
+ 'imports',
+ 'groups',
+ 'disabled'
+ );
+
+ protected function checkDirectorPermissions()
+ {
+ $this->assertPermission('director/hosts');
+ }
+
+ public function editAction()
+ {
+ $url = clone($this->getRequest()->getUrl());
+ $url->setPath('director/hosts/addservice');
+
+ $urlSet = clone($url);
+ $urlSet->setPath('director/hosts/addserviceset');
+
+ parent::editAction();
+
+ $this->actions()->add(Link::create(
+ $this->translate('Add Service'),
+ $url,
+ null,
+ ['class' => 'icon-plus']
+ ))->add(Link::create(
+ $this->translate('Add Service Set'),
+ $urlSet,
+ null,
+ ['class' => 'icon-plus']
+ ));
+ }
+
+ public function edittemplatesAction()
+ {
+ parent::editAction();
+
+ $objects = $this->loadMultiObjectsFromParams();
+ $names = [];
+ /** @var ExportInterface $object */
+ foreach ($objects as $object) {
+ $names[] = $object->getUniqueIdentifier();
+ }
+
+ $url = Url::fromPath('director/basket/add', [
+ 'type' => 'HostTemplate',
+ ]);
+
+ $url->getParams()->addValues('names', $names);
+
+ $this->actions()->add(Link::create(
+ $this->translate('Add to Basket'),
+ $url,
+ null,
+ ['class' => 'icon-tag']
+ ));
+ }
+
+ public function addserviceAction()
+ {
+ $this->addSingleTab($this->translate('Add Service'));
+ $filter = Filter::fromQueryString($this->params->toString());
+
+ $objects = array();
+ $db = $this->db();
+ /** @var $filter FilterChain */
+ foreach ($filter->filters() as $sub) {
+ /** @var $sub FilterChain */
+ foreach ($sub->filters() as $ex) {
+ /** @var $ex FilterChain|FilterExpression */
+ if ($ex->isExpression() && $ex->getColumn() === 'name') {
+ $name = $ex->getExpression();
+ $objects[$name] = IcingaHost::load($name, $db);
+ }
+ }
+ }
+ $this->addTitle(
+ $this->translate('Add service to %d hosts'),
+ count($objects)
+ );
+
+ $this->content()->add(
+ IcingaAddServiceForm::load()
+ ->setHosts($objects)
+ ->setDb($this->db())
+ ->handleRequest()
+ );
+ }
+
+ public function addservicesetAction()
+ {
+ $this->addSingleTab($this->translate('Add Service Set'));
+ $filter = Filter::fromQueryString($this->params->toString());
+
+ $objects = array();
+ $db = $this->db();
+ /** @var $filter FilterChain */
+ foreach ($filter->filters() as $sub) {
+ /** @var $sub FilterChain */
+ foreach ($sub->filters() as $ex) {
+ /** @var $ex FilterChain|FilterExpression */
+ if ($ex->isExpression() && $ex->getColumn() === 'name') {
+ $name = $ex->getExpression();
+ $objects[$name] = IcingaHost::load($name, $db);
+ }
+ }
+ }
+ $this->addTitle(
+ $this->translate('Add Service Set to %d hosts'),
+ count($objects)
+ );
+
+ $this->content()->add(
+ IcingaAddServiceSetForm::load()
+ ->setHosts($objects)
+ ->setDb($this->db())
+ ->handleRequest()
+ );
+ }
+}
diff --git a/application/controllers/HosttemplateController.php b/application/controllers/HosttemplateController.php
new file mode 100644
index 0000000..a5bfc2b
--- /dev/null
+++ b/application/controllers/HosttemplateController.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Web\Controller\TemplateController;
+
+class HosttemplateController extends TemplateController
+{
+ protected function requireTemplate()
+ {
+ return IcingaHost::load([
+ 'object_name' => $this->params->get('name')
+ ], $this->db());
+ }
+}
diff --git a/application/controllers/ImportrunController.php b/application/controllers/ImportrunController.php
new file mode 100644
index 0000000..d0e34e5
--- /dev/null
+++ b/application/controllers/ImportrunController.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Objects\ImportRun;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Web\Table\ImportedrowsTable;
+
+class ImportrunController extends ActionController
+{
+ public function indexAction()
+ {
+ $importRun = ImportRun::load($this->params->getRequired('id'), $this->db());
+ $this->addTitle($this->translate('Import run'));
+ $this->addSingleTab($this->translate('Import run'));
+
+ $table = ImportedrowsTable::load($importRun);
+ if ($chosen = $this->params->get('chosenColumns')) {
+ $table->setColumns(preg_split('/,/', $chosen, -1, PREG_SPLIT_NO_EMPTY));
+ }
+
+ $table->renderTo($this);
+ }
+}
diff --git a/application/controllers/ImportsourceController.php b/application/controllers/ImportsourceController.php
new file mode 100644
index 0000000..cbddb9e
--- /dev/null
+++ b/application/controllers/ImportsourceController.php
@@ -0,0 +1,375 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Exception;
+use gipfl\Web\Widget\Hint;
+use Icinga\Module\Director\Data\Exporter;
+use Icinga\Module\Director\Db\Branch\Branch;
+use Icinga\Module\Director\Forms\ImportRowModifierForm;
+use Icinga\Module\Director\Forms\ImportSourceForm;
+use Icinga\Module\Director\Hook\ImportSourceHook;
+use Icinga\Module\Director\Web\ActionBar\AutomationObjectActionBar;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Objects\ImportSource;
+use Icinga\Module\Director\Web\Controller\BranchHelper;
+use Icinga\Module\Director\Web\Form\CloneImportSourceForm;
+use Icinga\Module\Director\Web\Table\ImportrunTable;
+use Icinga\Module\Director\Web\Table\ImportsourceHookTable;
+use Icinga\Module\Director\Web\Table\PropertymodifierTable;
+use Icinga\Module\Director\Web\Tabs\ImportsourceTabs;
+use Icinga\Module\Director\Web\Widget\ImportSourceDetails;
+use InvalidArgumentException;
+use gipfl\IcingaWeb2\Link;
+use ipl\Html\Error;
+use ipl\Html\Html;
+
+class ImportsourceController extends ActionController
+{
+ use BranchHelper;
+
+ /** @var ImportSource|null */
+ private $importSource;
+
+ private $id;
+
+ /**
+ * @throws \Icinga\Exception\AuthenticationException
+ * @throws \Icinga\Exception\NotFoundError
+ * @throws \Icinga\Security\SecurityException
+ */
+ public function init()
+ {
+ parent::init();
+ $id = $this->params->get('source_id', $this->params->get('id'));
+ if ($id !== null && is_numeric($id)) {
+ $this->id = (int) $id;
+ }
+
+ $tabs = $this->tabs(new ImportsourceTabs($this->id));
+ $action = $this->getRequest()->getActionName();
+ if ($tabs->has($action)) {
+ $tabs->activate($action);
+ }
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function addMainActions()
+ {
+ $this->actions(new AutomationObjectActionBar(
+ $this->getRequest()
+ ));
+ $source = $this->getImportSource();
+
+ $this->actions()->add(Link::create(
+ $this->translate('Add to Basket'),
+ 'director/basket/add',
+ [
+ 'type' => 'ImportSource',
+ 'names' => $source->getUniqueIdentifier()
+ ],
+ [
+ 'class' => 'icon-tag',
+ 'data-base-target' => '_next'
+ ]
+ ));
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function indexAction()
+ {
+ $this->addMainActions();
+ $source = $this->getImportSource();
+ if ($this->params->get('format') === 'json') {
+ $this->sendJson($this->getResponse(), (new Exporter($this->db()))->export($source));
+ return;
+ }
+ $this->addTitle(
+ $this->translate('Import source: %s'),
+ $source->get('source_name')
+ )->setAutorefreshInterval(10);
+ $branch = $this->getBranch();
+ if ($this->getBranch()->isBranch()) {
+ $this->content()->add(Hint::info(Html::sprintf($this->translate(
+ 'Please note that importing data will take place in your main Branch.'
+ . ' Modifications to Import Sources are not allowed while being in a Configuration Branch.'
+ . ' To get the full functionality, please deactivate %s'
+ ), Branch::requireHook()->linkToBranch($branch, $this->getAuth(), $branch->getName()))));
+ }
+ $this->content()->add(new ImportSourceDetails($source));
+ }
+
+ public function addAction()
+ {
+ $this->addTitle($this->translate('Add import source'));
+ if ($this->showNotInBranch($this->translate('Creating Import Sources'))) {
+ return;
+ }
+
+ $this->content()->add(
+ ImportSourceForm::load()->setDb($this->db())
+ ->setSuccessUrl('director/importsources')
+ ->handleRequest()
+ );
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function editAction()
+ {
+ $this->addMainActions();
+ $this->activateTabWithPostfix($this->translate('Modify'));
+ if ($this->showNotInBranch($this->translate('Modifying Import Sources'))) {
+ return;
+ }
+ $form = ImportSourceForm::load()
+ ->setObject($this->getImportSource())
+ ->setListUrl('director/importsources')
+ ->handleRequest();
+ $this->addTitle(
+ $this->translate('Import source: %s'),
+ $form->getObject()->get('source_name')
+ )->setAutorefreshInterval(10);
+
+ $this->content()->add($form);
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function cloneAction()
+ {
+ $this->addMainActions();
+ $this->activateTabWithPostfix($this->translate('Clone'));
+ if ($this->showNotInBranch($this->translate('Cloning Import Sources'))) {
+ return;
+ }
+ $source = $this->getImportSource();
+ $this->addTitle('Clone: %s', $source->get('source_name'));
+ $form = new CloneImportSourceForm($source);
+ $this->content()->add($form);
+ $form->on(CloneImportSourceForm::ON_SUCCESS, function (CloneImportSourceForm $form) {
+ $this->getResponse()->redirectAndExit($form->getSuccessUrl());
+ });
+ $form->handleRequest($this->getServerRequest());
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function previewAction()
+ {
+ $source = $this->getImportSource();
+
+ $this->addTitle(
+ $this->translate('Import source preview: %s'),
+ $source->get('source_name')
+ );
+ $fetchUrl = clone($this->url());
+
+ $this->actions()->add(Link::create(
+ $this->translate('Download JSON'),
+ $fetchUrl->setPath('director/importsource/fetch'),
+ null,
+ [
+ 'target' => '_blank',
+ 'class' => 'icon-download',
+ ]
+ ))->add(Link::create('[..]', '#', null, [
+ 'onclick' => 'javascript:$("table.raw-data-table").toggleClass("collapsed");'
+ ]));
+ try {
+ (new ImportsourceHookTable())->setImportSource($source)->renderTo($this);
+ } catch (Exception $e) {
+ $this->content()->add(Error::show($e));
+ }
+ }
+
+ /**
+ * @throws \Icinga\Exception\ConfigurationError
+ * @throws \Icinga\Exception\NotFoundError
+ * @throws \Icinga\Module\Director\Exception\DuplicateKeyException
+ */
+ public function fetchAction()
+ {
+ $response = $this->getResponse();
+ try {
+ $source = $this->getImportSource();
+ $source->checkForChanges();
+ $hook = ImportSourceHook::forImportSource($source);
+ $data = $hook->fetchData();
+ $source->applyModifiers($data);
+
+ $filename = sprintf(
+ "director-importsource-%d_%s.json",
+ $this->getParam('id'),
+ date('YmdHis')
+ );
+ $response->setHeader('Content-Type', 'application/json', true);
+ $response->setHeader('Content-disposition', "attachment; filename=$filename", true);
+ $response->sendHeaders();
+ $this->sendJson($this->getResponse(), $data);
+ } catch (Exception $e) {
+ $this->sendJsonError($response, $e->getMessage());
+ }
+ // TODO: this is not clean
+ if (\ob_get_level()) {
+ \ob_end_flush();
+ }
+ exit;
+ }
+
+ /**
+ * @return ImportSource
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function requireImportSourceAndAddModifierTable()
+ {
+ $source = $this->getImportSource();
+ $table = PropertymodifierTable::load($source, $this->url());
+ if ($this->getBranch()->isBranch()) {
+ $table->setReadOnly();
+ } else {
+ $table->handleSortPriorityActions($this->getRequest(), $this->getResponse());
+ }
+ $table->renderTo($this);
+
+ return $source;
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function modifierAction()
+ {
+ $source = $this->requireImportSourceAndAddModifierTable();
+ $this->addTitle($this->translate('Property modifiers: %s'), $source->get('source_name'));
+ $this->addAddLink(
+ $this->translate('Add property modifier'),
+ 'director/importsource/addmodifier',
+ ['source_id' => $source->get('id')],
+ '_self'
+ );
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function historyAction()
+ {
+ $source = $this->getImportSource();
+ $this->addTitle($this->translate('Import run history: %s'), $source->get('source_name'));
+
+ // TODO: temporarily disabled, find a better place for stats:
+ // $this->view->stats = $this->db()->fetchImportStatistics();
+ ImportrunTable::load($source)->renderTo($this);
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function addmodifierAction()
+ {
+ $source = $this->requireImportSourceAndAddModifierTable();
+ $this->addTitle(
+ $this->translate('%s: add Property Modifier'),
+ $source->get('source_name')
+ )->addBackToModifiersLink($source);
+ $this->tabs()->activate('modifier');
+
+ if ($this->showNotInBranch($this->translate('Modifying Import Sources'))) {
+ return;
+ }
+
+ $this->content()->prepend(
+ ImportRowModifierForm::load()->setDb($this->db())
+ ->setSource($source)
+ ->setSuccessUrl(
+ 'director/importsource/modifier',
+ ['source_id' => $source->get('id')]
+ )->handleRequest()
+ );
+ }
+
+ /**
+ * @throws \Icinga\Exception\MissingParameterException
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function editmodifierAction()
+ {
+ // We need to load the table AFTER adding the title, otherwise search
+ // will not be placed next to the title
+ $source = $this->getImportSource();
+
+ $this->addTitle(
+ $this->translate('%s: Property Modifier'),
+ $source->get('source_name')
+ )->addBackToModifiersLink($source);
+ $source = $this->requireImportSourceAndAddModifierTable();
+ $this->tabs()->activate('modifier');
+ if ($this->showNotInBranch($this->translate('Modifying Import Sources'))) {
+ return;
+ }
+
+ $listUrl = 'director/importsource/modifier?source_id='
+ . (int) $source->get('id');
+ $this->content()->prepend(
+ ImportRowModifierForm::load()->setDb($this->db())
+ ->loadObject((int) $this->params->getRequired('id'))
+ ->setListUrl($listUrl)
+ ->setSource($source)
+ ->handleRequest()
+ );
+ }
+
+ /**
+ * @return ImportSource
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function getImportSource()
+ {
+ if ($this->importSource === null) {
+ if ($this->id === null) {
+ throw new InvalidArgumentException('Got no ImportSource id');
+ }
+ $this->importSource = ImportSource::loadWithAutoIncId(
+ $this->id,
+ $this->db()
+ );
+ }
+
+ return $this->importSource;
+ }
+
+ protected function activateTabWithPostfix($title)
+ {
+ /** @var ImportsourceTabs $tabs */
+ $tabs = $this->tabs();
+ $tabs->activateMainWithPostfix($title);
+
+ return $this;
+ }
+
+ /**
+ * @param ImportSource $source
+ * @return $this
+ */
+ protected function addBackToModifiersLink(ImportSource $source)
+ {
+ $this->actions()->add(
+ Link::create(
+ $this->translate('back'),
+ 'director/importsource/modifier',
+ ['source_id' => $source->get('id')],
+ ['class' => 'icon-left-big']
+ )
+ );
+
+ return $this;
+ }
+}
diff --git a/application/controllers/ImportsourcesController.php b/application/controllers/ImportsourcesController.php
new file mode 100644
index 0000000..4287292
--- /dev/null
+++ b/application/controllers/ImportsourcesController.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\DirectorObject\Automation\ImportExport;
+use Icinga\Module\Director\Web\Table\ImportsourceTable;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Web\Tabs\ImportTabs;
+
+class ImportsourcesController extends ActionController
+{
+ protected $isApified = true;
+
+ public function indexAction()
+ {
+ if ($this->getRequest()->isApiRequest()) {
+ switch (strtolower($this->getRequest()->getMethod())) {
+ case 'get':
+ $this->sendExport();
+ break;
+ case 'post':
+ $this->acceptImport($this->getRequest()->getRawBody());
+ break;
+ // TODO: put / replace all?
+ default:
+ $this->sendUnsupportedMethod();
+ }
+
+ return;
+ }
+
+ $this->addTitle($this->translate('Import source'))
+ ->setAutoRefreshInterval(10)
+ ->addAddLink(
+ $this->translate('Add a new Import Source'),
+ 'director/importsource/add'
+ )->tabs(new ImportTabs())->activate('importsource');
+
+ (new ImportsourceTable($this->db()))->renderTo($this);
+ }
+
+ /**
+ * @param $raw
+ */
+ protected function acceptImport($raw)
+ {
+ (new ImportExport($this->db()))->unserializeImportSources(json_decode($raw));
+ }
+
+ protected function sendExport()
+ {
+ $this->sendJson(
+ $this->getResponse(),
+ (new ImportExport($this->db()))->serializeAllImportSources()
+ );
+ }
+}
diff --git a/application/controllers/IndexController.php b/application/controllers/IndexController.php
new file mode 100644
index 0000000..3f6c62e
--- /dev/null
+++ b/application/controllers/IndexController.php
@@ -0,0 +1,79 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Exception;
+use gipfl\Web\Widget\Hint;
+use Icinga\Module\Director\Db\Migrations;
+use Icinga\Module\Director\Forms\ApplyMigrationsForm;
+use Icinga\Module\Director\Forms\KickstartForm;
+use ipl\Html\Html;
+
+class IndexController extends DashboardController
+{
+ protected $hasDeploymentEndpoint;
+
+ public function indexAction()
+ {
+ if ($this->Config()->get('db', 'resource')) {
+ $migrations = new Migrations($this->db());
+
+ if ($migrations->hasSchema()) {
+ if (!$this->hasDeploymentEndpoint()) {
+ $this->showKickstartForm();
+ }
+ }
+
+ if ($migrations->hasPendingMigrations()) {
+ $this->content()->prepend(
+ ApplyMigrationsForm::load()
+ ->setMigrations($migrations)
+ ->handleRequest()
+ );
+ } elseif ($migrations->hasBeenDowngraded()) {
+ $this->content()->add(Hint::warning(sprintf($this->translate(
+ 'Your DB schema (migration #%d) is newer than your code base.'
+ . ' Downgrading Icinga Director is not supported and might'
+ . ' lead to unexpected problems.'
+ ), $migrations->getLastMigrationNumber())));
+ }
+
+ if ($migrations->hasSchema()) {
+ parent::indexAction();
+ } else {
+ $this->addTitle(sprintf(
+ $this->translate('Icinga Director Setup: %s'),
+ $this->translate('Create Schema')
+ ));
+ $this->addSingleTab('Setup');
+ }
+ } else {
+ $this->addTitle(sprintf(
+ $this->translate('Icinga Director Setup: %s'),
+ $this->translate('Choose DB Resource')
+ ));
+ $this->addSingleTab('Setup');
+ $this->showKickstartForm();
+ }
+ }
+
+ protected function showKickstartForm()
+ {
+ $form = KickstartForm::load();
+ if ($name = $this->getPreferredDbResourceName()) {
+ $form->setDbResourceName($name);
+ }
+ $this->content()->prepend($form->handleRequest());
+ }
+
+ protected function hasDeploymentEndpoint()
+ {
+ try {
+ $this->hasDeploymentEndpoint = $this->db()->hasDeploymentEndpoint();
+ } catch (Exception $e) {
+ return false;
+ }
+
+ return $this->hasDeploymentEndpoint;
+ }
+}
diff --git a/application/controllers/InspectController.php b/application/controllers/InspectController.php
new file mode 100644
index 0000000..d631652
--- /dev/null
+++ b/application/controllers/InspectController.php
@@ -0,0 +1,200 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use gipfl\IcingaWeb2\Link;
+use Icinga\Module\Director\Objects\IcingaEndpoint;
+use Icinga\Module\Director\PlainObjectRenderer;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Web\Table\CoreApiFieldsTable;
+use Icinga\Module\Director\Web\Table\CoreApiObjectsTable;
+use Icinga\Module\Director\Web\Table\CoreApiPrototypesTable;
+use Icinga\Module\Director\Web\Tabs\ObjectTabs;
+use Icinga\Module\Director\Web\Tree\InspectTreeRenderer;
+use Icinga\Module\Director\Web\Widget\IcingaObjectInspection;
+use Icinga\Module\Director\Web\Widget\InspectPackages;
+use ipl\Html\Html;
+
+class InspectController extends ActionController
+{
+ private $endpoint;
+
+ protected function checkDirectorPermissions()
+ {
+ $this->assertPermission('director/inspect');
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function typesAction()
+ {
+ $object = $this->endpoint();
+ $name = $object->getObjectName();
+ $this->tabs(
+ new ObjectTabs('endpoint', $this->Auth(), $object)
+ )->activate('inspect');
+
+ $this->addTitle($this->translate('Icinga 2 - Objects: %s'), $name);
+
+ $this->actions()->add(
+ Link::create(
+ $this->translate('Status'),
+ 'director/inspect/status',
+ ['endpoint' => $name],
+ [
+ 'class' => 'icon-eye',
+ 'data-base-target' => '_next'
+ ]
+ )
+ );
+ $this->content()->add(
+ new InspectTreeRenderer($object)
+ );
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function typeAction()
+ {
+ $api = $this->endpoint()->api();
+ $typeName = $this->params->get('type');
+ $this->addSingleTab($this->translate('Inspect - object list'));
+ $this->addTitle(
+ $this->translate('Object type "%s"'),
+ $typeName
+ );
+ $c = $this->content();
+ $type = $api->getType($typeName);
+ if ($type->abstract) {
+ $c->add($this->translate('This is an abstract object type.'));
+ }
+
+ if (! $type->abstract) {
+ $objects = $api->listObjects($typeName, $type->plural_name);
+ $c->add(Html::tag('p', null, sprintf($this->translate('%d objects found'), count($objects))));
+ $c->add(new CoreApiObjectsTable($objects, $this->endpoint(), $type));
+ }
+
+ if (count((array) $type->fields)) {
+ $c->add([
+ Html::tag('h2', null, $this->translate('Type attributes')),
+ new CoreApiFieldsTable($type->fields, $this->url())
+ ]);
+ }
+
+ if (count($type->prototype_keys)) {
+ $c->add([
+ Html::tag('h2', null, $this->translate('Prototypes (methods)')),
+ new CoreApiPrototypesTable($type->prototype_keys, $type->name)
+ ]);
+ }
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function objectAction()
+ {
+ $name = $this->params->get('name');
+ $pType = $this->params->get('plural');
+ $this->addSingleTab($this->translate('Object Inspection'));
+ $this->addTitle('%s "%s"', $pType, $name);
+ $this->showEndpointInformation($this->endpoint());
+ $this->content()->add(
+ new IcingaObjectInspection(
+ $this->endpoint()->api()->getObject($name, $pType),
+ $this->db()
+ )
+ );
+ }
+
+ /**
+ * @param IcingaEndpoint $endpoint
+ */
+ protected function showEndpointInformation(IcingaEndpoint $endpoint)
+ {
+ $this->content()->add(
+ Html::tag('p', null, Html::sprintf(
+ 'Inspected via %s (%s)',
+ $this->linkToEndpoint($endpoint),
+ $endpoint->getDescriptiveUrl()
+ ))
+ );
+ }
+
+ /**
+ * @param IcingaEndpoint $endpoint
+ * @return Link
+ */
+ protected function linkToEndpoint(IcingaEndpoint $endpoint)
+ {
+ return Link::create($endpoint->getObjectName(), 'director/endpoint', [
+ 'name' => $endpoint->getObjectName()
+ ]);
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function statusAction()
+ {
+ $this->addSingleTab($this->translate('Status'));
+ $this->addTitle($this->translate('Icinga 2 API - Status'));
+ $this->content()->add(Html::tag(
+ 'pre',
+ null,
+ PlainObjectRenderer::render($this->endpoint()->api()->getStatus())
+ ));
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function packagesAction()
+ {
+ $db = $this->db();
+ $endpointName = $this->params->get('endpoint');
+ $package = $this->params->get('package');
+ $stage = $this->params->get('stage');
+ $file = $this->params->get('file');
+ if ($endpointName === null) {
+ $endpoint = null;
+ } else {
+ $endpoint = IcingaEndpoint::load($endpointName, $db);
+ }
+ if ($endpoint === null) {
+ $this->addSingleTab($this->translate('Inspect Packages'));
+ } elseif ($file !== null) {
+ $this->addSingleTab($this->translate('Inspect File Content'));
+ } else {
+ $this->tabs(
+ new ObjectTabs('endpoint', $this->Auth(), $endpoint)
+ )->activate('packages');
+ }
+ $widget = new InspectPackages($this->db(), 'director/inspect/packages');
+ $this->addTitle($widget->getTitle($endpoint, $package, $stage, $file));
+ if ($file === null) {
+ $this->actions()->add($widget->getBreadCrumb($endpoint, $package, $stage));
+ }
+ $this->content()->add($widget->getContent($endpoint, $package, $stage, $file));
+ }
+
+ /**
+ * @return IcingaEndpoint
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function endpoint()
+ {
+ if ($this->endpoint === null) {
+ if ($name = $this->params->get('endpoint')) {
+ $this->endpoint = IcingaEndpoint::load($name, $this->db());
+ } else {
+ $this->endpoint = $this->db()->getDeploymentEndpoint();
+ }
+ }
+
+ return $this->endpoint;
+ }
+}
diff --git a/application/controllers/JobController.php b/application/controllers/JobController.php
new file mode 100644
index 0000000..278c96b
--- /dev/null
+++ b/application/controllers/JobController.php
@@ -0,0 +1,117 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use gipfl\IcingaWeb2\Link;
+use Icinga\Module\Director\Forms\DirectorJobForm;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Objects\DirectorJob;
+use Icinga\Module\Director\Web\Controller\BranchHelper;
+use Icinga\Module\Director\Web\Widget\JobDetails;
+
+class JobController extends ActionController
+{
+ use BranchHelper;
+
+ /**
+ * @throws \Icinga\Exception\MissingParameterException
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function indexAction()
+ {
+ $this->setAutorefreshInterval(10);
+ $job = $this->requireJob();
+ $this
+ ->addJobTabs($job, 'show')
+ ->addTitle($this->translate('Job: %s'), $job->get('job_name'))
+ ->addToBasketLink()
+ ->content()->add(new JobDetails($job));
+ }
+
+ public function addAction()
+ {
+ $this
+ ->addSingleTab($this->translate('New Job'))
+ ->addTitle($this->translate('Add a new Job'));
+ if ($this->showNotInBranch($this->translate('Creating Jobs'))) {
+ return;
+ }
+
+ $this->content()->add(
+ DirectorJobForm::load()
+ ->setSuccessUrl('director/job')
+ ->setDb($this->db())
+ ->handleRequest()
+ );
+ }
+
+ /**
+ * @throws \Icinga\Exception\MissingParameterException
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function editAction()
+ {
+ $job = $this->requireJob();
+ $this
+ ->addJobTabs($job, 'edit')
+ ->addTitle($this->translate('Job: %s'), $job->get('job_name'))
+ ->addToBasketLink();
+ if ($this->showNotInBranch($this->translate('Modifying Jobs'))) {
+ return;
+ }
+
+ $form = DirectorJobForm::load()
+ ->setListUrl('director/jobs')
+ ->setObject($job)
+ ->handleRequest();
+ $this->content()->add($form);
+ }
+
+ /**
+ * @return DirectorJob
+ * @throws \Icinga\Exception\NotFoundError
+ * @throws \Icinga\Exception\MissingParameterException
+ */
+ protected function requireJob()
+ {
+ return DirectorJob::loadWithAutoIncId((int) $this->params->getRequired('id'), $this->db());
+ }
+
+ /**
+ * @return $this
+ * @throws \Icinga\Exception\MissingParameterException
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function addToBasketLink()
+ {
+ $job = $this->requireJob();
+ $this->actions()->add(Link::create(
+ $this->translate('Add to Basket'),
+ 'director/basket/add',
+ [
+ 'type' => 'DirectorJob',
+ 'names' => $job->getUniqueIdentifier()
+ ],
+ ['class' => 'icon-tag']
+ ));
+
+ return $this;
+ }
+
+ protected function addJobTabs(DirectorJob $job, $active)
+ {
+ $id = $job->get('id');
+
+ $this->tabs()->add('show', [
+ 'url' => 'director/job',
+ 'urlParams' => ['id' => $id],
+ 'label' => $this->translate('Job'),
+ ])->add('edit', [
+ 'url' => 'director/job/edit',
+ 'urlParams' => ['id' => $id],
+ 'label' => $this->translate('Config'),
+ ])->activate($active);
+
+ return $this;
+ }
+}
diff --git a/application/controllers/JobsController.php b/application/controllers/JobsController.php
new file mode 100644
index 0000000..11e86ed
--- /dev/null
+++ b/application/controllers/JobsController.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Web\Table\JobTable;
+use Icinga\Module\Director\Web\Tabs\ImportTabs;
+
+class JobsController extends ActionController
+{
+ public function indexAction()
+ {
+ $this->addTitle($this->translate('Jobs'))
+ ->setAutoRefreshInterval(10)
+ ->addAddLink($this->translate('Add a new Job'), 'director/job/add')
+ ->tabs(new ImportTabs())->activate('jobs');
+
+ (new JobTable($this->db()))->renderTo($this);
+ }
+}
diff --git a/application/controllers/KickstartController.php b/application/controllers/KickstartController.php
new file mode 100644
index 0000000..99cde1b
--- /dev/null
+++ b/application/controllers/KickstartController.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Exception;
+use Icinga\Module\Director\Forms\KickstartForm;
+use Icinga\Module\Director\Web\Controller\BranchHelper;
+
+class KickstartController extends DashboardController
+{
+ use BranchHelper;
+
+ public function indexAction()
+ {
+ $this->addSingleTab($this->translate('Kickstart'))
+ ->addTitle($this->translate('Director Kickstart Wizard'));
+ if ($this->showNotInBranch($this->translate('Kickstart'))) {
+ return;
+ }
+ $form = KickstartForm::load();
+ try {
+ $form->setEndpoint($this->db()->getDeploymentEndpoint());
+ } catch (Exception $e) {
+ // Silently ignore DB errors
+ }
+
+ $form->handleRequest();
+ $this->content()->add($form);
+ }
+}
diff --git a/application/controllers/NotificationController.php b/application/controllers/NotificationController.php
new file mode 100644
index 0000000..97fa0f4
--- /dev/null
+++ b/application/controllers/NotificationController.php
@@ -0,0 +1,85 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectController;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Objects\IcingaNotification;
+use Icinga\Module\Director\Objects\IcingaService;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class NotificationController extends ObjectController
+{
+ protected function checkDirectorPermissions()
+ {
+ $this->assertPermission('director/notifications');
+ }
+
+ // TODO: KILL IT
+ public function init()
+ {
+ parent::init();
+ // TODO: Check if this is still needed, remove it otherwise
+ /** @var \Icinga\Web\Widget\Tab $tab */
+ if ($this->object && $this->object->object_type === 'apply') {
+ if ($host = $this->params->get('host')) {
+ foreach ($this->getTabs()->getTabs() as $tab) {
+ $tab->getUrl()->setParam('host', $host);
+ }
+ }
+
+ if ($service = $this->params->get('service')) {
+ foreach ($this->getTabs()->getTabs() as $tab) {
+ $tab->getUrl()->setParam('service', $service);
+ }
+ }
+ }
+ }
+
+ /**
+ * @param DirectorObjectForm $form
+ */
+ protected function onObjectFormLoaded(DirectorObjectForm $form)
+ {
+ if (! $this->object) {
+ return;
+ }
+
+ if ($this->object->isTemplate()) {
+ $form->setListUrl('director/notifications/templates');
+ } else {
+ $form->setListUrl('director/notifications/applyrules');
+ }
+ }
+
+ protected function hasBasketSupport()
+ {
+ return $this->object->isTemplate() || $this->object->isApplyRule();
+ }
+
+ protected function loadObject()
+ {
+ if ($this->object === null) {
+ if ($name = $this->params->get('name')) {
+ $params = array('object_name' => $name);
+ $db = $this->db();
+
+ if ($hostname = $this->params->get('host')) {
+ $this->view->host = IcingaHost::load($hostname, $db);
+ $params['host_id'] = $this->view->host->id;
+ }
+
+ if ($service = $this->params->get('service')) {
+ $this->view->service = IcingaService::load($service, $db);
+ $params['service_id'] = $this->view->service->id;
+ }
+
+ $this->object = IcingaNotification::load($params, $db);
+ } else {
+ parent::loadObject();
+ }
+ }
+
+ return $this->object;
+ }
+}
diff --git a/application/controllers/NotificationsController.php b/application/controllers/NotificationsController.php
new file mode 100644
index 0000000..2ddb360
--- /dev/null
+++ b/application/controllers/NotificationsController.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Exception\NotFoundError;
+use Icinga\Module\Director\Web\Controller\ObjectsController;
+
+class NotificationsController extends ObjectsController
+{
+ protected function addObjectsTabs()
+ {
+ $res = parent::addObjectsTabs();
+ $this->tabs()->remove('index');
+ return $res;
+ }
+
+ public function indexAction()
+ {
+ throw new NotFoundError('Not found');
+ }
+
+ protected function assertApplyRulePermission()
+ {
+ return $this->assertPermission('director/notifications');
+ }
+
+ protected function checkDirectorPermissions()
+ {
+ $this->assertPermission('director/notifications');
+ }
+}
diff --git a/application/controllers/NotificationtemplateController.php b/application/controllers/NotificationtemplateController.php
new file mode 100644
index 0000000..0b8602c
--- /dev/null
+++ b/application/controllers/NotificationtemplateController.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Objects\IcingaNotification;
+use Icinga\Module\Director\Web\Controller\TemplateController;
+
+class NotificationtemplateController extends TemplateController
+{
+ protected function requireTemplate()
+ {
+ return IcingaNotification::load([
+ 'object_name' => $this->params->get('name')
+ ], $this->db());
+ }
+}
diff --git a/application/controllers/PhperrorController.php b/application/controllers/PhperrorController.php
new file mode 100644
index 0000000..40a32c1
--- /dev/null
+++ b/application/controllers/PhperrorController.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Application\Icinga;
+use Icinga\Module\Director\Application\DependencyChecker;
+use Icinga\Module\Director\Web\Table\Dependency\DependencyInfoTable;
+use Icinga\Web\Controller;
+
+class PhperrorController extends Controller
+{
+ public function errorAction()
+ {
+ $this->getTabs()->add('error', array(
+ 'label' => $this->translate('Error'),
+ 'url' => $this->getRequest()->getUrl()
+ ))->activate('error');
+ $msg = $this->translate(
+ "PHP version 5.4.x is required for Director >= 1.4.0, you're running %s."
+ . ' Please either upgrade PHP or downgrade Icinga Director'
+ );
+ $this->view->title = $this->translate('Unsatisfied dependencies');
+ $this->view->message = sprintf($msg, PHP_VERSION);
+ }
+
+ public function dependenciesAction()
+ {
+ $checker = new DependencyChecker(Icinga::app());
+ if ($checker->satisfiesDependencies($this->Module())) {
+ $this->redirectNow('director');
+ }
+ $this->setAutorefreshInterval(15);
+ $this->getTabs()->add('error', [
+ 'label' => $this->translate('Error'),
+ 'url' => $this->getRequest()->getUrl()
+ ])->activate('error');
+ $this->view->title = $this->translate('Unsatisfied dependencies');
+ $this->view->table = (new DependencyInfoTable($checker, $this->Module()))->render();
+ $this->view->message = $this->translate(
+ "Icinga Director depends on the following modules, please install/upgrade as required"
+ );
+ }
+}
diff --git a/application/controllers/ScheduledDowntimeController.php b/application/controllers/ScheduledDowntimeController.php
new file mode 100644
index 0000000..e681a70
--- /dev/null
+++ b/application/controllers/ScheduledDowntimeController.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Forms\IcingaScheduledDowntimeRangeForm;
+use Icinga\Module\Director\Objects\IcingaScheduledDowntime;
+use Icinga\Module\Director\Web\Controller\ObjectController;
+use Icinga\Module\Director\Web\Table\IcingaScheduledDowntimeRangeTable;
+
+class ScheduledDowntimeController extends ObjectController
+{
+ protected $objectBaseUrl = 'director/scheduled-downtime';
+
+ protected function checkDirectorPermissions()
+ {
+ $this->assertPermission('director/scheduled-downtimes');
+ }
+
+ public function rangesAction()
+ {
+ /** @var IcingaScheduledDowntime $object */
+ $object = $this->object;
+ $this->tabs()->activate('ranges');
+ $this->addTitle($this->translate('Time period ranges'));
+ $form = IcingaScheduledDowntimeRangeForm::load()
+ ->setScheduledDowntime($object);
+
+ if (null !== ($name = $this->params->get('range'))) {
+ $this->addBackLink($this->url()->without('range'));
+ $form->loadObject([
+ 'scheduled_downtime_id' => $object->get('id'),
+ 'range_key' => $name,
+ 'range_type' => $this->params->get('range_type')
+ ]);
+ }
+
+ $this->content()->add($form->handleRequest());
+ IcingaScheduledDowntimeRangeTable::load($object)->renderTo($this);
+ }
+
+ public function getType()
+ {
+ return 'scheduledDowntime';
+ }
+}
diff --git a/application/controllers/ScheduledDowntimesController.php b/application/controllers/ScheduledDowntimesController.php
new file mode 100644
index 0000000..b6d314c
--- /dev/null
+++ b/application/controllers/ScheduledDowntimesController.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectsController;
+
+class ScheduledDowntimesController extends ObjectsController
+{
+ protected function addObjectsTabs()
+ {
+ $res = parent::addObjectsTabs();
+ $this->tabs()->remove('index');
+ $this->tabs()->remove('templates');
+ return $res;
+ }
+
+ protected function getTable()
+ {
+ return parent::getTable()
+ ->setBaseObjectUrl('director/scheduled-downtime');
+ }
+
+ protected function getApplyRulesTable()
+ {
+ return parent::getApplyRulesTable()->createLinksWithNames();
+ }
+
+ public function getType()
+ {
+ return 'scheduledDowntime';
+ }
+
+ public function getBaseObjectUrl()
+ {
+ return 'scheduled-downtime';
+ }
+
+ protected function assertApplyRulePermission()
+ {
+ return $this->assertPermission('director/scheduled-downtimes');
+ }
+
+ protected function checkDirectorPermissions()
+ {
+ $this->assertPermission('director/scheduled-downtimes');
+ }
+}
diff --git a/application/controllers/SchemaController.php b/application/controllers/SchemaController.php
new file mode 100644
index 0000000..b0ca24e
--- /dev/null
+++ b/application/controllers/SchemaController.php
@@ -0,0 +1,113 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ActionController;
+use ipl\Html\Html;
+use gipfl\IcingaWeb2\Link;
+
+class SchemaController extends ActionController
+{
+ protected $schemas;
+
+ public function init()
+ {
+ $this->schemas = [
+ 'mysql' => $this->translate('MySQL schema'),
+ 'pgsql' => $this->translate('PostgreSQL schema'),
+ ];
+ }
+
+ /**
+ * @throws \Icinga\Exception\IcingaException
+ */
+ public function mysqlAction()
+ {
+ $this->serveSchema('mysql');
+ }
+
+ /**
+ * @throws \Icinga\Exception\IcingaException
+ */
+ public function pgsqlAction()
+ {
+ $this->serveSchema('pgsql');
+ }
+
+ /**
+ * @param $type
+ * @throws \Icinga\Exception\IcingaException
+ */
+ protected function serveSchema($type)
+ {
+ $schema = $this->loadSchema($type);
+
+ if ($this->params->get('format') === 'sql') {
+ header('Content-type: application/octet-stream');
+ header('Content-Disposition: attachment; filename=' . $type . '.sql');
+ echo $schema;
+ exit;
+ // TODO: Shutdown
+ }
+
+ $this
+ ->addSchemaTabs($type)
+ ->addTitle($this->schemas[$type])
+ ->addDownloadAction()
+ ->content()->add(Html::tag('pre', null, $schema));
+ }
+
+ protected function loadSchema($type)
+ {
+ return file_get_contents(
+ sprintf(
+ '%s/schema/%s.sql',
+ $this->Module()->getBasedir(),
+ $type
+ )
+ );
+ }
+
+ /**
+ * @return $this
+ * @throws \Icinga\Exception\IcingaException
+ * @throws \Icinga\Exception\ProgrammingError
+ */
+ protected function addDownloadAction()
+ {
+ $this->actions()->add(
+ Link::create(
+ $this->translate('Download'),
+ $this->url()->with('format', 'sql'),
+ null,
+ [
+ 'target' => '_blank',
+ 'class' => 'icon-download',
+ ]
+ )
+ );
+
+ return $this;
+ }
+
+ /**
+ * @param $active
+ * @return $this
+ * @throws \Icinga\Exception\Http\HttpNotFoundException
+ * @throws \Icinga\Exception\ProgrammingError
+ */
+ protected function addSchemaTabs($active)
+ {
+ $tabs = $this->tabs();
+ foreach ($this->schemas as $type => $title) {
+ $tabs->add($type, [
+ 'url' => 'director/schema/' . $type,
+ 'label' => $title,
+ ]);
+ }
+
+ $tabs->activate($active);
+
+ return $this;
+ }
+}
diff --git a/application/controllers/SelfServiceController.php b/application/controllers/SelfServiceController.php
new file mode 100644
index 0000000..0b3b642
--- /dev/null
+++ b/application/controllers/SelfServiceController.php
@@ -0,0 +1,435 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Exception;
+use Icinga\Exception\NotFoundError;
+use Icinga\Exception\ProgrammingError;
+use Icinga\Module\Director\Forms\IcingaHostSelfServiceForm;
+use Icinga\Module\Director\Objects\IcingaEndpoint;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Objects\IcingaZone;
+use Icinga\Module\Director\Settings;
+use Icinga\Module\Director\Util;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use ipl\Html\Html;
+
+class SelfServiceController extends ActionController
+{
+ /** @var bool */
+ protected $isApified = true;
+
+ /** @var bool */
+ protected $requiresAuthentication = false;
+
+ /** @var Settings */
+ protected $settings;
+
+ protected function assertApiPermission()
+ {
+ // no permission required, we'll check the API key
+ }
+
+ protected function checkDirectorPermissions()
+ {
+ }
+
+ /**
+ * @throws NotFoundError
+ * @throws ProgrammingError
+ * @throws \Zend_Controller_Request_Exception
+ */
+ public function apiVersionAction()
+ {
+ if ($this->getRequest()->isApiRequest()) {
+ $this->sendPowerShellResponse('1.4.0');
+ } else {
+ throw new NotFoundError('Not found');
+ }
+ }
+
+ /**
+ * @throws \Icinga\Exception\ConfigurationError
+ * @throws \Icinga\Exception\IcingaException
+ * @throws \Zend_Controller_Exception
+ */
+ public function registerHostAction()
+ {
+ $request = $this->getRequest();
+ $form = IcingaHostSelfServiceForm::create($this->db());
+ $form->setApiRequest($request->isApiRequest());
+ try {
+ if ($key = $this->params->get('key')) {
+ $form->loadTemplateWithApiKey($key);
+ }
+ } catch (Exception $e) {
+ $this->sendPowerShellError($e->getMessage(), 404);
+ return;
+ }
+ if ($name = $this->params->get('name')) {
+ $form->setHostName($name);
+ }
+
+ if ($request->isApiRequest()) {
+ $data = json_decode($request->getRawBody());
+ $request->setPost((array) $data);
+ $form->handleRequest();
+ if ($newKey = $form->getHostApiKey()) {
+ $this->sendPowerShellResponse($newKey);
+ } else {
+ $error = implode('; ', $form->getErrorMessages());
+ if ($error === '') {
+ if ($form->isMissingRequiredFields()) {
+ $fields = $form->listMissingRequiredFields();
+ if (count($fields) === 1) {
+ $this->sendPowerShellError(
+ sprintf("%s is required", $fields[0]),
+ 400
+ );
+ } else {
+ $this->sendPowerShellError(
+ sprintf("Missing parameters: %s", implode(', ', $fields)),
+ 400
+ );
+ }
+ return;
+ } else {
+ $this->sendPowerShellError('An unknown error ocurred', 500);
+ }
+ } else {
+ $this->sendPowerShellError($error, 400);
+ }
+ }
+ return;
+ }
+
+ $form->handleRequest();
+ $this->addSingleTab($this->translate('Self Service'))
+ ->addTitle($this->translate('Self Service - Host Registration'))
+ ->content()->add(Html::tag('p', null, $this->translate(
+ 'In case an Icinga Admin provided you with a self service API'
+ . ' token, this is where you can register new hosts'
+ )))
+ ->add($form);
+ }
+
+ /**
+ * @throws NotFoundError
+ * @throws \Zend_Controller_Request_Exception
+ * @throws \Zend_Controller_Response_Exception
+ */
+ public function ticketAction()
+ {
+ if (!$this->getRequest()->isApiRequest()) {
+ throw new NotFoundError('Not found');
+ }
+
+ try {
+ $key = $this->params->getRequired('key');
+ $host = IcingaHost::loadWithApiKey($key, $this->db());
+ if ($host->isTemplate()) {
+ throw new NotFoundError('Got invalid API key "%s"', $key);
+ }
+ $name = $host->getObjectName();
+
+ if ($host->getResolvedProperty('has_agent') !== 'y') {
+ throw new NotFoundError('The host "%s" is not an agent', $name);
+ }
+
+ $this->sendPowerShellResponse($this->api()->getTicket($name));
+ } catch (Exception $e) {
+ if ($e instanceof NotFoundError) {
+ $this->sendPowerShellError($e->getMessage(), 404);
+ } else {
+ $this->sendPowerShellError($e->getMessage(), 500);
+ }
+ }
+ }
+
+ /**
+ * @param $response
+ * @throws ProgrammingError
+ * @throws \Zend_Controller_Request_Exception
+ */
+ protected function sendPowerShellResponse($response)
+ {
+ if ($this->getRequest()->getHeader('X-Director-Accept') === 'text/plain') {
+ if (is_array($response)) {
+ echo $this->makePlainTextPowerShellArray($response);
+ } else {
+ echo $response;
+ }
+ } else {
+ $this->sendJson($this->getResponse(), $response);
+ }
+ }
+
+ /**
+ * @param $error
+ * @param $code
+ * @throws \Zend_Controller_Request_Exception
+ * @throws \Zend_Controller_Response_Exception
+ */
+ protected function sendPowerShellError($error, $code)
+ {
+ if ($this->getRequest()->getHeader('X-Director-Accept') === 'text/plain') {
+ $this->getResponse()->setHttpResponseCode($code);
+ echo "ERROR: $error";
+ } else {
+ $this->sendJsonError($this->getResponse(), $error, $code);
+ }
+ }
+
+ /**
+ * @param $value
+ * @return string
+ * @throws ProgrammingError
+ */
+ protected function makePowerShellBoolean($value)
+ {
+ if ($value === 'y' || $value === true) {
+ return 'true';
+ } elseif ($value === 'n' || $value === false) {
+ return 'false';
+ } else {
+ throw new ProgrammingError(
+ 'Expected boolean value, got %s',
+ var_export($value, 1)
+ );
+ }
+ }
+
+ /**
+ * @param array $params
+ * @return string
+ * @throws ProgrammingError
+ */
+ protected function makePlainTextPowerShellArray(array $params)
+ {
+ $plain = '';
+
+ foreach ($params as $key => $value) {
+ if (is_bool($value)) {
+ $value = $this->makePowerShellBoolean($value);
+ } elseif (is_array($value)) {
+ $value = implode('!', $value);
+ }
+ $plain .= "$key: $value\r\n";
+ }
+
+ return $plain;
+ }
+
+ /**
+ * @throws NotFoundError
+ * @throws \Zend_Controller_Request_Exception
+ * @throws \Zend_Controller_Response_Exception
+ */
+ public function powershellParametersAction()
+ {
+ if (!$this->getRequest()->isApiRequest()) {
+ throw new NotFoundError('Not found');
+ }
+
+ try {
+ $this->shipPowershellParams();
+ } catch (Exception $e) {
+ if ($e instanceof NotFoundError) {
+ $this->sendPowerShellError($e->getMessage(), 404);
+ } else {
+ $this->sendPowerShellError($e->getMessage(), 500);
+ }
+ }
+ }
+
+ /**
+ * @throws NotFoundError
+ * @throws ProgrammingError
+ * @throws \Icinga\Exception\ConfigurationError
+ * @throws \Icinga\Exception\IcingaException
+ * @throws \Icinga\Exception\MissingParameterException
+ * @throws \Zend_Controller_Request_Exception
+ * @throws \Zend_Controller_Response_Exception
+ */
+ protected function shipPowershellParams()
+ {
+ $db = $this->db();
+ $key = $this->params->getRequired('key');
+ $host = IcingaHost::loadWithApiKey($key, $db);
+
+ $settings = $this->getSettings();
+ $transform = $settings->get('self-service/transform_hostname');
+ $params = [
+ 'fetch_agent_name' => $settings->get('self-service/agent_name') === 'hostname',
+ 'fetch_agent_fqdn' => $settings->get('self-service/agent_name') === 'fqdn',
+ 'transform_hostname' => $transform,
+ 'flush_api_directory' => $settings->get('self-service/flush_api_dir') === 'y',
+ // ConvertEndpointIPConfig:
+ 'resolve_parent_host' => $settings->get('self-service/resolve_parent_host'),
+ // InstallFrameworkService:
+ 'install_framework_service' => '0',
+ // ServiceDirectory => framework_service_directory
+ // FrameworkServiceUrl => framework_service_url
+ // InstallFrameworkPlugins:
+ 'install_framework_plugins' => '0',
+ // PluginsUrl => framework_plugins_url
+ ];
+ $username = $settings->get('self-service/icinga_service_user');
+ if ($username !== null && strlen($username) > 0) {
+ $params['icinga_service_user'] = $username;
+ }
+
+ if ($transform === '2') {
+ $transformMethod = '.upperCase';
+ } elseif ($transform === '1') {
+ $transformMethod = '.lowerCase';
+ } else {
+ $transformMethod = '';
+ }
+
+ $hostObject = (object) [
+ 'address' => '&ipaddress&',
+ ];
+
+ switch ($settings->get('self-service/agent_name')) {
+ case 'hostname':
+ $hostObject->display_name = "&fqdn$transformMethod&";
+ break;
+ case 'fqdn':
+ $hostObject->display_name = "&hostname$transformMethod&";
+ break;
+ }
+ $params['director_host_object'] = json_encode($hostObject);
+
+ if ($settings->get('self-service/download_type')) {
+ $params['download_url'] = $settings->get('self-service/download_url');
+ $params['agent_version'] = $settings->get('self-service/agent_version');
+ $params['allow_updates'] = $settings->get('self-service/allow_updates') === 'y';
+ $params['agent_listen_port'] = $host->getAgentListenPort();
+ if ($hashes = $settings->get('self-service/installer_hashes')) {
+ $params['installer_hashes'] = $hashes;
+ }
+
+ if ($settings->get('self-service/install_nsclient') === 'y') {
+ $params['install_nsclient'] = true;
+ $this->addBooleanSettingsToParams($settings, [
+ 'nsclient_add_defaults',
+ 'nsclient_firewall',
+ 'nsclient_service',
+ ], $params);
+
+
+ $this->addStringSettingsToParams($settings, [
+ 'nsclient_directory',
+ 'nsclient_installer_path'
+ ], $params);
+ }
+ }
+
+ $this->addHostToParams($host, $params);
+
+ if ($this->getRequest()->getHeader('X-Director-Accept') === 'text/plain') {
+ echo $this->makePlainTextPowerShellArray($params);
+ } else {
+ $this->sendJson($this->getResponse(), $params);
+ }
+ }
+
+ /**
+ * @param IcingaHost $host
+ * @param array $params
+ * @throws NotFoundError
+ * @throws ProgrammingError
+ * @throws \Icinga\Exception\ConfigurationError
+ * @throws \Icinga\Exception\IcingaException
+ * @throws \Zend_Controller_Request_Exception
+ * @throws \Zend_Controller_Response_Exception
+ */
+ protected function addHostToParams(IcingaHost $host, array &$params)
+ {
+ if (! $host->isObject()) {
+ return;
+ }
+
+ $db = $this->db();
+ $settings = $this->getSettings();
+ $name = $host->getObjectName();
+ if ($host->getSingleResolvedProperty('has_agent') !== 'y') {
+ $this->sendPowerShellError(sprintf(
+ '%s is not configured for Icinga Agent usage',
+ $name
+ ), 403);
+ return;
+ }
+
+ $zoneName = $host->getRenderingZone();
+ if ($zoneName === IcingaHost::RESOLVE_ERROR) {
+ $this->sendPowerShellError(sprintf(
+ 'Could not resolve target Zone for %s',
+ $name
+ ), 404);
+ return;
+ }
+
+ $masterConnectsToAgent = $host->getSingleResolvedProperty(
+ 'master_should_connect'
+ ) === 'y';
+ $params['agent_add_firewall_rule'] = $masterConnectsToAgent;
+
+ $params['global_zones'] = $settings->get('self-service/global_zones');
+
+ $zone = IcingaZone::load($zoneName, $db);
+ $endpointNames = $zone->listEndpoints();
+ if (! $masterConnectsToAgent) {
+ $endpointsConfig = [];
+ foreach ($endpointNames as $endpointName) {
+ $endpoint = IcingaEndpoint::load($endpointName, $db);
+ $endpointsConfig[] = sprintf(
+ '%s;%s',
+ $endpoint->getSingleResolvedProperty('host'),
+ $endpoint->getResolvedPort()
+ );
+ }
+
+ $params['endpoints_config'] = $endpointsConfig;
+ }
+ $master = $db->getDeploymentEndpoint();
+ $params['parent_zone'] = $zoneName;
+ $params['ca_server'] = $master->getObjectName();
+ $params['parent_endpoints'] = $endpointNames;
+ $params['accept_config'] = $host->getSingleResolvedProperty('accept_config')=== 'y';
+ }
+
+ protected function addStringSettingsToParams(Settings $settings, array $keys, array &$params)
+ {
+ foreach ($keys as $key) {
+ $value = $settings->get("self-service/$key");
+ if (strlen($value)) {
+ $params[$key] = $value;
+ }
+ }
+ }
+
+ protected function addBooleanSettingsToParams(Settings $settings, array $keys, array &$params)
+ {
+ foreach ($keys as $key) {
+ $value = $settings->get("self-service/$key");
+ if ($value !== null) {
+ $params[$key] = $value === 'y';
+ }
+ }
+ }
+
+ /**
+ * @return Settings
+ * @throws \Icinga\Exception\ConfigurationError
+ */
+ protected function getSettings()
+ {
+ if ($this->settings === null) {
+ $this->settings = new Settings($this->db());
+ }
+
+ return $this->settings;
+ }
+}
diff --git a/application/controllers/ServiceController.php b/application/controllers/ServiceController.php
new file mode 100644
index 0000000..3cd54d6
--- /dev/null
+++ b/application/controllers/ServiceController.php
@@ -0,0 +1,311 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Exception;
+use Icinga\Exception\NotFoundError;
+use Icinga\Module\Director\Data\Db\DbObjectStore;
+use Icinga\Module\Director\Data\Db\DbObjectTypeRegistry;
+use Icinga\Module\Director\Db\Branch\UuidLookup;
+use Icinga\Module\Director\Forms\IcingaServiceForm;
+use Icinga\Module\Director\Monitoring;
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Web\Controller\ObjectController;
+use Icinga\Module\Director\Objects\IcingaService;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use Icinga\Module\Director\Web\Table\IcingaAppliedServiceTable;
+use Icinga\Web\Widget\Tab;
+use gipfl\IcingaWeb2\Link;
+use gipfl\IcingaWeb2\Widget\Tabs;
+
+class ServiceController extends ObjectController
+{
+ /** @var IcingaHost */
+ protected $host;
+
+ protected $set;
+
+ protected $apply;
+
+ protected function checkDirectorPermissions()
+ {
+ if ($this->hasPermission('director/monitoring/services')) {
+ $monitoring = new Monitoring();
+ if ($monitoring->authCanEditService($this->Auth(), $this->getParam('host'), $this->getParam('name'))) {
+ return;
+ }
+ }
+ $this->assertPermission('director/hosts');
+ }
+
+ public function init()
+ {
+ // This happens in parent::init() too, but is required to take place before the next two lines
+ $this->enableStaticObjectLoader($this->getTableName());
+
+ // Hint: having Host and Set loaded first is important for UUID lookups with legacy URLs
+ $this->host = $this->getOptionalRelatedObjectFromParams('host', 'host');
+ $this->set = $this->getOptionalRelatedObjectFromParams('service_set', 'set');
+ parent::init();
+ if ($this->object) {
+ if ($this->host === null) {
+ $this->host = $this->loadOptionalRelatedObject($this->object, 'host');
+ }
+ if ($this->set === null) {
+ $this->set = $this->loadOptionalRelatedObject($this->object, 'service_set');
+ }
+ }
+ $this->addOptionalHostTabs();
+ $this->addOptionalSetTabs();
+ }
+
+ protected function getOptionalRelatedObjectFromParams($type, $parameter)
+ {
+ if ($id = $this->params->get("${parameter}_id")) {
+ $key = (int) $id;
+ } else {
+ $key = $this->params->get($parameter);
+ }
+ if ($key !== null) {
+ $table = DbObjectTypeRegistry::tableNameByType($type);
+ $key = UuidLookup::findUuidForKey($key, $table, $this->db(), $this->getBranch());
+ return $this->loadSpecificObject($table, $key);
+ }
+
+ return null;
+ }
+
+ protected function loadOptionalRelatedObject(IcingaObject $object, $relation)
+ {
+ $key = $object->getUnresolvedRelated($relation);
+ if ($key === null) {
+ if ($key = $object->get("${relation}_id")) {
+ $key = (int) $key;
+ } else {
+ $key = $object->get($relation);
+ // We reach this when accessing Service Template Fields
+ }
+ }
+
+ if ($key === null) {
+ return null;
+ }
+
+ $table = DbObjectTypeRegistry::tableNameByType($relation);
+ $uuid = UuidLookup::findUuidForKey($key, $table, $this->db(), $this->getBranch());
+ return $this->loadSpecificObject($table, $uuid);
+ }
+
+ protected function addParamToTabs($name, $value)
+ {
+ foreach ($this->tabs()->getTabs() as $tab) {
+ /** @var Tab $tab */
+ $tab->getUrl()->setParam($name, $value);
+ }
+
+ return $this;
+ }
+
+ public function addAction()
+ {
+ parent::addAction();
+ if ($this->host) {
+ // TODO: use setTitle. And figure out, where we use this old route.
+ $this->view->title = $this->host->object_name . ': ' . $this->view->title;
+ } elseif ($this->set) {
+ $this->view->title = sprintf(
+ $this->translate('Add a service to "%s"'),
+ $this->set->object_name
+ );
+ } elseif ($this->apply) {
+ $this->view->title = sprintf(
+ $this->translate('Apply "%s"'),
+ $this->apply->object_name
+ );
+ }
+ }
+
+ protected function onObjectFormLoaded(DirectorObjectForm $form)
+ {
+ if ($this->set) {
+ /** @var IcingaServiceForm$form */
+ $form->setServiceSet($this->set);
+ }
+ if ($this->object === null && $this->apply) {
+ $form->createApplyRuleFor($this->apply);
+ }
+ }
+
+ public function editAction()
+ {
+ $this->tabs()->activate('modify');
+
+ /** @var IcingaService $object */
+ $object = $this->object;
+ $this->addTitle($object->getObjectName());
+ if ($object->isTemplate() && $this->showNotInBranch($this->translate('Modifying Templates'))) {
+ return;
+ }
+
+ $form = IcingaServiceForm::load()->setDb($this->db());
+ $form->setBranch($this->getBranch());
+
+ if ($this->host) {
+ $this->actions()->add(Link::create(
+ $this->translate('back'),
+ 'director/host/services',
+ ['uuid' => $this->host->getUniqueId()->toString()],
+ ['class' => 'icon-left-big']
+ ));
+ $form->setHost($this->host);
+ }
+
+ if ($this->set) {
+ $form->setServiceSet($this->set);
+ }
+ if ($this->host && $object->usesVarOverrides()) {
+ $fake = IcingaService::create(array(
+ 'object_type' => 'object',
+ 'host_id' => $object->get('host_id'),
+ 'imports' => $object,
+ 'object_name' => $object->object_name,
+ 'use_var_overrides' => 'y',
+ 'vars' => $this->host->getOverriddenServiceVars($object->object_name),
+ ), $this->db());
+
+ $form->setObject($fake);
+ } else {
+ $form->setObject($object);
+ }
+
+ $form->handleRequest();
+ $this->addActionClone();
+
+ if ($this->host) {
+ $this->view->subtitle = sprintf(
+ $this->translate('(on %s)'),
+ $this->host->object_name
+ );
+ }
+
+ try {
+ if ($object->isTemplate()
+ && $object->getResolvedProperty('check_command_id')
+ ) {
+ $this->view->actionLinks .= ' ' . $this->view->qlink(
+ 'Create apply-rule',
+ 'director/service/add',
+ array('apply' => $object->object_name),
+ array('class' => 'icon-plus')
+ );
+ }
+ } catch (Exception $e) {
+ // ignore the error, show no apply link
+ }
+
+ $this->content()->add($form);
+ }
+
+ public function assignAction()
+ {
+ // TODO: figure out whether and where we link to this
+ /** @var IcingaService $service */
+ $service = $this->object;
+ $this->actions()->add(new Link(
+ $this->translate('back'),
+ $this->getRequest()->getUrl()->without('rule_id'),
+ null,
+ array('class' => 'icon-left-big')
+ ));
+
+ $this->tabs()->activate('applied');
+ $this->addTitle(
+ $this->translate('Apply: %s'),
+ $service->getObjectName()
+ );
+ $table = (new IcingaAppliedServiceTable($this->db()))
+ ->setService($service);
+ $table->getAttributes()->set('data-base-target', '_self');
+
+ $this->content()->add($table);
+ }
+
+ protected function getLegacyKey()
+ {
+ if ($key = $this->params->get('id')) {
+ $key = (int) $key;
+ } else {
+ $key = $this->params->get('name');
+ }
+
+ if ($key === null) {
+ throw new \InvalidArgumentException('uuid, name or id required');
+ }
+
+ return $key;
+ }
+
+ protected function loadObject()
+ {
+ if ($this->params->has('uuid')) {
+ parent::loadObject();
+ return;
+ }
+
+ $key = $this->getLegacyKey();
+ // Hint: not passing 'object' as type, we still have name-based links in previews and similar
+ $uuid = UuidLookup::findServiceUuid($this->db(), $this->getBranch(), null, $key, $this->host, $this->set);
+ if ($uuid === null) {
+ if (! $this->params->get('allowOverrides')) {
+ throw new NotFoundError('Not found');
+ }
+ } else {
+ $this->params->set('uuid', $uuid->toString());
+ parent::loadObject();
+ }
+ }
+
+ protected function addOptionalHostTabs()
+ {
+ if ($this->host === null) {
+ return;
+ }
+ $hostname = $this->host->getObjectName();
+ $tabs = new Tabs();
+ $urlParams = ['uuid' => $this->host->getUniqueId()->toString()];
+ $tabs->add('host', [
+ 'url' => 'director/host',
+ 'urlParams' => $urlParams,
+ 'label' => $this->translate('Host'),
+ ])->add('services', [
+ 'url' => 'director/host/services',
+ 'urlParams' => $urlParams,
+ 'label' => $this->translate('Services'),
+ ]);
+
+ $this->addParamToTabs('host', $hostname);
+ $this->controls()->prependTabs($tabs);
+ }
+
+ protected function addOptionalSetTabs()
+ {
+ if ($this->set === null) {
+ return;
+ }
+ $setName = $this->set->getObjectName();
+ $tabs = new Tabs();
+ $tabs->add('set', [
+ 'url' => 'director/serviceset',
+ 'urlParams' => ['name' => $setName],
+ 'label' => $this->translate('ServiceSet'),
+ ])->add('services', [
+ 'url' => 'director/serviceset/services',
+ 'urlParams' => ['name' => $setName],
+ 'label' => $this->translate('Services'),
+ ]);
+
+ $this->addParamToTabs('serviceset', $setName);
+ $this->controls()->prependTabs($tabs);
+ }
+}
diff --git a/application/controllers/ServiceapplyrulesController.php b/application/controllers/ServiceapplyrulesController.php
new file mode 100644
index 0000000..c3a7f2b
--- /dev/null
+++ b/application/controllers/ServiceapplyrulesController.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Exception\NotFoundError;
+use Icinga\Module\Director\Objects\IcingaService;
+use Icinga\Module\Director\RestApi\IcingaObjectsHandler;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Web\Table\ApplyRulesTable;
+
+class ServiceapplyrulesController extends ActionController
+{
+ protected $isApified = true;
+
+ public function indexAction()
+ {
+ $request = $this->getRequest();
+ if (! $request->isApiRequest()) {
+ throw new NotFoundError('Not found');
+ }
+
+ $table = ApplyRulesTable::create('service', $this->db());
+/*
+ $query = $this->db()->getDbAdapter()
+ ->select()
+ ->from('icinga_service')
+ ->where('object_type = ?', 'apply');
+ $rules = IcingaService::loadAll($this->db(), $query);
+*/
+
+ $handler = (new IcingaObjectsHandler(
+ $request,
+ $this->getResponse(),
+ $this->db()
+ ))->setTable($table);
+
+ $handler->dispatch();
+ }
+}
diff --git a/application/controllers/ServicegroupController.php b/application/controllers/ServicegroupController.php
new file mode 100644
index 0000000..b2fc50e
--- /dev/null
+++ b/application/controllers/ServicegroupController.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectController;
+
+class ServicegroupController extends ObjectController
+{
+}
diff --git a/application/controllers/ServicegroupsController.php b/application/controllers/ServicegroupsController.php
new file mode 100644
index 0000000..d35e638
--- /dev/null
+++ b/application/controllers/ServicegroupsController.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectsController;
+
+class ServicegroupsController extends ObjectsController
+{
+}
diff --git a/application/controllers/ServicesController.php b/application/controllers/ServicesController.php
new file mode 100644
index 0000000..8d178c2
--- /dev/null
+++ b/application/controllers/ServicesController.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use gipfl\IcingaWeb2\Link;
+use gipfl\IcingaWeb2\Url;
+use Icinga\Module\Director\DirectorObject\Automation\ExportInterface;
+use Icinga\Module\Director\Web\Controller\ObjectsController;
+
+class ServicesController extends ObjectsController
+{
+ protected $multiEdit = array(
+ 'imports',
+ 'groups',
+ 'disabled'
+ );
+
+ public function edittemplatesAction()
+ {
+ parent::editAction();
+
+ $objects = $this->loadMultiObjectsFromParams();
+ $names = [];
+ /** @var ExportInterface $object */
+ foreach ($objects as $object) {
+ $names[] = $object->getUniqueIdentifier();
+ }
+
+ $url = Url::fromPath('director/basket/add', [
+ 'type' => 'ServiceTemplate',
+ ]);
+
+ $url->getParams()->addValues('names', $names);
+
+ $this->actions()->add(Link::create(
+ $this->translate('Add to Basket'),
+ $url,
+ null,
+ ['class' => 'icon-tag']
+ ));
+ }
+}
diff --git a/application/controllers/ServicesetController.php b/application/controllers/ServicesetController.php
new file mode 100644
index 0000000..684d2fc
--- /dev/null
+++ b/application/controllers/ServicesetController.php
@@ -0,0 +1,141 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Data\Filter\Filter;
+use Icinga\Module\Director\Forms\IcingaServiceSetForm;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Objects\IcingaServiceSet;
+use Icinga\Module\Director\Web\Controller\ObjectController;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use Icinga\Module\Director\Web\Table\IcingaHostsMatchingFilterTable;
+use Icinga\Module\Director\Web\Table\IcingaServiceSetHostTable;
+use Icinga\Module\Director\Web\Table\IcingaServiceSetServiceTable;
+use gipfl\IcingaWeb2\Link;
+
+class ServicesetController extends ObjectController
+{
+ /** @var IcingaHost */
+ protected $host;
+
+ protected function checkDirectorPermissions()
+ {
+ $this->assertPermission('director/servicesets');
+ }
+
+ public function init()
+ {
+ if (null !== ($host = $this->params->get('host'))) {
+ $this->host = IcingaHost::load($host, $this->db());
+ }
+
+ parent::init();
+ if ($this->object) {
+ $this->addServiceSetTabs();
+ }
+ }
+
+ protected function onObjectFormLoaded(DirectorObjectForm $form)
+ {
+ if ($this->host) {
+ /** @var IcingaServiceSetForm $form */
+ $form->setHost($this->host);
+ }
+ }
+
+ public function addAction()
+ {
+ parent::addAction();
+ if ($this->host) {
+ $this->addTitle(
+ $this->translate('Add a service set to "%s"'),
+ $this->host->getObjectName()
+ );
+ }
+ }
+
+ public function servicesAction()
+ {
+ /** @var IcingaServiceSet $set */
+ $set = $this->object;
+ $name = $set->getObjectName();
+ $this->tabs()->activate('services');
+ $this->addTitle(
+ $this->translate('Services in this set: %s'),
+ $name
+ );
+ $this->actions()->add(Link::create(
+ $this->translate('Add service'),
+ 'director/service/add',
+ ['set' => $name],
+ ['class' => 'icon-plus']
+ ));
+
+ IcingaServiceSetServiceTable::load($set)
+ ->setBranch($this->getBranch())
+ ->renderTo($this);
+ }
+
+ public function hostsAction()
+ {
+ /** @var IcingaServiceSet $set */
+ $set = $this->object;
+ $this->tabs()->activate('hosts');
+ $this->addTitle(
+ $this->translate('Hosts using this set: %s'),
+ $set->getObjectName()
+ );
+
+ $table = IcingaServiceSetHostTable::load($set);
+ if ($table->count()) {
+ $table->renderTo($this);
+ }
+ $filter = $set->get('assign_filter');
+ if ($filter !== null && \strlen($filter) > 0) {
+ $this->content()->add(
+ IcingaHostsMatchingFilterTable::load(Filter::fromQueryString($filter), $this->db())
+ );
+ }
+ }
+
+ protected function addServiceSetTabs()
+ {
+ $hexUuid = $this->object->getUniqueId()->toString();
+ $tabs = $this->tabs();
+ $tabs->add('services', [
+ 'url' => 'director/serviceset/services',
+ 'urlParams' => ['uuid' => $hexUuid],
+ 'label' => 'Services'
+ ]);
+ if ($this->branch->isBranch()) {
+ return $this;
+ }
+ $tabs->add('hosts', [
+ 'url' => 'director/serviceset/hosts',
+ 'urlParams' => ['uuid' => $hexUuid],
+ 'label' => 'Hosts'
+ ]);
+
+ return $this;
+ }
+
+ protected function loadObject()
+ {
+ if ($this->object === null) {
+ if (null !== ($name = $this->params->get('name'))) {
+ $params = ['object_name' => $name];
+ $db = $this->db();
+
+ if ($this->host) {
+ $params['host_id'] = $this->host->get('id');
+ }
+
+ $this->object = IcingaServiceSet::load($params, $db);
+ } else {
+ parent::loadObject();
+ }
+ }
+
+ return $this->object;
+ }
+}
diff --git a/application/controllers/ServicetemplateController.php b/application/controllers/ServicetemplateController.php
new file mode 100644
index 0000000..25d0742
--- /dev/null
+++ b/application/controllers/ServicetemplateController.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Objects\IcingaService;
+use Icinga\Module\Director\Web\Controller\TemplateController;
+
+class ServicetemplateController extends TemplateController
+{
+ protected function requireTemplate()
+ {
+ return IcingaService::load([
+ 'object_name' => $this->params->get('name')
+ ], $this->db());
+ }
+}
diff --git a/application/controllers/SettingsController.php b/application/controllers/SettingsController.php
new file mode 100644
index 0000000..c4709e6
--- /dev/null
+++ b/application/controllers/SettingsController.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Forms\KickstartForm;
+use Icinga\Module\Director\Forms\SelfServiceSettingsForm;
+use Icinga\Module\Director\Settings;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use ipl\Html\Html;
+
+class SettingsController extends ActionController
+{
+ /**
+ * @throws \Icinga\Exception\Http\HttpNotFoundException
+ */
+ public function indexAction()
+ {
+ // Hint: this is for the module configuration tab, legacy code
+ $this->view->tabs = $this->Module()
+ ->getConfigTabs()
+ ->activate('config');
+
+ $this->view->form = KickstartForm::load()
+ ->setModuleConfig($this->Config())
+ ->handleRequest();
+ }
+
+ /**
+ * @throws \Icinga\Exception\ConfigurationError
+ * @throws \Icinga\Exception\IcingaException
+ */
+ public function selfServiceAction()
+ {
+ $form = SelfServiceSettingsForm::create($this->db(), new Settings($this->db()));
+ $form->handleRequest();
+
+ $hint = $this->translate(
+ 'The Icinga Director Self Service API allows your Hosts to register'
+ . ' themselves. This allows them to get their Icinga Agent configured,'
+ . ' installed and upgraded in an automated way.'
+ );
+
+ $this->addSingleTab($this->translate('Self Service'))
+ ->addTitle($this->translate('Self Service API - Global Settings'))
+ ->content()->add(Html::tag('p', null, $hint))
+ ->add($form);
+ }
+}
diff --git a/application/controllers/SuggestController.php b/application/controllers/SuggestController.php
new file mode 100644
index 0000000..659c48c
--- /dev/null
+++ b/application/controllers/SuggestController.php
@@ -0,0 +1,415 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Restriction\HostgroupRestriction;
+use ipl\Html\Html;
+use Icinga\Exception\NotFoundError;
+use Icinga\Module\Director\Hook\ImportSourceHook;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Objects\IcingaService;
+use Icinga\Module\Director\Objects\ImportSource;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Data\Filter\Filter;
+use Icinga\Module\Director\Objects\HostApplyMatches;
+
+class SuggestController extends ActionController
+{
+ protected function checkDirectorPermissions()
+ {
+ }
+
+ public function indexAction()
+ {
+ // TODO: Using some temporarily hardcoded methods, should use DataViews later on
+ $context = $this->getRequest()->getPost('context');
+ $key = null;
+
+ if (strpos($context, '!') !== false) {
+ list($context, $key) = preg_split('~!~', $context, 2);
+ }
+
+ $func = 'suggest' . ucfirst($context);
+ if (method_exists($this, $func)) {
+ if (! empty($key)) {
+ $all = $this->$func($key);
+ } else {
+ $all = $this->$func();
+ }
+ } else {
+ $all = array();
+ }
+ // TODO: also get cursor position and eventually add an asterisk in the middle
+ // tODO: filter also when fetching, eventually limit somehow
+ $search = $this->getRequest()->getPost('value');
+ $begins = array();
+ $matches = array();
+ $begin = Filter::expression('value', '=', $search . '*');
+ $middle = Filter::expression('value', '=', '*' . $search . '*')->setCaseSensitive(false);
+ $prefixes = array();
+ foreach ($all as $str) {
+ if (false !== ($pos = strrpos($str, '.'))) {
+ $prefix = substr($str, 0, $pos) . '.';
+ $prefixes[$prefix] = $prefix;
+ }
+ if (strlen($search)) {
+ $row = (object) array('value' => $str);
+ if ($begin->matches($row)) {
+ $begins[] = $this->highlight($str, $search);
+ } elseif ($middle->matches($row)) {
+ $matches[] = $this->highlight($str, $search);
+ }
+ } else {
+ $matches[] = Html::escape($str);
+ }
+ }
+
+ $containing = array_slice(array_merge($begins, $matches), 0, 100);
+ $suggestions = $containing;
+
+ if ($func === 'suggestHostFilterColumns' || $func === 'suggestHostaddresses') {
+ ksort($prefixes);
+
+ if (count($suggestions) < 5) {
+ $suggestions = array_merge($suggestions, array_keys($prefixes));
+ }
+ }
+ $this->view->suggestions = $suggestions;
+ }
+
+ /**
+ * One more dummy helper for tests
+ *
+ * TODO: Should not remain here
+ *
+ * @return array
+ * @throws \Icinga\Exception\ConfigurationError
+ * @throws \Icinga\Security\SecurityException
+ */
+ protected function suggestLocations()
+ {
+ $this->assertPermission('director/hosts');
+ $db = $this->db()->getDbAdapter();
+ $query = $db->select()
+ ->distinct()
+ ->from('icinga_host_var', 'varvalue')
+ ->where('varname = ?', 'location')
+ ->order('varvalue');
+ return $db->fetchCol($query);
+ }
+
+ protected function suggestHostnames($type = 'object')
+ {
+ $this->assertPermission('director/hosts');
+ $db = $this->db()->getDbAdapter();
+ $query = $db->select()
+ ->from('icinga_host', 'object_name')
+ ->order('object_name');
+
+ if ($type !== null) {
+ $query->where('object_type = ?', $type);
+ }
+ $restriction = new HostgroupRestriction($this->db(), $this->Auth());
+ $restriction->filterHostsQuery($query);
+
+ return $db->fetchCol($query);
+ }
+
+ protected function suggestHostsAndTemplates()
+ {
+ return $this->suggestHostnames(null);
+ }
+
+ protected function suggestServicenames()
+ {
+ $r=array();
+ $this->assertPermission('director/services');
+ $db = $this->db()->getDbAdapter();
+ $for_host = $this->getRequest()->getPost('for_host');
+ if (!empty($for_host)) {
+ $tmp_host = IcingaHost::load($for_host, $this->db());
+ }
+
+ $query = $db->select()->distinct()
+ ->from('icinga_service', 'object_name')
+ ->order('object_name')
+ ->where("object_type IN ('object','apply')");
+ if (!empty($tmp_host)) {
+ $query->where('host_id = ?', $tmp_host->id);
+ }
+ $r = array_merge($r, $db->fetchCol($query));
+ if (!empty($tmp_host)) {
+ $resolver = $tmp_host->templateResolver();
+ foreach ($resolver->fetchResolvedParents() as $template_obj) {
+ $query = $db->select()->distinct()
+ ->from('icinga_service', 'object_name')
+ ->order('object_name')
+ ->where("object_type IN ('object','apply')")
+ ->where('host_id = ?', $template_obj->id);
+ $r = array_merge($r, $db->fetchCol($query));
+ }
+
+ $matcher = HostApplyMatches::prepare($tmp_host);
+ foreach ($this->getAllApplyRules() as $rule) {
+ if ($matcher->matchesFilter($rule->filter)) { //TODO
+ $r[]=$rule->name;
+ }
+ }
+ }
+ natcasesort($r);
+ return $r;
+ }
+
+ protected function suggestHosttemplates()
+ {
+ $this->assertPermission('director/hosts');
+ return $this->fetchTemplateNames('icinga_host', 'template_choice_id IS NULL');
+ }
+
+ protected function suggestServicetemplates()
+ {
+ $this->assertPermission('director/services');
+ return $this->fetchTemplateNames('icinga_service', 'template_choice_id IS NULL');
+ }
+
+ protected function suggestNotificationtemplates()
+ {
+ $this->assertPermission('director/notifications');
+ return $this->fetchTemplateNames('icinga_notification');
+ }
+
+ protected function suggestCommandtemplates()
+ {
+ $this->assertPermission('director/commands');
+ $db = $this->db()->getDbAdapter();
+ $query = $db->select()
+ ->from('icinga_command', 'object_name')
+ ->order('object_name');
+ return $db->fetchCol($query);
+ }
+
+ protected function suggestUsertemplates()
+ {
+ $this->assertPermission('director/users');
+ return $this->fetchTemplateNames('icinga_user');
+ }
+
+ /**
+ * @return array
+ * @throws \Icinga\Security\SecurityException
+ * @codingStandardsIgnoreStart
+ */
+ protected function suggestScheduled_downtimetemplates()
+ {
+ // @codingStandardsIgnoreEnd
+ $this->assertPermission('director/scheduled-downtimes');
+ return $this->fetchTemplateNames('icinga_scheduled_downtime');
+ }
+
+ protected function suggestCheckcommandnames()
+ {
+ $db = $this->db()->getDbAdapter();
+ $query = $db->select()
+ ->from('icinga_command', 'object_name')
+ ->where('object_type != ?', 'template')
+ ->order('object_name');
+
+ return $db->fetchCol($query);
+ }
+
+ protected function fetchTemplateNames($table, $where = null)
+ {
+ $db = $this->db()->getDbAdapter();
+ $query = $db->select()
+ ->from($table, 'object_name')
+ ->where('object_type = ?', 'template')
+ ->order('object_name');
+
+ if ($where !== null) {
+ $query->where('template_choice_id IS NULL');
+ }
+
+ return $db->fetchCol($query);
+ }
+
+ protected function suggestHostgroupnames()
+ {
+ $db = $this->db()->getDbAdapter();
+ $query = $db->select()->from('icinga_hostgroup', 'object_name')->order('object_name');
+ return $db->fetchCol($query);
+ }
+
+ protected function suggestHostaddresses()
+ {
+ $db = $this->db()->getDbAdapter();
+ $query = $db->select()->from('icinga_host', 'address')->order('address');
+ return $db->fetchCol($query);
+ }
+
+ protected function suggestHostFilterColumns()
+ {
+ return $this->getFilterColumns('host.', [
+ $this->translate('Host properties'),
+ $this->translate('Custom variables')
+ ]);
+ }
+
+ protected function suggestServiceFilterColumns()
+ {
+ return $this->getFilterColumns('service.', [
+ $this->translate('Service properties'),
+ $this->translate('Host properties'),
+ $this->translate('Host Custom variables'),
+ $this->translate('Custom variables')
+ ]);
+ }
+
+ protected function suggestDataListValuesForListId($id)
+ {
+ $db = $this->db()->getDbAdapter();
+ $select = $db->select()
+ ->from('director_datalist_entry', ['entry_name', 'entry_value'])
+ ->where('list_id = ?', $id)
+ ->order('entry_value ASC');
+
+ $result = $db->fetchPairs($select);
+ if ($result) {
+ return $result;
+ } else {
+ return [];
+ }
+ }
+
+ protected function suggestDataListValues($field = null)
+ {
+ if ($field === null) {
+ // field is required!
+ return [];
+ }
+
+ $datalistType = 'Icinga\\Module\\Director\\DataType\\DataTypeDatalist';
+ $db = $this->db()->getDbAdapter();
+
+ $query = $db->select()
+ ->from(['f' =>'director_datafield'], [])
+ ->join(
+ ['sid' => 'director_datafield_setting'],
+ 'sid.datafield_id = f.id AND sid.setting_name = \'datalist_id\'',
+ []
+ )
+ ->join(
+ ['l' => 'director_datalist'],
+ 'l.id = sid.setting_value',
+ []
+ )
+ ->join(
+ ['e' => 'director_datalist_entry'],
+ 'e.list_id = l.id',
+ ['entry_name', 'entry_value']
+ )
+ ->where('datatype = ?', $datalistType)
+ ->where('varname = ?', $field)
+ ->order('entry_value');
+
+
+ // TODO: respect allowed_roles
+ /* this implementation from DataTypeDatalist is broken
+ $roles = array_map('json_encode', Acl::instance()->listRoleNames());
+
+ if (empty($roles)) {
+ $query->where('allowed_roles IS NULL');
+ } else {
+ $query->where('(allowed_roles IS NULL OR allowed_roles IN (?))', $roles);
+ }
+ */
+
+ $data = [];
+ foreach ($db->fetchPairs($query) as $key => $label) {
+ // TODO: find a better solution here
+ // $data[] = sprintf("%s [%s]", $label, $key);
+ $data[] = $key;
+ }
+ return $data;
+ }
+
+ protected function getFilterColumns($prefix, $keys)
+ {
+ if ($prefix === 'host.') {
+ $all = IcingaHost::enumProperties($this->db(), $prefix);
+ } else {
+ $all = IcingaService::enumProperties($this->db(), $prefix);
+ }
+ $res = [];
+ foreach ($keys as $key) {
+ if (array_key_exists($key, $all)) {
+ $res = array_merge($res, array_keys($all[$key]));
+ }
+ }
+
+ natsort($res);
+ return $res;
+ }
+
+ protected function suggestDependencytemplates()
+ {
+ $this->assertPermission('director/hosts');
+ return $this->fetchTemplateNames('icinga_dependency');
+ }
+
+ protected function highlight($val, $search)
+ {
+ $search = ($search);
+ $val = Html::escape($val);
+ return preg_replace(
+ '/(' . preg_quote($search, '/') . ')/i',
+ '<strong>\1</strong>',
+ $val
+ );
+ }
+
+ protected function getAllApplyRules()
+ {
+ $allApplyRules=$this->fetchAllApplyRules();
+ foreach ($allApplyRules as $rule) {
+ $rule->filter = Filter::fromQueryString($rule->assign_filter);
+ }
+
+ return $allApplyRules;
+ }
+
+ protected function fetchAllApplyRules()
+ {
+ $db = $this->db()->getDbAdapter();
+ $query = $db->select()->from(
+ array('s' => 'icinga_service'),
+ array(
+ 'id' => 's.id',
+ 'name' => 's.object_name',
+ 'assign_filter' => 's.assign_filter',
+ )
+ )->where('object_type = ? AND assign_filter IS NOT NULL', 'apply');
+
+ return $db->fetchAll($query);
+ }
+
+ protected function suggestImportsourceproperties($sourceId = null)
+ {
+ if ($sourceId === null) {
+ return [];
+ }
+
+ try {
+ $importSource = ImportSource::loadWithAutoIncId($sourceId, $this->db());
+ $source = ImportSourceHook::loadByName($importSource->get('source_name'), $this->db());
+
+ $columns = array_merge(
+ $source->listColumns(),
+ $importSource->listProperties()
+ );
+
+ return array_combine($columns, $columns);
+ } catch (NotFoundError $e) {
+ return [];
+ }
+ }
+}
diff --git a/application/controllers/SyncruleController.php b/application/controllers/SyncruleController.php
new file mode 100644
index 0000000..928cf2c
--- /dev/null
+++ b/application/controllers/SyncruleController.php
@@ -0,0 +1,696 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use gipfl\IcingaWeb2\Link;
+use gipfl\Web\Widget\Hint;
+use Icinga\Date\DateFormatter;
+use Icinga\Module\Director\Data\Db\DbObjectStore;
+use Icinga\Module\Director\Data\Db\DbObjectTypeRegistry;
+use Icinga\Module\Director\Db\Branch\Branch;
+use Icinga\Module\Director\Db\Branch\BranchStore;
+use Icinga\Module\Director\Db\Branch\BranchSupport;
+use Icinga\Module\Director\Web\Controller\BranchHelper;
+use Icinga\Module\Director\Web\Form\ClickHereForm;
+use Icinga\Module\Director\Web\Table\BranchActivityTable;
+use Icinga\Module\Director\Web\Widget\IcingaConfigDiff;
+use Icinga\Module\Director\Web\Widget\UnorderedList;
+use Icinga\Module\Director\Db\Cache\PrefetchCache;
+use Icinga\Module\Director\DirectorObject\Automation\ExportInterface;
+use Icinga\Module\Director\Forms\SyncCheckForm;
+use Icinga\Module\Director\Forms\SyncPropertyForm;
+use Icinga\Module\Director\Forms\SyncRuleForm;
+use Icinga\Module\Director\Forms\SyncRunForm;
+use Icinga\Module\Director\IcingaConfig\IcingaConfig;
+use Icinga\Module\Director\Import\Sync;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Objects\IcingaService;
+use Icinga\Module\Director\Web\ActionBar\AutomationObjectActionBar;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Objects\SyncRule;
+use Icinga\Module\Director\Objects\SyncRun;
+use Icinga\Module\Director\Web\Form\CloneSyncRuleForm;
+use Icinga\Module\Director\Web\Table\SyncpropertyTable;
+use Icinga\Module\Director\Web\Table\SyncRunTable;
+use Icinga\Module\Director\Web\Tabs\SyncRuleTabs;
+use Icinga\Module\Director\Web\Widget\SyncRunDetails;
+use Icinga\Web\Notification;
+use ipl\Html\Form;
+use ipl\Html\Html;
+
+class SyncruleController extends ActionController
+{
+ use BranchHelper;
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function indexAction()
+ {
+ $this->setAutoRefreshInterval(10);
+ $rule = $this->requireSyncRule();
+ $this->tabs(new SyncRuleTabs($rule))->activate('show');
+ $ruleName = $rule->get('rule_name');
+ $this->addTitle($this->translate('Sync rule: %s'), $ruleName);
+
+ $checkForm = SyncCheckForm::load()->setSyncRule($rule)->handleRequest();
+ $store = new DbObjectStore($this->db(), $this->getBranch());
+ $runForm = new SyncRunForm($rule, $store);
+ $runForm->on(SyncRunForm::ON_SUCCESS, function (SyncRunForm $form) {
+ $message = $form->getSuccessMessage();
+ if ($message === null) {
+ Notification::error($this->translate('Synchronization failed'));
+ } else {
+ Notification::success($message);
+ }
+ $this->redirectNow($this->url());
+ });
+ $runForm->handleRequest($this->getServerRequest());
+
+ if ($lastRunId = $rule->getLastSyncRunId()) {
+ $run = SyncRun::load($lastRunId, $this->db());
+ } else {
+ $run = null;
+ }
+
+ $c = $this->content();
+ $c->add(Html::tag('p', null, $rule->get('description')));
+ if (! $rule->hasSyncProperties()) {
+ $this->addPropertyHint($rule);
+ return;
+ }
+ $this->addMainActions();
+ if (! $run) {
+ $c->add(Hint::warning($this->translate('This Sync Rule has never been run before.')));
+ }
+
+ switch ($rule->get('sync_state')) {
+ case 'unknown':
+ $c->add(Html::tag('p', null, $this->translate(
+ "It's currently unknown whether we are in sync with this rule."
+ . ' You should either check for changes or trigger a new Sync Run.'
+ )));
+ break;
+ case 'in-sync':
+ $c->add(Html::tag('p', null, sprintf(
+ $this->translate('This Sync Rule was last found to by in Sync at %s.'),
+ $rule->get('last_attempt')
+ )));
+ /*
+ TODO: check whether...
+ - there have been imports since then, differing from former ones
+ - there have been activities since then
+ */
+ break;
+ case 'pending-changes':
+ $c->add(Hint::warning($this->translate(
+ 'There are pending changes for this Sync Rule. You should trigger a new'
+ . ' Sync Run.'
+ )));
+ break;
+ case 'failing':
+ $c->add(Hint::error(sprintf(
+ $this->translate(
+ 'This Sync Rule failed when last checked at %s: %s'
+ ),
+ $rule->get('last_attempt'),
+ $rule->get('last_error_message')
+ )));
+ break;
+ }
+
+ $c->add($checkForm);
+ if ($this->hasBranch()) {
+ $objectType = $rule->get('object_type');
+ $table = DbObjectTypeRegistry::tableNameByType($objectType);
+ if (! BranchSupport::existsForTableName($table)) {
+ $this->showNotInBranch(sprintf($this->translate("Synchronizing '%s'"), $objectType));
+ return;
+ }
+ }
+
+ $c->add($runForm);
+
+ if ($run) {
+ $c->add(Html::tag('h3', null, $this->translate('Last sync run details')));
+ $c->add(new SyncRunDetails($run));
+ if ($run->get('rule_name') !== $ruleName) {
+ $c->add(Html::tag('p', null, sprintf(
+ $this->translate("It has been renamed since then, its former name was %s"),
+ $run->get('rule_name')
+ )));
+ }
+ }
+ }
+
+ /**
+ * @param SyncRule $rule
+ */
+ protected function addPropertyHint(SyncRule $rule)
+ {
+ $this->content()->add(Hint::warning(Html::sprintf(
+ $this->translate('You must define some %s before you can run this Sync Rule'),
+ new Link(
+ $this->translate('Sync Properties'),
+ 'director/syncrule/property',
+ ['rule_id' => $rule->get('id')]
+ )
+ )));
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function addAction()
+ {
+ $this->editAction();
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ * @throws \Exception
+ */
+ public function previewAction()
+ {
+ $rule = $this->requireSyncRule();
+ $branchSupport = BranchSupport::existsForSyncRule($rule);
+ $branchStore = new BranchStore($this->db());
+ $owner = $this->getAuth()->getUser()->getUsername();
+ if ($branchSupport) {
+ if ($this->getBranch()->isBranch()) {
+ $tmpBranchName = sprintf(
+ '%s/%s-%s',
+ Branch::PREFIX_SYNC_PREVIEW,
+ $this->getBranch()->getUuid()->toString(),
+ $rule->get('id')
+ );
+ // We could keep changes for preview on branch too
+ $branchStore->deleteByName($tmpBranchName);
+ $tmpBranch = $branchStore->cloneBranchForSync($this->getBranch(), $tmpBranchName, $owner);
+ $after = 1600000000; // a date in 2020, minus 10000000
+ } else {
+ $tmpBranchName = Branch::PREFIX_SYNC_PREVIEW . '/' . $rule->get('id');
+ $tmpBranch = $branchStore->fetchOrCreateByName($tmpBranchName, $owner);
+ $after = null;
+ }
+ $store = new DbObjectStore($this->db(), $tmpBranch);
+ } else {
+ $tmpBranch = $store = null;
+ }
+
+ $this->tabs(new SyncRuleTabs($rule))->activate('preview');
+ $this->addTitle($this->translate('Sync Preview'));
+ $sync = new Sync($rule, $store);
+ $keepBranchPreview = false;
+ if ($tmpBranch) {
+ if ($lastTime = $branchStore->getLastActivityTime($tmpBranch, $after)) {
+ if ((time() - $lastTime) > 100) {
+ $branchStore->wipeBranch($tmpBranch, $after);
+ } else {
+ $here = (new ClickHereForm())->handleRequest($this->getServerRequest());
+ if ($here->hasBeenClicked()) {
+ $branchStore->wipeBranch($tmpBranch, $after);
+ $this->redirectNow($this->url());
+ } else {
+ $keepBranchPreview = true;
+ }
+ $this->content()->add(Hint::info(Html::sprintf(
+ $this->translate('This preview has been generated %s, please click %s to regenerate it'),
+ DateFormatter::timeAgo($lastTime),
+ $here
+ )));
+ }
+ }
+ }
+ if (!$keepBranchPreview) {
+ $modifications = $sync->getExpectedModifications();
+ }
+
+ if ($tmpBranch) {
+ try {
+ if (!$keepBranchPreview) {
+ $sync->apply();
+ }
+ } catch (\Exception $e) {
+ $this->content()->add(Hint::error($e->getMessage()));
+ return;
+ }
+
+ $changes = new BranchActivityTable($tmpBranch->getUuid(), $this->db());
+ $changes->disableObjectLink();
+ if (count($changes) === 0) {
+ $this->showInSync();
+ }
+ $changes->renderTo($this);
+ } else {
+ if (empty($modifications)) {
+ $this->showInSync();
+ return;
+ }
+ $this->showExpectedModificationSummary($modifications);
+ }
+ }
+
+ protected function showInSync()
+ {
+ $this->content()->add(Hint::ok($this->translate(
+ 'This Sync Rule is in sync and would currently not apply any changes'
+ )));
+ }
+
+ protected function showExpectedModificationSummary($modifications)
+ {
+ $create = [];
+ $modify = [];
+ $delete = [];
+ $modifiedProperties = [];
+ /** @var IcingaObject $object */
+ foreach ($modifications as $object) {
+ if ($object->hasBeenLoadedFromDb()) {
+ if ($object->shouldBeRemoved()) {
+ $delete[] = $object;
+ } else {
+ $modify[] = $object;
+ foreach ($object->getModifiedProperties() as $property => $value) {
+ if (isset($modifiedProperties[$property])) {
+ $modifiedProperties[$property]++;
+ } else {
+ $modifiedProperties[$property] = 1;
+ }
+ }
+ if (! $object instanceof IcingaObject) {
+ continue;
+ }
+ if ($object->supportsGroups()) {
+ if ($object->hasModifiedGroups()) {
+ if (isset($modifiedProperties['groups'])) {
+ $modifiedProperties['groups']++;
+ } else {
+ $modifiedProperties['groups'] = 1;
+ }
+ }
+ }
+
+ if ($object->supportsImports()) {
+ if ($object->imports()->hasBeenModified()) {
+ if (isset($modifiedProperties['imports'])) {
+ $modifiedProperties['imports']++;
+ } else {
+ $modifiedProperties['imports'] = 1;
+ }
+ }
+ }
+ if ($object->supportsCustomVars()) {
+ if ($object->vars()->hasBeenModified()) {
+ foreach ($object->vars() as $var) {
+ if ($var->isNew()) {
+ $varName = 'add vars.' . $var->getKey();
+ } elseif ($var->hasBeenDeleted()) {
+ $varName = 'remove vars.' . $var->getKey();
+ } elseif ($var->hasBeenModified()) {
+ $varName = 'vars.' . $var->getKey();
+ } else {
+ continue;
+ }
+ if (isset($modifiedProperties[$varName])) {
+ $modifiedProperties[$varName]++;
+ } else {
+ $modifiedProperties[$varName] = 1;
+ }
+ }
+ }
+ }
+ }
+ } else {
+ $create[] = $object;
+ }
+ }
+
+ $content = $this->content();
+ if (! empty($delete)) {
+ $content->add([
+ Html::tag('h2', ['class' => 'icon-cancel action-delete'], sprintf(
+ $this->translate('%d object(s) will be deleted'),
+ count($delete)
+ )),
+ $this->objectList($delete)
+ ]);
+ }
+ if (! empty($modify)) {
+ $content->add([
+ Html::tag('h2', ['class' => 'icon-wrench action-modify'], sprintf(
+ $this->translate('%d object(s) will be modified'),
+ count($modify)
+ )),
+ $this->listModifiedProperties($modifiedProperties),
+ $this->objectList($modify),
+ ]);
+ }
+ if (! empty($create)) {
+ $content->add([
+ Html::tag('h2', ['class' => 'icon-plus action-create'], sprintf(
+ $this->translate('%d object(s) will be created'),
+ count($create)
+ )),
+ $this->objectList($create)
+ ]);
+ }
+ }
+
+ /**
+ * @param IcingaObject[] $objects
+ * @return \ipl\Html\HtmlElement
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function objectList($objects)
+ {
+ return Html::tag('p', $this->firstNames($objects));
+ }
+
+ /**
+ * Lots of duplicated code, this whole diff logic should be mouved to a
+ * dedicated class
+ *
+ * @param IcingaObject[] $objects
+ * @param int $max
+ * @return string
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function firstNames($objects, $max = 50)
+ {
+ $names = [];
+ $list = new UnorderedList();
+ $list->addAttributes([
+ 'style' => 'list-style-type: none; marign: 0; padding: 0',
+ ]);
+ $total = count($objects);
+ $i = 0;
+ PrefetchCache::forget();
+ IcingaHost::clearAllPrefetchCaches(); // why??
+ IcingaService::clearAllPrefetchCaches();
+ foreach ($objects as $object) {
+ $i++;
+ $name = $this->getObjectNameString($object);
+ if ($object->hasBeenLoadedFromDb()) {
+ if ($object instanceof IcingaHost) {
+ $names[$name] = Link::create(
+ $name,
+ 'director/host',
+ ['name' => $name],
+ ['data-base-target' => '_next']
+ );
+ $oldObject = IcingaHost::load($object->getObjectName(), $this->db());
+ $cfgNew = new IcingaConfig($this->db());
+ $cfgOld = new IcingaConfig($this->db());
+ $oldObject->renderToConfig($cfgOld);
+ $object->renderToConfig($cfgNew);
+ foreach (IcingaConfigDiff::getDiffs($cfgOld, $cfgNew) as $file => $diff) {
+ $names[$name . '___PRETITLE___' . $file] = Html::tag('h3', $file);
+ $names[$name . '___PREVIEW___' . $file] = $diff;
+ }
+ } elseif ($object instanceof IcingaService && $object->isObject()) {
+ $host = $object->getRelated('host');
+
+ $names[$name] = Link::create(
+ $name,
+ 'director/service/edit',
+ [
+ 'name' => $object->getObjectName(),
+ 'host' => $host->getObjectName()
+ ],
+ ['data-base-target' => '_next']
+ );
+ $oldObject = IcingaService::load([
+ 'host_id' => $host->get('id'),
+ 'object_name' => $object->getObjectName()
+ ], $this->db());
+
+ $cfgNew = new IcingaConfig($this->db());
+ $cfgOld = new IcingaConfig($this->db());
+ $oldObject->renderToConfig($cfgOld);
+ $object->renderToConfig($cfgNew);
+ foreach (IcingaConfigDiff::getDiffs($cfgOld, $cfgNew) as $file => $diff) {
+ $names[$name . '___PRETITLE___' . $file] = Html::tag('h3', $file);
+ $names[$name . '___PREVIEW___' . $file] = $diff;
+ }
+ } else {
+ $names[$name] = $name;
+ }
+ } else {
+ $names[$name] = $name;
+ }
+ if ($i === $max) {
+ break;
+ }
+ }
+ ksort($names);
+
+ foreach ($names as $name) {
+ $list->addItem($name);
+ }
+
+ if ($total > $max) {
+ $list->add(sprintf(
+ $this->translate('...and %d more'),
+ $total - $max
+ ));
+ }
+
+ return $list;
+ }
+
+ protected function listModifiedProperties($properties)
+ {
+ $list = new UnorderedList();
+ foreach ($properties as $property => $cnt) {
+ $list->addItem("${cnt}x $property");
+ }
+
+ return $list;
+ }
+
+ protected function getObjectNameString($object)
+ {
+ if ($object instanceof IcingaService) {
+ if ($object->isObject()) {
+ return $object->getRelated('host')->getObjectName()
+ . ': ' . $object->getObjectName();
+ } else {
+ return $object->getObjectName();
+ }
+ } elseif ($object instanceof IcingaHost) {
+ return $object->getObjectName();
+ } elseif ($object instanceof ExportInterface) {
+ return $object->getUniqueIdentifier();
+ } elseif ($object instanceof IcingaObject) {
+ return $object->getObjectName();
+ } else {
+ /** @var \Icinga\Module\Director\Data\Db\DbObject $object */
+ return json_encode($object->getKeyParams());
+ }
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function editAction()
+ {
+ $form = SyncRuleForm::load()
+ ->setListUrl('director/syncrules')
+ ->setDb($this->db());
+
+ if ($id = $this->params->get('id')) {
+ $form->loadObject((int) $id);
+ /** @var SyncRule $rule */
+ $rule = $form->getObject();
+ $this->tabs(new SyncRuleTabs($rule))->activate('edit');
+ $this->addTitle(sprintf(
+ $this->translate('Sync rule: %s'),
+ $rule->get('rule_name')
+ ));
+ $this->addMainActions();
+
+ if (! $rule->hasSyncProperties()) {
+ $this->addPropertyHint($rule);
+ }
+ if ($this->showNotInBranch($this->translate('Modifying Sync Rules'))) {
+ return;
+ }
+
+ } else {
+ $this->addTitle($this->translate('Add sync rule'));
+ $this->tabs(new SyncRuleTabs())->activate('add');
+ if ($this->showNotInBranch($this->translate('Creating Sync Rules'))) {
+ return;
+ }
+ }
+
+ $form->handleRequest();
+ $this->content()->add($form);
+ }
+
+ /**
+ * @throws \Icinga\Exception\MissingParameterException
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function cloneAction()
+ {
+ $id = $this->params->getRequired('id');
+ $rule = SyncRule::loadWithAutoIncId((int) $id, $this->db());
+ $this->tabs()->add('show', [
+ 'url' => 'director/syncrule',
+ 'urlParams' => ['id' => $id],
+ 'label' => $this->translate('Sync rule'),
+ ])->add('clone', [
+ 'url' => 'director/syncrule/clone',
+ 'urlParams' => ['id' => $id],
+ 'label' => $this->translate('Clone'),
+ ])->activate('clone');
+ $this->addTitle('Clone: %s', $rule->get('rule_name'));
+ $this->actions()->add(
+ Link::create(
+ $this->translate('Modify'),
+ 'director/syncrule/edit',
+ ['id' => $rule->get('id')],
+ ['class' => 'icon-paste']
+ )
+ );
+ if ($this->showNotInBranch($this->translate('Cloning Sync Rules'))) {
+ return;
+ }
+
+ $form = new CloneSyncRuleForm($rule);
+ $this->content()->add($form);
+ $form->on(Form::ON_SUCCESS, function (CloneSyncRuleForm $form) {
+ $this->getResponse()->redirectAndExit($form->getSuccessUrl());
+ });
+ $form->handleRequest($this->getServerRequest());
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function propertyAction()
+ {
+ $rule = $this->requireSyncRule('rule_id');
+ $this->tabs(new SyncRuleTabs($rule))->activate('property');
+
+ $this->actions()->add(Link::create(
+ $this->translate('Add sync property rule'),
+ 'director/syncrule/addproperty',
+ ['rule_id' => $rule->get('id')],
+ ['class' => 'icon-plus']
+ ));
+ $this->addTitle($this->translate('Sync properties') . ': ' . $rule->get('rule_name'));
+
+ SyncpropertyTable::create($rule)
+ ->handleSortPriorityActions($this->getRequest(), $this->getResponse())
+ ->renderTo($this);
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function editpropertyAction()
+ {
+ $this->addpropertyAction();
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function addpropertyAction()
+ {
+ $db = $this->db();
+ $rule = $this->requireSyncRule('rule_id');
+ $ruleId = (int) $rule->get('id');
+
+ $form = SyncPropertyForm::load()->setDb($db);
+ $this->tabs(new SyncRuleTabs($rule))->activate('property');
+ $this->actions()->add(new Link(
+ $this->translate('back'),
+ 'director/syncrule/property',
+ ['rule_id' => $ruleId],
+ ['class' => 'icon-left-big']
+ ));
+
+ if ($id = $this->params->get('id')) {
+ $form->loadObject((int) $id);
+ $this->addTitle(
+ $this->translate('Sync "%s": %s'),
+ $form->getObject()->get('destination_field'),
+ $rule->get('rule_name')
+ );
+ if ($this->showNotInBranch($this->translate('Modifying Sync Rules'))) {
+ return;
+ }
+ } else {
+ $this->addTitle(
+ $this->translate('Add sync property: %s'),
+ $rule->get('rule_name')
+ );
+ if ($this->showNotInBranch($this->translate('Modifying Sync Rules'))) {
+ return;
+ }
+ }
+ $form->setRule($rule);
+ $form->setSuccessUrl('director/syncrule/property', ['rule_id' => $ruleId]);
+ $this->content()->add($form->handleRequest());
+ SyncpropertyTable::create($rule)
+ ->handleSortPriorityActions($this->getRequest(), $this->getResponse())
+ ->renderTo($this);
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function historyAction()
+ {
+ $this->setAutoRefreshInterval(30);
+ $rule = $this->requireSyncRule();
+ $this->tabs(new SyncRuleTabs($rule))->activate('history');
+ $this->addTitle($this->translate('Sync history') . ': ' . $rule->get('rule_name'));
+
+ if ($runId = $this->params->get('run_id')) {
+ $run = SyncRun::load($runId, $this->db());
+ $this->content()->add(new SyncRunDetails($run));
+ }
+ (new SyncRunTable($rule))->renderTo($this);
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function addMainActions()
+ {
+ $this->actions(new AutomationObjectActionBar(
+ $this->getRequest()
+ ));
+ $source = $this->requireSyncRule();
+
+ $this->actions()->add(Link::create(
+ $this->translate('Add to Basket'),
+ 'director/basket/add',
+ [
+ 'type' => 'SyncRule',
+ 'names' => $source->getUniqueIdentifier()
+ ],
+ [
+ 'class' => 'icon-tag',
+ 'data-base-target' => '_next',
+ ]
+ ));
+ }
+
+ /**
+ * @param string $key
+ * @return SyncRule
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function requireSyncRule($key = 'id')
+ {
+ $id = $this->params->get($key);
+ return SyncRule::loadWithAutoIncId($id, $this->db());
+ }
+}
diff --git a/application/controllers/SyncrulesController.php b/application/controllers/SyncrulesController.php
new file mode 100644
index 0000000..1829ebe
--- /dev/null
+++ b/application/controllers/SyncrulesController.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\DirectorObject\Automation\ImportExport;
+use Icinga\Module\Director\Web\Table\SyncruleTable;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Web\Tabs\ImportTabs;
+
+class SyncrulesController extends ActionController
+{
+ protected $isApified = true;
+
+ /**
+ * @throws \Icinga\Exception\ConfigurationError
+ * @throws \Icinga\Exception\Http\HttpNotFoundException
+ */
+ public function indexAction()
+ {
+ if ($this->getRequest()->isApiRequest()) {
+ $this->sendExport();
+ return;
+ }
+
+ $this->addTitle($this->translate('Sync rule'))
+ ->setAutoRefreshInterval(10)
+ ->addAddLink(
+ $this->translate('Add a new Sync Rule'),
+ 'director/syncrule/add'
+ )->tabs(new ImportTabs())->activate('syncrule');
+
+ (new SyncruleTable($this->db()))->renderTo($this);
+ }
+
+ /**
+ * @throws \Icinga\Exception\ConfigurationError
+ */
+ protected function sendExport()
+ {
+ $this->sendJson(
+ $this->getResponse(),
+ (new ImportExport($this->db()))->serializeAllSyncRules()
+ );
+ }
+}
diff --git a/application/controllers/TemplatechoiceController.php b/application/controllers/TemplatechoiceController.php
new file mode 100644
index 0000000..faf3dfe
--- /dev/null
+++ b/application/controllers/TemplatechoiceController.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Forms\IcingaTemplateChoiceForm;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Web\Controller\BranchHelper;
+
+class TemplatechoiceController extends ActionController
+{
+ use BranchHelper;
+
+ protected function checkDirectorPermissions()
+ {
+ $this->assertPermission('director/admin');
+ }
+
+ public function hostAction()
+ {
+ $this->prepare('host', $this->translate('Host template choice'));
+ }
+
+ public function serviceAction()
+ {
+ $this->prepare('service', $this->translate('Service template choice'));
+ }
+
+ protected function prepare($type, $title)
+ {
+ $this->addSingleTab('Choice')
+ ->addTitle($title);
+ $form = IcingaTemplateChoiceForm::create($type, $this->db())
+ ->optionallyLoad($this->params->get('name'))
+ ->setListUrl("director/templatechoices/$type")
+ ->handleRequest();
+ if ($this->showNotInBranch($this->translate('Modifying Template Choices'))) {
+ return;
+ }
+ $this->content()->add($form);
+ }
+}
diff --git a/application/controllers/TemplatechoicesController.php b/application/controllers/TemplatechoicesController.php
new file mode 100644
index 0000000..753591a
--- /dev/null
+++ b/application/controllers/TemplatechoicesController.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\ActionBar\ChoicesActionBar;
+use Icinga\Module\Director\Web\Controller\ActionController;
+use Icinga\Module\Director\Web\Table\ChoicesTable;
+use Icinga\Module\Director\Web\Tabs\ObjectsTabs;
+
+class TemplatechoicesController extends ActionController
+{
+ protected function checkDirectorPermissions()
+ {
+ $this->assertPermission('director/admin');
+ }
+
+ public function hostAction()
+ {
+ $this->prepare('host', $this->translate('Host template choices'));
+ }
+
+ public function serviceAction()
+ {
+ $this->prepare('service', $this->translate('Service template choices'));
+ }
+
+ public function notificationAction()
+ {
+ $this->prepare('notification', $this->translate('Notification template choices'));
+ }
+
+ protected function prepare($type, $title)
+ {
+ $this->tabs(new ObjectsTabs($type, $this->Auth(), $type))->activate('choices');
+ $this->setAutorefreshInterval(10)->addTitle($title);
+ $this->actions(new ChoicesActionBar($type, $this->url()));
+ ChoicesTable::create($type, $this->db())->renderTo($this);
+ }
+}
diff --git a/application/controllers/TimeperiodController.php b/application/controllers/TimeperiodController.php
new file mode 100644
index 0000000..82c7749
--- /dev/null
+++ b/application/controllers/TimeperiodController.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Forms\IcingaTimePeriodRangeForm;
+use Icinga\Module\Director\Objects\IcingaTimePeriod;
+use Icinga\Module\Director\Web\Controller\ObjectController;
+use Icinga\Module\Director\Web\Table\IcingaTimePeriodRangeTable;
+
+class TimeperiodController extends ObjectController
+{
+ public function rangesAction()
+ {
+ /** @var IcingaTimePeriod $object */
+ $object = $this->object;
+ $this->tabs()->activate('ranges');
+ $this->addTitle($this->translate('Time period ranges'));
+ $form = IcingaTimePeriodRangeForm::load()
+ ->setTimePeriod($object);
+
+ if (null !== ($name = $this->params->get('range'))) {
+ $this->addBackLink($this->url()->without('range'));
+ $form->loadObject([
+ 'timeperiod_id' => $object->get('id'),
+ 'range_key' => $name,
+ 'range_type' => $this->params->get('range_type')
+ ]);
+ }
+
+ $this->content()->add($form->handleRequest());
+ IcingaTimePeriodRangeTable::load($object)->renderTo($this);
+ }
+}
diff --git a/application/controllers/TimeperiodsController.php b/application/controllers/TimeperiodsController.php
new file mode 100644
index 0000000..e5adb19
--- /dev/null
+++ b/application/controllers/TimeperiodsController.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectsController;
+
+class TimeperiodsController extends ObjectsController
+{
+}
diff --git a/application/controllers/TimeperiodtemplateController.php b/application/controllers/TimeperiodtemplateController.php
new file mode 100644
index 0000000..a7b26a8
--- /dev/null
+++ b/application/controllers/TimeperiodtemplateController.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Objects\IcingaTimePeriod;
+use Icinga\Module\Director\Web\Controller\TemplateController;
+
+class TimeperiodtemplateController extends TemplateController
+{
+ protected function requireTemplate()
+ {
+ return IcingaTimePeriod::load([
+ 'object_name' => $this->params->get('name')
+ ], $this->db());
+ }
+}
diff --git a/application/controllers/UserController.php b/application/controllers/UserController.php
new file mode 100644
index 0000000..b021be9
--- /dev/null
+++ b/application/controllers/UserController.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectController;
+
+class UserController extends ObjectController
+{
+ protected function checkDirectorPermissions()
+ {
+ $this->assertPermission('director/users');
+ }
+
+ protected function hasBasketSupport()
+ {
+ return true;
+ }
+}
diff --git a/application/controllers/UsergroupController.php b/application/controllers/UsergroupController.php
new file mode 100644
index 0000000..e58fd7e
--- /dev/null
+++ b/application/controllers/UsergroupController.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectController;
+
+class UsergroupController extends ObjectController
+{
+}
diff --git a/application/controllers/UsergroupsController.php b/application/controllers/UsergroupsController.php
new file mode 100644
index 0000000..057890f
--- /dev/null
+++ b/application/controllers/UsergroupsController.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectsController;
+
+class UsergroupsController extends ObjectsController
+{
+}
diff --git a/application/controllers/UsersController.php b/application/controllers/UsersController.php
new file mode 100644
index 0000000..ee6d93d
--- /dev/null
+++ b/application/controllers/UsersController.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectsController;
+
+class UsersController extends ObjectsController
+{
+ protected function checkDirectorPermissions()
+ {
+ $this->assertPermission('director/users');
+ }
+}
diff --git a/application/controllers/UsertemplateController.php b/application/controllers/UsertemplateController.php
new file mode 100644
index 0000000..41fce86
--- /dev/null
+++ b/application/controllers/UsertemplateController.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Objects\IcingaUser;
+use Icinga\Module\Director\Web\Controller\TemplateController;
+
+class UsertemplateController extends TemplateController
+{
+ protected function requireTemplate()
+ {
+ return IcingaUser::load([
+ 'object_name' => $this->params->get('name')
+ ], $this->db());
+ }
+}
diff --git a/application/controllers/ZoneController.php b/application/controllers/ZoneController.php
new file mode 100644
index 0000000..a4125bb
--- /dev/null
+++ b/application/controllers/ZoneController.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectController;
+
+class ZoneController extends ObjectController
+{
+}
diff --git a/application/controllers/ZonesController.php b/application/controllers/ZonesController.php
new file mode 100644
index 0000000..2dcaf58
--- /dev/null
+++ b/application/controllers/ZonesController.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Icinga\Module\Director\Controllers;
+
+use Icinga\Module\Director\Web\Controller\ObjectsController;
+
+class ZonesController extends ObjectsController
+{
+}
diff --git a/application/forms/AddToBasketForm.php b/application/forms/AddToBasketForm.php
new file mode 100644
index 0000000..44b5357
--- /dev/null
+++ b/application/forms/AddToBasketForm.php
@@ -0,0 +1,129 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use gipfl\Web\Widget\Hint;
+use ipl\Html\Html;
+use ipl\Html\HtmlDocument;
+use gipfl\IcingaWeb2\Link;
+use Icinga\Module\Director\DirectorObject\Automation\Basket;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+
+class AddToBasketForm extends DirectorForm
+{
+ /** @var Basket */
+ private $basket;
+
+ private $type = '(has not been set)';
+
+ private $names = [];
+
+ /**
+ * @throws \Zend_Form_Exception
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function setup()
+ {
+ $db = $this->getDb()->getDbAdapter();
+ $enum = $db->fetchPairs($db->select()->from('director_basket', [
+ 'a' => 'basket_name',
+ 'b' => 'basket_name',
+ ])->order('basket_name'));
+
+ $names = [];
+ $basket = null;
+ if ($this->hasBeenSent()) {
+ $basketName = $this->getSentValue('basket');
+ if ($basketName) {
+ $basket = Basket::load($basketName, $this->getDb());
+ }
+ }
+ $count = 0;
+ $type = $this->type;
+ foreach ($this->names as $name) {
+ if (! empty($names)) {
+ $names[] = ', ';
+ }
+ if ($basket && $basket->hasObject($type, $name)) {
+ $names[] = Html::tag('span', [
+ 'style' => 'text-decoration: line-through'
+ ], $name);
+ } else {
+ $count++;
+ $names[] = $name;
+ }
+ }
+ $this->addHtmlHint((new HtmlDocument())->add([
+ 'The following objects will be added: ',
+ $names
+ ]));
+ $this->addElement('select', 'basket', [
+ 'label' => $this->translate('Basket'),
+ 'multiOptions' => $this->optionalEnum($enum),
+ 'required' => true,
+ 'class' => 'autosubmit',
+ ]);
+
+ if ($count > 0) {
+ $this->setSubmitLabel(sprintf(
+ $this->translate('Add %s objects'),
+ $count
+ ));
+ } else {
+ $this->setSubmitLabel($this->translate('Add'));
+ $this->addSubmitButtonIfSet();
+ $this->getElement($this->submitButtonName)->setAttrib('disabled', true);
+ }
+ }
+
+ public function setType($type)
+ {
+ $this->type = $type;
+
+ return $this;
+ }
+
+ public function setNames($names)
+ {
+ $this->names = $names;
+
+ return $this;
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ * @throws \Icinga\Module\Director\Exception\DuplicateKeyException
+ */
+ public function onSuccess()
+ {
+ $type = $this->type;
+ $basket = Basket::load($this->getValue('basket'), $this->getDb());
+ $basketName = $basket->get('basket_name');
+
+ if (empty($this->names)) {
+ $this->getElement('basket')->addErrorMessage($this->translate(
+ 'No object has been chosen'
+ ));
+ }
+ if ($basket->supportsCustomSelectionFor($type)) {
+ $basket->addObjects($type, $this->names);
+ $basket->store();
+ $this->setSuccessMessage(sprintf($this->translate(
+ 'Configuration objects have been added to the chosen basket "%s"'
+ ), $basketName));
+ return parent::onSuccess();
+ } else {
+ $this->addHtmlHint(Hint::error(Html::sprintf($this->translate(
+ 'Please check your Basket configuration, %s does not support'
+ . ' single "%s" configuration objects'
+ ), Link::create(
+ $basketName,
+ 'director/basket',
+ ['name' => $basketName],
+ ['data-base-target' => '_next']
+ ), $type)));
+
+ return false;
+ }
+ }
+}
diff --git a/application/forms/ApplyMigrationsForm.php b/application/forms/ApplyMigrationsForm.php
new file mode 100644
index 0000000..4f1e62b
--- /dev/null
+++ b/application/forms/ApplyMigrationsForm.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Exception;
+use Icinga\Module\Director\Db\Migrations;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+
+class ApplyMigrationsForm extends DirectorForm
+{
+ /** @var Migrations */
+ protected $migrations;
+
+ public function setup()
+ {
+ if ($this->migrations->hasSchema()) {
+ $count = $this->migrations->countPendingMigrations();
+ if ($count === 1) {
+ $this->setSubmitLabel(
+ $this->translate('Apply a pending schema migration')
+ );
+ } else {
+ $this->setSubmitLabel(
+ sprintf(
+ $this->translate('Apply %d pending schema migrations'),
+ $count
+ )
+ );
+ }
+ } else {
+ $this->setSubmitLabel($this->translate('Create schema'));
+ }
+ }
+
+ public function onSuccess()
+ {
+ try {
+ $this->setSuccessMessage($this->translate(
+ 'Pending database schema migrations have successfully been applied'
+ ));
+
+ $this->migrations->applyPendingMigrations();
+ parent::onSuccess();
+ } catch (Exception $e) {
+ $this->addError($e->getMessage());
+ }
+ }
+
+ public function setMigrations(Migrations $migrations)
+ {
+ $this->migrations = $migrations;
+ return $this;
+ }
+}
diff --git a/application/forms/BasketCreateSnapshotForm.php b/application/forms/BasketCreateSnapshotForm.php
new file mode 100644
index 0000000..165c7ac
--- /dev/null
+++ b/application/forms/BasketCreateSnapshotForm.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\DirectorObject\Automation\Basket;
+use Icinga\Module\Director\DirectorObject\Automation\BasketSnapshot;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+
+class BasketCreateSnapshotForm extends DirectorForm
+{
+ /** @var Basket */
+ private $basket;
+
+ public function setBasket(Basket $basket)
+ {
+ $this->basket = $basket;
+
+ return $this;
+ }
+
+ public function setup()
+ {
+ $this->setSubmitLabel($this->translate('Create Snapshot'));
+ }
+
+ /**
+ * @throws \Icinga\Module\Director\Exception\DuplicateKeyException
+ */
+ public function onSuccess()
+ {
+ /** @var \Icinga\Module\Director\Db $connection */
+ $connection = $this->basket->getConnection();
+ $snapshot = BasketSnapshot::createForBasket($this->basket, $connection);
+ $snapshot->store();
+ parent::onSuccess();
+ }
+}
diff --git a/application/forms/BasketForm.php b/application/forms/BasketForm.php
new file mode 100644
index 0000000..8ff6cca
--- /dev/null
+++ b/application/forms/BasketForm.php
@@ -0,0 +1,147 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Data\Db\DbObject;
+use Icinga\Module\Director\DirectorObject\Automation\Basket;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use Zend_Form_SubForm as ZfSubForm;
+
+class BasketForm extends DirectorObjectForm
+{
+ protected $listUrl = 'director/baskets';
+
+ protected function getAvailableTypes()
+ {
+ return [
+ 'Command' => $this->translate('Command Definitions'),
+ 'ExternalCommand' => $this->translate('External Command Definitions'),
+ 'CommandTemplate' => $this->translate('Command Template'),
+ 'HostGroup' => $this->translate('Host Group'),
+ 'IcingaTemplateChoiceHost' => $this->translate('Host Template Choice'),
+ 'HostTemplate' => $this->translate('Host Templates'),
+ 'ServiceGroup' => $this->translate('Service Groups'),
+ 'IcingaTemplateChoiceService' => $this->translate('Service Template Choice'),
+ 'ServiceTemplate' => $this->translate('Service Templates'),
+ 'ServiceSet' => $this->translate('Service Sets'),
+ 'UserGroup' => $this->translate('User Groups'),
+ 'UserTemplate' => $this->translate('User Templates'),
+ 'User' => $this->translate('Users'),
+ 'NotificationTemplate' => $this->translate('Notification Templates'),
+ 'Notification' => $this->translate('Notifications'),
+ 'TimePeriod' => $this->translate('Time Periods'),
+ 'Dependency' => $this->translate('Dependencies'),
+ 'DataList' => $this->translate('Data Lists'),
+ 'ImportSource' => $this->translate('Import Sources'),
+ 'SyncRule' => $this->translate('Sync Rules'),
+ 'DirectorJob' => $this->translate('Job Definitions'),
+ 'Basket' => $this->translate('Basket Definitions'),
+ ];
+ }
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ public function setup()
+ {
+ $this->addElement('text', 'basket_name', [
+ 'label' => $this->translate('Basket Name'),
+ 'required' => true,
+ ]);
+
+ $types = $this->getAvailableTypes();
+
+ $options = [
+ 'IGNORE' => $this->translate('Ignore'),
+ 'ALL' => $this->translate('All of them'),
+ '[]' => $this->translate('Custom Selection'),
+ ];
+
+ $this->addHtmlHint($this->translate(
+ 'What should we place into this Basket every time we create'
+ . ' new snapshot?'
+ ));
+
+ $sub = new ZfSubForm();
+ $sub->setDecorators([
+ ['HtmlTag', ['tag' => 'dl']],
+ 'FormElements'
+ ]);
+
+ foreach ($types as $name => $label) {
+ $sub->addElement('select', $name, [
+ 'label' => $label,
+ 'multiOptions' => $options,
+ ]);
+ }
+
+ $this->addSubForm($sub, 'objects');
+ $this->addDeleteButton();
+
+ $this->addHtmlHint($this->translate(
+ 'Choose "All" to always add all of them,'
+ . ' "Ignore" to not care about a specific Type at all and'
+ . ' opt for "Custom Selection" in case you want to choose'
+ . ' just some specific Objects.'
+ ));
+ }
+
+ protected function setDefaultsFromObject(DbObject $object)
+ {
+ parent::setDefaultsFromObject($object);
+ /** @var Basket $object */
+ $values = [];
+ foreach ($this->getAvailableTypes() as $type => $label) {
+ $values[$type] = 'IGNORE';
+ }
+ foreach ($object->getChosenObjects() as $type => $selection) {
+ if ($selection === true) {
+ $values[$type] = 'ALL';
+ } elseif (is_array($selection)) {
+ $values[$type] = '[]';
+ }
+ }
+
+ $this->populate([
+ 'objects' => $values
+ ]);
+ }
+
+ protected function onRequest()
+ {
+ parent::onRequest(); // TODO: Change the autogenerated stub
+ }
+
+ protected function getObjectClassname()
+ {
+ return Basket::class;
+ }
+
+ public function onSuccess()
+ {
+ /** @var Basket $basket */
+ $basket = $this->object();
+
+ if ($basket->isEmpty()) {
+ $this->addError($this->translate("It's not allowed to store an empty basket"));
+
+ return;
+ }
+ if (! $basket->hasBeenLoadedFromDb()) {
+ $basket->set('owner_type', 'user');
+ $basket->set('owner_value', $this->getAuth()->getUser()->getUsername());
+ }
+
+ parent::onSuccess();
+ }
+
+ protected function setObjectSuccessUrl()
+ {
+ /** @var Basket $basket */
+ $basket = $this->object();
+ $this->setSuccessUrl(
+ 'director/basket',
+ ['name' => $basket->get('basket_name')]
+ );
+ }
+}
diff --git a/application/forms/BasketUploadForm.php b/application/forms/BasketUploadForm.php
new file mode 100644
index 0000000..a88dc06
--- /dev/null
+++ b/application/forms/BasketUploadForm.php
@@ -0,0 +1,147 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Exception;
+use Icinga\Exception\IcingaException;
+use Icinga\Module\Director\Core\Json;
+use Icinga\Module\Director\DirectorObject\Automation\Basket;
+use Icinga\Module\Director\DirectorObject\Automation\BasketSnapshot;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use Icinga\Web\Notification;
+
+class BasketUploadForm extends DirectorObjectForm
+{
+ protected $listUrl = 'director/baskets';
+
+ protected $failed;
+
+ protected $upload;
+
+ protected $rawUpload;
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ public function setup()
+ {
+ $this->addElement('text', 'basket_name', [
+ 'label' => $this->translate('Basket Name'),
+ 'required' => true,
+ ]);
+ $this->setAttrib('enctype', 'multipart/form-data');
+
+ $this->addElement('file', 'uploaded_file', [
+ 'label' => $this->translate('Choose file'),
+ 'destination' => $this->getTempDir(),
+ 'valueDisabled' => true,
+ 'isArray' => false,
+ 'multiple' => false,
+ 'ignore' => true,
+ ]);
+
+ $this->setSubmitLabel($this->translate('Upload'));
+ }
+
+ protected function getTempDir()
+ {
+ return sys_get_temp_dir();
+ }
+
+ protected function getObjectClassname()
+ {
+ return '\\Icinga\\Module\\Director\\DirectorObject\\Automation\\Basket';
+ }
+
+ protected function setObjectSuccessUrl()
+ {
+ /** @var Basket $basket */
+ $basket = $this->object();
+ $this->setSuccessUrl(
+ 'director/basket',
+ ['name' => $basket->get('basket_name')]
+ );
+ }
+
+ /**
+ * @return bool
+ * @throws IcingaException
+ */
+ protected function processUploadedSource()
+ {
+ if (! array_key_exists('uploaded_file', $_FILES)) {
+ throw new IcingaException('Got no file');
+ }
+
+ if (! isset($_FILES['uploaded_file']['tmp_name'])
+ || ! is_uploaded_file($_FILES['uploaded_file']['tmp_name'])
+ ) {
+ $this->addError('Got no uploaded file');
+ $this->failed = true;
+
+ return false;
+ }
+ $tmpFile = $_FILES['uploaded_file']['tmp_name'];
+ $originalFilename = $_FILES['uploaded_file']['name'];
+
+ $source = file_get_contents($tmpFile);
+ unlink($tmpFile);
+ try {
+ $json = Json::decode($source);
+ $this->rawUpload = $source;
+ $this->upload = $json;
+ } catch (Exception $e) {
+ $this->addError($originalFilename . ' failed: ' . $e->getMessage());
+ Notification::error($originalFilename . ' failed: ' . $e->getMessage());
+ $this->failed = true;
+
+ return false;
+ }
+
+ return true;
+ }
+
+ public function onRequest()
+ {
+ if ($this->hasBeenSent()) {
+ try {
+ $this->processUploadedSource();
+ } catch (Exception $e) {
+ $this->addError($e->getMessage());
+ return;
+ }
+ }
+ }
+
+ /**
+ * @throws \Icinga\Module\Director\Exception\DuplicateKeyException
+ */
+ public function onSuccess()
+ {
+ /** @var Basket $basket */
+ $basket = $this->object();
+
+ foreach ($this->upload as $type => $content) {
+ if ($type !== 'Datafield') {
+ $basket->addObjects($type, array_keys((array) $content));
+ }
+ }
+ if ($basket->isEmpty()) {
+ $this->addError($this->translate("It's not allowed to store an empty basket"));
+
+ return;
+ }
+
+ $basket->set('owner_type', 'user');
+ $basket->set('owner_value', $this->getAuth()->getUser()->getUsername());
+ $basket->store($this->db);
+
+ BasketSnapshot::forBasketFromJson(
+ $basket,
+ $this->rawUpload
+ )->store($this->db);
+ $this->setObjectSuccessUrl();
+ $this->beforeSuccessfulRedirect();
+ $this->redirectOnSuccess($this->translate('Basket has been uploaded'));
+ }
+}
diff --git a/application/forms/CustomvarForm.php b/application/forms/CustomvarForm.php
new file mode 100644
index 0000000..759464c
--- /dev/null
+++ b/application/forms/CustomvarForm.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\QuickForm;
+
+class CustomvarForm extends QuickForm
+{
+ protected $submitLabel = false;
+
+ public function setup()
+ {
+ $this->removeCsrfToken();
+ $this->removeElement(self::ID);
+ $this->addElement('text', 'varname', array(
+ 'label' => $this->translate('Variable name'),
+ 'required' => true,
+ ));
+
+ $this->addElement('text', 'varvalue', array(
+ 'label' => $this->translate('Value'),
+ ));
+
+ // $this->addHidden('format', 'string'); // expression, json?
+ }
+}
diff --git a/application/forms/DeployConfigForm.php b/application/forms/DeployConfigForm.php
new file mode 100644
index 0000000..0b817fa
--- /dev/null
+++ b/application/forms/DeployConfigForm.php
@@ -0,0 +1,121 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Exception\IcingaException;
+use Icinga\Module\Director\Core\DeploymentApiInterface;
+use Icinga\Module\Director\IcingaConfig\IcingaConfig;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+
+class DeployConfigForm extends DirectorForm
+{
+ use DeployFormsBug7530;
+
+ /** @var DeploymentApiInterface */
+ private $api;
+
+ /** @var string */
+ private $checksum;
+
+ /** @var int */
+ private $deploymentId;
+
+ public function init()
+ {
+ $this->setAttrib('class', 'inline');
+ }
+
+ public function setup()
+ {
+ $activities = $this->db->countActivitiesSinceLastDeployedConfig();
+ if ($this->deploymentId) {
+ $label = $this->translate('Re-deploy now');
+ } elseif ($activities === 0) {
+ $label = $this->translate('There are no pending changes. Deploy anyway');
+ } else {
+ $label = sprintf(
+ $this->translate('Deploy %d pending changes'),
+ $activities
+ );
+ }
+
+ if ($this->deploymentId) {
+ $deployIcon = 'reply-all';
+ } else {
+ $deployIcon = 'forward';
+ }
+
+ $this->addHtml(
+ $this->getView()->icon(
+ $deployIcon,
+ $label,
+ array('class' => 'link-color')
+ ) . '<nobr>'
+ );
+
+ $el = $this->createElement('submit', 'btn_deploy', array(
+ 'label' => $label,
+ 'escape' => false,
+ 'decorators' => array('ViewHelper'),
+ 'class' => 'link-button ' . $deployIcon,
+ ));
+
+ $this->addHtml('</nobr>');
+ $this->submitButtonName = $el->getName();
+ $this->setSubmitLabel($label);
+ $this->addElement($el);
+ }
+
+ public function onSuccess()
+ {
+ if ($this->skipBecauseOfBug7530()) {
+ return;
+ }
+
+ $db = $this->db;
+ $msg = $this->translate('Config has been submitted, validation is going on');
+ $this->setSuccessMessage($msg);
+
+ $isApiRequest = $this->getRequest()->isApiRequest();
+ if ($this->checksum) {
+ $config = IcingaConfig::load(hex2bin($this->checksum), $db);
+ } else {
+ $config = IcingaConfig::generate($db);
+ }
+
+ $this->api->wipeInactiveStages($db);
+
+ if ($this->api->dumpConfig($config, $db)) {
+ if ($isApiRequest) {
+ die('Api not ready');
+ // return $this->sendJson((object) array('checksum' => $checksum));
+ } else {
+ $this->setSuccessUrl('director/config/deployments');
+ $this->setSuccessMessage(
+ $this->translate('Config has been submitted, validation is going on')
+ );
+ }
+ parent::onSuccess();
+ } else {
+ throw new IcingaException($this->translate('Config deployment failed'));
+ }
+ }
+
+ public function setChecksum($checksum)
+ {
+ $this->checksum = $checksum;
+ return $this;
+ }
+
+ public function setDeploymentId($id)
+ {
+ $this->deploymentId = $id;
+ return $this;
+ }
+
+ public function setApi(DeploymentApiInterface $api)
+ {
+ $this->api = $api;
+ return $this;
+ }
+}
diff --git a/application/forms/DeployFormsBug7530.php b/application/forms/DeployFormsBug7530.php
new file mode 100644
index 0000000..4d456ae
--- /dev/null
+++ b/application/forms/DeployFormsBug7530.php
@@ -0,0 +1,126 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use gipfl\Web\Widget\Hint;
+use Icinga\Module\Director\Core\CoreApi;
+use ipl\Html\Html;
+
+trait DeployFormsBug7530
+{
+ public function hasBeenSubmitted()
+ {
+ if (parent::hasBeenSubmitted()) {
+ return true;
+ } else {
+ return \strlen($this->getSentValue('confirm_7530')) > 0;
+ }
+ }
+
+ protected function shouldWarnAboutBug7530()
+ {
+ /** @var \Icinga\Module\Director\Db $db */
+ $db = $this->getDb();
+
+ return $db->settings()->get('ignore_bug7530') !== 'y'
+ && $this->getSentValue('confirm_7530') !== 'i_know'
+ && $this->configMightTriggerBug7530()
+ & $this->coreHasBug7530();
+ }
+
+ protected function configMightTriggerBug7530()
+ {
+ /** @var \Icinga\Module\Director\Db $connection */
+ $connection = $this->getDb();
+ $db = $connection->getDbAdapter();
+
+ $zoneIds = $db->fetchCol(
+ $db->select()
+ ->from('icinga_zone', 'id')
+ ->where('object_type = ?', 'object')
+ );
+ if (empty($zoneIds)) {
+ return false;
+ }
+
+ $objectTypes = [
+ 'icinga_host',
+ 'icinga_service',
+ 'icinga_notification',
+ 'icinga_command',
+ ];
+
+ foreach ($objectTypes as $objectType) {
+ if ((int) $db->fetchOne(
+ $db->select()
+ ->from($objectType, 'COUNT(*)')
+ ->where('zone_id IN (?)', $zoneIds)
+ ) > 0) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ protected function coreHasBug7530()
+ {
+ // TODO: Cache this
+ if ($this->api instanceof CoreApi) {
+ $version = $this->api->getVersion();
+ if ($version === null) {
+ throw new \RuntimeException($this->translate('Unable to detect your Icinga 2 Core version'));
+ } elseif (\version_compare($version, '2.11.0', '>=')
+ && \version_compare($version, '2.12.0', '<')
+ ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public function skipBecauseOfBug7530()
+ {
+ $bug7530 = $this->getSentValue('confirm_7530');
+ if ($bug7530 === 'whaaat') {
+ $this->setSuccessMessage($this->translate('Config has not been deployed'));
+ parent::onSuccess();
+ } elseif ($bug7530 === 'hell_yes') {
+ $this->db->settings()->set('ignore_bug7530', 'y');
+ }
+ if ($this->shouldWarnAboutBug7530()) {
+ $this->addHtml(Hint::warning(Html::sprintf($this->translate(
+ "Warning: you're running Icinga v2.11.0 and our configuration looks"
+ . " like you could face issue %s. We're already working on a solution."
+ . " The GitHub Issue and our %s contain related details."
+ ), Html::tag('a', [
+ 'href' => 'https://github.com/Icinga/icinga2/issues/7530',
+ 'target' => '_blank',
+ 'title' => sprintf(
+ $this->translate('Show Issue %s on GitHub'),
+ '7530'
+ ),
+ 'class' => 'icon-github-circled',
+ ], '#7530'), Html::tag('a', [
+ 'href' => 'https://icinga.com/docs/icinga2/latest/doc/16-upgrading-icinga-2/'
+ . '#config-sync-zones-in-zones',
+ 'target' => '_blank',
+ 'title' => $this->translate('Upgrading Icinga 2 - Confic Sync: Zones in Zones'),
+ 'class' => 'icon-info-circled',
+ ], $this->translate('Upgrading documentation')))));
+ $this->addElement('select', 'confirm_7530', [
+ 'multiOptions' => $this->optionalEnum([
+ 'i_know' => $this->translate("I know what I'm doing, deploy anyway"),
+ 'hell_yes' => $this->translate("I know, please don't bother me again"),
+ 'whaaat' => $this->translate("Thanks, I'll verify this and come back later"),
+ ]),
+ 'class' => 'autosubmit',
+ 'decorators' => ['ViewHelper'],
+ ]);
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/application/forms/DeploymentLinkForm.php b/application/forms/DeploymentLinkForm.php
new file mode 100644
index 0000000..f42a627
--- /dev/null
+++ b/application/forms/DeploymentLinkForm.php
@@ -0,0 +1,170 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Authentication\Auth;
+use Icinga\Exception\IcingaException;
+use Icinga\Module\Director\Core\DeploymentApiInterface;
+use Icinga\Module\Director\Db;
+use Icinga\Module\Director\Deployment\DeploymentInfo;
+use Icinga\Module\Director\IcingaConfig\IcingaConfig;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+use gipfl\IcingaWeb2\Icon;
+use Zend_View_Interface;
+
+class DeploymentLinkForm extends DirectorForm
+{
+ use DeployFormsBug7530;
+
+ /** @var DeploymentInfo */
+ protected $info;
+
+ /** @var Auth */
+ protected $auth;
+
+ /** @var DeploymentApiInterface */
+ protected $api;
+
+ /** @var Db */
+ protected $db;
+
+ /**
+ * @param DeploymentInfo $info
+ * @param Auth $auth
+ * @return static
+ */
+ public static function create(Db $db, DeploymentInfo $info, Auth $auth, DeploymentApiInterface $api)
+ {
+ $self = static::load();
+ $self->setAuth($auth);
+ $self->db = $db;
+ $self->info = $info;
+ $self->api = $api;
+ return $self;
+ }
+
+ public function setAuth(Auth $auth)
+ {
+ $this->auth = $auth;
+ return $this;
+ }
+
+ public function setup()
+ {
+ if (! $this->canDeploy()) {
+ return;
+ }
+
+ $onObject = $this->info->getSingleObjectChanges();
+ $total = $this->info->getTotalChanges();
+
+ if ($onObject === 0) {
+ if ($total === 1) {
+ $msg = $this->translate('There is a single pending change');
+ } else {
+ $msg = sprintf(
+ $this->translate('There are %d pending changes'),
+ $total
+ );
+ }
+ } elseif ($total === 1) {
+ $msg = $this->translate('There has been a single change to this object, nothing else has been modified');
+ } elseif ($total === $onObject) {
+ $msg = sprintf(
+ $this->translate('There have been %d changes to this object, nothing else has been modified'),
+ $onObject
+ );
+ } else {
+ $msg = sprintf(
+ $this->translate('There are %d pending changes, %d of them applied to this object'),
+ $total,
+ $onObject
+ );
+ }
+
+ $this->setAttrib('class', 'gipfl-inline-form');
+ $this->addHtml(Icon::create('wrench'));
+ try {
+ // As this is shown for single objects, ignore errors caused by an
+ // unreachable core
+ $target = $this->shouldWarnAboutBug7530() ? '_self' : '_next';
+ } catch (\Exception $e) {
+ $target = '_next';
+ }
+ $this->addSubmitButton($this->translate('Deploy'), [
+ 'class' => 'link-button icon-wrench',
+ 'title' => $msg,
+ 'data-base-target' => $target,
+ ]);
+ }
+
+ protected function canDeploy()
+ {
+ return $this->auth->hasPermission('director/deploy');
+ }
+
+ public function render(Zend_View_Interface $view = null)
+ {
+ if (! $this->canDeploy()) {
+ return '';
+ }
+
+ return parent::render($view);
+ }
+
+ public function onSuccess()
+ {
+ try {
+ if ($this->skipBecauseOfBug7530()) {
+ return;
+ }
+ } catch (\Exception $e) {
+ // continue
+ }
+ $this->deploy();
+ }
+
+ public function deploy()
+ {
+ $this->setSuccessUrl('director/config/deployments');
+ $config = IcingaConfig::generate($this->db);
+ $checksum = $config->getHexChecksum();
+
+ try {
+ $this->api->wipeInactiveStages($this->db);
+ } catch (\Exception $e) {
+ $this->notifyError($e->getMessage());
+ }
+
+ if ($this->api->dumpConfig($config, $this->db)) {
+ $this->deploymentSucceeded($checksum);
+ } else {
+ $this->deploymentFailed($checksum);
+ }
+ }
+
+ protected function deploymentSucceeded($checksum)
+ {
+ if ($this->getRequest()->isApiRequest()) {
+ throw new IcingaException('Not yet');
+ // $this->sendJson($this->getResponse(), (object) array('checksum' => $checksum));
+ } else {
+ $msg = $this->translate('Config has been submitted, validation is going on');
+ $this->redirectOnSuccess($msg);
+ }
+ }
+
+ protected function deploymentFailed($checksum, $error = null)
+ {
+ $extra = $error ? ': ' . $error: '';
+
+ if ($this->getRequest()->isApiRequest()) {
+ throw new IcingaException('Not yet');
+ // $this->sendJsonError($this->getResponse(), 'Config deployment failed' . $extra);
+ } else {
+ $msg = $this->translate('Config deployment failed') . $extra;
+ $this->notifyError($msg);
+ $this->redirectAndExit('director/config/deployments');
+ }
+ }
+}
diff --git a/application/forms/DirectorDatafieldCategoryForm.php b/application/forms/DirectorDatafieldCategoryForm.php
new file mode 100644
index 0000000..fe5efc9
--- /dev/null
+++ b/application/forms/DirectorDatafieldCategoryForm.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class DirectorDatafieldCategoryForm extends DirectorObjectForm
+{
+ protected $objectName = 'Data field category';
+
+ protected $listUrl = 'director/data/fieldcategories';
+
+ public function setup()
+ {
+ $this->addHtmlHint(
+ $this->translate(
+ 'Data field categories allow to structure Data Fields. Fields with'
+ . ' a category will be shown grouped by category.'
+ )
+ );
+
+ $this->addElement('text', 'category_name', [
+ 'label' => $this->translate('Category name'),
+ 'description' => $this->translate(
+ 'The unique name of the category used for grouping your custom Data Fields.'
+ ),
+ 'required' => true,
+ ]);
+
+ $this->addElement('text', 'description', [
+ 'label' => $this->translate('Description'),
+ ]);
+
+ $this->setButtons();
+ }
+}
diff --git a/application/forms/DirectorDatafieldForm.php b/application/forms/DirectorDatafieldForm.php
new file mode 100644
index 0000000..a306bd7
--- /dev/null
+++ b/application/forms/DirectorDatafieldForm.php
@@ -0,0 +1,301 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Exception\ConfigurationError;
+use Icinga\Module\Director\CustomVariable\CustomVariables;
+use Icinga\Module\Director\Hook\DataTypeHook;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use Icinga\Application\Hook;
+use Exception;
+
+class DirectorDatafieldForm extends DirectorObjectForm
+{
+ protected $objectName = 'Data field';
+
+ protected $listUrl = 'director/data/fields';
+
+ protected function onRequest()
+ {
+ if ($this->hasBeenSent()) {
+ if ($this->shouldBeDeleted()) {
+ $varname = $this->getSentValue('varname');
+ if ($cnt = CustomVariables::countAll($varname, $this->getDb())) {
+ $this->askForVariableDeletion($varname, $cnt);
+ }
+ } elseif ($this->shouldBeRenamed()) {
+ $varname = $this->object()->getOriginalProperty('varname');
+ if ($cnt = CustomVariables::countAll($varname, $this->getDb())) {
+ $this->askForVariableRename(
+ $varname,
+ $this->getSentValue('varname'),
+ $cnt
+ );
+ }
+ }
+ }
+
+ parent::onRequest();
+ }
+
+ protected function askForVariableDeletion($varname, $cnt)
+ {
+ $msg = $this->translate(
+ 'Leaving custom variables in place while removing the related field is'
+ . ' perfectly legal and might be a desired operation. This way you can'
+ . ' no longer modify related custom variables in the Director GUI, but'
+ . ' the variables themselves will stay there and continue to be deployed.'
+ . ' When you re-add a field for the same variable later on, everything'
+ . ' will continue to work as before'
+ );
+
+ $this->addBoolean('wipe_vars', array(
+ 'label' => $this->translate('Wipe related vars'),
+ 'description' => sprintf($msg, $this->getSentValue('varname')),
+ 'required' => true,
+ ));
+
+ if ($wipe = $this->getSentValue('wipe_vars')) {
+ if ($wipe === 'y') {
+ CustomVariables::deleteAll($varname, $this->getDb());
+ }
+ } else {
+ $this->abortDeletion();
+ $this->addError(
+ sprintf(
+ $this->translate('Also wipe all "%s" custom variables from %d objects?'),
+ $varname,
+ $cnt
+ )
+ );
+ $this->getElement('wipe_vars')->addError(
+ sprintf(
+ $this->translate(
+ 'There are %d objects with a related property. Should I also'
+ . ' remove the "%s" property from them?'
+ ),
+ $cnt,
+ $varname
+ )
+ );
+ }
+ }
+
+ protected function askForVariableRename($oldname, $newname, $cnt)
+ {
+ $msg = $this->translate(
+ 'Leaving custom variables in place while renaming the related field is'
+ . ' perfectly legal and might be a desired operation. This way you can'
+ . ' no longer modify related custom variables in the Director GUI, but'
+ . ' the variables themselves will stay there and continue to be deployed.'
+ . ' When you re-add a field for the same variable later on, everything'
+ . ' will continue to work as before'
+ );
+
+ $this->addBoolean('rename_vars', array(
+ 'label' => $this->translate('Rename related vars'),
+ 'description' => sprintf($msg, $this->getSentValue('varname')),
+ 'required' => true,
+ ));
+
+ if ($wipe = $this->getSentValue('rename_vars')) {
+ if ($wipe === 'y') {
+ CustomVariables::renameAll($oldname, $newname, $this->getDb());
+ }
+ } else {
+ $this->abortDeletion();
+ $this->addError(
+ sprintf(
+ $this->translate('Also rename all "%s" custom variables to "%s" on %d objects?'),
+ $oldname,
+ $newname,
+ $cnt
+ )
+ );
+ $this->getElement('rename_vars')->addError(
+ sprintf(
+ $this->translate(
+ 'There are %d objects with a related property. Should I also'
+ . ' rename the "%s" property to "%s" on them?'
+ ),
+ $cnt,
+ $oldname,
+ $newname
+ )
+ );
+ }
+ }
+
+ public function setup()
+ {
+ $this->addHtmlHint(
+ $this->translate(
+ 'Data fields allow you to customize input controls for Icinga custom'
+ . ' variables. Once you defined them here, you can provide them through'
+ . ' your defined templates. This gives you a granular control over what'
+ . ' properties your users should be allowed to configure in which way.'
+ )
+ );
+
+ $this->addElement('text', 'varname', array(
+ 'label' => $this->translate('Field name'),
+ 'description' => $this->translate(
+ 'The unique name of the field. This will be the name of the custom'
+ . ' variable in the rendered Icinga configuration.'
+ ),
+ 'required' => true,
+ ));
+
+ $this->addElement('text', 'caption', array(
+ 'label' => $this->translate('Caption'),
+ 'required' => true,
+ 'description' => $this->translate(
+ 'The caption which should be displayed to your users when this field'
+ . ' is shown'
+ )
+ ));
+
+ $this->addElement('textarea', 'description', array(
+ 'label' => $this->translate('Description'),
+ 'description' => $this->translate(
+ 'An extended description for this field. Will be shown as soon as a'
+ . ' user puts the focus on this field'
+ ),
+ 'rows' => '3',
+ ));
+
+ $this->addElement('select', 'category_id', [
+ 'label' => $this->translate('Data Field Category'),
+ 'multiOptions' => $this->optionalEnum($this->enumCategpories()),
+ ]);
+
+ $error = false;
+ try {
+ $types = $this->enumDataTypes();
+ } catch (Exception $e) {
+ $error = $e->getMessage();
+ $types = $this->optionalEnum(array());
+ }
+
+ $this->addElement('select', 'datatype', array(
+ 'label' => $this->translate('Data type'),
+ 'description' => $this->translate('Field type'),
+ 'required' => true,
+ 'multiOptions' => $types,
+ 'class' => 'autosubmit',
+ ));
+ if ($error) {
+ $this->getElement('datatype')->addError($error);
+ }
+
+ $object = $this->object();
+ try {
+ if ($class = $this->getSentValue('datatype')) {
+ if ($class && array_key_exists($class, $types)) {
+ $this->addSettings($class);
+ }
+ } elseif ($class = $object->get('datatype')) {
+ $this->addSettings($class);
+ }
+
+ // TODO: next line looks like obsolete duplicate code to me
+ $this->addSettings();
+ } catch (Exception $e) {
+ $this->getElement('datatype')->addError($e->getMessage());
+ }
+
+ foreach ($object->getSettings() as $key => $val) {
+ if ($el = $this->getElement($key)) {
+ $el->setValue($val);
+ }
+ }
+
+ $this->setButtons();
+ }
+
+ public function shouldBeRenamed()
+ {
+ $object = $this->object();
+ return $object->hasBeenLoadedFromDb()
+ && $object->getOriginalProperty('varname') !== $this->getSentValue('varname');
+ }
+
+ protected function addSettings($class = null)
+ {
+ if ($class === null) {
+ $class = $this->getValue('datatype');
+ }
+
+ if ($class !== null) {
+ if (! class_exists($class)) {
+ throw new ConfigurationError(
+ 'The hooked class "%s" for this data field does no longer exist',
+ $class
+ );
+ }
+
+ $class::addSettingsFormFields($this);
+ }
+ }
+
+ protected function clearOutdatedSettings()
+ {
+ $names = array();
+ $object = $this->object();
+ $global = array('varname', 'description', 'caption', 'datatype');
+
+ /** @var \Zend_Form_Element $el */
+ foreach ($this->getElements() as $el) {
+ if ($el->getIgnore()) {
+ continue;
+ }
+
+ $name = $el->getName();
+ if (in_array($name, $global)) {
+ continue;
+ }
+
+ $names[$name] = $name;
+ }
+
+
+ foreach ($object->getSettings() as $setting => $value) {
+ if (! array_key_exists($setting, $names)) {
+ unset($object->$setting);
+ }
+ }
+ }
+
+ public function onSuccess()
+ {
+ $this->clearOutdatedSettings();
+
+ if ($class = $this->getValue('datatype')) {
+ if (array_key_exists($class, $this->enumDataTypes())) {
+ $this->addHidden('format', $class::getFormat());
+ }
+ }
+
+ parent::onSuccess();
+ }
+
+ protected function enumDataTypes()
+ {
+ $hooks = Hook::all('Director\\DataType');
+ $enum = array(null => '- please choose -');
+ /** @var DataTypeHook $hook */
+ foreach ($hooks as $hook) {
+ $enum[get_class($hook)] = $hook->getName();
+ }
+
+ return $enum;
+ }
+
+ protected function enumCategpories()
+ {
+ $db = $this->getDb()->getDbAdapter();
+ return $db->fetchPairs(
+ $db->select()->from('director_datafield_category', ['id', 'category_name'])
+ );
+ }
+}
diff --git a/application/forms/DirectorDatalistEntryForm.php b/application/forms/DirectorDatalistEntryForm.php
new file mode 100644
index 0000000..c6e309f
--- /dev/null
+++ b/application/forms/DirectorDatalistEntryForm.php
@@ -0,0 +1,80 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Application\Config;
+use Icinga\Module\Director\Db;
+use Icinga\Module\Director\Objects\DirectorDatalist;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class DirectorDatalistEntryForm extends DirectorObjectForm
+{
+ /** @var DirectorDatalist */
+ protected $datalist;
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ public function setup()
+ {
+ $this->addElement('text', 'entry_name', [
+ 'label' => $this->translate('Key'),
+ 'required' => true,
+ 'description' => $this->translate(
+ 'Will be stored as a custom variable value when this entry'
+ . ' is chosen from the list'
+ )
+ ]);
+
+ $this->addElement('text', 'entry_value', [
+ 'label' => $this->translate('Label'),
+ 'required' => true,
+ 'description' => $this->translate(
+ 'This will be the visible caption for this entry'
+ )
+ ]);
+
+ $rolesConfig = Config::app('roles', true);
+ $roles = [];
+ foreach ($rolesConfig as $name => $role) {
+ $roles[$name] = $name;
+ }
+
+ $this->addElement('extensibleSet', 'allowed_roles', [
+ 'label' => $this->translate('Allowed roles'),
+ 'required' => false,
+ 'multiOptions' => $roles,
+ 'description' => $this->translate(
+ 'Allow to use this entry only to users with one of these Icinga Web 2 roles'
+ )
+ ]);
+
+ $this->addHidden('list_id', $this->datalist->get('id'));
+ $this->addHidden('format', 'string');
+ if (!$this->isNew()) {
+ $this->addHidden('entry_name', $this->object->get('entry_name'));
+ }
+
+ $this->addSimpleDisplayGroup(['entry_name', 'entry_value', 'allowed_roles'], 'entry', [
+ 'legend' => $this->isNew()
+ ? $this->translate('Add data list entry')
+ : $this->translate('Modify data list entry')
+ ]);
+
+ $this->setButtons();
+ }
+
+ /**
+ * @param DirectorDatalist $list
+ * @return $this
+ */
+ public function setList(DirectorDatalist $list)
+ {
+ $this->datalist = $list;
+ /** @var Db $db */
+ $db = $list->getConnection();
+ $this->setDb($db);
+
+ return $this;
+ }
+}
diff --git a/application/forms/DirectorDatalistForm.php b/application/forms/DirectorDatalistForm.php
new file mode 100644
index 0000000..91c0ea7
--- /dev/null
+++ b/application/forms/DirectorDatalistForm.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use Icinga\Authentication\Auth;
+
+class DirectorDatalistForm extends DirectorObjectForm
+{
+ public function setup()
+ {
+ $this->addElement('text', 'list_name', array(
+ 'label' => $this->translate('List name'),
+ 'description' => $this->translate(
+ 'Data lists are mainly used as data providers for custom variables'
+ . ' presented as dropdown boxes boxes. You can manually manage'
+ . ' their entries here in place, but you could also create dedicated'
+ . ' sync rules after creating a new empty list. This would allow you'
+ . ' to keep your available choices in sync with external data providers'
+ ),
+ 'required' => true,
+ ));
+ $this->addSimpleDisplayGroup(array('list_name'), 'list', array(
+ 'legend' => $this->translate('Data list')
+ ));
+
+ $this->setButtons();
+ }
+
+ public function onSuccess()
+ {
+ $this->object()->set('owner', self::username());
+ parent::onSuccess();
+ }
+
+ protected static function username()
+ {
+ $auth = Auth::getInstance();
+ if ($auth->isAuthenticated()) {
+ return $auth->getUser()->getUsername();
+ } else {
+ return '<unknown>';
+ }
+ }
+}
diff --git a/application/forms/DirectorJobForm.php b/application/forms/DirectorJobForm.php
new file mode 100644
index 0000000..7ca998c
--- /dev/null
+++ b/application/forms/DirectorJobForm.php
@@ -0,0 +1,141 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Data\Db\DbObjectWithSettings;
+use Icinga\Module\Director\Hook\JobHook;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use Icinga\Web\Hook;
+
+class DirectorJobForm extends DirectorObjectForm
+{
+ public function setup()
+ {
+ $jobTypes = $this->enumJobTypes();
+
+ $this->addElement('select', 'job_class', array(
+ 'label' => $this->translate('Job Type'),
+ 'required' => true,
+ 'multiOptions' => $this->optionalEnum($jobTypes),
+ 'description' => $this->translate(
+ 'These are different available job types'
+ ),
+ 'class' => 'autosubmit'
+ ));
+
+ if (! $jobClass = $this->getJobClass()) {
+ return;
+ }
+
+ if ($desc = $jobClass::getDescription($this)) {
+ $this->addHtmlHint($desc);
+ }
+
+ $this->addBoolean(
+ 'disabled',
+ array(
+ 'label' => $this->translate('Disabled'),
+ 'description' => $this->translate(
+ 'This allows to temporarily disable this job'
+ )
+ ),
+ 'n'
+ );
+
+ $this->addElement('text', 'run_interval', array(
+ 'label' => $this->translate('Run interval'),
+ 'description' => $this->translate(
+ 'Execution interval for this job, in seconds'
+ ),
+ 'value' => $jobClass::getSuggestedRunInterval($this)
+ ));
+
+ $periods = $this->db->enumTimeperiods();
+
+ if (!empty($periods)) {
+ $this->addElement(
+ 'select',
+ 'timeperiod_id',
+ array(
+ 'label' => $this->translate('Time period'),
+ 'description' => $this->translate(
+ 'The name of a time period within this job should be active.'
+ . ' Supports only simple time periods (weekday and multiple'
+ . ' time definitions)'
+ ),
+ 'multiOptions' => $this->optionalEnum($periods),
+ )
+ );
+ }
+
+ $this->addElement('text', 'job_name', array(
+ 'label' => $this->translate('Job name'),
+ 'description' => $this->translate(
+ 'A short name identifying this job. Use something meaningful,'
+ . ' like "Import Puppet Hosts"'
+ ),
+ 'required' => true,
+ ));
+
+ $this->addSettings();
+ $this->setButtons();
+ }
+
+ public function getSentOrObjectSetting($name, $default = null)
+ {
+ if ($this->hasObject()) {
+ $value = $this->getSentValue($name);
+ if ($value === null) {
+ /** @var DbObjectWithSettings $object */
+ $object = $this->getObject();
+ return $object->getSetting($name, $default);
+ } else {
+ return $value;
+ }
+ } else {
+ return $this->getSentValue($name, $default);
+ }
+ }
+
+ protected function getJobClass($class = null)
+ {
+ if ($class === null) {
+ $class = $this->getSentOrObjectValue('job_class');
+ }
+
+ if (array_key_exists($class, $this->enumJobTypes())) {
+ return $class;
+ }
+
+ return null;
+ }
+
+ protected function addSettings($class = null)
+ {
+ if (! $class = $this->getJobClass($class)) {
+ return;
+ }
+
+ $class::addSettingsFormFields($this);
+ foreach ($this->object()->getSettings() as $key => $val) {
+ if ($el = $this->getElement($key)) {
+ $el->setValue($val);
+ }
+ }
+ }
+
+ protected function enumJobTypes()
+ {
+ /** @var JobHook[] $hooks */
+ $hooks = Hook::all('Director\\Job');
+
+ $enum = array();
+
+ foreach ($hooks as $hook) {
+ $enum[get_class($hook)] = $hook->getName();
+ }
+ asort($enum);
+
+ return $enum;
+ }
+}
diff --git a/application/forms/IcingaAddServiceForm.php b/application/forms/IcingaAddServiceForm.php
new file mode 100644
index 0000000..df2302e
--- /dev/null
+++ b/application/forms/IcingaAddServiceForm.php
@@ -0,0 +1,183 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use gipfl\IcingaWeb2\Link;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Objects\IcingaService;
+
+class IcingaAddServiceForm extends DirectorObjectForm
+{
+ /** @var IcingaHost[] */
+ private $hosts;
+
+ /** @var IcingaHost */
+ private $host;
+
+ /** @var IcingaService */
+ protected $object;
+
+ protected $objectName = 'service';
+
+ public function setup()
+ {
+ if ($this->object === null) {
+ $this->object = IcingaService::create(
+ ['object_type' => 'object'],
+ $this->db
+ );
+ }
+
+ $this->addSingleImportElement();
+
+ if (! ($imports = $this->getSentOrObjectValue('imports'))) {
+ $this->setSubmitLabel($this->translate('Next'));
+ $this->groupMainProperties();
+ return;
+ }
+
+ $this->removeElement('imports');
+ $this->addHidden('imports', $imports);
+ $this->setElementValue('imports', $imports);
+ $this->addNameElement();
+ $name = $this->getSentOrObjectValue('object_name');
+ if (empty($name)) {
+ $this->setElementValue('object_name', $imports);
+ }
+ $this->groupMainProperties()
+ ->setButtons();
+ }
+
+ protected function groupMainProperties($importsFirst = false)
+ {
+ $elements = [
+ 'object_type',
+ 'imports',
+ 'object_name',
+ ];
+
+ $this->addDisplayGroup($elements, 'object_definition', [
+ 'decorators' => [
+ 'FormElements',
+ ['HtmlTag', ['tag' => 'dl']],
+ 'Fieldset',
+ ],
+ 'order' => self::GROUP_ORDER_OBJECT_DEFINITION,
+ 'legend' => $this->translate('Main properties')
+ ]);
+
+ return $this;
+ }
+
+ /**
+ * @param bool $required
+ * @return $this
+ */
+ protected function addSingleImportElement($required = null)
+ {
+ $enum = $this->enumServiceTemplates();
+ if (empty($enum)) {
+ if ($required) {
+ if ($this->hasBeenSent()) {
+ $this->addError($this->translate('No service has been chosen'));
+ } else {
+ if ($this->hasPermission('director/admin')) {
+ $html = sprintf(
+ $this->translate('Please define a %s first'),
+ Link::create(
+ $this->translate('Service Template'),
+ 'director/service/add',
+ ['type' => 'template']
+ )
+ );
+ } else {
+ $html = $this->translate('No Service Templates have been provided yet');
+ }
+ $this->addHtml('<p class="warning">' . $html . '</p>');
+ }
+ }
+
+ return $this;
+ }
+ $this->addElement('text', 'imports', [
+ 'label' => $this->translate('Service'),
+ 'description' => $this->translate('Choose a service template'),
+ 'required' => true,
+ 'data-suggestion-context' => 'servicetemplates',
+ 'class' => 'autosubmit director-suggest'
+ ]);
+
+ return $this;
+ }
+
+ protected function enumServiceTemplates()
+ {
+ $tpl = $this->getDb()->enumIcingaTemplates('service');
+ return array_combine($tpl, $tpl);
+ }
+
+ /**
+ * @param IcingaHost[] $hosts
+ * @return $this
+ */
+ public function setHosts(array $hosts)
+ {
+ $this->hosts = $hosts;
+ return $this;
+ }
+
+ /**
+ * @param IcingaHost $host
+ * @return $this
+ */
+ public function setHost(IcingaHost $host)
+ {
+ $this->host = $host;
+ return $this;
+ }
+
+ protected function addNameElement()
+ {
+ $this->addElement('text', 'object_name', [
+ 'label' => $this->translate('Name'),
+ 'required' => true,
+ 'description' => $this->translate(
+ 'Name for the Icinga service you are going to create'
+ )
+ ]);
+
+ return $this;
+ }
+
+ public function onSuccess()
+ {
+ if ($this->host !== null) {
+ if ($id = $this->host->get('id')) {
+ $this->object->set('host_id', $id);
+ } else {
+ $this->object->set('host', $this->host->getObjectName());
+ }
+ parent::onSuccess();
+ return;
+ }
+
+ $plain = $this->object->toPlainObject();
+ $db = $this->object->getConnection();
+
+ // TODO: Test this:
+ foreach ($this->hosts as $host) {
+ $service = IcingaService::fromPlainObject($plain, $db)
+ ->set('host_id', $host->get('id'));
+ $this->getDbObjectStore()->store($service);
+ }
+
+ $msg = sprintf(
+ $this->translate('The service "%s" has been added to %d hosts'),
+ $this->object->getObjectName(),
+ count($this->hosts)
+ );
+
+ $this->redirectOnSuccess($msg);
+ }
+}
diff --git a/application/forms/IcingaAddServiceSetForm.php b/application/forms/IcingaAddServiceSetForm.php
new file mode 100644
index 0000000..b889110
--- /dev/null
+++ b/application/forms/IcingaAddServiceSetForm.php
@@ -0,0 +1,123 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Objects\IcingaServiceSet;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaAddServiceSetForm extends DirectorObjectForm
+{
+ /** @var IcingaHost[] */
+ private $hosts;
+
+ /** @var IcingaHost */
+ private $host;
+
+ /** @var IcingaServiceSet */
+ protected $object;
+
+ protected $objectName = 'service_set';
+
+ protected $listUrl = 'director/services/sets';
+
+ public function setup()
+ {
+ if ($this->object === null) {
+ $this->object = IcingaServiceSet::create(
+ ['object_type' => 'object'],
+ $this->db
+ );
+ }
+
+ $object = $this->object();
+ if ($this->hasBeenSent()) {
+ $object->set('object_name', $this->getSentValue('imports'));
+ $object->set('imports', $object->getObjectName());
+ }
+
+ if (! $object->hasBeenLoadedFromDb()) {
+ $this->addSingleImportsElement();
+ }
+
+ if (count($object->get('imports'))) {
+ $description = $object->getResolvedProperty('description');
+ if ($description) {
+ $this->addHtmlHint($description);
+ }
+ }
+
+ $this->addHidden('object_type', 'object');
+ $this->setButtons();
+ }
+
+ protected function setObjectSuccessUrl()
+ {
+ if ($this->host) {
+ $this->setSuccessUrl(
+ 'director/host/services',
+ array('name' => $this->host->getObjectName())
+ );
+ } else {
+ parent::setObjectSuccessUrl();
+ }
+ }
+
+ public function setHost(IcingaHost $host)
+ {
+ $this->host = $host;
+ return $this;
+ }
+ /**
+ * @param IcingaHost[] $hosts
+ * @return $this
+ */
+ public function setHosts(array $hosts)
+ {
+ $this->hosts = $hosts;
+ return $this;
+ }
+
+ protected function addSingleImportsElement()
+ {
+ $enum = $this->enumAllowedTemplates();
+
+ $this->addElement('select', 'imports', array(
+ 'label' => $this->translate('Service set'),
+ 'description' => $this->translate(
+ 'The service Set that should be assigned'
+ ),
+ 'required' => true,
+ 'multiOptions' => $this->optionallyAddFromEnum($enum),
+ 'class' => 'autosubmit'
+ ));
+
+ return $this;
+ }
+
+ public function onSuccess()
+ {
+ if ($this->host !== null) {
+ $this->object->set('host_id', $this->host->get('id'));
+ parent::onSuccess();
+ return;
+ }
+
+ $plain = $this->object->toPlainObject();
+ $db = $this->object->getConnection();
+
+ foreach ($this->hosts as $host) {
+ IcingaServiceSet::fromPlainObject($plain, $db)
+ ->set('host_id', $host->get('id'))
+ ->store();
+ }
+
+ $msg = sprintf(
+ $this->translate('The Service Set "%s" has been added to %d hosts'),
+ $this->object->getObjectName(),
+ count($this->hosts)
+ );
+
+ $this->redirectOnSuccess($msg);
+ }
+}
diff --git a/application/forms/IcingaApiUserForm.php b/application/forms/IcingaApiUserForm.php
new file mode 100644
index 0000000..eda0857
--- /dev/null
+++ b/application/forms/IcingaApiUserForm.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaApiUserForm extends DirectorObjectForm
+{
+ public function setup()
+ {
+ $this->addHidden('object_type', 'external_object');
+
+ $this->addElement('text', 'object_name', array(
+ 'label' => $this->translate('Name'),
+ 'required' => true,
+ ));
+
+ $this->addElement('password', 'password', array(
+ 'label' => $this->translate('Password'),
+ 'required' => true,
+ ));
+
+ $this->setButtons();
+ }
+}
diff --git a/application/forms/IcingaCloneObjectForm.php b/application/forms/IcingaCloneObjectForm.php
new file mode 100644
index 0000000..6ee99ba
--- /dev/null
+++ b/application/forms/IcingaCloneObjectForm.php
@@ -0,0 +1,259 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use gipfl\Web\Widget\Hint;
+use Icinga\Exception\IcingaException;
+use Icinga\Module\Director\Acl;
+use Icinga\Module\Director\Data\Db\DbObjectStore;
+use Icinga\Module\Director\Db\Branch\Branch;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Objects\IcingaService;
+use Icinga\Module\Director\Objects\IcingaServiceSet;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+
+class IcingaCloneObjectForm extends DirectorForm
+{
+ /** @var IcingaObject */
+ protected $object;
+
+ protected $baseObjectUrl;
+
+ /** @var Branch */
+ protected $branch;
+
+ public function setup()
+ {
+ $isBranch = $this->branch && $this->branch->isBranch();
+ $branchOnly = $this->object->get('id') === null;
+ if ($isBranch && $this->object instanceof IcingaObject && $this->object->isTemplate()) {
+ $this->addHtml(Hint::error($this->translate(
+ 'Templates cannot be cloned in Configuration Branches'
+ )));
+ $this->submitLabel = false;
+ return;
+ }
+ $name = $this->object->getObjectName();
+ $this->addElement('text', 'new_object_name', array(
+ 'label' => $this->translate('New name'),
+ 'required' => true,
+ 'value' => $name,
+ ));
+
+ if (!$branchOnly && Acl::instance()->hasPermission('director/admin')) {
+ $this->addElement('select', 'clone_type', array(
+ 'label' => 'Clone type',
+ 'required' => true,
+ 'multiOptions' => array(
+ 'equal' => $this->translate('Clone the object as is, preserving imports'),
+ 'flat' => $this->translate('Flatten all inherited properties, strip imports'),
+ )
+ ));
+ }
+
+ if (!$branchOnly && ($this->object instanceof IcingaHost
+ || $this->object instanceof IcingaServiceSet)
+ ) {
+ $this->addBoolean('clone_services', [
+ 'label' => $this->translate('Clone Services'),
+ 'description' => $this->translate(
+ 'Also clone single Services defined for this Host'
+ )
+ ], 'y');
+ }
+
+ if (!$branchOnly && $this->object instanceof IcingaHost) {
+ $this->addBoolean('clone_service_sets', [
+ 'label' => $this->translate('Clone Service Sets'),
+ 'description' => $this->translate(
+ 'Also clone single Service Sets defined for this Host'
+ )
+ ], 'y');
+ }
+
+ if ($this->object instanceof IcingaService) {
+ if ($this->object->get('service_set_id') !== null) {
+ $this->addElement('select', 'target_service_set', [
+ 'label' => $this->translate('Target Service Set'),
+ 'description' => $this->translate(
+ 'Clone this service to the very same or to another Service Set'
+ ),
+ 'multiOptions' => $this->enumServiceSets(),
+ 'value' => $this->object->get('service_set_id')
+ ]);
+ } elseif ($this->object->get('host_id') !== null) {
+ $this->addElement('text', 'target_host', [
+ 'label' => $this->translate('Target Host'),
+ 'description' => $this->translate(
+ 'Clone this service to the very same or to another Host'
+ ),
+ 'value' => $this->object->get('host'),
+ 'class' => "autosubmit director-suggest",
+ 'data-suggestion-context' => 'HostsAndTemplates',
+ ]);
+ }
+ }
+
+ if ($this->object->isTemplate() && $this->object->supportsFields()) {
+ $this->addBoolean('clone_fields', [
+ 'label' => $this->translate('Clone Template Fields'),
+ 'description' => $this->translate(
+ 'Also clone fields provided by this Template'
+ )
+ ], 'y');
+ }
+
+ $this->submitLabel = sprintf(
+ $this->translate('Clone "%s"'),
+ $name
+ );
+ }
+
+ public function setBranch(Branch $branch)
+ {
+ $this->branch = $branch;
+
+ return $this;
+ }
+
+ public function setObjectBaseUrl($url)
+ {
+ $this->baseObjectUrl = $url;
+
+ return $this;
+ }
+
+ public function onSuccess()
+ {
+ $object = $this->object;
+ $table = $object->getTableName();
+ $type = $object->getShortTableName();
+ $connection = $object->getConnection();
+ $db = $connection->getDbAdapter();
+ $newName = $this->getValue('new_object_name');
+ $resolve = Acl::instance()->hasPermission('director/admin')
+ && $this->getValue('clone_type') === 'flat';
+
+ $msg = sprintf(
+ 'The %s "%s" has been cloned from "%s"',
+ $type,
+ $newName,
+ $object->getObjectName()
+ );
+
+ if ($object->isTemplate() && $this->branch && $this->branch->isBranch()) {
+ throw new IcingaException('Cloning templates is not available for Branches');
+ }
+
+ if ($object->isTemplate() && $object->getObjectName() === $newName) {
+ throw new IcingaException(
+ $this->translate('Name needs to be changed when cloning a Template')
+ );
+ }
+
+ $new = $object::fromPlainObject(
+ $object->toPlainObject($resolve),
+ $connection
+ )->set('object_name', $newName);
+
+ if ($new->isExternal()) {
+ $new->set('object_type', 'object');
+ }
+
+ if ($set = $this->getValue('target_service_set')) {
+ $new->set(
+ 'service_set_id',
+ IcingaServiceSet::loadWithAutoIncId((int) $set, $connection)->get('id')
+ );
+ } elseif ($host = $this->getValue('target_host')) {
+ $new->set('host', $host);
+ }
+
+ $services = [];
+ $sets = [];
+ if ($object instanceof IcingaHost) {
+ $new->set('api_key', null);
+ if ($this->getValue('clone_services') === 'y') {
+ $services = $object->fetchServices();
+ }
+ if ($this->getValue('clone_service_sets') === 'y') {
+ $sets = $object->fetchServiceSets();
+ }
+ } elseif ($object instanceof IcingaServiceSet) {
+ if ($this->getValue('clone_services') === 'y') {
+ $services = $object->fetchServices();
+ }
+ }
+ if ($this->getValue('clone_fields') === 'y') {
+ $fields = $db->fetchAll(
+ $db->select()
+ ->from($table . '_field')
+ ->where("${type}_id = ?", $object->get('id'))
+ );
+ } else {
+ $fields = [];
+ }
+
+ $store = new DbObjectStore($connection, $this->branch);
+ if ($store->store($new)) {
+ $newId = $new->get('id');
+ foreach ($services as $service) {
+ $clone = IcingaService::fromPlainObject(
+ $service->toPlainObject(),
+ $connection
+ );
+
+ if ($new instanceof IcingaHost) {
+ $clone->set('host_id', $newId);
+ } elseif ($new instanceof IcingaServiceSet) {
+ $clone->set('service_set_id', $newId);
+ }
+ $store->store($clone);
+ }
+
+ foreach ($sets as $set) {
+ $newSet = IcingaServiceSet::fromPlainObject(
+ $set->toPlainObject(),
+ $connection
+ )->set('host_id', $newId);
+ $store->store($newSet);
+ }
+
+ foreach ($fields as $row) {
+ $row->{"${type}_id"} = $newId;
+ $db->insert($table . '_field', (array) $row);
+ }
+
+ if ($new instanceof IcingaServiceSet) {
+ $this->setSuccessUrl(
+ 'director/serviceset',
+ $new->getUrlParams()
+ );
+ } else {
+ $this->setSuccessUrl(
+ $this->baseObjectUrl ?: 'director/' . strtolower($type),
+ $new->getUrlParams()
+ );
+ }
+
+ $this->redirectOnSuccess($msg);
+ }
+ }
+
+ protected function enumServiceSets()
+ {
+ $db = $this->object->getConnection()->getDbAdapter();
+ return $db->fetchPairs(
+ $db->select()
+ ->from('icinga_service_set', ['id', 'object_name'])
+ ->order('object_name')
+ );
+ }
+
+ public function setObject(IcingaObject $object)
+ {
+ $this->object = $object;
+ return $this;
+ }
+}
diff --git a/application/forms/IcingaCommandArgumentForm.php b/application/forms/IcingaCommandArgumentForm.php
new file mode 100644
index 0000000..5dbef41
--- /dev/null
+++ b/application/forms/IcingaCommandArgumentForm.php
@@ -0,0 +1,190 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Objects\IcingaCommand;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaCommandArgumentForm extends DirectorObjectForm
+{
+ /** @var IcingaCommand */
+ protected $commandObject;
+
+ public function setCommandObject(IcingaCommand $object)
+ {
+ $this->commandObject = $object;
+ $this->setDb($object->getConnection());
+ return $this;
+ }
+
+ public function setup()
+ {
+ $this->addHidden('command_id', $this->commandObject->get('id'));
+
+ $this->addElement('text', 'argument_name', array(
+ 'label' => $this->translate('Argument name'),
+ 'filters' => array('StringTrim'),
+ 'description' => $this->translate('e.g. -H or --hostname, empty means "skip_key"')
+ ));
+
+ $this->addElement('text', 'description', array(
+ 'label' => $this->translate('Description'),
+ 'description' => $this->translate('Description of the argument')
+ ));
+
+ $this->addElement('select', 'argument_format', array(
+ 'label' => $this->translate('Value type'),
+ 'multiOptions' => array(
+ 'string' => $this->translate('String'),
+ 'expression' => $this->translate('Icinga DSL')
+ ),
+ 'description' => $this->translate(
+ 'Whether the argument value is a string (allowing macros like $host$)'
+ . ' or an Icinga DSL lambda function (will be enclosed with {{ ... }}'
+ ),
+ 'class' => 'autosubmit',
+ ));
+
+ if ($this->getSentOrObjectValue('argument_format') === 'expression') {
+ $this->addElement('textarea', 'argument_value', array(
+ 'label' => $this->translate('Value'),
+ 'description' => $this->translate(
+ 'An Icinga DSL expression, e.g.: var cmd = macro("$cmd$");'
+ . ' return typeof(command) == String ...'
+ ),
+ 'rows' => 3
+ ));
+ } else {
+ $this->addElement('text', 'argument_value', array(
+ 'label' => $this->translate('Value'),
+ 'description' => $this->translate(
+ 'e.g. 5%, $host.name$, $lower$%:$upper$%'
+ )
+ ));
+ }
+
+ $this->addElement('text', 'sort_order', array(
+ 'label' => $this->translate('Position'),
+ 'description' => $this->translate(
+ 'Leave empty for non-positional arguments. Can be a positive or'
+ . ' negative number and influences argument ordering'
+ )
+ ));
+
+ $this->addElement('select', 'set_if_format', array(
+ 'label' => $this->translate('Condition format'),
+ 'multiOptions' => array(
+ 'string' => $this->translate('String'),
+ 'expression' => $this->translate('Icinga DSL')
+ ),
+ 'description' => $this->translate(
+ 'Whether the set_if parameter is a string (allowing macros like $host$)'
+ . ' or an Icinga DSL lambda function (will be enclosed with {{ ... }}'
+ ),
+ 'class' => 'autosubmit',
+ ));
+
+ if ($this->getSentOrObjectValue('set_if_format') === 'expression') {
+ $this->addElement('textarea', 'set_if', array(
+ 'label' => $this->translate('Condition (set_if)'),
+ 'description' => $this->translate(
+ 'An Icinga DSL expression that returns a boolean value, e.g.: var cmd = bool(macro("$cmd$"));'
+ . ' return cmd ...'
+ ),
+ 'rows' => 3
+ ));
+ } else {
+ $this->addElement('text', 'set_if', array(
+ 'label' => $this->translate('Condition (set_if)'),
+ 'description' => $this->translate(
+ 'Only set this parameter if the argument value resolves to a'
+ . ' numeric value. String values are not supported'
+ )
+ ));
+ }
+
+ $this->addBoolean('repeat_key', array(
+ 'label' => $this->translate('Repeat key'),
+ 'description' => $this->translate(
+ 'Whether this parameter should be repeated when multiple values'
+ . ' (read: array) are given'
+ )
+ ));
+
+ $this->addBoolean('skip_key', array(
+ 'label' => $this->translate('Skip key'),
+ 'description' => $this->translate(
+ 'Whether the parameter name should not be passed to the command.'
+ . ' Per default, the parameter name (e.g. -H) will be appended,'
+ . ' so no need to explicitly set this to "No".'
+ )
+ ));
+
+ $this->addBoolean('required', array(
+ 'label' => $this->translate('Required'),
+ 'required' => false,
+ 'description' => $this->translate('Whether this argument should be required')
+ ));
+
+ $this->setButtons();
+ }
+
+ protected function deleteObject($object)
+ {
+ $cmd = $this->commandObject;
+
+ $msg = sprintf(
+ $this->translate('%s argument "%s" has been removed'),
+ $this->translate($this->getObjectShortClassName()),
+ $object->argument_name
+ );
+
+ // TODO: remove argument_id, once verified that it is no longer in use
+ $url = $this->getSuccessUrl()->without('argument_id')->without('argument');
+
+ $cmd->arguments()->remove($object->argument_name);
+ if ($this->branch->isBranch()) {
+ $this->getDbObjectStore()->store($cmd);
+ $this->setSuccessUrl($url);
+ } else {
+ if ($cmd->store()) {
+ $this->setSuccessUrl($url);
+ }
+ }
+
+ $this->redirectOnSuccess($msg);
+ }
+
+ public function onSuccess()
+ {
+ $object = $this->object();
+ $cmd = $this->commandObject;
+ if ($object->get('argument_name') === null) {
+ $object->set('skip_key', true);
+ $object->set('argument_name', $cmd->getNextSkippableKeyName());
+ }
+
+ if ($object->hasBeenModified()) {
+ $cmd->arguments()->set(
+ $object->get('argument_name'),
+ $object
+ );
+ $msg = sprintf(
+ $this->translate('The argument %s has successfully been stored'),
+ $object->get('argument_name')
+ );
+ $this->getDbObjectStore()->store($cmd);
+ } else {
+ if ($this->isApiRequest()) {
+ $this->setHttpResponseCode(304);
+ }
+ $msg = $this->translate('No action taken, object has not been modified');
+ }
+ $this->setSuccessUrl('director/command/arguments', [
+ 'argument' => $object->get('argument_name'),
+ 'name' => $cmd->getObjectName()
+ ]);
+
+ $this->redirectOnSuccess($msg);
+ }
+}
diff --git a/application/forms/IcingaCommandForm.php b/application/forms/IcingaCommandForm.php
new file mode 100644
index 0000000..ba1386b
--- /dev/null
+++ b/application/forms/IcingaCommandForm.php
@@ -0,0 +1,137 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaCommandForm extends DirectorObjectForm
+{
+ public function setup()
+ {
+ $this->addObjectTypeElement();
+ if (! $this->hasObjectType()) {
+ return;
+ }
+
+ $this->addElement('select', 'methods_execute', array(
+ 'label' => $this->translate('Command type'),
+ 'multiOptions' => array(
+ null => '- please choose -',
+ $this->translate('Plugin commands') => array(
+ 'PluginCheck' => 'Plugin Check Command',
+ 'PluginNotification' => 'Notification Plugin Command',
+ 'PluginEvent' => 'Event Plugin Command',
+ ),
+ $this->translate('Internal commands') => array(
+ 'IcingaCheck' => 'Icinga Check Command',
+ 'ClusterCheck' => 'Icinga Cluster Check Command',
+ 'ClusterZoneCheck' => 'Icinga Cluster Zone Check Command',
+ 'IdoCheck' => 'Ido Check Command',
+ 'RandomCheck' => 'Random Check Command',
+ )
+ ),
+ 'required' => ! $this->isTemplate(),
+ 'description' => $this->translate(
+ 'Plugin Check commands are what you need when running checks agains'
+ . ' your infrastructure. Notification commands will be used when it'
+ . ' comes to notify your users. Event commands allow you to trigger'
+ . ' specific actions when problems occur. Some people use them for'
+ . ' auto-healing mechanisms, like restarting services or rebooting'
+ . ' systems at specific thresholds'
+ ),
+ 'class' => 'autosubmit'
+ ));
+
+ $nameLabel = $this->isTemplate()
+ ? $this->translate('Name')
+ : $this->translate('Command name');
+
+ $this->addElement('text', 'object_name', array(
+ 'label' => $nameLabel,
+ 'required' => true,
+ 'description' => $this->translate('Identifier for the Icinga command you are going to create')
+ ));
+
+ $this->addImportsElement(false);
+
+ $this->addElement('text', 'command', array(
+ 'label' => $this->translate('Command'),
+ 'required' => ! $this->isTemplate(),
+ 'description' => $this->translate(
+ 'The command Icinga should run. Absolute paths are accepted as provided,'
+ . ' relative paths are prefixed with "PluginDir + ", similar Constant prefixes are allowed.'
+ . ' Spaces will lead to separation of command path and standalone arguments. Please note that'
+ . ' this means that we do not support spaces in plugin names and paths right now.'
+ )
+ ));
+
+ $this->addElement('text', 'timeout', array(
+ 'label' => $this->translate('Timeout'),
+ 'description' => $this->translate(
+ 'Optional command timeout. Allowed values are seconds or durations postfixed with a'
+ . ' specific unit (e.g. 1m or also 3m 30s).'
+ )
+ ));
+
+ $descIsString = [
+ $this->translate('Render the command as a plain string instead of an array.'),
+ $this->translate('If enabled you can not define arguments.'),
+ $this->translate('Disabled by default, and should only be used in rare cases.'),
+ $this->translate('WARNING, this can allow shell script injection via custom variables used in command.'),
+ ];
+
+ $this->addBoolean(
+ 'is_string',
+ array(
+ 'label' => $this->translate('Render as string'),
+ 'description' => join(' ', $descIsString),
+ )
+ );
+
+ $this->addDisabledElement();
+ $this->addZoneSection();
+ $this->setButtons();
+ }
+
+ protected function addZoneSection()
+ {
+ $this->addZoneElement(true);
+
+ $elements = array(
+ 'zone_id',
+ );
+ $this->addDisplayGroup($elements, 'clustering', array(
+ 'decorators' => array(
+ 'FormElements',
+ array('HtmlTag', array('tag' => 'dl')),
+ 'Fieldset',
+ ),
+ 'order' => self::GROUP_ORDER_CLUSTERING,
+ 'legend' => $this->translate('Zone settings')
+ ));
+
+ return $this;
+ }
+
+ protected function enumAllowedTemplates()
+ {
+ $object = $this->object();
+ $tpl = $this->db->enum($object->getTableName());
+ if (empty($tpl)) {
+ return array();
+ }
+
+ $id = $object->get('id');
+
+ if (array_key_exists($id, $tpl)) {
+ unset($tpl[$id]);
+ }
+
+ if (empty($tpl)) {
+ return array();
+ }
+
+ $tpl = array_combine($tpl, $tpl);
+ return $tpl;
+ }
+}
diff --git a/application/forms/IcingaDeleteObjectForm.php b/application/forms/IcingaDeleteObjectForm.php
new file mode 100644
index 0000000..409bdc3
--- /dev/null
+++ b/application/forms/IcingaDeleteObjectForm.php
@@ -0,0 +1,41 @@
+<?php
+
+// TODO: Check whether this can be removed
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Web\Form\QuickForm;
+
+class IcingaDeleteObjectForm extends QuickForm
+{
+ /** @var IcingaObject */
+ protected $object;
+
+ public function setup()
+ {
+ $this->submitLabel = sprintf(
+ $this->translate('YES, please delete "%s"'),
+ $this->object->getObjectName()
+ );
+ }
+
+ public function onSuccess()
+ {
+ $object = $this->object;
+ $msg = sprintf(
+ 'The %s "%s" has been deleted',
+ $object->getShortTableName(),
+ $object->getObjectName()
+ );
+
+ if ($object->delete()) {
+ $this->redirectOnSuccess($msg);
+ }
+ }
+
+ public function setObject(IcingaObject $object)
+ {
+ $this->object = $object;
+ return $this;
+ }
+}
diff --git a/application/forms/IcingaDependencyForm.php b/application/forms/IcingaDependencyForm.php
new file mode 100644
index 0000000..ab30844
--- /dev/null
+++ b/application/forms/IcingaDependencyForm.php
@@ -0,0 +1,309 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Data\Db\DbObject;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use Icinga\Module\Director\Objects\IcingaDependency;
+
+class IcingaDependencyForm extends DirectorObjectForm
+{
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ public function setup()
+ {
+ $this->setupDependencyElements();
+ }
+
+ /***
+ * @throws \Zend_Form_Exception
+ */
+ protected function setupDependencyElements()
+ {
+ $this->addObjectTypeElement();
+ if (! $this->hasObjectType()) {
+ $this->groupMainProperties();
+ return;
+ }
+
+ $this->addNameElement()
+ ->addDisabledElement()
+ ->addImportsElement()
+ ->addObjectsElement()
+ ->addBooleanElements()
+ ->addPeriodElement()
+ ->addAssignmentElements()
+ ->addEventFilterElements(['states'])
+ ->groupMainProperties()
+ ->addZoneSection()
+ ->setButtons();
+ }
+
+ /**
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addZoneSection()
+ {
+ $this->addZoneElement(true);
+
+ $elements = array(
+ 'zone_id',
+ );
+ $this->addDisplayGroup($elements, 'clustering', array(
+ 'decorators' => array(
+ 'FormElements',
+ array('HtmlTag', array('tag' => 'dl')),
+ 'Fieldset',
+ ),
+ 'order' => self::GROUP_ORDER_CLUSTERING,
+ 'legend' => $this->translate('Zone settings')
+ ));
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addNameElement()
+ {
+ $this->addElement('text', 'object_name', [
+ 'label' => $this->translate('Name'),
+ 'required' => true,
+ 'description' => $this->translate('Name for the Icinga dependency you are going to create')
+ ]);
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addAssignmentElements()
+ {
+ if (!$this->object || !$this->object->isApplyRule()) {
+ return $this;
+ }
+
+ $this->addElement('select', 'apply_to', [
+ 'label' => $this->translate('Apply to'),
+ 'description' => $this->translate(
+ 'Whether this dependency should affect hosts or services'
+ ),
+ 'required' => true,
+ 'class' => 'autosubmit',
+ 'multiOptions' => $this->optionalEnum([
+ 'host' => $this->translate('Hosts'),
+ 'service' => $this->translate('Services'),
+ ])
+ ]);
+
+ $applyTo = $this->getSentOrObjectValue('apply_to');
+
+ if (! $applyTo) {
+ return $this;
+ }
+
+ $suggestionContext = ucfirst($applyTo) . 'FilterColumns';
+ $this->addAssignFilter([
+ 'suggestionContext' => $suggestionContext,
+ 'description' => $this->translate(
+ 'This allows you to configure an assignment filter. Please feel'
+ . ' free to combine as many nested operators as you want. The'
+ . ' "contains" operator is valid for arrays only. Please use'
+ . ' wildcards and the = (equals) operator when searching for'
+ . ' partial string matches, like in *.example.com'
+ )
+ ]);
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addPeriodElement()
+ {
+ $periods = $this->db->enumTimeperiods();
+ if (empty($periods)) {
+ return $this;
+ }
+
+ $this->addElement(
+ 'select',
+ 'period_id',
+ array(
+ 'label' => $this->translate('Time period'),
+ 'description' => $this->translate(
+ 'The name of a time period which determines when this'
+ . ' notification should be triggered. Not set by default.'
+ ),
+ 'multiOptions' => $this->optionalEnum($periods),
+ )
+ );
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ protected function addBooleanElements()
+ {
+ $this->addBoolean('disable_checks', [
+ 'label' => $this->translate('Disable Checks'),
+ 'description' => $this->translate(
+ 'Whether to disable checks when this dependency fails.'
+ . ' Defaults to false.'
+ )
+ ], null);
+
+ $this->addBoolean('disable_notifications', [
+ 'label' => $this->translate('Disable Notificiations'),
+ 'description' => $this->translate(
+ 'Whether to disable notifications when this dependency fails.'
+ . ' Defaults to true.'
+ )
+ ], null);
+
+ $this->addBoolean('ignore_soft_states', [
+ 'label' => $this->translate('Ignore Soft States'),
+ 'description' => $this->translate(
+ 'Whether to ignore soft states for the reachability calculation.'
+ . ' Defaults to true.'
+ )
+ ], null);
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addObjectsElement()
+ {
+ $dependency = $this->getObject();
+ $parentHost = $dependency->get('parent_host');
+ if ($parentHost === null) {
+ $parentHostVar = $dependency->get('parent_host_var');
+ if (\strlen($parentHostVar) > 0) {
+ $parentHost = '$' . $dependency->get('parent_host_var') . '$';
+ }
+ }
+ $this->addElement('text', 'parent_host', [
+ 'label' => $this->translate('Parent Host'),
+ 'description' => $this->translate(
+ 'The parent host. You might want to refer Host Custom Variables'
+ . ' via $host.vars.varname$'
+ ),
+ 'class' => "autosubmit director-suggest",
+ 'data-suggestion-context' => 'hostnames',
+ 'order' => 10,
+ 'required' => $this->isObject(),
+ 'value' => $parentHost
+ ]);
+ $sentParent = $this->getSentOrObjectValue('parent_host');
+
+ if (!empty($sentParent) || $dependency->isApplyRule()) {
+ $parentService = $dependency->get('parent_service');
+ $this->addElement('text', 'parent_service', [
+ 'label' => $this->translate('Parent Service'),
+ 'description' => $this->translate(
+ 'Optional. The parent service. If omitted this dependency'
+ . ' object is treated as host dependency.'
+ ),
+ 'class' => "autosubmit director-suggest",
+ 'data-suggestion-context' => 'servicenames',
+ 'data-suggestion-for-host' => $sentParent,
+ 'order' => 20,
+ 'value' => $parentService
+ ]);
+ }
+
+ // If configuring Object, allow selection of child host and/or service,
+ // otherwise apply rules will determine child object.
+ if ($dependency->isObject()) {
+ $this->addElement('text', 'child_host', [
+ 'label' => $this->translate('Child Host'),
+ 'description' => $this->translate('The child host.'),
+ 'value' => $dependency->get('child_host'),
+ 'order' => 30,
+ 'class' => 'autosubmit director-suggest',
+ 'required' => $this->isObject(),
+ 'data-suggestion-context' => 'hostnames',
+ ]);
+
+ $sentChild = $this->getSentOrObjectValue('child_host');
+
+ if (!empty($sentChild)) {
+ $this->addElement('text', 'child_service', [
+ 'label' => $this->translate('Child Service'),
+ 'description' => $this->translate(
+ 'Optional. The child service. If omitted this dependency'
+ . ' object is treated as host dependency.'
+ ),
+ 'class' => 'autosubmit director-suggest',
+ 'order' => 40,
+ 'value' => $this->getObject()->get('child_service'),
+ 'data-suggestion-context' => 'servicenames',
+ 'data-suggestion-for-host' => $sentChild,
+ ]);
+ }
+ }
+
+ $elements = ['parent_host', 'child_host', 'parent_service', 'child_service'];
+ $this->addDisplayGroup($elements, 'related_objects', [
+ 'decorators' => [
+ 'FormElements',
+ ['HtmlTag', ['tag' => 'dl']],
+ 'Fieldset',
+ ],
+ 'order' => self::GROUP_ORDER_RELATED_OBJECTS,
+ 'legend' => $this->translate('Related Objects')
+ ]);
+
+ return $this;
+ }
+
+ /**
+ * Hint: this is unused. Why?
+ *
+ * @param IcingaDependency $dependency
+ * @return $this
+ */
+ public function createApplyRuleFor(IcingaDependency $dependency)
+ {
+ $object = $this->object();
+ $object->setImports($dependency->getObjectName());
+ $object->set('object_type', 'apply');
+ $object->set('object_name', $dependency->getObjectName());
+
+ return $this;
+ }
+
+ protected function handleProperties(DbObject $object, &$values)
+ {
+ if ($this->hasBeenSent()) {
+ if (isset($values['parent_host'])
+ && $this->isCustomVar($values['parent_host'])
+ ) {
+ $values['parent_host_var'] = \trim($values['parent_host'], '$');
+ $values['parent_host'] = '';
+ }
+ }
+
+ parent::handleProperties($object, $values);
+ }
+
+ protected function isCustomVar($string)
+ {
+ return \preg_match('/^\$(?:host)\.vars\..+\$$/', $string);
+ // Eventually: return \preg_match('/^\$(?:host|service)\.vars\..+\$$/', $string);
+ }
+}
diff --git a/application/forms/IcingaEndpointForm.php b/application/forms/IcingaEndpointForm.php
new file mode 100644
index 0000000..1c08cb4
--- /dev/null
+++ b/application/forms/IcingaEndpointForm.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaEndpointForm extends DirectorObjectForm
+{
+ public function setup()
+ {
+ $this->addObjectTypeElement();
+ if (! $this->hasObjectType()) {
+ return;
+ }
+
+ if ($this->isTemplate()) {
+ $this->addElement('text', 'object_name', array(
+ 'label' => $this->translate('Endpoint template name'),
+ 'required' => true,
+ 'description' => $this->translate('Name for the Icinga endpoint template you are going to create')
+ ));
+ } else {
+ $this->addElement('text', 'object_name', array(
+ 'label' => $this->translate('Endpoint'),
+ 'required' => true,
+ 'description' => $this->translate('Name for the Icinga endpoint you are going to create')
+ ));
+ }
+
+ $this->addElement('text', 'host', array(
+ 'label' => $this->translate('Endpoint address'),
+ 'description' => $this->translate('IP address / hostname of remote node')
+ ));
+
+ $this->addElement('text', 'port', array(
+ 'label' => $this->translate('Port'),
+ 'description' => $this->translate('The port of the endpoint.'),
+ ));
+
+ $this->addElement('text', 'log_duration', array(
+ 'label' => $this->translate('Log Duration'),
+ 'description' => $this->translate('The log duration time.')
+ ));
+
+ $this->addElement('select', 'apiuser_id', array(
+ 'label' => $this->translate('API user'),
+ 'multiOptions' => $this->optionalEnum($this->db->enumApiUsers())
+ ));
+
+ $this->addZoneElement();
+
+ if ($this->object->hasBeenLoadedFromDb()) {
+ $imports = $this->object->get('imports');
+ if ($imports !== null && count($imports) > 0) {
+ $this->addImportsElement(false);
+ }
+ }
+
+ $this->setButtons();
+ }
+}
diff --git a/application/forms/IcingaForgetApiKeyForm.php b/application/forms/IcingaForgetApiKeyForm.php
new file mode 100644
index 0000000..d1f475c
--- /dev/null
+++ b/application/forms/IcingaForgetApiKeyForm.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+
+class IcingaForgetApiKeyForm extends DirectorForm
+{
+ /** @var IcingaHost */
+ protected $host;
+
+ public function setHost(IcingaHost $host)
+ {
+ $this->host = $host;
+ return $this;
+ }
+
+ public function setup()
+ {
+ $this->addStandaloneSubmitButton(sprintf(
+ $this->translate('Drop Self Service API key'),
+ $this->host->getObjectName()
+ ));
+ }
+
+ public function onSuccess()
+ {
+ $this->host->set('api_key', null)->store();
+ $this->redirectOnSuccess(sprintf($this->translate(
+ 'The Self Service API key for %s has been dropped'
+ ), $this->host->getObjectName()));
+ }
+}
diff --git a/application/forms/IcingaGenerateApiKeyForm.php b/application/forms/IcingaGenerateApiKeyForm.php
new file mode 100644
index 0000000..18980f0
--- /dev/null
+++ b/application/forms/IcingaGenerateApiKeyForm.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+
+class IcingaGenerateApiKeyForm extends DirectorForm
+{
+ /** @var IcingaHost */
+ protected $host;
+
+ public function setHost(IcingaHost $host)
+ {
+ $this->host = $host;
+ return $this;
+ }
+
+ public function setup()
+ {
+ if ($this->host->getProperty('api_key')) {
+ $label = $this->translate('Regenerate Self Service API key');
+ } else {
+ $label = $this->translate('Generate Self Service API key');
+ }
+
+ $this->addStandaloneSubmitButton(sprintf(
+ $label,
+ $this->host->getObjectName()
+ ));
+ }
+
+ public function onSuccess()
+ {
+ $host = $this->host;
+ $host->generateApiKey();
+ $host->store();
+ $this->redirectOnSuccess(sprintf($this->translate(
+ 'A new Self Service API key for %s has been generated'
+ ), $host->getObjectName()));
+ }
+}
diff --git a/application/forms/IcingaHostForm.php b/application/forms/IcingaHostForm.php
new file mode 100644
index 0000000..ec71471
--- /dev/null
+++ b/application/forms/IcingaHostForm.php
@@ -0,0 +1,390 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Exception\AuthenticationException;
+use Icinga\Module\Director\Repository\IcingaTemplateRepository;
+use Icinga\Module\Director\Restriction\HostgroupRestriction;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use ipl\Html\BaseHtmlElement;
+use ipl\Html\Html;
+use gipfl\IcingaWeb2\Link;
+
+class IcingaHostForm extends DirectorObjectForm
+{
+ public function setup()
+ {
+ $this->addObjectTypeElement();
+ if (! $this->hasObjectType()) {
+ $this->groupMainProperties();
+ return;
+ }
+
+ $simpleImports = $this->isNew() && ! $this->isTemplate();
+ if ($simpleImports) {
+ if (!$this->addSingleImportElement(true)) {
+ $this->setSubmitLabel(false);
+ return;
+ }
+
+ if (! ($imports = $this->getSentOrObjectValue('imports'))) {
+ $this->setSubmitLabel($this->translate('Next'));
+ $this->groupMainProperties();
+ return;
+ }
+ }
+
+ $nameLabel = $this->isTemplate()
+ ? $this->translate('Name')
+ : $this->translate('Hostname');
+
+ $this->addElement('text', 'object_name', array(
+ 'label' => $nameLabel,
+ 'required' => true,
+ 'spellcheck' => 'false',
+ 'description' => $this->translate(
+ 'Icinga object name for this host. This is usually a fully qualified host name'
+ . ' but it could basically be any kind of string. To make things easier for your'
+ . ' users we strongly suggest to use meaningful names for templates. E.g. "generic-host"'
+ . ' is ugly, "Standard Linux Server" is easier to understand'
+ )
+ ));
+
+ if (! $simpleImports) {
+ $this->addImportsElement();
+ }
+
+ $this->addChoices('host')
+ ->addDisplayNameElement()
+ ->addAddressElements()
+ ->addGroupsElement()
+ ->addDisabledElement()
+ ->groupMainProperties($simpleImports)
+ ->addCheckCommandElements()
+ ->addCheckExecutionElements()
+ ->addExtraInfoElements()
+ ->addClusteringElements()
+ ->setButtons();
+ }
+
+ /**
+ * @return $this
+ */
+ protected function addClusteringElements()
+ {
+ $this->addZoneElement();
+ $this->addBoolean('has_agent', [
+ 'label' => $this->translate('Icinga2 Agent'),
+ 'description' => $this->translate(
+ 'Whether this host has the Icinga 2 Agent installed'
+ ),
+ 'class' => 'autosubmit',
+ ]);
+
+ if ($this->getSentOrResolvedObjectValue('has_agent') === 'y') {
+ $this->addBoolean('master_should_connect', [
+ 'label' => $this->translate('Establish connection'),
+ 'description' => $this->translate(
+ 'Whether the parent (master) node should actively try to connect to this agent'
+ ),
+ 'required' => true
+ ]);
+ $this->addBoolean('accept_config', [
+ 'label' => $this->translate('Accepts config'),
+ 'description' => $this->translate('Whether the agent is configured to accept config'),
+ 'required' => true
+ ]);
+
+ $this->addHidden('command_endpoint_id', null);
+ $this->setSentValue('command_endpoint_id', null);
+
+ $settings = $this->object->getConnection()->settings();
+ if ($settings->get('feature_custom_endpoint') === 'y' && ! $this->isTemplate()) {
+ $this->addElement('text', 'custom_endpoint_name', [
+ 'label' => $this->translate('Custom Endpoint Name'),
+ 'description' => $this->translate(
+ 'Use a different name for the generated endpoint object than the host name'
+ . ' and add a custom variable to allow services setting the correct command endpoint.'
+ ),
+ ]);
+ }
+ } else {
+ if ($this->isTemplate()) {
+ $this->addElement('select', 'command_endpoint_id', [
+ 'label' => $this->translate('Command endpoint'),
+ 'description' => $this->translate(
+ 'Setting a command endpoint allows you to force host checks'
+ . ' to be executed by a specific endpoint. Please carefully'
+ . ' study the related Icinga documentation before using this'
+ . ' feature'
+ ),
+ 'multiOptions' => $this->optionalEnum($this->enumEndpoints())
+ ]);
+ }
+
+ foreach (['master_should_connect', 'accept_config'] as $key) {
+ $this->addHidden($key, null);
+ $this->setSentValue($key, null);
+ }
+ }
+
+ $elements = [
+ 'zone_id',
+ 'has_agent',
+ 'master_should_connect',
+ 'accept_config',
+ 'command_endpoint_id',
+ 'custom_endpoint_name',
+ 'api_key',
+ ];
+ $this->addDisplayGroup($elements, 'clustering', [
+ 'decorators' => [
+ 'FormElements',
+ ['HtmlTag', ['tag' => 'dl']],
+ 'Fieldset',
+ ],
+ 'order' => self::GROUP_ORDER_CLUSTERING,
+ 'legend' => $this->translate('Icinga Agent and zone settings')
+ ]);
+
+ return $this;
+ }
+
+ /**
+ * @param bool $required
+ * @return bool
+ */
+ protected function addSingleImportElement($required = null)
+ {
+ $enum = $this->enumHostTemplates();
+ if (empty($enum)) {
+ if ($required) {
+ if ($this->hasBeenSent()) {
+ $this->addError($this->translate('No Host template has been chosen'));
+ } else {
+ if ($this->hasPermission('director/admin')) {
+ $html = sprintf(
+ $this->translate('Please define a %s first'),
+ Link::create(
+ $this->translate('Host Template'),
+ 'director/host/add',
+ ['type' => 'template']
+ )
+ );
+ } else {
+ $html = $this->translate('No Host Template has been provided yet');
+ }
+
+ $this->addHtml('<p class="warning">' . $html . '</p>');
+ }
+ }
+
+ return false;
+ }
+
+ $this->addElement('select', 'imports', [
+ 'label' => $this->translate('Host Template'),
+ 'description' => $this->translate(
+ 'Choose a Host Template'
+ ),
+ 'required' => true,
+ 'multiOptions' => $this->optionalEnum($enum),
+ 'class' => 'autosubmit'
+ ]);
+
+ return true;
+ }
+
+ protected function enumHostTemplates()
+ {
+ $tpl = IcingaTemplateRepository::instanceByType('host', $this->getDb())
+ ->listAllowedTemplateNames();
+ return array_combine($tpl, $tpl);
+ }
+
+ /**
+ * @return $this
+ */
+ protected function addGroupsElement()
+ {
+ if ($this->hasHostGroupRestriction()
+ && ! $this->getAuth()->hasPermission('director/groups-for-restricted-hosts')
+ ) {
+ return $this;
+ }
+
+ $this->addElement('extensibleSet', 'groups', array(
+ 'label' => $this->translate('Groups'),
+ 'suggest' => 'hostgroupnames',
+ 'description' => $this->translate(
+ 'Hostgroups that should be directly assigned to this node. Hostgroups can be useful'
+ . ' for various reasons. You might assign service checks based on assigned hostgroup.'
+ . ' They are also often used as an instrument to enforce restricted views in Icinga Web 2.'
+ . ' Hostgroups can be directly assigned to single hosts or to host templates. You might'
+ . ' also want to consider assigning hostgroups using apply rules'
+ )
+ ));
+
+ $applied = $this->getAppliedGroups();
+ if (! empty($applied)) {
+ $this->addElement('simpleNote', 'applied_groups', [
+ 'label' => $this->translate('Applied groups'),
+ 'value' => $this->createHostgroupLinks($applied),
+ 'ignore' => true,
+ ]);
+ }
+
+ $inherited = $this->getInheritedGroups();
+ if (! empty($inherited)) {
+ /** @var BaseHtmlElement $links */
+ $links = $this->createHostgroupLinks($inherited);
+ if (count($this->object()->getGroups())) {
+ $links->addAttributes(['class' => 'strike-links']);
+ /** @var BaseHtmlElement $link */
+ foreach ($links->getContent() as $link) {
+ if ($link instanceof BaseHtmlElement) {
+ $link->addAttributes([
+ 'title' => $this->translate(
+ 'Group has been inherited, but will be overridden'
+ . ' by locally assigned group(s)'
+ )
+ ]);
+ }
+ }
+ }
+ $this->addElement('simpleNote', 'inherited_groups', [
+ 'label' => $this->translate('Inherited groups'),
+ 'value' => $links,
+ 'ignore' => true,
+ ]);
+ }
+
+ return $this;
+ }
+
+ protected function strikeGroupLinks(BaseHtmlElement $links)
+ {
+ /** @var BaseHtmlElement $link */
+ foreach ($links->getContent() as $link) {
+ $link->getAttributes()->add('style', 'text-decoration: strike');
+ }
+ $links->add('aha');
+ }
+
+ protected function getInheritedGroups()
+ {
+ if ($this->hasObject()) {
+ return $this->object->listInheritedGroupNames();
+ } else {
+ return [];
+ }
+ }
+
+ protected function createHostgroupLinks($groups)
+ {
+ $links = [];
+ foreach ($groups as $name) {
+ if (! empty($links)) {
+ $links[] = ', ';
+ }
+ $links[] = Link::create(
+ $name,
+ 'director/hostgroup',
+ ['name' => $name],
+ ['data-base-target' => '_next']
+ );
+ }
+
+ return Html::tag('span', [
+ 'style' => 'line-height: 2.5em; padding-left: 0.5em'
+ ], $links);
+ }
+
+ protected function getAppliedGroups()
+ {
+ if ($this->isNew()) {
+ return [];
+ }
+
+ return $this->object()->getAppliedGroups();
+ }
+
+ protected function hasHostGroupRestriction()
+ {
+ return $this->getAuth()->getRestrictions('director/filter/hostgroups');
+ }
+
+ /**
+ * @return $this
+ */
+ protected function addAddressElements()
+ {
+ if ($this->isTemplate()) {
+ return $this;
+ }
+
+ $this->addElement('text', 'address', array(
+ 'label' => $this->translate('Host address'),
+ 'description' => $this->translate(
+ 'Host address. Usually an IPv4 address, but may be any kind of address'
+ . ' your check plugin is able to deal with'
+ )
+ ));
+
+ $this->addElement('text', 'address6', array(
+ 'label' => $this->translate('IPv6 address'),
+ 'description' => $this->translate('Usually your hosts main IPv6 address')
+ ));
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ protected function addDisplayNameElement()
+ {
+ if ($this->isTemplate()) {
+ return $this;
+ }
+
+ $this->addElement('text', 'display_name', array(
+ 'label' => $this->translate('Display name'),
+ 'spellcheck' => 'false',
+ 'description' => $this->translate(
+ 'Alternative name for this host. Might be a host alias or and kind'
+ . ' of string helping your users to identify this host'
+ )
+ ));
+
+ return $this;
+ }
+
+ protected function enumEndpoints()
+ {
+ $db = $this->db->getDbAdapter();
+ $select = $db->select()->from('icinga_endpoint', [
+ 'id',
+ 'object_name'
+ ])->where(
+ 'object_type IN (?)',
+ ['object', 'external_object']
+ )->order('object_name');
+
+ return $db->fetchPairs($select);
+ }
+
+ public function onSuccess()
+ {
+ if ($this->hasHostGroupRestriction()) {
+ $restriction = new HostgroupRestriction($this->getDb(), $this->getAuth());
+ if (! $restriction->allowsHost($this->object())) {
+ throw new AuthenticationException($this->translate(
+ 'Unable to store a host with the given properties because of insufficient permissions'
+ ));
+ }
+ }
+
+ parent::onSuccess();
+ }
+}
diff --git a/application/forms/IcingaHostGroupForm.php b/application/forms/IcingaHostGroupForm.php
new file mode 100644
index 0000000..be48318
--- /dev/null
+++ b/application/forms/IcingaHostGroupForm.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaHostGroupForm extends DirectorObjectForm
+{
+ public function setup()
+ {
+ $this->addHidden('object_type', 'object');
+
+ $this->addElement('text', 'object_name', [
+ 'label' => $this->translate('Hostgroup'),
+ 'required' => true,
+ 'description' => $this->translate('Icinga object name for this host group')
+ ]);
+
+ $this->addGroupDisplayNameElement()
+ ->addAssignmentElements()
+ ->setButtons();
+ }
+
+ protected function addAssignmentElements()
+ {
+ $this->addAssignFilter([
+ 'suggestionContext' => 'HostFilterColumns',
+ 'required' => false,
+ 'description' => $this->translate(
+ 'This allows you to configure an assignment filter. Please feel'
+ . ' free to combine as many nested operators as you want. The'
+ . ' "contains" operator is valid for arrays only. Please use'
+ . ' wildcards and the = (equals) operator when searching for'
+ . ' partial string matches, like in *.example.com'
+ )
+ ]);
+
+ return $this;
+ }
+}
diff --git a/application/forms/IcingaHostSelfServiceForm.php b/application/forms/IcingaHostSelfServiceForm.php
new file mode 100644
index 0000000..1e05b96
--- /dev/null
+++ b/application/forms/IcingaHostSelfServiceForm.php
@@ -0,0 +1,156 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Exception\NotFoundError;
+use Icinga\Module\Director\Db;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+use Icinga\Security\SecurityException;
+
+class IcingaHostSelfServiceForm extends DirectorForm
+{
+ /** @var string */
+ private $hostApiKey;
+
+ /** @var IcingaHost */
+ private $template;
+
+ private $hostName;
+
+ public function setup()
+ {
+ if ($this->hostName === null) {
+ $this->addElement('text', 'object_name', array(
+ 'label' => $this->translate('Host name'),
+ 'required' => true,
+ 'value' => $this->hostName,
+ ));
+ }
+ $this->addElement('text', 'display_name', array(
+ 'label' => $this->translate('Alias'),
+ ));
+
+ $this->addElement('text', 'address', array(
+ 'label' => $this->translate('Host address'),
+ 'description' => $this->translate(
+ 'Host address. Usually an IPv4 address, but may be any kind of address'
+ . ' your check plugin is able to deal with'
+ )
+ ));
+
+ $this->addElement('text', 'address6', array(
+ 'label' => $this->translate('IPv6 address'),
+ 'description' => $this->translate('Usually your hosts main IPv6 address')
+ ));
+
+ if ($this->template === null) {
+ $this->addElement('text', 'key', array(
+ 'label' => $this->translate('API Key'),
+ 'ignore' => true,
+ 'required' => true,
+ ));
+ }
+
+ $this->submitLabel = sprintf(
+ $this->translate('Register')
+ );
+ }
+
+ public function setHostName($name)
+ {
+ $this->hostName = $name;
+ $this->removeElement('object_name');
+ return $this;
+ }
+
+ public function loadTemplateWithApiKey($key)
+ {
+ $this->template = IcingaHost::loadWithApiKey($key, $this->getDb());
+ if (! $this->template->isTemplate()) {
+ throw new NotFoundError('Got invalid API key "%s"', $key);
+ }
+
+ if ($this->template->getResolvedProperty('has_agent') !== 'y') {
+ throw new NotFoundError(
+ 'Got valid API key "%s", but template is not for Agents',
+ $key
+ );
+ }
+
+ $this->removeElement('key');
+
+ return $this->template;
+ }
+
+ public function listMissingRequiredFields()
+ {
+ $result = [];
+ foreach ($this->getElements() as $element) {
+ if (in_array('isEmpty', $element->getErrors())) {
+ $result[] = $element->getName();
+ }
+ }
+
+ return $result;
+ }
+
+ public function isMissingRequiredFields()
+ {
+ return count($this->listMissingRequiredFields()) > 0;
+ }
+
+ public function onSuccess()
+ {
+ $db = $this->getDb();
+ if ($this->template === null) {
+ $this->loadTemplateWithApiKey($this->getValue('key'));
+ }
+ $name = $this->hostName ?: $this->getValue('object_name');
+ if (IcingaHost::exists($name, $db)) {
+ $host = IcingaHost::load($name, $db);
+ if ($host->isTemplate()) {
+ throw new SecurityException(
+ 'You are not allowed to create "%s"',
+ $name
+ );
+ }
+
+ if (null !== $host->getProperty('api_key')) {
+ throw new SecurityException(
+ 'The host "%s" has already been registered',
+ $name
+ );
+ }
+
+ $propertyNames = ['display_name', 'address', 'address6'];
+ foreach ($propertyNames as $property) {
+ if (\strlen($value = $this->getValue($property)) > 0) {
+ $host->set($property, $value);
+ }
+ }
+ } else {
+ $host = IcingaHost::create(array_filter($this->getValues(), 'strlen'), $db);
+ $host->set('object_name', $name);
+ $host->set('object_type', 'object');
+ $host->set('imports', [$this->template]);
+ }
+
+ $key = $host->generateApiKey();
+ $host->store($db);
+ $this->hostApiKey = $key;
+ }
+
+ /**
+ * @return string|null
+ */
+ public function getHostApiKey()
+ {
+ return $this->hostApiKey;
+ }
+
+ public static function create(Db $db)
+ {
+ return static::load()->setDb($db);
+ }
+}
diff --git a/application/forms/IcingaHostVarForm.php b/application/forms/IcingaHostVarForm.php
new file mode 100644
index 0000000..cb15bcb
--- /dev/null
+++ b/application/forms/IcingaHostVarForm.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+/**
+ * @deprecated
+ */
+class IcingaHostVarForm extends DirectorObjectForm
+{
+ public function setup()
+ {
+ $this->addElement('select', 'host_id', array(
+ 'label' => $this->translate('Host'),
+ 'description' => $this->translate('The name of the host'),
+ 'multiOptions' => $this->optionalEnum($this->db->enumHosts()),
+ 'required' => true
+ ));
+
+ $this->addElement('text', 'varname', array(
+ 'label' => $this->translate('Name'),
+ 'description' => $this->translate('host var name')
+ ));
+
+ $this->addElement('textarea', 'varvalue', array(
+ 'label' => $this->translate('Value'),
+ 'description' => $this->translate('host var value')
+ ));
+
+ $this->addElement('text', 'format', array(
+ 'label' => $this->translate('Format'),
+ 'description' => $this->translate('value format')
+ ));
+ }
+}
diff --git a/application/forms/IcingaImportObjectForm.php b/application/forms/IcingaImportObjectForm.php
new file mode 100644
index 0000000..3942f74
--- /dev/null
+++ b/application/forms/IcingaImportObjectForm.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Web\Form\QuickForm;
+
+class IcingaImportObjectForm extends QuickForm
+{
+ /** @var IcingaObject */
+ protected $object;
+
+ public function setup()
+ {
+ $this->addNote($this->translate(
+ "Importing an object means that its type will change from"
+ . ' "external" to "object". That way it will make part of the'
+ . ' next deployment. So in case you imported this object from'
+ . ' your Icinga node make sure to remove it from your local'
+ . ' configuration before issueing the next deployment. In case'
+ . ' of a conflict nothing bad will happen, just your config'
+ . " won't deploy."
+ ));
+
+ $this->submitLabel = sprintf(
+ $this->translate('Import external "%s"'),
+ $this->object->object_name
+ );
+ }
+
+ public function onSuccess()
+ {
+ $object = $this->object;
+ if ($object->set('object_type', 'object')->store()) {
+ $this->redirectOnSuccess(sprintf(
+ $this->translate('%s "%s" has been imported"'),
+ $object->getShortTableName(),
+ $object->getObjectName()
+ ));
+ } else {
+ $this->addError(sprintf(
+ $this->translate('Failed to import %s "%s"'),
+ $object->getShortTableName(),
+ $object->getObjectName()
+ ));
+ }
+ }
+
+ public function setObject(IcingaObject $object)
+ {
+ $this->object = $object;
+ return $this;
+ }
+}
diff --git a/application/forms/IcingaMultiEditForm.php b/application/forms/IcingaMultiEditForm.php
new file mode 100644
index 0000000..4149a70
--- /dev/null
+++ b/application/forms/IcingaMultiEditForm.php
@@ -0,0 +1,324 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Data\Db\DbObject;
+use Icinga\Module\Director\Hook\IcingaObjectFormHook;
+use Icinga\Module\Director\Web\Form\IcingaObjectFieldLoader;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use Icinga\Module\Director\Web\Form\QuickForm;
+use Zend_Form_Element as ZfElement;
+
+class IcingaMultiEditForm extends DirectorObjectForm
+{
+ /** @var DbObject[] */
+ private $objects;
+
+ private $elementGroupMap;
+
+ /** @var QuickForm */
+ private $relatedForm;
+
+ private $propertiesToPick;
+
+ public function setObjects($objects)
+ {
+ $this->objects = $objects;
+ $this->object = current($this->objects);
+ $this->db = $this->object()->getConnection();
+ return $this;
+ }
+
+ public function isMultiObjectForm()
+ {
+ return true;
+ }
+
+ public function pickElementsFrom(QuickForm $form, $properties)
+ {
+ $this->relatedForm = $form;
+ $this->propertiesToPick = $properties;
+ return $this;
+ }
+
+ public function setup()
+ {
+ $object = $this->object;
+
+ $loader = new IcingaObjectFieldLoader($object);
+ $loader->prepareElements($this);
+ $loader->addFieldsToForm($this);
+
+ if ($form = $this->relatedForm) {
+ if ($form instanceof DirectorObjectForm) {
+ $form->setDb($object->getConnection())
+ ->setObject($object);
+ }
+
+ $form->prepareElements();
+ } else {
+ $this->propertiesToPick = array();
+ }
+
+ foreach ($this->propertiesToPick as $property) {
+ if ($el = $form->getElement($property)) {
+ $this->makeVariants($el);
+ }
+ }
+
+ /** @var \Zend_Form_Element $el */
+ foreach ($this->getElements() as $el) {
+ $name = $el->getName();
+ if (substr($name, 0, 4) === 'var_') {
+ $this->makeVariants($el);
+ }
+ }
+
+ $this->setButtons();
+ }
+
+ public function onSuccess()
+ {
+ foreach ($this->getValues() as $key => $value) {
+ $this->setSubmittedMultiValue($key, $value);
+ }
+
+ $modified = $this->storeModifiedObjects();
+ if ($modified === 0) {
+ $msg = $this->translate('No object has been modified');
+ } elseif ($modified === 1) {
+ $msg = $this->translate('One object has been modified');
+ } else {
+ $msg = sprintf(
+ $this->translate('%d objects have been modified'),
+ $modified
+ );
+ }
+
+ $this->redirectOnSuccess($msg);
+ }
+
+ /**
+ * No default objects behaviour
+ */
+ protected function onRequest()
+ {
+ IcingaObjectFormHook::callOnSetup($this);
+ if ($this->hasBeenSent()) {
+ $this->handlePost();
+ }
+ }
+
+ protected function handlePost()
+ {
+ $this->callOnRequestCallables();
+ if ($this->shouldBeDeleted()) {
+ $this->deleteObjects();
+ }
+ }
+
+ protected function setSubmittedMultiValue($key, $value)
+ {
+ $parts = preg_split('/_/', $key);
+ $objectsSum = array_pop($parts);
+ $valueSum = array_pop($parts);
+ $property = implode('_', $parts);
+
+ if ($value === '') {
+ $value = null;
+ }
+
+ foreach ($this->getVariants($property) as $json => $objects) {
+ if ($valueSum !== sha1($json)) {
+ continue;
+ }
+
+ if ($objectsSum !== sha1(json_encode($objects))) {
+ continue;
+ }
+
+ if (substr($property, 0, 4) === 'var_') {
+ $property = 'vars.' . substr($property, 4);
+ }
+
+ foreach ($this->getObjects($objects) as $object) {
+ $object->$property = $value;
+ }
+ }
+ }
+
+ protected function storeModifiedObjects()
+ {
+ $modified = 0;
+ $store = $this->getDbObjectStore();
+ foreach ($this->objects as $object) {
+ if ($object->hasBeenModified()) {
+ $modified++;
+ $store->store($object);
+ }
+ }
+
+ return $modified;
+ }
+
+ protected function getDisplayGroupForElement(ZfElement $element)
+ {
+ if ($this->elementGroupMap === null) {
+ $this->resolveDisplayGroups();
+ }
+
+ $name = $element->getName();
+ if (array_key_exists($name, $this->elementGroupMap)) {
+ $groupName = $this->elementGroupMap[$name];
+
+ if ($group = $this->getDisplayGroup($groupName)) {
+ return $group;
+ } elseif ($this->relatedForm) {
+ return $this->stealDisplayGroup($groupName, $this->relatedForm);
+ }
+ }
+
+ return null;
+ }
+
+ protected function stealDisplayGroup($name, QuickForm $form)
+ {
+ if ($group = $form->getDisplayGroup($name)) {
+ $group = clone($group);
+ $group->setElements(array());
+ $this->_displayGroups[$name] = $group;
+ $this->_order[$name] = $group->getOrder();
+ $this->_orderUpdated = true;
+
+ return $group;
+ }
+
+ return null;
+ }
+
+ protected function resolveDisplayGroups()
+ {
+ $this->elementGroupMap = array();
+ if ($form = $this->relatedForm) {
+ $this->extractFormDisplayGroups($form);
+ }
+
+ $this->extractFormDisplayGroups($this);
+ }
+
+ protected function extractFormDisplayGroups(QuickForm $form)
+ {
+ /** @var \Zend_Form_DisplayGroup $group */
+ foreach ($form->getDisplayGroups() as $group) {
+ $groupName = $group->getName();
+ foreach ($group->getElements() as $name => $e) {
+ $this->elementGroupMap[$name] = $groupName;
+ }
+ }
+ }
+
+ protected function makeVariants(ZfElement $element)
+ {
+ $key = $element->getName();
+ $this->removeElement($key);
+ $label = $element->getLabel();
+ $group = $this->getDisplayGroupForElement($element);
+ $description = $element->getDescription();
+
+ foreach ($this->getVariants($key) as $json => $objects) {
+ $value = json_decode($json);
+ $checksum = sha1($json) . '_' . sha1(json_encode($objects));
+
+ $v = clone($element);
+ $v->setName($key . '_' . $checksum);
+ $v->setDescription($description . ' ' . $this->descriptionForObjects($objects));
+ $v->setLabel($label . $this->labelCount($objects));
+ $v->setValue($value);
+ if ($group) {
+ $group->addElement($v);
+ }
+ $this->addElement($v);
+ }
+ }
+
+ protected function getVariants($key)
+ {
+ $variants = array();
+ if (substr($key, 0, 4) === 'var_') {
+ $key = 'vars.' . substr($key, 4);
+ }
+
+ foreach ($this->objects as $name => $object) {
+ $value = json_encode($object->$key);
+ if (! array_key_exists($value, $variants)) {
+ $variants[$value] = array();
+ }
+
+ $variants[$value][] = $name;
+ }
+
+ foreach ($variants as & $objects) {
+ natsort($objects);
+ }
+
+ return $variants;
+ }
+
+ protected function descriptionForObjects($list)
+ {
+ return sprintf(
+ $this->translate('Changing this value affects %d object(s): %s'),
+ count($list),
+ implode(', ', $list)
+ );
+ }
+
+ protected function labelCount($list)
+ {
+ return ' (' . count($list) . ')';
+ }
+
+ protected function db()
+ {
+ if ($this->db === null) {
+ $this->db = $this->object()->getConnection();
+ }
+
+ return $this->db;
+ }
+
+ public function getObjects($names = null)
+ {
+ if ($names === null) {
+ return $this->objects;
+ }
+
+ $res = array();
+
+ foreach ($names as $name) {
+ $res[$name] = $this->objects[$name];
+ }
+
+ return $res;
+ }
+
+ protected function deleteObjects()
+ {
+ $msg = sprintf(
+ '%d objects of type "%s" have been removed',
+ count($this->objects),
+ $this->translate($this->object->getShortTableName())
+ );
+
+ $store = $this->getDbObjectStore();
+ foreach ($this->objects as $object) {
+ $store->delete($object);
+ }
+
+ if ($this->listUrl) {
+ $this->setSuccessUrl($this->listUrl);
+ }
+
+ $this->redirectOnSuccess($msg);
+ }
+}
diff --git a/application/forms/IcingaNotificationForm.php b/application/forms/IcingaNotificationForm.php
new file mode 100644
index 0000000..0fca6b8
--- /dev/null
+++ b/application/forms/IcingaNotificationForm.php
@@ -0,0 +1,298 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaNotificationForm extends DirectorObjectForm
+{
+ public function setup()
+ {
+ $this->addObjectTypeElement();
+ if (! $this->hasObjectType()) {
+ $this->groupMainProperties();
+ return;
+ }
+
+ if ($this->isTemplate()) {
+ $this->addElement('text', 'object_name', array(
+ 'label' => $this->translate('Notification Template'),
+ 'required' => true,
+ 'description' => $this->translate('Name for the Icinga notification template you are going to create')
+ ));
+ } else {
+ $this->addElement('text', 'object_name', array(
+ 'label' => $this->translate('Notification'),
+ 'required' => true,
+ 'description' => $this->translate('Name for the Icinga notification you are going to create')
+ ));
+
+ $this->eventuallyAddNameRestriction(
+ 'director/notification/apply/filter-by-name'
+ );
+ }
+
+ $this->addDisabledElement()
+ ->addImportsElement()
+ ->addUsersElement()
+ ->addUsergroupsElement()
+ ->addIntervalElement()
+ ->addPeriodElement()
+ ->addTimesElements()
+ ->addAssignmentElements()
+ ->addDisabledElement()
+ ->addCommandElements()
+ ->addEventFilterElements()
+ ->addZoneElements()
+ ->groupMainProperties()
+ ->setButtons();
+ }
+
+ protected function addZoneElements()
+ {
+ if (! $this->isTemplate()) {
+ return $this;
+ }
+
+ $this->addZoneElement();
+ $this->addDisplayGroup(array('zone_id'), 'clustering', array(
+ 'decorators' => array(
+ 'FormElements',
+ array('HtmlTag', array('tag' => 'dl')),
+ 'Fieldset',
+ ),
+ 'order' => self::GROUP_ORDER_CLUSTERING,
+ 'legend' => $this->translate('Zone settings')
+ ));
+
+ return $this;
+ }
+
+ /**
+ * @return self
+ */
+ protected function addAssignmentElements()
+ {
+ if (!$this->object || !$this->object->isApplyRule()) {
+ return $this;
+ }
+
+ $this->addElement('select', 'apply_to', array(
+ 'label' => $this->translate('Apply to'),
+ 'description' => $this->translate(
+ 'Whether this notification should affect hosts or services'
+ ),
+ 'required' => true,
+ 'class' => 'autosubmit',
+ 'multiOptions' => $this->optionalEnum(
+ array(
+ 'host' => $this->translate('Hosts'),
+ 'service' => $this->translate('Services'),
+ )
+ )
+ ));
+
+ $applyTo = $this->getSentOrObjectValue('apply_to');
+
+ if (! $applyTo) {
+ return $this;
+ }
+
+ $suggestionContext = ucfirst($applyTo) . 'FilterColumns';
+ $this->addAssignFilter([
+ 'required' => true,
+ 'suggestionContext' => $suggestionContext,
+ 'description' => $this->translate(
+ 'This allows you to configure an assignment filter. Please feel'
+ . ' free to combine as many nested operators as you want. The'
+ . ' "contains" operator is valid for arrays only. Please use'
+ . ' wildcards and the = (equals) operator when searching for'
+ . ' partial string matches, like in *.example.com'
+ )
+ ]);
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ protected function addUsersElement()
+ {
+ $users = $this->enumUsers();
+ if (empty($users)) {
+ return $this;
+ }
+
+ $this->addElement(
+ 'extensibleSet',
+ 'users',
+ array(
+ 'label' => $this->translate('Users'),
+ 'description' => $this->translate(
+ 'Users that should be notified by this notifications'
+ ),
+ 'multiOptions' => $this->optionalEnum($users)
+ )
+ );
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ protected function addUsergroupsElement()
+ {
+ $groups = $this->enumUsergroups();
+ if (empty($groups)) {
+ return $this;
+ }
+
+ $this->addElement(
+ 'extensibleSet',
+ 'user_groups',
+ array(
+ 'label' => $this->translate('User groups'),
+ 'description' => $this->translate(
+ 'User groups that should be notified by this notifications'
+ ),
+ 'multiOptions' => $this->optionalEnum($groups)
+ )
+ );
+
+ return $this;
+ }
+
+ /**
+ * @return self
+ */
+ protected function addIntervalElement()
+ {
+ $this->addElement(
+ 'text',
+ 'notification_interval',
+ array(
+ 'label' => $this->translate('Notification interval'),
+ 'description' => $this->translate(
+ 'The notification interval (in seconds). This interval is'
+ . ' used for active notifications. Defaults to 30 minutes.'
+ . ' If set to 0, re-notifications are disabled.'
+ )
+ )
+ );
+
+ return $this;
+ }
+
+ /**
+ * @return self
+ */
+ protected function addTimesElements()
+ {
+ $this->addElement(
+ 'text',
+ 'times_begin',
+ array(
+ 'label' => $this->translate('First notification delay'),
+ 'description' => $this->translate(
+ 'Delay unless the first notification should be sent'
+ ) . '. ' . $this->getTimeValueInfo()
+ )
+ );
+
+ $this->addElement(
+ 'text',
+ 'times_end',
+ array(
+ 'label' => $this->translate('Last notification'),
+ 'description' => $this->translate(
+ 'When the last notification should be sent'
+ ) . '. ' . $this->getTimeValueInfo()
+ )
+ );
+
+ return $this;
+ }
+
+ protected function getTimeValueInfo()
+ {
+ return $this->translate(
+ 'Unit is seconds unless a suffix is given. Supported suffixes include'
+ . ' ms (milliseconds), s (seconds), m (minutes), h (hours) and d (days).'
+ );
+ }
+
+ /**
+ * @return self
+ */
+ protected function addPeriodElement()
+ {
+ $periods = $this->db->enumTimeperiods();
+ if (empty($periods)) {
+ return $this;
+ }
+
+ $this->addElement(
+ 'select',
+ 'period_id',
+ array(
+ 'label' => $this->translate('Time period'),
+ 'description' => $this->translate(
+ 'The name of a time period which determines when this'
+ . ' notification should be triggered. Not set by default.'
+ ),
+ 'multiOptions' => $this->optionalEnum($periods),
+ )
+ );
+
+ return $this;
+ }
+
+ /**
+ * @return self
+ */
+ protected function addCommandElements()
+ {
+ if (! $this->isTemplate()) {
+ return $this;
+ }
+
+ $this->addElement('select', 'command_id', array(
+ 'label' => $this->translate('Notification command'),
+ 'description' => $this->translate('Check command definition'),
+ 'multiOptions' => $this->optionalEnum($this->db->enumNotificationCommands()),
+ 'class' => 'autosubmit',
+ ));
+
+ return $this;
+ }
+
+ protected function enumUsers()
+ {
+ $db = $this->db->getDbAdapter();
+ $select = $db->select()->from(
+ 'icinga_user',
+ array(
+ 'name' => 'object_name',
+ 'display' => 'COALESCE(display_name, object_name)'
+ )
+ )->where('object_type = ?', 'object')->order('display');
+
+ return $db->fetchPairs($select);
+ }
+
+ protected function enumUsergroups()
+ {
+ $db = $this->db->getDbAdapter();
+ $select = $db->select()->from(
+ 'icinga_usergroup',
+ array(
+ 'name' => 'object_name',
+ 'display' => 'COALESCE(display_name, object_name)'
+ )
+ )->where('object_type = ?', 'object')->order('display');
+
+ return $db->fetchPairs($select);
+ }
+}
diff --git a/application/forms/IcingaObjectFieldForm.php b/application/forms/IcingaObjectFieldForm.php
new file mode 100644
index 0000000..537c95e
--- /dev/null
+++ b/application/forms/IcingaObjectFieldForm.php
@@ -0,0 +1,219 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Objects\IcingaCommand;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Objects\DirectorDatafield;
+use Icinga\Module\Director\Objects\IcingaService;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use Icinga\Module\Director\Web\Form\IcingaObjectFieldLoader;
+
+class IcingaObjectFieldForm extends DirectorObjectForm
+{
+ /** @var IcingaObject Please note that $object would conflict with logic in parent class */
+ protected $icingaObject;
+
+ public function setIcingaObject($object)
+ {
+ $this->icingaObject = $object;
+ $this->className = get_class($object) . 'Field';
+ return $this;
+ }
+
+ public function setup()
+ {
+ $object = $this->icingaObject;
+ $type = $object->getShortTableName();
+ $this->addHidden($type . '_id', $object->get('id'));
+
+ $this->addHtmlHint(
+ 'Custom data fields allow you to easily fill custom variables with'
+ . " meaningful data. It's perfectly legal to override inherited fields."
+ . ' You may for example want to allow "network devices" specifying any'
+ . ' string for vars.snmp_community, but restrict "customer routers" to'
+ . ' a specific set, shown as a dropdown.'
+ );
+
+ // TODO: remove assigned ones!
+ $existingFields = $this->db->enumDatafields();
+ $blacklistedVars = array();
+ $suggestedFields = array();
+
+ foreach ($existingFields as $id => $field) {
+ if (preg_match('/ \(([^\)]+)\)$/', $field, $m)) {
+ $blacklistedVars['$' . $m[1] . '$'] = $id;
+ }
+ }
+
+ // TODO: think about imported existing vars without fields
+ // TODO: extract vars from command line (-> dummy)
+ // TODO: do not suggest chosen ones
+ $argumentVars = array();
+ $argumentVarDescriptions = array();
+ if ($object instanceof IcingaCommand) {
+ $command = $object;
+ } elseif ($object->hasProperty('check_command_id')) {
+ $command = $object->getResolvedRelated('check_command');
+ } else {
+ $command = null;
+ }
+
+ if ($command) {
+ foreach ($command->arguments() as $arg) {
+ if ($arg->argument_format === 'string') {
+ $val = $arg->argument_value;
+ // TODO: create var::extractMacros or so
+
+ if (preg_match_all('/(\$[a-z0-9_]+\$)/i', $val, $m, PREG_PATTERN_ORDER)) {
+ foreach ($m[1] as $val) {
+ if (array_key_exists($val, $blacklistedVars)) {
+ $id = $blacklistedVars[$val];
+
+ // Hint: if not set it might already have been
+ // removed in this loop
+ if (array_key_exists($id, $existingFields)) {
+ $suggestedFields[$id] = $existingFields[$id];
+ unset($existingFields[$id]);
+ }
+ } else {
+ $argumentVars[$val] = $val;
+ $argumentVarDescriptions[$val] = $arg->description;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Prepare combined fields array
+ $fields = array();
+ if (! empty($suggestedFields)) {
+ asort($existingFields);
+ $fields[$this->translate('Suggested fields')] = $suggestedFields;
+ }
+
+ if (! empty($argumentVars)) {
+ ksort($argumentVars);
+ $fields[$this->translate('Argument macros')] = $argumentVars;
+ }
+
+ if (! empty($existingFields)) {
+ $fields[$this->translate('Other available fields')] = $existingFields;
+ }
+
+ $this->addElement('select', 'datafield_id', array(
+ 'label' => 'Field',
+ 'required' => true,
+ 'description' => 'Field to assign',
+ 'class' => 'autosubmit',
+ 'multiOptions' => $this->optionalEnum($fields)
+ ));
+
+ if (empty($fields)) {
+ // TODO: show message depending on permissions
+ $msg = $this->translate(
+ 'There are no data fields available. Please ask an administrator to create such'
+ );
+
+ $this->getElement('datafield_id')->addError($msg);
+ }
+
+ if (($id = $this->getSentValue('datafield_id')) && ! ctype_digit($id)) {
+ $this->addElement('text', 'caption', array(
+ 'label' => $this->translate('Caption'),
+ 'required' => true,
+ 'ignore' => true,
+ 'value' => trim($id, '$'),
+ 'description' => $this->translate('The caption which should be displayed')
+ ));
+
+ $this->addElement('textarea', 'description', array(
+ 'label' => $this->translate('Description'),
+ 'description' => $this->translate('A description about the field'),
+ 'ignore' => true,
+ 'value' => array_key_exists($id, $argumentVarDescriptions) ? $argumentVarDescriptions[$id] : null,
+ 'rows' => '3',
+ ));
+ }
+
+ $this->addElement('select', 'is_required', array(
+ 'label' => $this->translate('Mandatory'),
+ 'description' => $this->translate('Whether this field should be mandatory'),
+ 'required' => true,
+ 'multiOptions' => array(
+ 'n' => $this->translate('Optional'),
+ 'y' => $this->translate('Mandatory'),
+ )
+ ));
+
+ $filterFields = array();
+ $prefix = null;
+ if ($object instanceof IcingaHost) {
+ $prefix = 'host.vars.';
+ } elseif ($object instanceof IcingaService) {
+ $prefix = 'service.vars.';
+ }
+
+ if ($prefix) {
+ $loader = new IcingaObjectFieldLoader($object);
+ $fields = $loader->getFields();
+
+ foreach ($fields as $varName => $field) {
+ $filterFields[$prefix . $field->varname] = $field->caption;
+ }
+
+ $this->addFilterElement('var_filter', array(
+ 'description' => $this->translate(
+ 'You might want to show this field only when certain conditions are met.'
+ . ' Otherwise it will not be available and values eventually set before'
+ . ' will be cleared once stored'
+ ),
+ 'columns' => $filterFields,
+ ));
+
+ $this->addDisplayGroup(array($this->getElement('var_filter')), 'field_filter', array(
+ 'decorators' => array(
+ 'FormElements',
+ array('HtmlTag', array('tag' => 'dl')),
+ 'Fieldset',
+ ),
+ 'order' => 30,
+ 'legend' => $this->translate('Show based on filter')
+ ));
+ }
+
+ $this->setButtons();
+ }
+
+ protected function onRequest()
+ {
+ parent::onRequest();
+ if ($this->getSentValue('delete') === $this->translate('Delete')) {
+ $this->object()->delete();
+ $this->setSuccessUrl($this->getSuccessUrl()->without('field_id'));
+ $this->redirectOnSuccess($this->translate('Field has been removed'));
+ }
+ }
+
+ public function onSuccess()
+ {
+ $fieldId = $this->getValue('datafield_id');
+
+ if (! ctype_digit($fieldId)) {
+ $field = DirectorDatafield::create(array(
+ 'varname' => trim($fieldId, '$'),
+ 'caption' => $this->getValue('caption'),
+ 'description' => $this->getValue('description'),
+ 'datatype' => 'Icinga\Module\Director\DataType\DataTypeString',
+ ));
+ $field->store($this->getDb());
+ $this->setElementValue('datafield_id', $field->get('id'));
+ $this->object()->set('datafield_id', $field->get('id'));
+ }
+
+ $this->object()->set('var_filter', $this->getValue('var_filter'));
+ return parent::onSuccess();
+ }
+}
diff --git a/application/forms/IcingaScheduledDowntimeForm.php b/application/forms/IcingaScheduledDowntimeForm.php
new file mode 100644
index 0000000..b126d59
--- /dev/null
+++ b/application/forms/IcingaScheduledDowntimeForm.php
@@ -0,0 +1,133 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaScheduledDowntimeForm extends DirectorObjectForm
+{
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ public function setup()
+ {
+ if ($this->isTemplate()) {
+ $this->addElement('text', 'object_name', [
+ 'label' => $this->translate('Template name'),
+ 'required' => true,
+ ]);
+ } else {
+ $this->addElement('text', 'object_name', [
+ 'label' => $this->translate('Downtime name'),
+ 'required' => true,
+ ]);
+ }
+
+ if ($this->object()->isApplyRule()) {
+ $this->eventuallyAddNameRestriction('director/scheduled-downtime/apply/filter-by-name');
+ }
+ $this->addImportsElement();
+ $this->addElement('text', 'author', [
+ 'label' => $this->translate('Author'),
+ 'description' => $this->translate(
+ 'This name will show up as the author for ever related downtime'
+ . ' comment'
+ ),
+ 'required' => ! $this->isTemplate()
+ ]);
+ $this->addElement('textarea', 'comment', [
+ 'label' => $this->translate('Comment'),
+ 'description' => $this->translate(
+ 'Every related downtime will show this comment'
+ ),
+ 'required' => ! $this->isTemplate(),
+ 'rows' => 4,
+ ]);
+ $this->addBoolean('fixed', [
+ 'label' => $this->translate('Fixed'),
+ 'description' => $this->translate(
+ 'Whether this downtime is fixed or flexible. If unsure please'
+ . ' check the related documentation:'
+ . ' https://icinga.com/docs/icinga2/latest/doc/08-advanced-topics/#downtimes'
+ ),
+ 'required' => ! $this->isTemplate(),
+ ]);
+ $this->addElement('text', 'duration', [
+ 'label' => $this->translate('Duration'),
+ 'description' => $this->translate(
+ 'How long the downtime lasts. Only has an effect for flexible'
+ . ' (non-fixed) downtimes. Time in seconds, supported suffixes'
+ . ' include ms (milliseconds), s (seconds), m (minutes),'
+ . ' h (hours) and d (days). To express "90 minutes" you might'
+ . ' want to write 1h 30m'
+ )
+ ]);
+ $this->addDisabledElement();
+ $this->addAssignmentElements();
+ $this->setButtons();
+ }
+
+
+ /**
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addAssignmentElements()
+ {
+ if ($this->isTemplate()) {
+ return $this;
+ }
+
+ $this->addElement('select', 'apply_to', [
+ 'label' => $this->translate('Apply to'),
+ 'description' => $this->translate(
+ 'Whether this dependency should affect hosts or services'
+ ),
+ 'required' => true,
+ 'class' => 'autosubmit',
+ 'multiOptions' => $this->optionalEnum([
+ 'host' => $this->translate('Hosts'),
+ 'service' => $this->translate('Services'),
+ ])
+ ]);
+
+ $applyTo = $this->getSentOrObjectValue('apply_to');
+
+ if (! $applyTo) {
+ return $this;
+ }
+
+ if ($applyTo === 'host') {
+ $this->addBoolean('with_services', [
+ 'label' => $this->translate('With Services'),
+ 'description' => $this->translate(
+ 'Whether Downtimes should also explicitly be scheduled for'
+ . ' all Services belonging to affected Hosts'
+ )
+ ]);
+ }
+
+ $suggestionContext = ucfirst($applyTo) . 'FilterColumns';
+ $this->addAssignFilter([
+ 'suggestionContext' => $suggestionContext,
+ 'required' => true,
+ 'description' => $this->translate(
+ 'This allows you to configure an assignment filter. Please feel'
+ . ' free to combine as many nested operators as you want. The'
+ . ' "contains" operator is valid for arrays only. Please use'
+ . ' wildcards and the = (equals) operator when searching for'
+ . ' partial string matches, like in *.example.com'
+ )
+ ]);
+
+ return $this;
+ }
+
+ protected function setObjectSuccessUrl()
+ {
+ $this->setSuccessUrl(
+ 'director/scheduled-downtime',
+ $this->object()->getUrlParams()
+ );
+ }
+}
diff --git a/application/forms/IcingaScheduledDowntimeRangeForm.php b/application/forms/IcingaScheduledDowntimeRangeForm.php
new file mode 100644
index 0000000..b5f95d0
--- /dev/null
+++ b/application/forms/IcingaScheduledDowntimeRangeForm.php
@@ -0,0 +1,110 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Objects\IcingaScheduledDowntime;
+use Icinga\Module\Director\Objects\IcingaScheduledDowntimeRange;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaScheduledDowntimeRangeForm extends DirectorObjectForm
+{
+ /** @var IcingaScheduledDowntime */
+ private $downtime;
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ public function setup()
+ {
+ $this->addHidden('scheduled_downtime_id', $this->downtime->get('id'));
+ $this->addElement('text', 'range_key', [
+ 'label' => $this->translate('Day(s)'),
+ 'description' => $this->translate(
+ 'Might be monday, tuesday or 2016-01-28 - have a look at the documentation for more examples'
+ ),
+ ]);
+
+ $this->addElement('text', 'range_value', [
+ 'label' => $this->translate('Timeperiods'),
+ 'description' => $this->translate(
+ 'One or more time periods, e.g. 00:00-24:00 or 00:00-09:00,17:00-24:00'
+ ),
+ ]);
+
+ $this->setButtons();
+ }
+
+ public function setScheduledDowntime(IcingaScheduledDowntime $downtime)
+ {
+ $this->downtime = $downtime;
+ $this->setDb($downtime->getConnection());
+ return $this;
+ }
+
+ /**
+ * @param IcingaScheduledDowntimeRange $object
+ * @throws \Icinga\Module\Director\Exception\DuplicateKeyException
+ */
+ protected function deleteObject($object)
+ {
+ $key = $object->get('range_key');
+ $downtime = $this->downtime;
+ $downtime->ranges()->remove($key);
+ $downtime->store();
+ $msg = sprintf(
+ $this->translate('Time range "%s" has been removed from %s'),
+ $key,
+ $downtime->getObjectName()
+ );
+
+ $url = $this->getSuccessUrl()->without(
+ ['range', 'range_type']
+ );
+
+ $this->setSuccessUrl($url);
+ $this->redirectOnSuccess($msg);
+ }
+
+ /**
+ * @throws \Icinga\Module\Director\Exception\DuplicateKeyException
+ */
+ public function onSuccess()
+ {
+ $object = $this->object();
+ if ($object->hasBeenModified()) {
+ $this->downtime->ranges()->setRange(
+ $this->getValue('range_key'),
+ $this->getValue('range_value')
+ );
+ }
+
+ if ($this->downtime->hasBeenModified()) {
+ if (! $object->hasBeenLoadedFromDb()) {
+ $this->setHttpResponseCode(201);
+ }
+
+ $msg = sprintf(
+ $object->hasBeenLoadedFromDb()
+ ? $this->translate('The %s has successfully been stored')
+ : $this->translate('A new %s has successfully been created'),
+ $this->translate($this->getObjectShortClassName())
+ );
+
+ $this->downtime->store($this->db);
+ } else {
+ if ($this->isApiRequest()) {
+ $this->setHttpResponseCode(304);
+ }
+ $msg = $this->translate('No action taken, object has not been modified');
+ }
+ if ($object instanceof IcingaObject) {
+ $this->setSuccessUrl(
+ 'director/' . strtolower($this->getObjectShortClassName()),
+ $object->getUrlParams()
+ );
+ }
+
+ $this->redirectOnSuccess($msg);
+ }
+}
diff --git a/application/forms/IcingaServiceDictionaryMemberForm.php b/application/forms/IcingaServiceDictionaryMemberForm.php
new file mode 100644
index 0000000..90b8f94
--- /dev/null
+++ b/application/forms/IcingaServiceDictionaryMemberForm.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use Icinga\Module\Director\Objects\IcingaService;
+
+class IcingaServiceDictionaryMemberForm extends DirectorObjectForm
+{
+ /** @var IcingaService */
+ protected $object;
+
+ private $succeeded;
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ public function setup()
+ {
+ $this->addHidden('object_type', 'object');
+ $this->addElement('text', 'object_name', [
+ 'label' => $this->translate('Name'),
+ 'required' => !$this->object()->isApplyRule(),
+ 'description' => $this->translate(
+ 'Name for the instance you are going to create'
+ )
+ ]);
+ $this->groupMainProperties()->setButtons();
+ }
+
+ protected function isNew()
+ {
+ return $this->object === null;
+ }
+
+ protected function deleteObject($object)
+ {
+ }
+
+ protected function getObjectClassname()
+ {
+ return IcingaService::class;
+ }
+
+ public function succeeded()
+ {
+ return $this->succeeded;
+ }
+
+ public function onSuccess()
+ {
+ $this->succeeded = true;
+ }
+}
diff --git a/application/forms/IcingaServiceForm.php b/application/forms/IcingaServiceForm.php
new file mode 100644
index 0000000..f22f9e6
--- /dev/null
+++ b/application/forms/IcingaServiceForm.php
@@ -0,0 +1,806 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use gipfl\Web\Widget\Hint;
+use Icinga\Data\Filter\Filter;
+use Icinga\Exception\IcingaException;
+use Icinga\Exception\ProgrammingError;
+use Icinga\Module\Director\Data\PropertiesFilter\ArrayCustomVariablesFilter;
+use Icinga\Module\Director\Exception\NestingError;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Objects\IcingaService;
+use Icinga\Module\Director\Objects\IcingaServiceSet;
+use Icinga\Module\Director\Web\Table\ObjectsTableHost;
+use ipl\Html\Html;
+use gipfl\IcingaWeb2\Link;
+use RuntimeException;
+
+class IcingaServiceForm extends DirectorObjectForm
+{
+ /** @var IcingaHost */
+ private $host;
+
+ /** @var IcingaServiceSet */
+ private $set;
+
+ private $apply;
+
+ /** @var IcingaService */
+ protected $object;
+
+ /** @var IcingaService */
+ private $applyGenerated;
+
+ private $inheritedFrom;
+
+ /** @var bool|null */
+ private $blacklisted;
+
+ public function setApplyGenerated(IcingaService $applyGenerated)
+ {
+ $this->applyGenerated = $applyGenerated;
+
+ return $this;
+ }
+
+ public function setInheritedFrom($hostname)
+ {
+ $this->inheritedFrom = $hostname;
+
+ return $this;
+ }
+
+ /**
+ * @throws IcingaException
+ * @throws ProgrammingError
+ * @throws \Zend_Form_Exception
+ */
+ public function setup()
+ {
+ if (!$this->isNew() || $this->providesOverrides()) {
+ $this->tryToFetchHost();
+ }
+
+ if ($this->providesOverrides()) {
+ return;
+ }
+
+ if ($this->host && $this->set) {
+ // Probably never reached, as providesOverrides includes this
+ $this->setupOnHostForSet();
+
+ return;
+ }
+
+ if ($this->set !== null) {
+ $this->setupSetRelatedElements();
+ } elseif ($this->host === null) {
+ $this->setupServiceElements();
+ } else {
+ $this->setupHostRelatedElements();
+ }
+ }
+
+ protected function tryToFetchHost()
+ {
+ try {
+ if ($this->host === null) {
+ $this->host = $this->object->getResolvedRelated('host');
+ }
+ } catch (NestingError $nestingError) {
+ // ignore for the form to load
+ }
+ }
+
+ public function providesOverrides()
+ {
+ return $this->applyGenerated
+ || $this->inheritedFrom
+ || ($this->host && $this->set)
+ || ($this->object && $this->object->usesVarOverrides());
+ }
+
+ /**
+ * @throws IcingaException
+ * @throws ProgrammingError
+ * @throws \Zend_Form_Exception
+ */
+ protected function addFields()
+ {
+ if ($this->providesOverrides() && $this->hasBeenBlacklisted()) {
+ $this->onAddedFields();
+
+ return;
+ } else {
+ parent::addFields();
+ }
+ }
+
+ /**
+ * @throws IcingaException
+ * @throws ProgrammingError
+ * @throws \Zend_Form_Exception
+ */
+ protected function onAddedFields()
+ {
+ if (! $this->providesOverrides()) {
+ return;
+ }
+ $hasDeleteButton = false;
+ $isBranch = $this->branch && $this->branch->isBranch();
+
+ if ($this->hasBeenBlacklisted()) {
+ $this->addHtml(
+ Hint::warning($this->translate('This Service has been deactivated on this host')),
+ ['name' => 'HINT_blacklisted']
+ );
+ $group = null;
+ if (! $isBranch) {
+ $this->addDeleteButton($this->translate('Reactivate'));
+ $hasDeleteButton = true;
+ }
+ $this->setSubmitLabel(false);
+ } else {
+ $this->addOverrideHint();
+ $group = $this->getDisplayGroup('custom_fields');
+ if (! $group) {
+ foreach ($this->getDisplayGroups() as $groupName => $eventualGroup) {
+ if (preg_match('/^custom_fields:/', $groupName)) {
+ $group = $eventualGroup;
+ break;
+ }
+ }
+ }
+ if ($group) {
+ $elements = $group->getElements();
+ $group->setElements([$this->getElement('inheritance_hint')]);
+ $group->addElements($elements);
+ $this->setSubmitLabel($this->translate('Override vars'));
+ } else {
+ $this->addElementsToGroup(
+ ['inheritance_hint'],
+ 'custom_fields',
+ 20,
+ $this->translate('Hints regarding this service')
+ );
+
+ $this->setSubmitLabel(false);
+ }
+
+ if (! $isBranch) {
+ $this->addDeleteButton($this->translate('Deactivate'));
+ $hasDeleteButton = true;
+ }
+ }
+
+ if (! $this->hasSubmitButton() && $hasDeleteButton) {
+ $this->addDisplayGroup([$this->deleteButtonName], 'buttons', [
+ 'decorators' => [
+ 'FormElements',
+ ['HtmlTag', ['tag' => 'dl']],
+ 'DtDdWrapper',
+ ],
+ 'order' => self::GROUP_ORDER_BUTTONS,
+ ]);
+ }
+ }
+
+ /**
+ * @return IcingaHost|null
+ */
+ public function getHost()
+ {
+ return $this->host;
+ }
+
+ /**
+ * @param IcingaService $service
+ * @return IcingaService
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function getFirstParent(IcingaService $service)
+ {
+ /** @var IcingaService[] $objects */
+ $objects = $service->imports()->getObjects();
+ if (empty($objects)) {
+ throw new RuntimeException('Something went wrong, got no parent');
+ }
+ reset($objects);
+
+ return current($objects);
+ }
+
+ /**
+ * @return bool
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function hasBeenBlacklisted()
+ {
+ if (! $this->providesOverrides() || $this->object === null) {
+ return false;
+ }
+
+ if ($this->blacklisted === null) {
+ $host = $this->host;
+ // Safety check, branches
+ $hostId = $host->get('id');
+ $service = $this->getServiceToBeBlacklisted();
+ $serviceId = $service->get('id');
+ if (! $hostId || ! $serviceId) {
+ return false;
+ }
+ $db = $this->db->getDbAdapter();
+ if ($this->providesOverrides()) {
+ $this->blacklisted = 1 === (int)$db->fetchOne(
+ $db->select()->from('icinga_host_service_blacklist', 'COUNT(*)')
+ ->where('host_id = ?', $hostId)
+ ->where('service_id = ?', $serviceId)
+ );
+ } else {
+ $this->blacklisted = false;
+ }
+ }
+
+ return $this->blacklisted;
+ }
+
+ /**
+ * @param $object
+ * @throws IcingaException
+ * @throws ProgrammingError
+ * @throws \Zend_Db_Adapter_Exception
+ */
+ protected function deleteObject($object)
+ {
+ /** @var IcingaService $object */
+ if ($this->providesOverrides()) {
+ if ($this->hasBeenBlacklisted()) {
+ $this->removeFromBlacklist();
+ } else {
+ $this->blacklist();
+ }
+ } else {
+ parent::deleteObject($object);
+ }
+ }
+
+ /**
+ * @throws IcingaException
+ * @throws \Zend_Db_Adapter_Exception
+ */
+ protected function blacklist()
+ {
+ $host = $this->host;
+ $service = $this->getServiceToBeBlacklisted();
+
+ $db = $this->db->getDbAdapter();
+ $host->unsetOverriddenServiceVars($this->object->getObjectName())->store();
+
+ if ($db->insert('icinga_host_service_blacklist', [
+ 'host_id' => $host->get('id'),
+ 'service_id' => $service->get('id')
+ ])) {
+ $msg = sprintf(
+ $this->translate('%s has been deactivated on %s'),
+ $service->getObjectName(),
+ $host->getObjectName()
+ );
+ $this->redirectOnSuccess($msg);
+ }
+ }
+
+ /**
+ * @return IcingaService
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function getServiceToBeBlacklisted()
+ {
+ if ($this->set) {
+ return $this->object;
+ } else {
+ return $this->getFirstParent($this->object);
+ }
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function removeFromBlacklist()
+ {
+ $host = $this->host;
+ $service = $this->getServiceToBeBlacklisted();
+
+ $db = $this->db->getDbAdapter();
+ $where = implode(' AND ', [
+ $db->quoteInto('host_id = ?', $host->get('id')),
+ $db->quoteInto('service_id = ?', $service->get('id')),
+ ]);
+ if ($db->delete('icinga_host_service_blacklist', $where)) {
+ $msg = sprintf(
+ $this->translate('%s is no longer deactivated on %s'),
+ $service->getObjectName(),
+ $host->getObjectName()
+ );
+ $this->redirectOnSuccess($msg);
+ }
+ }
+
+ /**
+ * @param IcingaService $service
+ * @return $this
+ */
+ public function createApplyRuleFor(IcingaService $service)
+ {
+ $this->apply = $service;
+ $object = $this->object();
+ $object->set('imports', $service->getObjectName());
+ $object->set('object_type', 'apply');
+ $object->set('object_name', $service->getObjectName());
+
+ return $this;
+ }
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ protected function setupServiceElements()
+ {
+ if ($this->object) {
+ $objectType = $this->object->get('object_type');
+ } elseif ($this->preferredObjectType) {
+ $objectType = $this->preferredObjectType;
+ } else {
+ $objectType = 'template';
+ }
+ $this->addHidden('object_type', $objectType);
+ $forceCommandElements = $this->hasPermission('director/admin');
+
+ $this->addNameElement()
+ ->addHostObjectElement()
+ ->addImportsElement()
+ ->addChoices('service')
+ ->addGroupsElement()
+ ->addDisabledElement()
+ ->addApplyForElement()
+ ->groupMainProperties()
+ ->addAssignmentElements()
+ ->addCheckCommandElements($forceCommandElements)
+ ->addCheckExecutionElements()
+ ->addExtraInfoElements()
+ ->addAgentAndZoneElements()
+ ->setButtons();
+ }
+
+ /**
+ * @throws IcingaException
+ * @throws ProgrammingError
+ */
+ protected function addOverrideHint()
+ {
+ if ($this->object && $this->object->usesVarOverrides()) {
+ $hint = $this->translate(
+ 'This service has been generated in an automated way, but still'
+ . ' allows you to override the following properties in a safe way.'
+ );
+ } elseif ($apply = $this->applyGenerated) {
+ $hint = Html::sprintf(
+ $this->translate(
+ 'This service has been generated using the %s apply rule, assigned where %s'
+ ),
+ Link::create(
+ $apply->getObjectName(),
+ 'director/service',
+ ['id' => $apply->get('id')],
+ ['data-base-target' => '_next']
+ ),
+ (string) Filter::fromQueryString($apply->assign_filter)
+ );
+ } elseif ($this->host && $this->set) {
+ $hint = Html::sprintf(
+ $this->translate(
+ 'This service belongs to the %s Service Set. Still, you might want'
+ . ' to override the following properties for this host only.'
+ ),
+ Link::create(
+ $this->set->getObjectName(),
+ 'director/serviceset',
+ ['id' => $this->set->get('id')],
+ ['data-base-target' => '_next']
+ )
+ );
+ } elseif ($this->inheritedFrom) {
+ $msg = $this->translate(
+ 'This service has been inherited from %s. Still, you might want'
+ . ' to change the following properties for this host only.'
+ );
+
+ $name = $this->inheritedFrom;
+ $link = Link::create(
+ $name,
+ 'director/service',
+ [
+ 'host' => $name,
+ 'name' => $this->object->getObjectName(),
+ ],
+ ['data-base-target' => '_next']
+ );
+
+ $hint = Html::sprintf($msg, $link);
+ } else {
+ throw new ProgrammingError('Got no override hint for your situation');
+ }
+
+ $this->setSubmitLabel($this->translate('Override vars'));
+
+ $this->addHtmlHint($hint, ['name' => 'inheritance_hint']);
+ }
+
+ protected function setupOnHostForSet()
+ {
+ $msg = $this->translate(
+ 'This service belongs to the service set "%s". Still, you might want'
+ . ' to change the following properties for this host only.'
+ );
+
+ $name = $this->set->getObjectName();
+ $link = Link::create(
+ $name,
+ 'director/serviceset',
+ ['name' => $name],
+ ['data-base-target' => '_next']
+ );
+
+ $this->addHtmlHint(
+ Html::sprintf($msg, $link),
+ ['name' => 'inheritance_hint']
+ );
+
+ $this->addElementsToGroup(
+ ['inheritance_hint'],
+ 'custom_fields',
+ 50,
+ $this->translate('Custom properties')
+ );
+
+ $this->setSubmitLabel($this->translate('Override vars'));
+ }
+
+ protected function addAssignmentElements()
+ {
+ $this->addAssignFilter([
+ 'suggestionContext' => 'HostFilterColumns',
+ 'required' => true,
+ 'description' => $this->translate(
+ 'This allows you to configure an assignment filter. Please feel'
+ . ' free to combine as many nested operators as you want. The'
+ . ' "contains" operator is valid for arrays only. Please use'
+ . ' wildcards and the = (equals) operator when searching for'
+ . ' partial string matches, like in *.example.com'
+ )
+ ]);
+
+ return $this;
+ }
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ protected function setupHostRelatedElements()
+ {
+ $this->addHidden('host', $this->host->getObjectName());
+ $this->addHidden('object_type', 'object');
+ $this->addImportsElement();
+ $imports = $this->getSentOrObjectValue('imports');
+
+ if ($this->hasBeenSent()) {
+ $imports = $this->getElement('imports')->setValue($imports)->getValue();
+ }
+
+ if ($this->isNew() && empty($imports)) {
+ $this->groupMainProperties();
+ return;
+ }
+
+ $this->addNameElement()
+ ->addChoices('service')
+ ->addDisabledElement()
+ ->addGroupsElement()
+ ->groupMainProperties()
+ ->addCheckCommandElements()
+ ->addExtraInfoElements()
+ ->setButtons();
+
+ $this->setDefaultNameFromTemplate($imports);
+ }
+
+ /**
+ * @param IcingaHost $host
+ * @return $this
+ */
+ public function setHost(IcingaHost $host)
+ {
+ $this->host = $host;
+ return $this;
+ }
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ protected function setupSetRelatedElements()
+ {
+ $this->addHidden('service_set', $this->set->getObjectName());
+ $this->addHidden('object_type', 'apply');
+ $this->addImportsElement();
+ $this->setButtons();
+ $imports = $this->getSentOrObjectValue('imports');
+
+ if ($this->hasBeenSent()) {
+ $imports = $this->getElement('imports')->setValue($imports)->getValue();
+ }
+
+ if ($this->isNew() && empty($imports)) {
+ $this->groupMainProperties();
+ return;
+ }
+
+ $this->addNameElement()
+ ->addDisabledElement()
+ ->addGroupsElement()
+ ->groupMainProperties();
+
+ if ($this->hasPermission('director/admin')) {
+ $this->addCheckCommandElements(true)
+ ->addCheckExecutionElements(true)
+ ->addExtraInfoElements();
+ }
+
+ $this->setDefaultNameFromTemplate($imports);
+ }
+
+ public function setServiceSet(IcingaServiceSet $set)
+ {
+ $this->set = $set;
+ return $this;
+ }
+
+ /**
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addNameElement()
+ {
+ $this->addElement('text', 'object_name', array(
+ 'label' => $this->translate('Name'),
+ 'required' => !$this->object()->isApplyRule(),
+ 'description' => $this->translate(
+ 'Name for the Icinga service you are going to create'
+ )
+ ));
+
+ if ($this->object()->isApplyRule()) {
+ $this->eventuallyAddNameRestriction('director/service/apply/filter-by-name');
+ }
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addHostObjectElement()
+ {
+ if ($this->isObject()) {
+ $this->addElement('select', 'host', [
+ 'label' => $this->translate('Host'),
+ 'required' => true,
+ 'multiOptions' => $this->optionalEnum($this->enumHostsAndTemplates()),
+ 'description' => $this->translate(
+ 'Choose the host this single service should be assigned to'
+ )
+ ]);
+ }
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addApplyForElement()
+ {
+ if ($this->object->isApplyRule()) {
+ $hostProperties = IcingaHost::enumProperties(
+ $this->object->getConnection(),
+ 'host.',
+ new ArrayCustomVariablesFilter()
+ );
+
+ $this->addElement('select', 'apply_for', array(
+ 'label' => $this->translate('Apply For'),
+ 'class' => 'assign-property autosubmit',
+ 'multiOptions' => $this->optionalEnum($hostProperties, $this->translate('None')),
+ 'description' => $this->translate(
+ 'Evaluates the apply for rule for ' .
+ 'all objects with the custom attribute specified. ' .
+ 'E.g selecting "host.vars.custom_attr" will generate "for (config in ' .
+ 'host.vars.array_var)" where "config" will be accessible through "$config$". ' .
+ 'NOTE: only custom variables of type "Array" are eligible.'
+ )
+ ));
+ }
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addGroupsElement()
+ {
+ $groups = $this->enumServicegroups();
+
+ if (! empty($groups)) {
+ $this->addElement('extensibleSet', 'groups', array(
+ 'label' => $this->translate('Groups'),
+ 'multiOptions' => $this->optionallyAddFromEnum($groups),
+ 'positional' => false,
+ 'description' => $this->translate(
+ 'Service groups that should be directly assigned to this service.'
+ . ' Servicegroups can be useful for various reasons. They are'
+ . ' helpful to provided service-type specific view in Icinga Web 2,'
+ . ' either for custom dashboards or as an instrument to enforce'
+ . ' restrictions. Service groups can be directly assigned to'
+ . ' single services or to service templates.'
+ )
+ ));
+ }
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addAgentAndZoneElements()
+ {
+ if (!$this->isTemplate()) {
+ return $this;
+ }
+
+ $this->optionalBoolean(
+ 'use_agent',
+ $this->translate('Run on agent'),
+ $this->translate(
+ 'Whether the check commmand for this service should be executed'
+ . ' on the Icinga agent'
+ )
+ );
+ $this->addZoneElement();
+
+ $elements = array(
+ 'use_agent',
+ 'zone_id',
+ );
+ $this->addDisplayGroup($elements, 'clustering', array(
+ 'decorators' => array(
+ 'FormElements',
+ array('HtmlTag', array('tag' => 'dl')),
+ 'Fieldset',
+ ),
+ 'order' => self::GROUP_ORDER_CLUSTERING,
+ 'legend' => $this->translate('Icinga Agent and zone settings')
+ ));
+
+ return $this;
+ }
+
+ protected function enumHostsAndTemplates()
+ {
+ if ($this->branch && $this->branch->isBranch()) {
+ return $this->enumHosts();
+ }
+
+ return [
+ $this->translate('Templates') => $this->enumHostTemplates(),
+ $this->translate('Hosts') => $this->enumHosts(),
+ ];
+ }
+
+ protected function enumHostTemplates()
+ {
+ $names = array_values($this->db->enumHostTemplates());
+ return array_combine($names, $names);
+ }
+
+ protected function enumHosts()
+ {
+ $db = $this->db->getDbAdapter();
+ $table = new ObjectsTableHost($this->db);
+ $table->setAuth($this->getAuth());
+ if ($this->branch && $this->branch->isBranch()) {
+ $table->setBranchUuid($this->branch->getUuid());
+ }
+ $result = [];
+ foreach ($db->fetchAll($table->getQuery()->reset(\Zend_Db_Select::LIMIT_COUNT)) as $row) {
+ $result[$row->object_name] = $row->object_name;
+ }
+
+ return $result;
+ }
+
+ protected function enumServicegroups()
+ {
+ $db = $this->db->getDbAdapter();
+ $select = $db->select()->from(
+ 'icinga_servicegroup',
+ array(
+ 'name' => 'object_name',
+ 'display' => 'COALESCE(display_name, object_name)'
+ )
+ )->where('object_type = ?', 'object')->order('display');
+
+ return $db->fetchPairs($select);
+ }
+
+ protected function succeedForOverrides()
+ {
+ $vars = array();
+ foreach ($this->object->vars() as $key => $var) {
+ $vars[$key] = $var->getValue();
+ }
+
+ $host = $this->host;
+ $serviceName = $this->object->getObjectName();
+
+ $this->host->overrideServiceVars($serviceName, (object) $vars);
+
+ if ($host->hasBeenModified()) {
+ $msg = sprintf(
+ empty($vars)
+ ? $this->translate('All overrides have been removed from "%s"')
+ : $this->translate('The given properties have been stored for "%s"'),
+ $this->translate($host->getObjectName())
+ );
+
+ $this->getDbObjectStore()->store($host);
+ } else {
+ if ($this->isApiRequest()) {
+ $this->setHttpResponseCode(304);
+ }
+
+ $msg = $this->translate('No action taken, object has not been modified');
+ }
+
+ $this->redirectOnSuccess($msg);
+ }
+
+ public function onSuccess()
+ {
+ if ($this->providesOverrides()) {
+ $this->succeedForOverrides();
+ return;
+ }
+
+ parent::onSuccess();
+ }
+
+ /**
+ * @param array $imports
+ */
+ protected function setDefaultNameFromTemplate($imports)
+ {
+ if ($this->hasBeenSent()) {
+ $name = $this->getSentOrObjectValue('object_name');
+ if ($name === null || !strlen($name)) {
+ $this->setElementValue('object_name', end($imports));
+ $this->object->set('object_name', end($imports));
+ }
+ }
+ }
+}
diff --git a/application/forms/IcingaServiceGroupForm.php b/application/forms/IcingaServiceGroupForm.php
new file mode 100644
index 0000000..db23cbb
--- /dev/null
+++ b/application/forms/IcingaServiceGroupForm.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaServiceGroupForm extends DirectorObjectForm
+{
+ public function setup()
+ {
+ $this->addHidden('object_type', 'object');
+
+ $this->addElement('text', 'object_name', [
+ 'label' => $this->translate('Servicegroup'),
+ 'required' => true,
+ 'description' => $this->translate('Icinga object name for this service group')
+ ]);
+
+ $this->addGroupDisplayNameElement()
+ ->addAssignmentElements()
+ ->setButtons();
+ }
+
+ protected function addAssignmentElements()
+ {
+ $this->addAssignFilter([
+ 'suggestionContext' => 'ServiceFilterColumns',
+ 'required' => false,
+ 'description' => $this->translate(
+ 'This allows you to configure an assignment filter. Please feel'
+ . ' free to combine as many nested operators as you want. The'
+ . ' "contains" operator is valid for arrays only. Please use'
+ . ' wildcards and the = (equals) operator when searching for'
+ . ' partial string matches, like in *.example.com'
+ )
+ ]);
+
+ return $this;
+ }
+}
diff --git a/application/forms/IcingaServiceSetForm.php b/application/forms/IcingaServiceSetForm.php
new file mode 100644
index 0000000..21508d5
--- /dev/null
+++ b/application/forms/IcingaServiceSetForm.php
@@ -0,0 +1,135 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Objects\IcingaHost;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaServiceSetForm extends DirectorObjectForm
+{
+ protected $host;
+
+ protected $listUrl = 'director/services/sets';
+
+ public function setup()
+ {
+ if ($this->host === null) {
+ $this->setupTemplate();
+ } else {
+ $this->setupHost();
+ }
+
+ $this->setButtons();
+ }
+
+ protected function setupTemplate()
+ {
+ $this->addElement('text', 'object_name', [
+ 'label' => $this->translate('Service set name'),
+ 'description' => $this->translate(
+ 'A short name identifying this set of services'
+ ),
+ 'required' => true,
+ ])
+ ->eventuallyAddNameRestriction('director/service_set/filter-by-name')
+ ->addHidden('object_type', 'template')
+ ->addDescriptionElement()
+ ->addAssignmentElements();
+ }
+
+ protected function setObjectSuccessUrl()
+ {
+ if ($this->host) {
+ $this->setSuccessUrl(
+ 'director/host/services',
+ array('name' => $this->host->getObjectName())
+ );
+ } else {
+ parent::setObjectSuccessUrl();
+ }
+ }
+
+ protected function setupHost()
+ {
+ $object = $this->object();
+ if ($this->hasBeenSent()) {
+ $object->set('object_name', $this->getSentValue('imports'));
+ $object->set('imports', $object->object_name);
+ }
+
+ if (! $object->hasBeenLoadedFromDb()) {
+ $this->addSingleImportsElement();
+ }
+
+ if (count($object->get('imports'))) {
+ $description = $object->getResolvedProperty('description');
+ if ($description) {
+ $this->addHtmlHint($description);
+ }
+ }
+
+ $this->addHidden('object_type', 'object');
+ $this->addHidden('host', $this->host->getObjectName());
+ $this->groupMainProperties();
+ }
+
+ public function setHost(IcingaHost $host)
+ {
+ $this->host = $host;
+ return $this;
+ }
+
+ protected function addSingleImportsElement()
+ {
+ $enum = $this->enumAllowedTemplates();
+
+ $this->addElement('select', 'imports', array(
+ 'label' => $this->translate('Service set'),
+ 'description' => $this->translate(
+ 'The service set that should be assigned to this host'
+ ),
+ 'required' => true,
+ 'multiOptions' => $this->optionallyAddFromEnum($enum),
+ 'class' => 'autosubmit'
+ ));
+
+ return $this;
+ }
+
+ protected function addDescriptionElement()
+ {
+ $this->addElement('textarea', 'description', array(
+ 'label' => $this->translate('Description'),
+ 'description' => $this->translate(
+ 'A meaningful description explaining your users what to expect'
+ . ' when assigning this set of services'
+ ),
+ 'rows' => '3',
+ 'required' => ! $this->isTemplate(),
+ ));
+
+ return $this;
+ }
+
+ protected function addAssignmentElements()
+ {
+ if (! $this->hasPermission('director/service_set/apply')) {
+ return $this;
+ }
+
+ $this->addAssignFilter([
+ 'suggestionContext' => 'HostFilterColumns',
+ 'description' => $this->translate(
+ 'This allows you to configure an assignment filter. Please feel'
+ . ' free to combine as many nested operators as you want. You'
+ . ' might also want to skip this, define it later and/or just'
+ . ' add this set of services to single hosts. The "contains"'
+ . ' operator is valid for arrays only. Please use wildcards and'
+ . ' the = (equals) operator when searching for partial string'
+ . ' matches, like in *.example.com'
+ )
+ ]);
+
+ return $this;
+ }
+}
diff --git a/application/forms/IcingaServiceVarForm.php b/application/forms/IcingaServiceVarForm.php
new file mode 100644
index 0000000..e7ac4a0
--- /dev/null
+++ b/application/forms/IcingaServiceVarForm.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+/**
+ * @deprecated
+ */
+class IcingaServiceVarForm extends DirectorObjectForm
+{
+ public function setup()
+ {
+ $this->addElement('select', 'service_id', array(
+ 'label' => $this->translate('Service'),
+ 'description' => $this->translate('The name of the service'),
+ 'multiOptions' => $this->optionalEnum($this->db->enumServices()),
+ 'required' => true
+ ));
+
+ $this->addElement('text', 'varname', array(
+ 'label' => $this->translate('Name'),
+ 'description' => $this->translate('service var name')
+ ));
+
+ $this->addElement('textarea', 'varvalue', array(
+ 'label' => $this->translate('Value'),
+ 'description' => $this->translate('service var value')
+ ));
+
+ $this->addElement('text', 'format', array(
+ 'label' => $this->translate('Format'),
+ 'description' => $this->translate('value format')
+ ));
+ }
+}
diff --git a/application/forms/IcingaTemplateChoiceForm.php b/application/forms/IcingaTemplateChoiceForm.php
new file mode 100644
index 0000000..31fe610
--- /dev/null
+++ b/application/forms/IcingaTemplateChoiceForm.php
@@ -0,0 +1,140 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Db;
+use Icinga\Module\Director\Objects\IcingaTemplateChoice;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaTemplateChoiceForm extends DirectorObjectForm
+{
+ private $choiceType;
+
+ public static function create($type, Db $db)
+ {
+ return static::load()->setDb($db)->setChoiceType($type);
+ }
+
+ public function optionallyLoad($name)
+ {
+ if ($name !== null) {
+ /** @var IcingaTemplateChoice $class - cheating IDE */
+ $class = $this->getObjectClassName();
+ $this->setObject($class::load($name, $this->getDb()));
+ }
+
+ return $this;
+ }
+
+ protected function getObjectClassname()
+ {
+ if ($this->className === null) {
+ return 'Icinga\\Module\\Director\\Objects\\IcingaTemplateChoice'
+ . ucfirst($this->choiceType);
+ }
+
+ return $this->className;
+ }
+
+ public function setChoiceType($type)
+ {
+ $this->choiceType = $type;
+ return $this;
+ }
+
+ public function setup()
+ {
+ $this->addElement('text', 'object_name', array(
+ 'label' => $this->translate('Choice name'),
+ 'required' => true,
+ 'description' => $this->translate(
+ 'This will be shown as a label for the given choice'
+ )
+ ));
+
+ $this->addElement('textarea', 'description', array(
+ 'label' => $this->translate('Description'),
+ 'rows' => 4,
+ 'description' => $this->translate(
+ 'A detailled description explaining what this choice is all about'
+ )
+ ));
+
+ $this->addElement('extensibleSet', 'members', array(
+ 'label' => $this->translate('Available choices'),
+ 'required' => true,
+ 'description' => $this->translate(
+ 'Your users will be allowed to choose among those templates'
+ ),
+ 'multiOptions' => $this->fetchUnboundTemplates()
+ ));
+
+ $this->addElement('text', 'min_required', array(
+ 'label' => $this->translate('Minimum required'),
+ 'description' => $this->translate(
+ 'Choosing this many options will be mandatory for this Choice.'
+ . ' Setting this to zero will leave this Choice optional, setting'
+ . ' it to one results in a "required" Choice. You can use higher'
+ . ' numbers to enforce multiple options, this Choice will then turn'
+ . ' into a multi-selection element.'
+ ),
+ 'value' => 0,
+ ));
+
+ $this->addElement('text', 'max_allowed', array(
+ 'label' => $this->translate('Allowed maximum'),
+ 'description' => $this->translate(
+ 'It will not be allowed to choose more than this many options.'
+ . ' Setting it to one (1) will result in a drop-down box, a'
+ . ' higher number will turn this into a multi-selection element.'
+ ),
+ 'value' => 1,
+ ));
+
+ $this->addElement('select', 'required_template', [
+ 'label' => $this->translate('Associated Template'),
+ 'description' => $this->translate(
+ 'Choose Choice Associated Template'
+ ),
+ 'required' => true,
+ 'multiOptions' => $this->fetchUnboundTemplates(),
+ ]);
+
+ $this->setButtons();
+ }
+
+ protected function fetchUnboundTemplates()
+ {
+ /** @var IcingaTemplateChoice $object */
+ $object = $this->object();
+ $db = $this->getDb()->getDbAdapter();
+ $table = $object->getObjectTableName();
+ $query = $db->select()->from(
+ ['o' => $table],
+ [
+ 'k' => 'o.object_name',
+ 'v' => 'o.object_name',
+ ]
+ )->where("o.object_type = 'template'");
+ if ($object->hasBeenLoadedFromDb()) {
+ $query->where(
+ 'o.template_choice_id IS NULL OR o.template_choice_id = ?',
+ $object->get('id')
+ );
+ } else {
+ $query->where('o.template_choice_id IS NULL');
+ }
+
+ return $db->fetchPairs($query);
+ }
+
+ protected function setObjectSuccessUrl()
+ {
+ /** @var IcingaTemplateChoice $object */
+ $object = $this->object();
+ $this->setSuccessUrl(
+ 'director/templatechoice/' . $object->getObjectshortTableName(),
+ $object->getUrlParams()
+ );
+ }
+}
diff --git a/application/forms/IcingaTimePeriodForm.php b/application/forms/IcingaTimePeriodForm.php
new file mode 100644
index 0000000..8afcdf3
--- /dev/null
+++ b/application/forms/IcingaTimePeriodForm.php
@@ -0,0 +1,82 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaTimePeriodForm extends DirectorObjectForm
+{
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ public function setup()
+ {
+ $this->addElement('text', 'object_name', [
+ 'label' => $this->translate('Name'),
+ 'required' => true,
+ ]);
+
+ $this->addElement('text', 'display_name', [
+ 'label' => $this->translate('Display Name'),
+ ]);
+
+ if ($this->isTemplate()) {
+ $this->addElement('text', 'update_method', [
+ 'label' => $this->translate('Update Method'),
+ 'value' => 'LegacyTimePeriod',
+ ]);
+ } else {
+ // TODO: I'd like to skip this for objects inheriting from a template
+ // with a defined update_method. However, unfortunately it's too
+ // early for $this->object()->getResolvedProperty('update_method').
+ // Should be fixed.
+ $this->addHidden('update_method', 'LegacyTimePeriod');
+ }
+
+ $this->addIncludeExclude()
+ ->addImportsElement()
+ ->setButtons();
+ }
+
+ /**
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addIncludeExclude()
+ {
+ $periods = [];
+ foreach ($this->db->enumTimeperiods() as $id => $period) {
+ if ($this->object === null || $this->object->get('object_name') !== $period) {
+ $periods[$period] = $period;
+ }
+ }
+
+ if (empty($periods)) {
+ return $this;
+ }
+
+ $this->addElement('extensibleSet', 'includes', [
+ 'label' => $this->translate('Include period'),
+ 'multiOptions' => $this->optionalEnum($periods),
+ 'description' => $this->translate(
+ 'Include other time periods into this.'
+ ),
+ ]);
+
+ $this->addElement('extensibleSet', 'excludes', [
+ 'label' => $this->translate('Exclude period'),
+ 'multiOptions' => $this->optionalEnum($periods),
+ 'description' => $this->translate(
+ 'Exclude other time periods from this.'
+ ),
+ ]);
+
+ $this->optionalBoolean(
+ 'prefer_includes',
+ $this->translate('Prefer includes'),
+ $this->translate('Whether to prefer timeperiods includes or excludes. Default to true.')
+ );
+
+ return $this;
+ }
+}
diff --git a/application/forms/IcingaTimePeriodRangeForm.php b/application/forms/IcingaTimePeriodRangeForm.php
new file mode 100644
index 0000000..977684e
--- /dev/null
+++ b/application/forms/IcingaTimePeriodRangeForm.php
@@ -0,0 +1,105 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Objects\IcingaTimePeriod;
+use Icinga\Module\Director\Objects\IcingaTimePeriodRange;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaTimePeriodRangeForm extends DirectorObjectForm
+{
+ /**
+ * @var IcingaTimePeriod
+ */
+ private $period;
+
+ public function setup()
+ {
+ $this->addHidden('timeperiod_id', $this->period->get('id'));
+ $this->addElement('text', 'range_key', array(
+ 'label' => $this->translate('Day(s)'),
+ 'description' => $this->translate(
+ 'Might be monday, tuesday or 2016-01-28 - have a look at the documentation for more examples'
+ ),
+ ));
+
+ $this->addElement('text', 'range_value', array(
+ 'label' => $this->translate('Timerperiods'),
+ 'description' => $this->translate(
+ 'One or more time periods, e.g. 00:00-24:00 or 00:00-09:00,17:00-24:00'
+ ),
+ ));
+
+ $this->setButtons();
+ }
+
+ public function setTimePeriod(IcingaTimePeriod $period)
+ {
+ $this->period = $period;
+ $this->setDb($period->getConnection());
+ return $this;
+ }
+
+ /**
+ * @param IcingaTimePeriodRange $object
+ */
+ protected function deleteObject($object)
+ {
+ $key = $object->get('range_key');
+ $period = $this->period;
+ $period->ranges()->remove($key);
+ $period->store();
+ $msg = sprintf(
+ 'Time period range "%s" has been removed from %s',
+ $key,
+ $period->getObjectName()
+ );
+
+ $url = $this->getSuccessUrl()->without(
+ ['range', 'range_type']
+ );
+
+ $this->setSuccessUrl($url);
+ $this->redirectOnSuccess($msg);
+ }
+
+ public function onSuccess()
+ {
+ $object = $this->object();
+ if ($object->hasBeenModified()) {
+ $this->period->ranges()->setRange(
+ $this->getValue('range_key'),
+ $this->getValue('range_value')
+ );
+ }
+
+ if ($this->period->hasBeenModified()) {
+ if (! $object->hasBeenLoadedFromDb()) {
+ $this->setHttpResponseCode(201);
+ }
+
+ $msg = sprintf(
+ $object->hasBeenLoadedFromDb()
+ ? $this->translate('The %s has successfully been stored')
+ : $this->translate('A new %s has successfully been created'),
+ $this->translate($this->getObjectShortClassName())
+ );
+
+ $this->period->store($this->db);
+ } else {
+ if ($this->isApiRequest()) {
+ $this->setHttpResponseCode(304);
+ }
+ $msg = $this->translate('No action taken, object has not been modified');
+ }
+ if ($object instanceof IcingaObject) {
+ $this->setSuccessUrl(
+ 'director/' . strtolower($this->getObjectShortClassName()),
+ $object->getUrlParams()
+ );
+ }
+
+ $this->redirectOnSuccess($msg);
+ }
+}
diff --git a/application/forms/IcingaUserForm.php b/application/forms/IcingaUserForm.php
new file mode 100644
index 0000000..bff2252
--- /dev/null
+++ b/application/forms/IcingaUserForm.php
@@ -0,0 +1,214 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaUserForm extends DirectorObjectForm
+{
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ public function setup()
+ {
+ $this->addObjectTypeElement();
+ if (! $this->hasObjectType()) {
+ $this->groupMainProperties();
+ return;
+ }
+
+ if ($this->isTemplate()) {
+ $this->addElement('text', 'object_name', array(
+ 'label' => $this->translate('User template name'),
+ 'required' => true,
+ 'description' => $this->translate('Name for the Icinga user template you are going to create')
+ ));
+ } else {
+ $this->addElement('text', 'object_name', array(
+ 'label' => $this->translate('Username'),
+ 'required' => true,
+ 'description' => $this->translate('Name for the Icinga user object you are going to create')
+ ));
+ }
+
+ if (! $this->isTemplate()) {
+ $this->addElement('text', 'email', array(
+ 'label' => $this->translate('Email'),
+ 'description' => $this->translate('The Email address of the user.')
+ ));
+
+ $this->addElement('text', 'pager', array(
+ 'label' => $this->translate('Pager'),
+ 'description' => $this->translate('The pager address of the user.')
+ ));
+ }
+
+ $this->addGroupsElement()
+ ->addImportsElement()
+ ->addDisplayNameElement()
+ ->addEnableNotificationsElement()
+ ->addDisabledElement()
+ ->addZoneElements()
+ ->addPeriodElement()
+ ->addEventFilterElements()
+ ->groupMainProperties()
+ ->setButtons();
+ }
+
+ /**
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addZoneElements()
+ {
+ if (! $this->isTemplate()) {
+ return $this;
+ }
+
+ $this->addZoneElement();
+ $this->addDisplayGroup(array('zone_id'), 'clustering', array(
+ 'decorators' => array(
+ 'FormElements',
+ array('HtmlTag', array('tag' => 'dl')),
+ 'Fieldset',
+ ),
+ 'order' => self::GROUP_ORDER_CLUSTERING,
+ 'legend' => $this->translate('Zone settings')
+ ));
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ */
+ protected function addEnableNotificationsElement()
+ {
+ $this->optionalBoolean(
+ 'enable_notifications',
+ $this->translate('Send notifications'),
+ $this->translate('Whether to send notifications for this user')
+ );
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addGroupsElement()
+ {
+ $groups = $this->enumUsergroups();
+
+ if (empty($groups)) {
+ return $this;
+ }
+
+ $this->addElement('extensibleSet', 'groups', array(
+ 'label' => $this->translate('Groups'),
+ 'multiOptions' => $this->optionallyAddFromEnum($groups),
+ 'positional' => false,
+ 'description' => $this->translate(
+ 'User groups that should be directly assigned to this user. Groups can be useful'
+ . ' for various reasons. You might prefer to send notifications to groups instead of'
+ . ' single users'
+ )
+ ));
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addDisplayNameElement()
+ {
+ if ($this->isTemplate()) {
+ return $this;
+ }
+
+ $this->addElement('text', 'display_name', array(
+ 'label' => $this->translate('Display name'),
+ 'description' => $this->translate(
+ 'Alternative name for this user. In case your object name is a'
+ . ' username, this could be the full name of the corresponding person'
+ )
+ ));
+
+ return $this;
+ }
+
+ /**
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addPeriodElement()
+ {
+ $periods = $this->db->enumTimeperiods();
+ if (empty($periods)) {
+ return $this;
+ }
+
+ $this->addElement(
+ 'select',
+ 'period_id',
+ array(
+ 'label' => $this->translate('Time period'),
+ 'description' => $this->translate(
+ 'The name of a time period which determines when notifications'
+ . ' to this User should be triggered. Not set by default.'
+ ),
+ 'multiOptions' => $this->optionalEnum($periods),
+ )
+ );
+
+ return $this;
+ }
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ protected function groupObjectDefinition()
+ {
+ $elements = array(
+ 'object_type',
+ 'object_name',
+ 'display_name',
+ 'imports',
+ 'groups',
+ 'email',
+ 'pager',
+ 'period_id',
+ 'enable_notifications',
+ 'disabled',
+ );
+ $this->addDisplayGroup($elements, 'object_definition', array(
+ 'decorators' => array(
+ 'FormElements',
+ array('HtmlTag', array('tag' => 'dl')),
+ 'Fieldset',
+ ),
+ 'order' => self::GROUP_ORDER_OBJECT_DEFINITION,
+ 'legend' => $this->translate('User properties')
+ ));
+ }
+
+ /**
+ * @return array
+ */
+ protected function enumUsergroups()
+ {
+ $db = $this->db->getDbAdapter();
+ $select = $db->select()->from(
+ 'icinga_usergroup',
+ array(
+ 'name' => 'object_name',
+ 'display' => 'COALESCE(display_name, object_name)'
+ )
+ )->where('object_type = ?', 'object')->order('display');
+
+ return $db->fetchPairs($select);
+ }
+}
diff --git a/application/forms/IcingaUserGroupForm.php b/application/forms/IcingaUserGroupForm.php
new file mode 100644
index 0000000..d9706b4
--- /dev/null
+++ b/application/forms/IcingaUserGroupForm.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaUserGroupForm extends DirectorObjectForm
+{
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ public function setup()
+ {
+ $this->addHidden('object_type', 'object');
+
+ $this->addElement('text', 'object_name', array(
+ 'label' => $this->translate('Usergroup'),
+ 'required' => true,
+ 'description' => $this->translate('Icinga object name for this user group')
+ ));
+
+ $this->addGroupDisplayNameElement()
+ ->addZoneElements()
+ ->groupMainProperties()
+ ->setButtons();
+ }
+
+ /**
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addZoneElements()
+ {
+ $this->addZoneElement(true);
+ $this->addDisplayGroup(['zone_id'], 'clustering', [
+ 'decorators' => [
+ 'FormElements',
+ ['HtmlTag', ['tag' => 'dl']],
+ 'Fieldset',
+ ],
+ 'order' => self::GROUP_ORDER_CLUSTERING,
+ 'legend' => $this->translate('Zone settings')
+ ]);
+
+ return $this;
+ }
+}
diff --git a/application/forms/IcingaZoneForm.php b/application/forms/IcingaZoneForm.php
new file mode 100644
index 0000000..bf27cae
--- /dev/null
+++ b/application/forms/IcingaZoneForm.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class IcingaZoneForm extends DirectorObjectForm
+{
+ public function setup()
+ {
+ $this->addHidden('object_type', 'object');
+
+ $this->addElement('text', 'object_name', array(
+ 'label' => $this->translate('Zone name'),
+ 'required' => true,
+ 'description' => $this->translate(
+ 'Name for the Icinga zone you are going to create'
+ )
+ ));
+
+ $this->addElement('select', 'is_global', array(
+ 'label' => $this->translate('Global zone'),
+ 'description' => $this->translate(
+ 'Whether this zone should be available everywhere. Please note that'
+ . ' it rarely leads to the desired result when you try to distribute'
+ . ' global zones in distrubuted environments'
+ ),
+ 'multiOptions' => array(
+ 'n' => $this->translate('No'),
+ 'y' => $this->translate('Yes'),
+ ),
+ 'required' => true,
+ ));
+
+ $this->addElement('select', 'parent_id', array(
+ 'label' => $this->translate('Parent Zone'),
+ 'description' => $this->translate('Chose an (optional) parent zone'),
+ 'multiOptions' => $this->optionalEnum($this->db->enumZones()),
+ ));
+
+ $this->setButtons();
+ }
+}
diff --git a/application/forms/ImportCheckForm.php b/application/forms/ImportCheckForm.php
new file mode 100644
index 0000000..31c9781
--- /dev/null
+++ b/application/forms/ImportCheckForm.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Objects\ImportSource;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+
+class ImportCheckForm extends DirectorForm
+{
+ /** @var ImportSource */
+ protected $source;
+
+ public function setImportSource(ImportSource $source)
+ {
+ $this->source = $source;
+ return $this;
+ }
+
+ public function setup()
+ {
+ $this->submitLabel = false;
+ $this->addElement('submit', 'submit', [
+ 'label' => $this->translate('Check for changes'),
+ 'decorators' => ['ViewHelper']
+ ]);
+ }
+
+ public function onSuccess()
+ {
+ $source = $this->source;
+ if ($source->checkForChanges()) {
+ $this->setSuccessMessage(
+ $this->translate('This Import Source provides modified data')
+ );
+ } else {
+ $this->setSuccessMessage(
+ $this->translate(
+ 'Nothing to do, data provided by this Import Source'
+ . " didn't change since the last import run"
+ )
+ );
+ }
+
+ if ($source->get('import_state') === 'failing') {
+ $this->addError($this->translate('Checking this Import Source failed'));
+ } else {
+ parent::onSuccess();
+ }
+ }
+}
diff --git a/application/forms/ImportRowModifierForm.php b/application/forms/ImportRowModifierForm.php
new file mode 100644
index 0000000..9e53bd9
--- /dev/null
+++ b/application/forms/ImportRowModifierForm.php
@@ -0,0 +1,182 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Exception;
+use Icinga\Application\Hook;
+use Icinga\Exception\ConfigurationError;
+use Icinga\Module\Director\Hook\ImportSourceHook;
+use Icinga\Module\Director\Hook\PropertyModifierHook;
+use Icinga\Module\Director\Objects\ImportSource;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use RuntimeException;
+
+class ImportRowModifierForm extends DirectorObjectForm
+{
+ /** @var ImportSource */
+ protected $source;
+
+ /** @var ImportSourceHook */
+ protected $importSource;
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ public function setup()
+ {
+ $this->addHidden('source_id', $this->source->id);
+
+ $this->addElement('text', 'property_name', array(
+ 'label' => $this->translate('Property'),
+ 'description' => $this->translate(
+ 'Please start typing for a list of suggestions. Dots allow you to access nested'
+ . ' properties: column.some.key. Such nested properties cannot be modified in-place,'
+ . ' but you can store the modified value to a new "target property"'
+ ),
+ 'required' => true,
+ 'class' => 'autosubmit director-suggest',
+ 'data-suggestion-context' => 'importsourceproperties!' . $this->source->id,
+ ));
+
+ $this->addElement('text', 'target_property', [
+ 'label' => $this->translate('Target property'),
+ 'description' => $this->translate(
+ 'You might want to write the modified value to another (new) property.'
+ . ' This property name can be defined here, the original property would'
+ . ' remain unmodified. Please leave this blank in case you just want to'
+ . ' modify the value of a specific property'
+ ),
+ ]);
+
+ $this->addElement('textarea', 'description', [
+ 'label' => $this->translate('Description'),
+ 'description' => $this->translate(
+ 'An extended description for this Import Row Modifier. This should explain'
+ . " it's purpose and why it has been put in place at all."
+ ),
+ 'rows' => '3',
+ ]);
+
+ $error = false;
+ try {
+ $mods = $this->enumModifiers();
+ } catch (Exception $e) {
+ $error = $e->getMessage();
+ $mods = $this->optionalEnum([]);
+ }
+
+ $this->addElement('select', 'provider_class', [
+ 'label' => $this->translate('Modifier'),
+ 'required' => true,
+ 'description' => $this->translate(
+ 'A property modifier allows you to modify a specific property at import time'
+ ),
+ 'multiOptions' => $this->optionalEnum($mods),
+ 'class' => 'autosubmit',
+ ]);
+ if ($error) {
+ $this->getElement('provider_class')->addError($error);
+ }
+
+ try {
+ if ($class = $this->getSentValue('provider_class')) {
+ if ($class && array_key_exists($class, $mods)) {
+ $this->addSettings($class);
+ }
+ } elseif ($class = $this->object()->get('provider_class')) {
+ $this->addSettings($class);
+ }
+
+ // TODO: next line looks like obsolete duplicate code to me
+ $this->addSettings();
+ } catch (Exception $e) {
+ $this->getElement('provider_class')->addError($e->getMessage());
+ }
+
+ foreach ($this->object()->getSettings() as $key => $val) {
+ if ($el = $this->getElement($key)) {
+ $el->setValue($val);
+ }
+ }
+
+ $this->setButtons();
+ }
+
+ public function getSetting($name, $default = null)
+ {
+ if ($this->hasBeenSent()) {
+ $value = $this->getSentValue($name);
+ if ($value !== null) {
+ return $value;
+ }
+ }
+ if ($this->isNew()) {
+ $value = $this->getElement($name)->getValue();
+ if ($value === null) {
+ return $default;
+ }
+
+ return $value;
+ }
+
+ return $this->object()->getSetting($name, $default);
+ }
+
+ /**
+ * @return ImportSourceHook
+ * @throws ConfigurationError
+ */
+ protected function getImportSource()
+ {
+ if ($this->importSource === null) {
+ $this->importSource = ImportSourceHook::loadByName(
+ $this->source->get('source_name'),
+ $this->db
+ );
+ }
+
+ return $this->importSource;
+ }
+
+ protected function enumModifiers()
+ {
+ /** @var PropertyModifierHook[] $hooks */
+ $hooks = Hook::all('Director\\PropertyModifier');
+ $enum = [];
+ foreach ($hooks as $hook) {
+ $enum[get_class($hook)] = $hook->getName();
+ }
+
+ asort($enum);
+
+ return $enum;
+ }
+
+ /**
+ * @param null $class
+ */
+ protected function addSettings($class = null)
+ {
+ if ($class === null) {
+ $class = $this->getValue('provider_class');
+ }
+
+ if ($class !== null) {
+ if (! class_exists($class)) {
+ throw new RuntimeException(sprintf(
+ 'The hooked class "%s" for this property modifier does no longer exist',
+ $class
+ ));
+ }
+
+ $class::addSettingsFormFields($this);
+ }
+ }
+
+ public function setSource(ImportSource $source)
+ {
+ $this->source = $source;
+
+ return $this;
+ }
+}
diff --git a/application/forms/ImportRunForm.php b/application/forms/ImportRunForm.php
new file mode 100644
index 0000000..9f6494f
--- /dev/null
+++ b/application/forms/ImportRunForm.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Objects\ImportSource;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+
+class ImportRunForm extends DirectorForm
+{
+ /** @var ImportSource */
+ protected $source;
+
+ public function setImportSource(ImportSource $source)
+ {
+ $this->source = $source;
+ return $this;
+ }
+
+ public function setup()
+ {
+ $this->submitLabel = false;
+ $this->addElement('submit', 'submit', [
+ 'label' => $this->translate('Trigger Import Run'),
+ 'decorators' => ['ViewHelper']
+ ]);
+ }
+
+ public function onSuccess()
+ {
+ $source = $this->source;
+ if ($source->runImport()) {
+ $this->setSuccessMessage(
+ $this->translate('Imported new data from this Import Source')
+ );
+ } else {
+ $this->setSuccessMessage(
+ $this->translate(
+ 'Nothing to do, data provided by this Import Source'
+ . " didn't change since the last import run"
+ )
+ );
+ }
+
+ if ($source->get('import_state') === 'failing') {
+ $this->addError($this->translate('Triggering this Import Source failed'));
+ } else {
+ parent::onSuccess();
+ }
+ }
+}
diff --git a/application/forms/ImportSourceForm.php b/application/forms/ImportSourceForm.php
new file mode 100644
index 0000000..b547a32
--- /dev/null
+++ b/application/forms/ImportSourceForm.php
@@ -0,0 +1,163 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Hook\ImportSourceHook;
+use Icinga\Module\Director\Objects\ImportSource;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+use Icinga\Web\Hook;
+
+class ImportSourceForm extends DirectorObjectForm
+{
+ public function setup()
+ {
+ $this->addElement('text', 'source_name', array(
+ 'label' => $this->translate('Import source name'),
+ 'description' => $this->translate(
+ 'A short name identifying this import source. Use something meaningful,'
+ . ' like "Hosts from Puppet", "Users from Active Directory" or similar'
+ ),
+ 'required' => true,
+ ));
+
+ $this->addElement('textarea', 'description', array(
+ 'label' => $this->translate('Description'),
+ 'description' => $this->translate(
+ 'An extended description for this Import Source. This should explain'
+ . " what kind of data you're going to import from this source."
+ ),
+ 'rows' => '3',
+ ));
+
+ $this->addElement('select', 'provider_class', array(
+ 'label' => $this->translate('Source Type'),
+ 'required' => true,
+ 'multiOptions' => $this->optionalEnum($this->enumSourceTypes()),
+ 'description' => $this->translate(
+ 'These are different data providers fetching data from various sources.'
+ . ' You didn\'t find what you\'re looking for? Import sources are implemented'
+ . ' as a hook in Director, so you might find (or write your own) Icinga Web 2'
+ . ' module fetching data from wherever you want'
+ ),
+ 'class' => 'autosubmit'
+ ));
+
+ $this->addSettings();
+ $this->setButtons();
+ }
+
+ public function getSentOrObjectSetting($name, $default = null)
+ {
+ if ($this->hasObject()) {
+ $value = $this->getSentValue($name);
+ if ($value === null) {
+ /** @var ImportSource $object */
+ $object = $this->getObject();
+
+ return $object->getSetting($name, $default);
+ } else {
+ return $value;
+ }
+ } else {
+ return $this->getSentValue($name, $default);
+ }
+ }
+
+ public function hasChangedSetting($name)
+ {
+ if ($this->hasBeenSent() && $this->hasObject()) {
+ /** @var ImportSource $object */
+ $object = $this->getObject();
+ return $object->getStoredSetting($name)
+ !== $this->getSentValue($name);
+ } else {
+ return false;
+ }
+ }
+
+ protected function addSettings()
+ {
+ if (! ($class = $this->getProviderClass())) {
+ return;
+ }
+
+ $defaultKeyCol = $this->getDefaultKeyColumnName();
+
+ $this->addElement('text', 'key_column', array(
+ 'label' => $this->translate('Key column name'),
+ 'description' => $this->translate(
+ 'This must be a column containing unique values like hostnames. Unless otherwise'
+ . ' specified this will then be used as the object_name for the syncronized'
+ . ' Icinga object. Especially when getting started with director please make'
+ . ' sure to strictly follow this rule. Duplicate values for this column on different'
+ . ' rows will trigger a failure, your import run will not succeed. Please pay attention'
+ . ' when synching services, as "purge" will only work correctly with a key_column'
+ . ' corresponding to host!name. Check the "Combine" property modifier in case your'
+ . ' data source cannot provide such a field'
+ ),
+ 'placeholder' => $defaultKeyCol,
+ 'required' => $defaultKeyCol === null,
+ ));
+
+ if (array_key_exists($class, $this->enumSourceTypes())) {
+ $class::addSettingsFormFields($this);
+ foreach ($this->object()->getSettings() as $key => $val) {
+ if ($el = $this->getElement($key)) {
+ $el->setValue($val);
+ }
+ }
+ }
+ }
+
+ protected function getDefaultKeyColumnName()
+ {
+ if (! ($class = $this->getProviderClass())) {
+ return null;
+ }
+
+ if (! class_exists($class)) {
+ return null;
+ }
+
+ return $class::getDefaultKeyColumnName();
+ }
+
+ protected function getProviderClass()
+ {
+ if ($this->hasBeenSent()) {
+ $class = $this->getRequest()->getPost('provider_class');
+ } else {
+ if (! ($class = $this->object()->get('provider_class'))) {
+ return null;
+ }
+ }
+
+ return $class;
+ }
+
+ public function onSuccess()
+ {
+ if (! $this->getValue('key_column')) {
+ if ($default = $this->getDefaultKeyColumnName()) {
+ $this->setElementValue('key_column', $default);
+ $this->object()->set('key_column', $default);
+ }
+ }
+
+ parent::onSuccess();
+ }
+
+ protected function enumSourceTypes()
+ {
+ /** @var ImportSourceHook[] $hooks */
+ $hooks = Hook::all('Director\\ImportSource');
+
+ $enum = array();
+ foreach ($hooks as $hook) {
+ $enum[get_class($hook)] = $hook->getName();
+ }
+ asort($enum);
+
+ return $enum;
+ }
+}
diff --git a/application/forms/KickstartForm.php b/application/forms/KickstartForm.php
new file mode 100644
index 0000000..0079cfb
--- /dev/null
+++ b/application/forms/KickstartForm.php
@@ -0,0 +1,482 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Exception;
+use Icinga\Application\Config;
+use Icinga\Data\ResourceFactory;
+use Icinga\Module\Director\Db;
+use Icinga\Module\Director\Db\Migrations;
+use Icinga\Module\Director\Objects\IcingaEndpoint;
+use Icinga\Module\Director\KickstartHelper;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+use ipl\Html\Html;
+use gipfl\IcingaWeb2\Link;
+
+class KickstartForm extends DirectorForm
+{
+ private $config;
+
+ private $storeConfigLabel;
+
+ private $createDbLabel;
+
+ private $migrateDbLabel;
+
+ /** @var IcingaEndpoint */
+ private $endpoint;
+
+ private $dbResourceName;
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ public function setup()
+ {
+ $this->storeConfigLabel = $this->translate('Store configuration');
+ $this->createDbLabel = $this->translate('Create database schema');
+ $this->migrateDbLabel = $this->translate('Apply schema migrations');
+
+ if ($this->dbResourceName === null) {
+ $this->addResourceConfigElements();
+ $this->addResourceDisplayGroup();
+
+ if (!$this->config()->get('db', 'resource')
+ || ($this->config()->get('db', 'resource') !== $this->getResourceName())) {
+ return;
+ }
+ }
+
+ if (!$this->hasBeenSent() && !$this->tryDbConnection()) {
+ return;
+ }
+
+ if (!$this->migrations()->hasSchema()) {
+ $this->addHtmlHint($this->translate(
+ 'No database schema has been created yet'
+ ), array('name' => 'HINT_schema'));
+
+ $this->addResourceDisplayGroup();
+ $this->setSubmitLabel($this->createDbLabel);
+ return;
+ }
+
+ if ($this->migrations()->hasPendingMigrations()) {
+ $this->addHtmlHint($this->translate(
+ 'There are pending database migrations'
+ ), array('name' => 'HINT_schema'));
+
+ $this->addResourceDisplayGroup();
+ $this->setSubmitLabel($this->migrateDbLabel);
+ return;
+ }
+
+ if (! $this->endpoint && $this->getDb()->hasDeploymentEndpoint()) {
+ $hint = Html::sprintf(
+ $this->translate('Your database looks good, you are ready to %s'),
+ Link::create(
+ $this->translate('start working with the Icinga Director'),
+ 'director',
+ null,
+ ['data-base-target' => '_main']
+ )
+ );
+
+ $this->addHtmlHint($hint, ['name' => 'HINT_ready']);
+ $this->getDisplayGroup('config')->addElements(
+ array($this->getElement('HINT_ready'))
+ );
+
+ return;
+ }
+
+ $this->addResourceDisplayGroup();
+
+ if ($this->getDb()->hasDeploymentEndpoint()) {
+ $this->addHtmlHint(
+ $this->translate(
+ 'Your configuration looks good. Still, you might want to re-run'
+ . ' this kickstart wizard to (re-)import modified or new manually'
+ . ' defined Command definitions or to get fresh new ITL commands'
+ . ' after an Icinga 2 Core upgrade.'
+ ),
+ array('name' => 'HINT_kickstart')
+ // http://docs.icinga.com/icinga2/latest/doc/module/icinga2/chapter/
+ // ... object-types#objecttype-apilistener
+ );
+ } else {
+ $this->addHtmlHint(
+ $this->translate(
+ 'Your installation of Icinga Director has not yet been prepared for'
+ . ' deployments. This kickstart wizard will assist you with setting'
+ . ' up the connection to your Icinga 2 server.'
+ ),
+ array('name' => 'HINT_kickstart')
+ // http://docs.icinga.com/icinga2/latest/doc/module/icinga2/chapter/
+ // ... object-types#objecttype-apilistener
+ );
+ }
+
+ $this->addElement('text', 'endpoint', array(
+ 'label' => $this->translate('Endpoint Name'),
+ 'description' => $this->translate(
+ 'This is the name of the Endpoint object (and certificate name) you'
+ . ' created for your ApiListener object. In case you are unsure what'
+ . ' this means please make sure to read the documentation first'
+ ),
+ 'required' => true,
+ ));
+
+ $this->addElement('text', 'host', array(
+ 'label' => $this->translate('Icinga Host'),
+ 'description' => $this->translate(
+ 'IP address / hostname of your Icinga node. Please note that this'
+ . ' information will only be used for the very first connection to'
+ . ' your Icinga instance. The Director then relies on a correctly'
+ . ' configured Endpoint object. Correctly configures means that either'
+ . ' it\'s name is resolvable or that it\'s host property contains'
+ . ' either an IP address or a resolvable host name. Your Director must'
+ . ' be able to reach this endpoint'
+ ),
+ 'required' => false,
+ ));
+
+ $this->addElement('text', 'port', array(
+ 'label' => $this->translate('Port'),
+ 'value' => '5665',
+ 'description' => $this->translate(
+ 'The port you are going to use. The default port 5665 will be used'
+ . ' if none is set'
+ ),
+ 'required' => false,
+ ));
+
+ $this->addElement('text', 'username', array(
+ 'label' => $this->translate('API user'),
+ 'description' => $this->translate(
+ 'Your Icinga 2 API username'
+ ),
+ 'required' => true,
+ ));
+
+ $this->addElement('password', 'password', array(
+ 'label' => $this->translate('Password'),
+ 'description' => $this->translate(
+ 'The corresponding password'
+ ),
+ 'required' => true,
+ ));
+
+ if ($ep = $this->endpoint) {
+ $user = $ep->getApiUser();
+ $this->setDefaults(array(
+ 'endpoint' => $ep->get('object_name'),
+ 'host' => $ep->get('host'),
+ 'port' => $ep->get('port'),
+ 'username' => $user->get('object_name'),
+ 'password' => $user->get('password'),
+ ));
+
+ if (! empty($user->password)) {
+ $this->getElement('password')->setAttrib(
+ 'placeholder',
+ '(use stored password)'
+ )->setRequired(false);
+ }
+ }
+
+ $this->addKickstartDisplayGroup();
+ $this->setSubmitLabel($this->translate('Run import'));
+ }
+
+ /**
+ * @throws \Icinga\Exception\ConfigurationError
+ */
+ protected function onSetup()
+ {
+ if ($this->hasBeenSubmitted()) {
+ // Do not hinder the form from being stored
+ return;
+ }
+
+ $this->tryDbConnection();
+ }
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ protected function addResourceConfigElements()
+ {
+ $config = $this->config();
+ $resources = $this->enumResources();
+
+ if (!$this->getResourceName()) {
+ $this->addHtmlHint($this->translate(
+ 'No database resource has been configured yet. Please choose a'
+ . ' resource to complete your config'
+ ), array('name' => 'HINT_no_resource'));
+ }
+
+ $this->addElement('select', 'resource', array(
+ 'required' => true,
+ 'label' => $this->translate('DB Resource'),
+ 'multiOptions' => $this->optionalEnum($resources),
+ 'class' => 'autosubmit',
+ 'value' => $config->get('db', 'resource')
+ ));
+
+ if (empty($resources)) {
+ $this->getElement('resource')->addError(
+ $this->translate('This has to be a MySQL or PostgreSQL database')
+ );
+
+ $this->addHtmlHint(Html::sprintf(
+ $this->translate('Please click %s to create new DB resources'),
+ Link::create(
+ $this->translate('here'),
+ 'config/resource',
+ null,
+ ['data-base-target' => '_main']
+ )
+ ));
+ }
+
+ $this->setSubmitLabel($this->storeConfigLabel);
+ }
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ protected function addResourceDisplayGroup()
+ {
+ if ($this->dbResourceName !== null) {
+ return;
+ }
+
+ $elements = array(
+ 'HINT_no_resource',
+ 'resource',
+ 'HINT_ready',
+ 'HINT_schema',
+ 'HINT_db_perms',
+ 'HINT_config_store'
+ );
+
+ $this->addDisplayGroup($elements, 'config', array(
+ 'decorators' => array(
+ 'FormElements',
+ array('HtmlTag', array('tag' => 'dl')),
+ 'Fieldset',
+ ),
+ 'order' => 40,
+ 'legend' => $this->translate('Database backend')
+ ));
+ }
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ protected function addKickstartDisplayGroup()
+ {
+ $elements = array(
+ 'HINT_kickstart', 'endpoint', 'host', 'port', 'username', 'password'
+ );
+
+ $this->addDisplayGroup($elements, 'wizard', array(
+ 'decorators' => array(
+ 'FormElements',
+ array('HtmlTag', array('tag' => 'dl')),
+ 'Fieldset',
+ ),
+ 'order' => 60,
+ 'legend' => $this->translate('Kickstart Wizard')
+ ));
+ }
+
+ /**
+ * @return bool
+ * @throws \Zend_Form_Exception
+ */
+ protected function storeResourceConfig()
+ {
+ $config = $this->config();
+ $value = $this->getValue('resource');
+
+ $config->setSection('db', array('resource' => $value));
+
+ try {
+ $config->saveIni();
+ $this->setSuccessMessage($this->translate('Configuration has been stored'));
+
+ return true;
+ } catch (Exception $e) {
+ $this->getElement('resource')->addError(
+ sprintf(
+ $this->translate(
+ 'Unable to store the configuration to "%s". Please check'
+ . ' file permissions or manually store the content shown below'
+ ),
+ $config->getConfigFile()
+ )
+ );
+ $this->addHtmlHint(
+ Html::tag('pre', null, (string) $config),
+ array('name' => 'HINT_config_store')
+ );
+
+ $this->getDisplayGroup('config')->addElements(
+ array($this->getElement('HINT_config_store'))
+ );
+ $this->removeElement('HINT_ready');
+
+ return false;
+ }
+ }
+
+ public function setEndpoint(IcingaEndpoint $endpoint)
+ {
+ $this->endpoint = $endpoint;
+ return $this;
+ }
+
+ /**
+ * @throws \Icinga\Exception\ProgrammingError
+ * @throws \Zend_Form_Exception
+ */
+ public function onSuccess()
+ {
+ if ($this->getSubmitLabel() === $this->storeConfigLabel) {
+ if ($this->storeResourceConfig()) {
+ parent::onSuccess();
+ } else {
+ return;
+ }
+ }
+
+ if ($this->getSubmitLabel() === $this->createDbLabel
+ || $this->getSubmitLabel() === $this->migrateDbLabel) {
+ $this->migrations()->applyPendingMigrations();
+ parent::onSuccess();
+ }
+
+ $values = $this->getValues();
+ if ($this->endpoint && empty($values['password'])) {
+ $values['password'] = $this->endpoint->getApiUser()->password;
+ }
+
+ $kickstart = new KickstartHelper($this->getDb());
+ unset($values['resource']);
+ $kickstart->setConfig($values)->run();
+
+ parent::onSuccess();
+ }
+
+ public function setDbResourceName($name)
+ {
+ $this->dbResourceName = $name;
+
+ return $this;
+ }
+
+ protected function getResourceName()
+ {
+ if ($this->dbResourceName !== null) {
+ return $this->dbResourceName;
+ }
+
+ if ($this->hasBeenSent()) {
+ $resource = $this->getSentValue('resource');
+ $resources = $this->enumResources();
+ if (in_array($resource, $resources)) {
+ return $resource;
+ } else {
+ return null;
+ }
+ } else {
+ return $this->config()->get('db', 'resource');
+ }
+ }
+
+ public function getDb()
+ {
+ return Db::fromResourceName($this->getResourceName());
+ }
+
+ protected function getResource()
+ {
+ return ResourceFactory::create($this->getResourceName());
+ }
+
+ /**
+ * @return Migrations
+ */
+ protected function migrations()
+ {
+ return new Migrations($this->getDb());
+ }
+
+ public function setModuleConfig(Config $config)
+ {
+ $this->config = $config;
+ return $this;
+ }
+
+ protected function config()
+ {
+ if ($this->config === null) {
+ $this->config = Config::module('director');
+ }
+
+ return $this->config;
+ }
+
+ protected function enumResources()
+ {
+ $resources = array();
+ $allowed = array('mysql', 'pgsql');
+
+ foreach (ResourceFactory::getResourceConfigs() as $name => $resource) {
+ if ($resource->get('type') === 'db' && in_array($resource->get('db'), $allowed)) {
+ $resources[$name] = $name;
+ }
+ }
+
+ return $resources;
+ }
+
+ protected function tryDbConnection()
+ {
+ if ($resourceName = $this->getResourceName()) {
+ $resourceConfig = ResourceFactory::getResourceConfig($resourceName);
+ if (!isset($resourceConfig->charset)
+ || !in_array($resourceConfig->charset, array('utf8', 'utf8mb4', 'UTF8', 'UTF-8'))
+ ) {
+ if ($resource = $this->getElement('resource')) {
+ $resource->addError('Please change the encoding for the director database to utf8');
+ } else {
+ $this->addError('Please change the encoding for the director database to utf8');
+ }
+ }
+
+ $resource = $this->getResource();
+ $db = $resource->getDbAdapter();
+
+ try {
+ $db->fetchOne('SELECT 1');
+ return true;
+ } catch (Exception $e) {
+ $this->getElement('resource')
+ ->addError('Could not connect to database: ' . $e->getMessage());
+
+ $hint = $this->translate(
+ 'Please make sure that your database exists and your user has'
+ . ' been granted enough permissions'
+ );
+
+ $this->addHtmlHint($hint, array('name' => 'HINT_db_perms'));
+ }
+ }
+
+ return false;
+ }
+}
diff --git a/application/forms/RemoveLinkForm.php b/application/forms/RemoveLinkForm.php
new file mode 100644
index 0000000..6f0c7cc
--- /dev/null
+++ b/application/forms/RemoveLinkForm.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use gipfl\IcingaWeb2\Icon;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+
+class RemoveLinkForm extends DirectorForm
+{
+ private $label;
+
+ private $title;
+
+ private $onSuccessAction;
+
+ public function __construct($label, $title, $action, $params = [])
+ {
+ // Required to detect the right instance
+ $this->formName = 'RemoveSet' . sha1(json_encode($params));
+ parent::__construct([
+ 'style' => 'float: right',
+ 'data-base-target' => '_self'
+ ]);
+ $this->label = $label;
+ $this->title = $title;
+ foreach ($params as $name => $value) {
+ $this->addHidden($name, $value);
+ }
+ $this->setAction($action);
+ }
+
+ public function runOnSuccess($action)
+ {
+ $this->onSuccessAction = $action;
+
+ return $this;
+ }
+
+ public function setup()
+ {
+ $this->setAttrib('class', 'inline');
+ $this->addHtml(Icon::create('cancel'));
+ $this->addSubmitButton($this->label, [
+ 'class' => 'link-button',
+ 'title' => $this->title,
+ ]);
+ }
+
+ public function onSuccess()
+ {
+ if ($this->onSuccessAction !== null) {
+ $func = $this->onSuccessAction;
+ $func();
+ $this->redirectOnSuccess(
+ $this->translate('Service Set has been removed')
+ );
+ }
+ }
+}
diff --git a/application/forms/RestoreBasketForm.php b/application/forms/RestoreBasketForm.php
new file mode 100644
index 0000000..90d5b38
--- /dev/null
+++ b/application/forms/RestoreBasketForm.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Application\Config;
+use Icinga\Authentication\Auth;
+use Icinga\Module\Director\Db;
+use Icinga\Module\Director\DirectorObject\Automation\BasketSnapshot;
+use Icinga\Module\Director\Web\Controller\Extension\DirectorDb;
+use Icinga\Module\Director\Web\Form\QuickForm;
+
+class RestoreBasketForm extends QuickForm
+{
+ use DirectorDb;
+
+ /** @var BasketSnapshot */
+ private $snapshot;
+
+ public function setSnapshot(BasketSnapshot $snapshot)
+ {
+ $this->snapshot = $snapshot;
+
+ return $this;
+ }
+
+ /**
+ * @codingStandardsIgnoreStart
+ * @return Auth
+ */
+ protected function Auth()
+ {
+ return Auth::getInstance();
+ }
+
+ /**
+ * @return Config
+ */
+ protected function Config()
+ {
+ // @codingStandardsIgnoreEnd
+ return Config::module('director');
+ }
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ public function setup()
+ {
+ $allowedDbs = $this->listAllowedDbResourceNames();
+ $this->addElement('select', 'target_db', [
+ 'label' => $this->translate('Target DB'),
+ 'description' => $this->translate('Restore to this target Director DB'),
+ 'multiOptions' => $allowedDbs,
+ 'value' => $this->getRequest()->getParam('target_db', $this->getFirstDbResourceName()),
+ 'class' => 'autosubmit',
+ ]);
+
+ $this->setSubmitLabel($this->translate('Restore'));
+ }
+
+ public function getDb()
+ {
+ return Db::fromResourceName($this->getValue('target_db'));
+ }
+
+ /**
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ public function onSuccess()
+ {
+ $this->snapshot->restoreTo($this->getDb());
+ $this->setSuccessUrl($this->getSuccessUrl()->with('target_db', $this->getValue('target_db')));
+ $this->setSuccessMessage(sprintf('Restored to %s', $this->getValue('target_db')));
+
+ parent::onSuccess();
+ }
+}
diff --git a/application/forms/RestoreObjectForm.php b/application/forms/RestoreObjectForm.php
new file mode 100644
index 0000000..e665d65
--- /dev/null
+++ b/application/forms/RestoreObjectForm.php
@@ -0,0 +1,92 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Exception\NotFoundError;
+use Icinga\Exception\NotImplementedError;
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+
+class RestoreObjectForm extends DirectorForm
+{
+ /** @var IcingaObject */
+ protected $object;
+
+ public function setup()
+ {
+ $this->addSubmitButton($this->translate('Restore former object'));
+ }
+
+ public function onSuccess()
+ {
+ $object = $this->object;
+ $name = $object->getObjectName();
+ $db = $this->db;
+
+ $keyParams = $object->getKeyParams();
+
+ if ($object->supportsApplyRules() && $object->get('object_type') === 'apply') {
+ // TODO: not all apply should be considered unique by name + object_type
+ $query = $db->getDbAdapter()
+ ->select()
+ ->from($object->getTableName())
+ ->where('object_type = ?', 'apply')
+ ->where('object_name = ?', $name);
+
+ $rules = $object::loadAll($db, $query);
+
+ if (empty($rules)) {
+ $existing = null;
+ } elseif (count($rules) === 1) {
+ $existing = current($rules);
+ } else {
+ // TODO: offer drop down?
+ throw new NotImplementedError(
+ "Found multiple apply rule matching name '%s', can not restore!",
+ $name
+ );
+ }
+ } else {
+ try {
+ $existing = $object::load($keyParams, $db);
+ } catch (NotFoundError $e) {
+ $existing = null;
+ }
+ }
+
+ if ($existing !== null) {
+ $typeExisting = $existing->get('object_type');
+ $typeObject = $object->get('object_type');
+ if ($typeExisting !== $typeObject) {
+ // Not sure when that may occur
+ throw new NotImplementedError(
+ 'Found existing object has a mismatching object_type: %s != %s',
+ $typeExisting,
+ $typeObject
+ );
+ }
+
+ $existing->replaceWith($object);
+
+ if ($existing->hasBeenModified()) {
+ $msg = $this->translate('Object has been restored');
+ $existing->store();
+ } else {
+ $msg = $this->translate(
+ 'Nothing to do, restore would not modify the current object'
+ );
+ }
+ } else {
+ $msg = $this->translate('Object has been re-created');
+ $object->store($db);
+ }
+
+ $this->redirectOnSuccess($msg);
+ }
+
+ public function setObject(IcingaObject $object)
+ {
+ $this->object = $object;
+ return $this;
+ }
+}
diff --git a/application/forms/SelfServiceSettingsForm.php b/application/forms/SelfServiceSettingsForm.php
new file mode 100644
index 0000000..4471bcf
--- /dev/null
+++ b/application/forms/SelfServiceSettingsForm.php
@@ -0,0 +1,306 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Exception;
+use Icinga\Module\Director\Db;
+use Icinga\Module\Director\Settings;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+
+class SelfServiceSettingsForm extends DirectorForm
+{
+ /** @var Settings */
+ protected $settings;
+
+ public function setup()
+ {
+ $settings = $this->settings;
+ $this->addElement('select', 'agent_name', [
+ 'label' => $this->translate('Host Name'),
+ 'description' => $this->translate(
+ 'What to use as your Icinga 2 Agent\'s Host Name'
+ ),
+ 'multiOptions' => [
+ 'fqdn' => $this->translate('Fully qualified domain name (FQDN)'),
+ 'hostname' => $this->translate('Host name (local part, without domain)'),
+ ],
+ 'value' => $settings->getStoredOrDefaultValue('self-service/agent_name')
+ ]);
+
+ $this->addElement('select', 'transform_hostname', [
+ 'label' => $this->translate('Transform Host Name'),
+ 'description' => $this->translate(
+ 'Whether to adjust your host name'
+ ),
+ 'multiOptions' => [
+ '0' => $this->translate('Do not transform at all'),
+ '1' => $this->translate('Transform to lowercase'),
+ '2' => $this->translate('Transform to uppercase'),
+ ],
+ 'value' => $settings->getStoredOrDefaultValue('self-service/transform_hostname')
+ ]);
+ $this->addElement('select', 'resolve_parent_host', [
+ 'label' => $this->translate('Transform Parent Host to IP'),
+ 'description' => $this->translate(
+ 'This is only important in case your master/satellite nodes do not'
+ . ' have IP addresses as their "host" property. The Agent can be'
+ . ' told to issue related DNS lookups on it\' own'
+ ),
+ 'multiOptions' => [
+ '0' => $this->translate("Don't care, my host settings are fine"),
+ '1' => $this->translate('My Agents should use DNS to look up Endpoint names'),
+ ],
+ 'value' => $settings->getStoredOrDefaultValue('self-service/resolve_parent_host')
+ ]);
+
+ $this->addElement('extensibleSet', 'global_zones', [
+ 'label' => $this->translate('Global Zones'),
+ 'description' => $this->translate(
+ 'To ensure downloaded packages are build by the Icinga Team'
+ . ' and not compromised by third parties, you will be able'
+ . ' to provide an array of SHA1 hashes here. In case you have'
+ . ' defined any hashses, the module will not continue with'
+ . ' updating / installing the Agent in case the SHA1 hash of'
+ . ' the downloaded MSI package is not matching one of the'
+ . ' provided hashes of this setting'
+ ),
+ 'multiOptions' => $this->enumGlobalZones(),
+ 'value' => $settings->getStoredOrDefaultValue('self-service/global_zones'),
+ ]);
+
+ $this->addElement('select', 'download_type', [
+ 'label' => $this->translate('Installation Source'),
+ 'description' => $this->translate(
+ 'You might want to let the generated Powershell script install'
+ . ' the Icinga 2 Agent in an automated way. If so, please choose'
+ . ' where your Windows nodes should fetch the Agent installer'
+ ),
+ 'multiOptions' => [
+ null => $this->translate('- no automatic installation -'),
+ // TODO: not yet
+ // 'director' => $this->translate('Download via the Icinga Director'),
+ 'icinga' => $this->translate('Download from packages.icinga.com'),
+ 'url' => $this->translate('Download from a custom url'),
+ 'file' => $this->translate('Use a local file or network share'),
+ ],
+ 'value' => $settings->getStoredOrDefaultValue('self-service/download_type'),
+ 'class' => 'autosubmit'
+ ]);
+
+ $downloadType = $this->getSentValue(
+ 'download_type',
+ $settings->getStoredOrDefaultValue('self-service/download_type')
+ );
+
+ if ($downloadType) {
+ $this->addInstallSettings($downloadType, $settings);
+ }
+
+ $this->addEventuallyConfiguredBoolean('flush_api_dir', [
+ 'label' => $this->translate('Flush API directory'),
+ 'description' => $this->translate(
+ 'In case the Icinga Agent will accept configuration from the parent'
+ . ' Icinga 2 system, it will possibly write data to /var/lib/icinga2/api/*.'
+ . ' By setting this parameter to true, all content inside the api directory'
+ . ' will be flushed before an eventual restart of the Icinga 2 Agent'
+ ),
+ 'required' => true,
+ ]);
+ }
+
+ protected function addInstallSettings($downloadType, Settings $settings)
+ {
+ $this->addElement('text', 'download_url', [
+ 'label' => $this->translate('Source Path'),
+ 'description' => $this->translate(
+ 'Define a download Url or local directory from which the a specific'
+ . ' Icinga 2 Agent MSI Installer package should be fetched. Please'
+ . ' ensure to only define the base download Url or Directory. The'
+ . ' Module will generate the MSI file name based on your operating'
+ . ' system architecture and the version to install. The Icinga 2 MSI'
+ . ' Installer name is internally build as follows:'
+ . ' Icinga2-v[InstallAgentVersion]-[OSArchitecture].msi (full example:'
+ . ' Icinga2-v2.6.3-x86_64.msi)'
+ ),
+ 'value' => $settings->getStoredOrDefaultValue('self-service/download_url'),
+ ]);
+
+ // TODO: offer to check for available versions
+ if ($downloadType === 'icinga') {
+ $el = $this->getElement('download_url');
+ $el->setAttrib('disabled', 'disabled');
+ $value = 'https://packages.icinga.com/windows/';
+ $el->setValue($value);
+ $this->setSentValue('download_url', $value);
+ }
+ if ($downloadType === 'director') {
+ $el = $this->getElement('download_url');
+ $el->setAttrib('disabled', 'disabled');
+
+ $r = $this->getRequest();
+ $scheme = $r->getServer('HTTP_X_FORWARDED_PROTO', $r->getScheme());
+
+ $value = sprintf(
+ '%s://%s%s/director/download/windows/',
+ $scheme,
+ $r->getHttpHost(),
+ $this->getRequest()->getBaseUrl()
+ );
+ $el->setValue($value);
+ $this->setSentValue('download_url', $value);
+ }
+
+ $this->addElement('text', 'agent_version', [
+ 'label' => $this->translate('Agent Version'),
+ 'description' => $this->translate(
+ 'In case the Icinga 2 Agent should be automatically installed,'
+ . ' this has to be a string value like: 2.6.3'
+ ),
+ 'value' => $settings->getStoredOrDefaultValue('self-service/agent_version'),
+ 'required' => true,
+ ]);
+
+ $hashes = $settings->getStoredOrDefaultValue('self-service/installer_hashes');
+ $this->addElement('extensibleSet', 'installer_hashes', [
+ 'label' => $this->translate('Installer Hashes'),
+ 'description' => $this->translate(
+ 'To ensure downloaded packages are build by the Icinga Team'
+ . ' and not compromised by third parties, you will be able'
+ . ' to provide an array of SHA1 hashes here. In case you have'
+ . ' defined any hashses, the module will not continue with'
+ . ' updating / installing the Agent in case the SHA1 hash of'
+ . ' the downloaded MSI package is not matching one of the'
+ . ' provided hashes of this setting'
+ ),
+ 'value' => $hashes,
+ ]);
+
+ $this->addElement('text', 'icinga_service_user', [
+ 'label' => $this->translate('Service User'),
+ 'description' => $this->translate(
+ 'The user that should run the Icinga 2 service on Windows.'
+ ),
+ 'value' => $settings->getStoredOrDefaultValue('self-service/icinga_service_user'),
+ ]);
+
+ $this->addEventuallyConfiguredBoolean('allow_updates', [
+ 'label' => $this->translate('Allow Updates'),
+ 'description' => $this->translate(
+ 'In case the Icinga 2 Agent is already installed on the system,'
+ . ' this parameter will allow you to configure if you wish to'
+ . ' upgrade / downgrade to a specified version with the as well.'
+ ),
+ 'required' => true,
+ ]);
+
+ $this->addNscpSettings();
+ }
+
+ protected function addNscpSettings()
+ {
+ $this->addEventuallyConfiguredBoolean('install_nsclient', [
+ 'label' => $this->translate('Install NSClient++'),
+ 'description' => $this->translate(
+ 'Also install NSClient++. It can be used through the Icinga Agent'
+ . ' and comes with a bunch of additional Check Plugins'
+ ),
+ 'required' => true,
+ ]);
+ /*
+ * TODO: eventually add those:
+ if ($settings->get('self-service/install_nsclient') === 'y') {
+ $params['install_nsclient'] = true;
+ $this->addBooleanSettingsToParams($settings, [
+ 'nsclient_add_defaults',
+ 'nsclient_firewall',
+ 'nsclient_service',
+ ], $params);
+
+
+ $this->addStringSettingsToParams($settings, [
+ 'nsclient_directory',
+ 'nsclient_installer_path'
+ ], $params);
+ }
+ */
+ }
+
+ public static function create(Db $db, Settings $settings)
+ {
+ return static::load()->setDb($db)->setSettings($settings);
+ }
+
+ protected function addEventuallyConfiguredBoolean($name, $params)
+ {
+ $key = "self-service/$name";
+ $value = $this->settings->getStoredValue($key);
+ $params['value'] = $value;
+ $params['multiOptions'] = $this->eventuallyConfiguredEnum($name, [
+ 'y' => $this->translate('Yes'),
+ 'n' => $this->translate('No'),
+ ]);
+
+ return $this->addElement('select', $name, $params);
+ }
+
+ protected function eventuallyConfiguredEnum($name, $enum)
+ {
+ $key = "self-service/$name";
+ $default = $this->settings->getDefaultValue($key);
+ if ($default === null) {
+ return [
+ null => $this->translate('- please choose -')
+ ] + $enum;
+ } else {
+ return [
+ null => sprintf($this->translate('%s (default)'), $enum[$default])
+ ] + $enum;
+ }
+ }
+
+ protected function setSentValue($key, $value)
+ {
+ $this->getRequest()->setPost($key, $value);
+ return $this;
+ }
+
+ protected function enumGlobalZones()
+ {
+ $db = $this->getDb()->getDbAdapter();
+ $zones = $db->fetchCol(
+ $db->select()->from('icinga_zone', 'object_name')
+ ->where('disabled = ?', 'n')
+ ->where('is_global = ?', 'y')
+ ->order('object_name')
+ );
+
+ return array_combine($zones, $zones);
+ }
+
+ public function setSettings(Settings $settings)
+ {
+ $this->settings = $settings;
+ return $this;
+ }
+
+ public function onSuccess()
+ {
+ try {
+ foreach ($this->getValues() as $key => $value) {
+ if ($value === '') {
+ $value = null;
+ }
+
+ $this->settings->set("self-service/$key", $value);
+ }
+
+ $this->setSuccessMessage($this->translate(
+ 'Self Service Settings have been stored'
+ ));
+
+ parent::onSuccess();
+ } catch (Exception $e) {
+ $this->addException($e);
+ }
+ }
+}
diff --git a/application/forms/SettingsForm.php b/application/forms/SettingsForm.php
new file mode 100644
index 0000000..f6ba654
--- /dev/null
+++ b/application/forms/SettingsForm.php
@@ -0,0 +1,238 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Exception;
+use Icinga\Module\Director\Settings;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+
+class SettingsForm extends DirectorForm
+{
+ /** @var Settings */
+ protected $settings;
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ public function setup()
+ {
+ $settings = $this->settings;
+
+ $this->addHtmlHint(
+ $this->translate(
+ 'Please only change those settings in case you are really sure'
+ . ' that you are required to do so. Usually the defaults chosen'
+ . ' by the Icinga Director should make a good fit for your'
+ . ' environment.'
+ )
+ );
+ $globalZones = $this->eventuallyConfiguredEnum('default_global_zone', $this->enumGlobalZones());
+
+ $this->addElement('select', 'default_global_zone', array(
+ 'label' => $this->translate('Default global zone'),
+ 'multiOptions' => $globalZones,
+ 'description' => $this->translate(
+ 'Icinga Director decides to deploy objects like CheckCommands'
+ . ' to a global zone. This defaults to "director-global" but'
+ . ' might be adjusted to a custom Zone name'
+ ),
+ 'value' => $settings->getStoredValue('default_global_zone')
+ ));
+
+ $this->addElement('text', 'icinga_package_name', array(
+ 'label' => $this->translate('Icinga Package Name'),
+ 'description' => $this->translate(
+ 'The Icinga Package name Director uses to deploy it\'s configuration.'
+ . ' This defaults to "director" and should not be changed unless'
+ . ' you really know what you\'re doing'
+ ),
+ 'placeholder' => $settings->get('icinga_package_name'),
+ 'value' => $settings->getStoredValue('icinga_package_name')
+ ));
+
+ $this->addElement('select', 'disable_all_jobs', array(
+ 'label' => $this->translate('Disable all Jobs'),
+ 'multiOptions' => $this->eventuallyConfiguredEnum(
+ 'disable_all_jobs',
+ array(
+ 'n' => $this->translate('No'),
+ 'y' => $this->translate('Yes'),
+ )
+ ),
+ 'description' => $this->translate(
+ 'Whether all configured Jobs should be disabled'
+ ),
+ 'value' => $settings->getStoredValue('disable_all_jobs')
+ ));
+
+ $this->addElement('select', 'enable_audit_log', array(
+ 'label' => $this->translate('Enable audit log'),
+ 'multiOptions' => $this->eventuallyConfiguredEnum(
+ 'enable_audit_log',
+ array(
+ 'n' => $this->translate('No'),
+ 'y' => $this->translate('Yes'),
+ )
+ ),
+ 'description' => $this->translate(
+ 'All changes are tracked in the Director database. In addition'
+ . ' you might also want to send an audit log through the Icinga'
+ . " Web 2 logging mechanism. That way all changes would be"
+ . ' written to either Syslog or the configured log file. When'
+ . ' enabling this please make sure that you configured Icinga'
+ . ' Web 2 to log at least at "informational" level.'
+ ),
+ 'value' => $settings->getStoredValue('enable_audit_log')
+ ));
+
+ if ($settings->getStoredValue('ignore_bug7530')) {
+ // Show this only for those who touched this setting
+ $this->addElement('select', 'ignore_bug7530', array(
+ 'label' => $this->translate('Ignore Bug #7530'),
+ 'multiOptions' => $this->eventuallyConfiguredEnum(
+ 'ignore_bug7530',
+ array(
+ 'n' => $this->translate('No'),
+ 'y' => $this->translate('Yes'),
+ )
+ ),
+ 'description' => $this->translate(
+ 'Icinga v2.11.0 breaks some configurations, the Director will'
+ . ' warn you before every deployment in case your config is'
+ . ' affected. This setting allows to hide this warning.'
+ ),
+ 'value' => $settings->getStoredValue('ignore_bug7530')
+ ));
+ }
+
+ $this->addBoolean('feature_custom_endpoint', [
+ 'label' => $this->translate('Feature: Custom Endpoint Name'),
+ 'description' => $this->translate(
+ 'Enabled the feature for custom endpoint names,'
+ . ' where you can choose a different name for the generated endpoint object.'
+ . ' This uses some Icinga config snippets and a special custom variable.'
+ . ' Please do NOT enable this, unless you really need divergent endpoint names!'
+ ),
+ 'value' => $settings->getStoredValue('feature_custom_endpoint')
+ ]);
+
+
+ $this->addElement('select', 'config_format', array(
+ 'label' => $this->translate('Configuration format'),
+ 'multiOptions' => $this->eventuallyConfiguredEnum(
+ 'config_format',
+ array(
+ 'v2' => $this->translate('Icinga v2.x'),
+ 'v1' => $this->translate('Icinga v1.x'),
+ )
+ ),
+ 'description' => $this->translate(
+ 'Default configuration format. Please note that v1.x is for'
+ . ' special transitional projects only and completely'
+ . ' unsupported. There are no plans to make Director a first-'
+ . 'class configuration backends for Icinga 1.x'
+ ),
+ 'class' => 'autosubmit',
+ 'value' => $settings->getStoredValue('config_format')
+ ));
+
+ $this->setSubmitLabel($this->translate('Store'));
+
+ if ($this->hasBeenSent()) {
+ if ($this->getSentValue('config_format') !== 'v1') {
+ return;
+ }
+ } elseif ($settings->getStoredValue('config_format') !== 'v1') {
+ return;
+ }
+
+ $this->addElement('select', 'deployment_mode_v1', array(
+ 'label' => $this->translate('Deployment mode'),
+ 'multiOptions' => $this->eventuallyConfiguredEnum(
+ 'deployment_mode_v1',
+ array(
+ 'active-passive' => $this->translate('Active-Passive'),
+ 'masterless' => $this->translate('Master-less'),
+ )
+ ),
+ 'description' => $this->translate(
+ 'Deployment mode for Icinga 1 configuration'
+ ),
+ 'value' => $settings->getStoredValue('deployment_mode_v1')
+ ));
+
+ $this->addElement('text', 'deployment_path_v1', array(
+ 'label' => $this->translate('Deployment Path'),
+ 'description' => $this->translate(
+ 'Local directory to deploy Icinga 1.x configuration.'
+ . ' Must be writable by icingaweb2.'
+ . ' (e.g. /etc/icinga/director)'
+ ),
+ 'value' => $settings->getStoredValue('deployment_path_v1')
+ ));
+
+ $this->addElement('text', 'activation_script_v1', array(
+ 'label' => $this->translate('Activation Tool'),
+ 'description' => $this->translate(
+ 'Script or tool to call when activating a new configuration stage.'
+ . ' (e.g. sudo /usr/local/bin/icinga-director-activate)'
+ . ' (name of the stage will be the argument for the script)'
+ ),
+ 'value' => $settings->getStoredValue('activation_script_v1')
+ ));
+ }
+
+ protected function eventuallyConfiguredEnum($name, $enum)
+ {
+ if (array_key_exists($name, $enum)) {
+ $default = sprintf(
+ $this->translate('%s (default)'),
+ $enum[$this->settings->getDefaultValue($name)]
+ );
+ } else {
+ $default = $this->translate('- please choose -');
+ }
+
+ return [null => $default] + $enum;
+ }
+
+ public function setSettings(Settings $settings)
+ {
+ $this->settings = $settings;
+ return $this;
+ }
+
+ protected function enumGlobalZones()
+ {
+ $db = $this->settings->getDb();
+ $zones = $db->fetchCol(
+ $db->select()->from('icinga_zone', 'object_name')
+ ->where('disabled = ?', 'n')
+ ->where('is_global = ?', 'y')
+ ->order('object_name')
+ );
+
+ return array_combine($zones, $zones);
+ }
+
+ public function onSuccess()
+ {
+ try {
+ foreach ($this->getValues() as $key => $value) {
+ if ($value === '') {
+ $value = null;
+ }
+
+ $this->settings->set($key, $value);
+ }
+
+ $this->setSuccessMessage($this->translate(
+ 'Settings have been stored'
+ ));
+
+ parent::onSuccess();
+ } catch (Exception $e) {
+ $this->addError($e->getMessage());
+ }
+ }
+}
diff --git a/application/forms/SyncCheckForm.php b/application/forms/SyncCheckForm.php
new file mode 100644
index 0000000..8fb3bd0
--- /dev/null
+++ b/application/forms/SyncCheckForm.php
@@ -0,0 +1,69 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Objects\DirectorActivityLog;
+use Icinga\Module\Director\Objects\SyncRule;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+
+class SyncCheckForm extends DirectorForm
+{
+ /** @var SyncRule */
+ protected $rule;
+
+ public function setSyncRule(SyncRule $rule)
+ {
+ $this->rule = $rule;
+ return $this;
+ }
+
+ public function setup()
+ {
+ $this->submitLabel = false;
+ $this->addElement('submit', 'submit', array(
+ 'label' => $this->translate('Check for changes'),
+ 'decorators' => array('ViewHelper')
+ ));
+ }
+
+ public function onSuccess()
+ {
+ if ($this->rule->checkForChanges()) {
+ $this->notifySuccess(
+ $this->translate(('This Sync Rule would apply new changes'))
+ );
+ $sum = [
+ DirectorActivityLog::ACTION_CREATE => 0,
+ DirectorActivityLog::ACTION_MODIFY => 0,
+ DirectorActivityLog::ACTION_DELETE => 0
+ ];
+
+ // TODO: Preview them? Like "hosta, hostb and 4 more would be...
+ foreach ($this->rule->getExpectedModifications() as $object) {
+ if ($object->shouldBeRemoved()) {
+ $sum[DirectorActivityLog::ACTION_DELETE]++;
+ } elseif (! $object->hasBeenLoadedFromDb()) {
+ $sum[DirectorActivityLog::ACTION_CREATE]++;
+ } elseif ($object->hasBeenModified()) {
+ $sum[DirectorActivityLog::ACTION_MODIFY]++;
+ }
+ }
+
+ /**
+ if ($sum['modify'] === 1) {
+ $html .= $this->translate('One object would be modified'
+ } elseif ($sum['modify'] > 1) {
+ }
+ */
+ $html = '<pre>' . print_r($sum, 1) . '</pre>';
+
+ $this->addHtml($html);
+ } elseif ($this->rule->get('sync_state') === 'in-sync') {
+ $this->notifySuccess(
+ $this->translate('Nothing would change, this rule is still in sync')
+ );
+ } else {
+ $this->addError($this->translate('Checking this sync rule failed'));
+ }
+ }
+}
diff --git a/application/forms/SyncPropertyForm.php b/application/forms/SyncPropertyForm.php
new file mode 100644
index 0000000..720237e
--- /dev/null
+++ b/application/forms/SyncPropertyForm.php
@@ -0,0 +1,444 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Exception;
+use Icinga\Module\Director\Hook\ImportSourceHook;
+use Icinga\Module\Director\Objects\SyncProperty;
+use Icinga\Module\Director\Objects\SyncRule;
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Objects\ImportSource;
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class SyncPropertyForm extends DirectorObjectForm
+{
+ /**
+ * @var SyncRule
+ */
+ private $rule;
+
+ /** @var ImportSource */
+ private $importSource;
+
+ /** @var ImportSourceHook */
+ private $importSourceHook;
+
+ private $dummyObject;
+
+ const EXPRESSION = '__EXPRESSION__';
+
+ /**
+ * @throws \Zend_Form_Exception
+ */
+ public function setup()
+ {
+ $this->addHidden('rule_id', $this->rule->get('id'));
+
+ $this->addElement('select', 'source_id', array(
+ 'label' => $this->translate('Source Name'),
+ 'multiOptions' => $this->enumImportSource(),
+ 'required' => true,
+ 'class' => 'autosubmit',
+ ));
+ if (! $this->hasObject() && ! $this->getSentValue('source_id')) {
+ return;
+ }
+
+ $this->addElement('select', 'destination_field', array(
+ 'label' => $this->translate('Destination Field'),
+ 'multiOptions' => $this->optionalEnum($this->listDestinationFields()),
+ 'required' => true,
+ 'class' => 'autosubmit',
+ ));
+
+ if ($this->getSentValue('destination_field')) {
+ $destination = $this->getSentValue('destination_field');
+ } elseif ($this->hasObject()) {
+ $destination = $this->getObject()->destination_field;
+ } else {
+ return;
+ }
+
+ $isCustomvar = substr($destination, 0, 5) === 'vars.';
+
+ if ($isCustomvar) {
+ $varname = substr($destination, 5);
+ $this->addElement('text', 'customvar', array(
+ 'label' => $this->translate('Custom variable'),
+ 'required' => true,
+ 'ignore' => true,
+ ));
+
+ if ($varname !== '*') {
+ $this->setElementValue('destination_field', 'vars.*');
+ $this->setElementValue('customvar', $varname);
+ if ($this->hasObject()) {
+ $this->getObject()->destination_field = 'vars.*';
+ }
+ }
+ }
+
+ $this->addSourceColumnElement($destination);
+
+ $this->addElement('YesNo', 'use_filter', array(
+ 'label' => $this->translate('Set based on filter'),
+ 'ignore' => true,
+ 'class' => 'autosubmit',
+ 'required' => true,
+ ));
+
+ if ($this->hasBeenSent()) {
+ $useFilter = $this->getSentValue('use_filter');
+ if ($useFilter === null) {
+ $this->setElementValue('use_filter', $useFilter = 'n');
+ }
+ } else {
+ $expression = $this->getObject()->filter_expression;
+ $useFilter = ($expression === null || strlen($expression) === 0) ? 'n' : 'y';
+ $this->setElementValue('use_filter', $useFilter);
+ }
+
+ if ($useFilter === 'y') {
+ $this->addElement('text', 'filter_expression', array(
+ 'label' => $this->translate('Filter Expression'),
+ 'description' => $this->translate(
+ 'This allows to filter for specific parts within the given source expression.'
+ . ' You are allowed to refer all imported columns. Examples: host=www* would'
+ . ' set this property only for rows imported with a host property starting'
+ . ' with "www". Complex example: host=www*&!(address=127.*|address6=::1)'
+ ),
+ 'required' => true,
+ // TODO: validate filter
+ ));
+ }
+
+ if ($isCustomvar || $destination === 'vars') {
+ $this->addElement('select', 'merge_policy', array(
+ 'label' => $this->translate('Merge Policy'),
+ 'description' => $this->translate(
+ 'Whether you want to merge or replace the destination field.'
+ . ' Makes no difference for strings'
+ ),
+ 'required' => true,
+ 'multiOptions' => $this->optionalEnum(array(
+ 'merge' => 'merge',
+ 'override' => 'replace'
+ ))
+ ));
+ } else {
+ $this->addHidden('merge_policy', 'override');
+ }
+
+ $this->setButtons();
+ }
+
+ protected function hasSubOption($options, $key)
+ {
+ foreach ($options as $mainKey => $sub) {
+ if (! is_array($sub)) {
+ // null -> please choose - or similar
+ continue;
+ }
+
+ if (array_key_exists($key, $sub)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @param $destination
+ * @return $this
+ * @throws \Zend_Form_Exception
+ */
+ protected function addSourceColumnElement($destination)
+ {
+ $error = false;
+
+ $srcTitle = $this->translate('Source columns');
+ try {
+ $columns[$srcTitle] = $this->listSourceColumns();
+ natsort($columns[$srcTitle]);
+ } catch (Exception $e) {
+ $srcTitle .= sprintf(' (%s)', $this->translate('failed to fetch'));
+ $columns[$srcTitle] = array();
+ $error = sprintf(
+ $this->translate('Unable to fetch data: %s'),
+ $e->getMessage()
+ );
+ }
+
+ if ($destination === 'import') {
+ $this->addIcingaTempateColumns($columns);
+ } elseif ($destination === 'list_id') {
+ $this->addDatalistsColumns($columns);
+ }
+
+ $xpTitle = $this->translate('Expert mode');
+ $columns[$xpTitle][self::EXPRESSION] = $this->translate('Custom expression');
+
+ $this->addElement('select', 'source_column', array(
+ 'label' => $this->translate('Source Column'),
+ 'multiOptions' => $this->optionalEnum($columns),
+ 'required' => true,
+ 'ignore' => true,
+ 'class' => 'autosubmit',
+ ));
+
+ if ($error) {
+ $this->getElement('source_column')->addError($error);
+ }
+
+ $showExpression = false;
+
+ if ($this->hasBeenSent()) {
+ $sentValue = $this->getSentValue('source_column');
+ if ($sentValue === self::EXPRESSION) {
+ $showExpression = true;
+ }
+ } elseif ($this->hasObject()) {
+ $objectValue = $this->getObject()->source_expression;
+ if ($this->hasSubOption($columns, $objectValue)) {
+ $this->setElementValue('source_column', $objectValue);
+ } else {
+ $this->setElementValue('source_column', self::EXPRESSION);
+ $showExpression = true;
+ }
+ }
+
+ if ($showExpression) {
+ $this->addElement('text', 'source_expression', array(
+ 'label' => $this->translate('Source Expression'),
+ 'description' => $this->translate(
+ 'A custom string. Might contain source columns, please use placeholders'
+ . ' of the form ${columnName} in such case. Structured data sources'
+ . ' can be referenced as ${columnName.sub.key}'
+ ),
+ 'required' => true,
+ ));
+ }
+
+
+ return $this;
+ }
+
+ protected function addIcingaTempateColumns(&$columns)
+ {
+ $funcTemplates = 'enum' . ucfirst($this->rule->get('object_type')) . 'Templates';
+ if (method_exists($this->db, $funcTemplates)) {
+ $templates = $this->db->$funcTemplates();
+ if (! empty($templates)) {
+ $templates = array_combine($templates, $templates);
+ }
+
+ $title = $this->translate('Existing templates');
+ $columns[$title] = $templates;
+ natsort($columns[$title]);
+ }
+ }
+
+ protected function addDatalistsColumns(&$columns)
+ {
+ // Clear other columns, we don't allow them right now
+ $columns = [];
+ $db = $this->db->getDbAdapter();
+ $enum = $db->fetchPairs(
+ $db->select()->from('director_datalist', ['id', 'list_name'])->order('list_name')
+ );
+
+ $columns[$this->translate('Existing Data Lists')] = $enum;
+ }
+
+ protected function enumImportSource()
+ {
+ $sources = $this->db->enumImportSource();
+ $usedIds = $this->rule->listInvolvedSourceIds();
+ if (empty($usedIds)) {
+ return $this->optionalEnum($sources);
+ }
+ $usedSources = array();
+ foreach ($usedIds as $id) {
+ $usedSources[$id] = $sources[$id];
+ unset($sources[$id]);
+ }
+
+ if (empty($sources)) {
+ return $this->optionalEnum($usedSources);
+ }
+
+ return $this->optionalEnum(
+ array(
+ $this->translate('Used sources') => $usedSources,
+ $this->translate('Other sources') => $sources
+ )
+ );
+ }
+
+ /**
+ * @return array
+ * @throws \Icinga\Exception\ConfigurationError
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function listSourceColumns()
+ {
+ $columns = array();
+ $source = $this->getImportSource();
+ $hook = $this->getImportSourceHook();
+ foreach ($hook->listColumns() as $col) {
+ $columns['${' . $col . '}'] = $col;
+ }
+
+ foreach ($source->listModifierTargetProperties() as $property) {
+ $columns['${' . $property . '}'] = $property;
+ }
+
+ return $columns;
+ }
+
+ protected function listDestinationFields()
+ {
+ $props = [];
+ $special = [];
+ $dummy = $this->dummyObject();
+
+ if ($dummy instanceof IcingaObject) {
+ if ($dummy->supportsCustomVars()) {
+ $special['vars.*'] = $this->translate('Custom variable (vars.)');
+ $special['vars'] = $this->translate('All custom variables (vars)');
+ }
+ if ($dummy->supportsImports()) {
+ $special['import'] = $this->translate('Inheritance (import)');
+ }
+ if ($dummy->supportsArguments()) {
+ $special['arguments'] = $this->translate('Arguments');
+ }
+ if ($dummy->supportsGroups()) {
+ $special['groups'] = $this->translate('Group membership');
+ }
+ if ($dummy->supportsRanges()) {
+ $special['ranges'] = $this->translate('Time ranges');
+ }
+ }
+
+ foreach ($dummy->listProperties() as $prop) {
+ if ($dummy instanceof IcingaObject && $prop === 'id') {
+ continue;
+ }
+
+ // TODO: allow those fields, but munge them (store ids)
+ //if (preg_match('~_id$~', $prop)) continue;
+ if (substr($prop, -3) === '_id') {
+ $short = substr($prop, 0, -3);
+ if ($dummy instanceof IcingaObject) {
+ if ($dummy->hasRelation($short)) {
+ $prop = $short;
+ } else {
+ continue;
+ }
+ }
+ }
+
+ $props[$prop] = $prop;
+ }
+
+ if ($dummy instanceof IcingaObject) {
+ foreach ($dummy->listMultiRelations() as $prop) {
+ $props[$prop] = sprintf('%s (%s)', $prop, $this->translate('a list'));
+ }
+ }
+
+ ksort($props);
+
+ $result = [];
+ if (! empty($special)) {
+ $result[$this->translate('Special properties')] = $special;
+ }
+ if (! empty($props)) {
+ $result[$this->translate('Object properties')] = $props;
+ }
+
+ return $result;
+ }
+
+ /**
+ * @return ImportSource
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function getImportSource()
+ {
+ if ($this->importSource === null) {
+ if ($this->hasObject()) {
+ $id = (int) $this->object->get('source_id');
+ } else {
+ $id = (int) $this->getSentValue('source_id');
+ }
+ $this->importSource = ImportSource::loadWithAutoIncId($id, $this->db);
+ }
+
+ return $this->importSource;
+ }
+
+ /**
+ * @return ImportSourceHook
+ * @throws \Icinga\Exception\ConfigurationError
+ * @throws \Icinga\Exception\NotFoundError
+ */
+ protected function getImportSourceHook()
+ {
+ if ($this->importSourceHook === null) {
+ $this->importSourceHook = ImportSourceHook::loadByName(
+ $this->getImportSource()->get('source_name'),
+ $this->db
+ );
+ }
+
+ return $this->importSourceHook;
+ }
+
+ public function onSuccess()
+ {
+ /** @var SyncProperty $object */
+ $object = $this->getObject();
+ $object->set('rule_id', $this->rule->get('id')); // ?!
+
+ if ($this->getValue('use_filter') === 'n') {
+ $object->set('filter_expression', null);
+ }
+
+ $sourceColumn = $this->getValue('source_column');
+ $this->removeElement('source_column');
+
+ if ($sourceColumn !== self::EXPRESSION) {
+ $object->set('source_expression', $sourceColumn);
+ }
+
+ $destination = $this->getValue('destination_field');
+ if ($destination === 'vars.*') {
+ $destination = $this->getValue('customvar');
+ $object->set('destination_field', 'vars.' . $destination);
+ }
+
+ return parent::onSuccess();
+ }
+
+ protected function dummyObject()
+ {
+ if ($this->dummyObject === null) {
+ $this->dummyObject = IcingaObject::createByType(
+ $this->rule->get('object_type'),
+ array(),
+ $this->db
+ );
+ }
+
+ return $this->dummyObject;
+ }
+
+ public function setRule(SyncRule $rule)
+ {
+ $this->rule = $rule;
+ return $this;
+ }
+}
diff --git a/application/forms/SyncRuleForm.php b/application/forms/SyncRuleForm.php
new file mode 100644
index 0000000..d88e493
--- /dev/null
+++ b/application/forms/SyncRuleForm.php
@@ -0,0 +1,112 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Module\Director\Web\Form\DirectorObjectForm;
+
+class SyncRuleForm extends DirectorObjectForm
+{
+ public function setup()
+ {
+ $availableTypes = [
+ 'host' => $this->translate('Host'),
+ 'hostgroup' => $this->translate('Host Group'),
+ 'service' => $this->translate('Service'),
+ 'servicegroup' => $this->translate('Service Group'),
+ 'serviceSet' => $this->translate('Service Set'),
+ 'user' => $this->translate('User'),
+ 'usergroup' => $this->translate('User Group'),
+ 'datalistEntry' => $this->translate('Data List Entry'),
+ 'command' => $this->translate('Command'),
+ 'timePeriod' => $this->translate('Time Period'),
+ 'notification' => $this->translate('Notification'),
+ 'scheduledDowntime' => $this->translate('Scheduled Downtime'),
+ 'dependency' => $this->translate('Dependency'),
+ 'endpoint' => $this->translate('Endpoint'),
+ 'zone' => $this->translate('Zone'),
+ ];
+
+ $this->addElement('text', 'rule_name', [
+ 'label' => $this->translate('Rule name'),
+ 'description' => $this->translate('Please provide a rule name'),
+ 'required' => true,
+ ]);
+
+ $this->addElement('textarea', 'description', [
+ 'label' => $this->translate('Description'),
+ 'description' => $this->translate(
+ 'An extended description for this Sync Rule. This should explain'
+ . ' what this Rule is going to accomplish.'
+ ),
+ 'rows' => '3',
+ ]);
+
+ $this->addElement('select', 'object_type', [
+ 'label' => $this->translate('Object Type'),
+ 'description' => $this->translate('Choose an object type'),
+ 'required' => true,
+ 'multiOptions' => $this->optionalEnum($availableTypes)
+ ]);
+
+ $this->addElement('select', 'update_policy', [
+ 'label' => $this->translate('Update Policy'),
+ 'description' => $this->translate(
+ 'Define what should happen when an object with a matching key'
+ . " already exists. You could merge its properties (import source"
+ . ' wins), replace it completely with the imported object or ignore'
+ . ' it (helpful for one-time imports). "Update only" means that this'
+ . ' Rule would never create (or delete) full Objects.'
+ ),
+ 'required' => true,
+ 'multiOptions' => $this->optionalEnum([
+ 'merge' => $this->translate('Merge'),
+ 'override' => $this->translate('Replace'),
+ 'ignore' => $this->translate('Ignore'),
+ 'update-only' => $this->translate('Update only'),
+ ])
+ ]);
+
+ $this->addBoolean('purge_existing', [
+ 'label' => $this->translate('Purge'),
+ 'description' => $this->translate(
+ 'Whether to purge existing objects. This means that objects of'
+ . ' the same type will be removed from Director in case they no'
+ . ' longer exist at your import source.'
+ ),
+ 'required' => true,
+ 'class' => 'autosubmit',
+ ]);
+
+ if ($this->getSentOrObjectValue('purge_existing') === 'y') {
+ $this->addElement('select', 'purge_action', [
+ 'label' => $this->translate('Purge Action'),
+ 'description' => $this->translate(
+ 'Whether to delete or to disable objects subject to purge'
+ ),
+ 'multiOptions' => $this->optionalEnum([
+ 'delete' => $this->translate('Delete'),
+ 'disable' => $this->translate('Disable'),
+ ]),
+ 'required' => true,
+ ]);
+ }
+
+ $this->addElement('text', 'filter_expression', [
+ 'label' => $this->translate('Filter Expression'),
+ 'description' => sprintf(
+ $this->translate(
+ 'Sync only part of your imported objects with this rule. Icinga Web 2'
+ . ' filter syntax is allowed, so this could look as follows: %s'
+ ),
+ '(host=a|host=b)&!ip=127.*'
+ ) . ' ' . $this->translate(
+ 'Be careful: this is usually NOT what you want, as it makes Sync "blind"'
+ . ' for objects matching this filter. This means that "Purge" will not'
+ . ' work as expected. The "Black/Whitelist" Import Property Modifier'
+ . ' is probably what you\'re looking for.'
+ ),
+ ]);
+
+ $this->setButtons();
+ }
+}
diff --git a/application/forms/SyncRunForm.php b/application/forms/SyncRunForm.php
new file mode 100644
index 0000000..0bc5fda
--- /dev/null
+++ b/application/forms/SyncRunForm.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use gipfl\Translation\TranslationHelper;
+use gipfl\Web\Form;
+use Icinga\Module\Director\Data\Db\DbObjectStore;
+use Icinga\Module\Director\Import\Sync;
+use Icinga\Module\Director\Objects\SyncRule;
+
+class SyncRunForm extends Form
+{
+ use TranslationHelper;
+
+ protected $defaultDecoratorClass = null;
+
+ /** @var ?string */
+ protected $successMessage = null;
+
+ /** @var SyncRule */
+ protected $rule;
+
+ /** @var DbObjectStore */
+ protected $store;
+
+ public function __construct(SyncRule $rule, DbObjectStore $store)
+ {
+ $this->rule = $rule;
+ $this->store = $store;
+ }
+
+ public function assemble()
+ {
+ if ($this->store->getBranch()->isBranch()) {
+ $label = sprintf($this->translate('Sync to Branch: %s'), $this->store->getBranch()->getName());
+ } else {
+ $label = $this->translate('Trigger this Sync');
+ }
+ $this->addElement('submit', 'submit', [
+ 'label' => $label,
+ ]);
+ }
+
+ /**
+ * @return string|null
+ */
+ public function getSuccessMessage()
+ {
+ return $this->successMessage;
+ }
+
+ public function onSuccess()
+ {
+ $sync = new Sync($this->rule, $this->store);
+ if ($sync->hasModifications()) {
+ if ($sync->apply()) {
+ // and changed
+ $this->successMessage = $this->translate(('Source has successfully been synchronized'));
+ } else {
+ $this->successMessage = $this->translate('Nothing changed, rule is in sync');
+ }
+ } else {
+ // Used to be $rule->get('sync_state') === 'in-sync', $changed = $rule->applyChanges();
+ $this->successMessage = $this->translate('Nothing to do, rule is in sync');
+ }
+ }
+}
diff --git a/application/locale/de_DE/LC_MESSAGES/director.mo b/application/locale/de_DE/LC_MESSAGES/director.mo
new file mode 100644
index 0000000..3cf12af
--- /dev/null
+++ b/application/locale/de_DE/LC_MESSAGES/director.mo
Binary files differ
diff --git a/application/locale/de_DE/LC_MESSAGES/director.po b/application/locale/de_DE/LC_MESSAGES/director.po
new file mode 100644
index 0000000..ec2fb2a
--- /dev/null
+++ b/application/locale/de_DE/LC_MESSAGES/director.po
@@ -0,0 +1,8230 @@
+# Director - Config tool for Icinga 2.
+# Copyright (C) 2022 TEAM NAME
+# This file is distributed under the same license as Director Module.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Director Module (master)\n"
+"Report-Msgid-Bugs-To: https://github.com/Icinga/icingaweb2-module-director/issues\n"
+"POT-Creation-Date: 2022-09-21 07:17+0000\n"
+"PO-Revision-Date: 2022-09-21 09:21+0200\n"
+"Last-Translator: Thomas Gelf <thomas@gelf.net>\n"
+"Language-Team: \n"
+"Language: de_DE\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Basepath: .\n"
+"X-Generator: Poedit 3.0.1\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:615
+#, php-format
+msgid " (inherited from \"%s\")"
+msgstr " (geerbt von \"%s\")"
+
+#: library/Director/Web/Table/TemplatesTable.php:64
+msgid " - not in use -"
+msgstr " - unbenutzt -"
+
+#: library/Director/Web/Table/DatafieldCategoryTable.php:48
+#: library/Director/Web/Table/DatafieldTable.php:52
+msgid "# Used"
+msgstr "# Benutzt"
+
+#: library/Director/Web/Table/DatafieldTable.php:53
+msgid "# Vars"
+msgstr "# Vars"
+
+#: library/Director/Web/Table/CustomvarTable.php:29
+#, php-format
+msgid "%d / %d"
+msgstr "%d / %d"
+
+#: library/Director/Resolver/CommandUsage.php:51
+#, php-format
+msgid "%d Host Template(s)"
+msgstr "%d Host-Vorlagen"
+
+#: library/Director/Resolver/CommandUsage.php:50
+#, php-format
+msgid "%d Host(s)"
+msgstr "%d Host(s)"
+
+#: library/Director/Resolver/CommandUsage.php:61
+#, php-format
+msgid "%d Notification Apply Rule(s)"
+msgstr "%d Benachrichtigungs-Apply-Regeln"
+
+#: library/Director/Resolver/CommandUsage.php:60
+#, php-format
+msgid "%d Notification Template(s)"
+msgstr "%d Benachrichtigungsvorlagen"
+
+#: library/Director/Resolver/CommandUsage.php:59
+#, php-format
+msgid "%d Notification(s)"
+msgstr "%d Benachrichtigung(en)"
+
+#: library/Director/Resolver/CommandUsage.php:56
+#, php-format
+msgid "%d Service Apply Rule(s)"
+msgstr "%d Service Apply-Regel(n)"
+
+#: library/Director/Resolver/CommandUsage.php:55
+#, php-format
+msgid "%d Service Template(s)"
+msgstr "%d Service-Vorlage(n)"
+
+#: library/Director/Resolver/CommandUsage.php:54
+#, php-format
+msgid "%d Service(s)"
+msgstr "%d Service(s)"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:170
+#, php-format
+msgid "%d apply rules have been defined"
+msgstr "%d Apply-Regeln wurden definiert"
+
+#: library/Director/Db/Branch/BranchModificationInspection.php:68
+#: library/Director/Web/Table/SyncRunTable.php:49
+#: library/Director/Web/Widget/SyncRunDetails.php:77
+#, php-format
+msgid "%d created"
+msgstr "%d erstellt"
+
+#: library/Director/Db/Branch/BranchModificationInspection.php:71
+#: library/Director/Web/Table/SyncRunTable.php:61
+#: library/Director/Web/Widget/SyncRunDetails.php:89
+#, php-format
+msgid "%d deleted"
+msgstr "%d gelöscht"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:110
+#, php-format
+msgid "%d files"
+msgstr "%d Dateien"
+
+#: library/Director/Web/Widget/DeployedConfigInfoHeader.php:93
+#, php-format
+msgid "%d files rendered in %0.2fs"
+msgstr "%d Dateien in %0.2fs erstellt"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:212
+#, php-format
+msgid "%d have been externally defined and will not be deployed"
+msgstr "%d wurden extern definiert und werden nicht ausgerollt"
+
+#: library/Director/Db/Branch/BranchModificationInspection.php:74
+#: library/Director/Web/Table/SyncRunTable.php:55
+#: library/Director/Web/Widget/SyncRunDetails.php:83
+#, php-format
+msgid "%d modified"
+msgstr "%d geändert"
+
+#: application/controllers/SyncruleController.php:353
+#, php-format
+msgid "%d object(s) will be created"
+msgstr "%d Objekt(e) werden erstellt"
+
+#: application/controllers/SyncruleController.php:334
+#, php-format
+msgid "%d object(s) will be deleted"
+msgstr "%d Objekt(e) werden gelöscht"
+
+#: application/controllers/SyncruleController.php:343
+#, php-format
+msgid "%d object(s) will be modified"
+msgstr "%d Objekt(e) werden verändert"
+
+#: application/controllers/InspectController.php:76
+#, php-format
+msgid "%d objects found"
+msgstr "%d Objekte gefunden"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:195
+#, php-format
+msgid "%d objects have been defined"
+msgstr "%d Objekte wurden definiert"
+
+#: application/forms/IcingaMultiEditForm.php:93
+#, php-format
+msgid "%d objects have been modified"
+msgstr "%d Objekte wurden verändert"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:119
+#, php-format
+msgid "%d objects, %d templates, %d apply rules"
+msgstr "%d Objekte, %d Vorlagen, %d Apply-Regeln"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:204
+#, php-format
+msgid "%d of them are templates"
+msgstr "%d davon sind Vorlagen"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:152
+#, php-format
+msgid "%d templates have been defined"
+msgstr "%d Vorlagen wurden definiert"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:581
+#, php-format
+msgid "%s \"%s\" has been created"
+msgstr "%s \"%s\" wurde erstellt"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:584
+#, php-format
+msgid "%s \"%s\" has been deleted"
+msgstr "%s \"%s\" wurde gelöscht"
+
+#: application/forms/IcingaImportObjectForm.php:36
+#, php-format
+msgid "%s \"%s\" has been imported\""
+msgstr "%s \"%s\" wurde importiert\""
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:587
+#, php-format
+msgid "%s \"%s\" has been modified"
+msgstr "%s \"%s\" wurde geändert"
+
+#: library/Director/Web/Table/IcingaHostAppliedServicesTable.php:107
+#, php-format
+msgid "%s %s(%s)"
+msgstr "%s %s(%s)"
+
+#: library/Director/Web/Table/ObjectSetTable.php:61
+#, php-format
+msgid "%s (%d members)"
+msgstr "%s (%d Mitglieder)"
+
+#: application/controllers/HostController.php:248
+#: application/controllers/HostController.php:328
+#, php-format
+msgid "%s (Applied Service set)"
+msgstr "%s (zugewiesenes Service-Set)"
+
+#: application/controllers/HostController.php:384
+#, php-format
+msgid "%s (Service set)"
+msgstr "%s (Service-Set)"
+
+#: application/forms/SettingsForm.php:189
+#: application/forms/SelfServiceSettingsForm.php:256
+#, php-format
+msgid "%s (default)"
+msgstr "%s (default)"
+
+#: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:312
+#, php-format
+msgid "%s (inherited from %s)"
+msgstr "%s (geerbt von %s)"
+
+#: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:307
+#, php-format
+msgid "%s (inherited)"
+msgstr "%s (geerbt)"
+
+#: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:325
+#, php-format
+msgid "%s (not an Array!)"
+msgstr "%s (kein Array)"
+
+#: library/Director/Web/Controller/TemplateController.php:72
+#, php-format
+msgid "%s Templates"
+msgstr "%s Vorlagen"
+
+#: application/forms/IcingaCommandArgumentForm.php:137
+#, php-format
+msgid "%s argument \"%s\" has been removed"
+msgstr "Das %s-Argument \"%s\" wurde entfernt"
+
+#: library/Director/Web/Controller/TemplateController.php:37
+#, php-format
+msgid "%s based on %s"
+msgstr "%s basierend auf %s"
+
+#: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:114
+#, php-format
+msgid "%s config changes are available in your configuration branch"
+msgstr ""
+"%s Konfigurationsänderungen sind in diesem Konfigurationszweig verfügbar"
+
+#: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:129
+#, php-format
+msgid "%s config changes happend since the last deployed configuration"
+msgstr ""
+"%s Konfigurationsänderungen seit der letzten ausgerollten Konfiguration"
+
+#: application/forms/IcingaServiceForm.php:286
+#, php-format
+msgid "%s has been deactivated on %s"
+msgstr "%s wurde auf %s deaktiviert"
+
+#: application/controllers/DataController.php:354
+#, php-format
+msgid "%s instances"
+msgstr "%s Instanzen"
+
+#: application/forms/IcingaServiceForm.php:322
+#, php-format
+msgid "%s is no longer deactivated on %s"
+msgstr "%s ist auf %s nicht mehr deaktiviert"
+
+#: library/Director/Web/Widget/NotInBranchedHint.php:18
+#, php-format
+msgid "%s is not available while being in a Configuration Branch: %s"
+msgstr "%s ist beim Arbeiten in einem Konfigurationszweig nicht verfügbar: %s"
+
+#: library/Director/Web/Widget/SyncRunDetails.php:49
+#, php-format
+msgid "%s objects have been modified"
+msgstr "%s Objekte wurden verändert"
+
+#: application/controllers/DataController.php:359
+#, php-format
+msgid "%s on %s"
+msgstr "%s auf %s"
+
+#: application/controllers/HostController.php:542
+#, php-format
+msgid "%s on %s (from set: %s)"
+msgstr "%s auf %s (aus dem Set \"%s\")"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:227
+#, php-format
+msgid "%s related group objects have been created"
+msgstr "%s verwandte Gruppenobjekte wurden erstellt"
+
+#: library/Director/Web/Controller/TemplateController.php:75
+#, php-format
+msgid "%s templates based on %s"
+msgstr "%s Vorlagen basierend auf %s"
+
+#: library/Director/Web/Widget/HealthCheckPluginOutput.php:46
+#, php-format
+msgid "%s: %d"
+msgstr "%s: %d"
+
+#: application/controllers/BasketController.php:195
+#, php-format
+msgid "%s: %s (Snapshot)"
+msgstr "%s: %s (Snapshot)"
+
+#: application/controllers/ImportsourceController.php:310
+#, php-format
+msgid "%s: Property Modifier"
+msgstr "%s: Eigenschaftsmodifikatoren"
+
+#: application/controllers/BasketController.php:146
+#, php-format
+msgid "%s: Snapshots"
+msgstr "%s: Snapshots"
+
+#: application/controllers/ImportsourceController.php:280
+#, php-format
+msgid "%s: add Property Modifier"
+msgstr "%s: Eigenschaftsmodifikator hinzufügen"
+
+#: library/Director/Db/Housekeeping.php:54
+msgid "(Host) group resolve cache"
+msgstr "Gruppenmitgliedschaftscache (Hosts)"
+
+#: application/controllers/ServiceController.php:187
+#, php-format
+msgid "(on %s)"
+msgstr "(auf %s)"
+
+#: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:243
+msgid "- add more -"
+msgstr "- mehr hinzuzufügen -"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1090
+msgid "- click to add more -"
+msgstr "- Hier klicken um mehr hinzuzufügen -"
+
+#: application/forms/SelfServiceSettingsForm.php:79
+msgid "- no automatic installation -"
+msgstr "- keine automatische Installation -"
+
+#: library/Director/DataType/DataTypeDirectorObject.php:45
+#: library/Director/DataType/DataTypeSqlQuery.php:37
+#: library/Director/Job/ImportJob.php:118
+#: library/Director/Job/SyncJob.php:124
+#: library/Director/Web/Form/QuickBaseForm.php:119
+#: application/views/helpers/FormDataFilter.php:465
+#: application/forms/SettingsForm.php:193
+#: application/forms/SelfServiceSettingsForm.php:252
+#: application/controllers/ConfigController.php:383
+#: application/controllers/ConfigController.php:394
+msgid "- please choose -"
+msgstr "- bitte wählen -"
+
+#: application/controllers/SyncruleController.php:455
+#, php-format
+msgid "...and %d more"
+msgstr "...und %d weitere"
+
+#: library/Director/Web/Controller/ObjectController.php:730
+#: application/controllers/ConfigController.php:452
+msgid "...and the modifications below are already in the main branch:"
+msgstr "...und folgende Änderungen befinden sich bereits im Hauptzweig:"
+
+#: application/controllers/BasketsController.php:34
+msgid ""
+"A Configuration Basket references specific Configuration Objects or all "
+"objects of a specific type. It has been designed to share Templates, Import/"
+"Sync strategies and other base Configuration Objects. It is not a tool to "
+"operate with single Hosts or Services."
+msgstr ""
+"Ein Konfiguratinsbasket referenziert bestimmte Konfigurationsobjekte oder "
+"alle Objekte eines bestimmten Typs. Er wurde entworfen um Vorlagen, Import/"
+"Synchronisationsstrategien und andere grundlegende Konfigurationsobjekte zu "
+"teilen. Dies ist kein Werkzeug welches sich um einzelne Hosts oder Services "
+"kümmert."
+
+#: library/Director/Import/ImportSourceLdap.php:64
+msgid ""
+"A custom LDAP filter to use in addition to the object class. This allows for "
+"a lot of flexibility but requires LDAP filter skills. Simple filters might "
+"look as follows: operatingsystem=*server*"
+msgstr ""
+"Ein benutzerdefinierter LDAP Filter zur gemeinsamen Verwendung mit der "
+"Objektklasse. Dies gewährt ein großes Maß an Flexibilität, benötigt jedoch "
+"Kenntnisse über LDAP Filter. Einfache Filter können wie folgt aussehen: "
+"operatingsystem=*server*"
+
+#: application/forms/SyncPropertyForm.php:215
+msgid ""
+"A custom string. Might contain source columns, please use placeholders of "
+"the form ${columnName} in such case. Structured data sources can be "
+"referenced as ${columnName.sub.key}"
+msgstr ""
+"Benutzerdefinierte Zeichenkette. Falls Quellspalten enthalten sind, müssen "
+"Platzhalter in der Form ${columnName} genutzt werden. Strukturierte Daten "
+"können mittels ${columnName.sub.key} addressiert werden"
+
+#: application/forms/IcingaObjectFieldForm.php:134
+msgid "A description about the field"
+msgstr "Eine Beschreibung des Feldes"
+
+#: application/forms/IcingaTemplateChoiceForm.php:59
+msgid "A detailled description explaining what this choice is all about"
+msgstr "Eine detaillierte Beschreibung zum Sinn und Zweck dieser Auswahl"
+
+#: application/forms/IcingaServiceSetForm.php:104
+msgid ""
+"A meaningful description explaining your users what to expect when assigning "
+"this set of services"
+msgstr ""
+"Eine aussagekräftige Beschreibung, die den Benutzern erklärt, was geschieht, "
+"wenn dieses Service-Set zugewiesen wird"
+
+# Geschlecht kann hier leider nicht bestimmt werden -ThW
+#: library/Director/Web/Form/DirectorObjectForm.php:662
+#: application/forms/IcingaTimePeriodRangeForm.php:85
+#: application/forms/IcingaScheduledDowntimeRangeForm.php:90
+#, php-format
+msgid "A new %s has successfully been created"
+msgstr "Ein neuer %s wurde erfolgreich erstellt"
+
+#: application/forms/IcingaGenerateApiKeyForm.php:39
+#, php-format
+msgid "A new Self Service API key for %s has been generated"
+msgstr "Ein neuer Selbstbedienungs-API-Schlüssel für %s wurde erstellt"
+
+#: application/forms/ImportRowModifierForm.php:72
+msgid ""
+"A property modifier allows you to modify a specific property at import time"
+msgstr ""
+"Ein Eigenschaftsmodifikator erlaubt das Verändern bestimmter Eigenschaften "
+"während des Imports"
+
+#: application/forms/ImportSourceForm.php:17
+msgid ""
+"A short name identifying this import source. Use something meaningful, like "
+"\"Hosts from Puppet\", \"Users from Active Directory\" or similar"
+msgstr ""
+"Eine kurzer Name um diese Importquelle zu bezeichnen. Sprechende "
+"Bezeichnungen wie \"Hosts aus Puppet\" oder \"Benutzer aus LDAP\" bieten "
+"sich an"
+
+#: application/forms/DirectorJobForm.php:74
+msgid ""
+"A short name identifying this job. Use something meaningful, like \"Import "
+"Puppet Hosts\""
+msgstr ""
+"Eine kurzer Name um diesen Auftrag zu bezeichnen. Sprechende Bezeichnungen "
+"wie \"Puppet Hosts importieren\" bieten sich an"
+
+#: application/forms/IcingaServiceSetForm.php:30
+msgid "A short name identifying this set of services"
+msgstr "Eine kurzer Name um dieses Service-Set zu bezeichnen"
+
+#: library/Director/Web/SelfService.php:234
+#, php-format
+msgid ""
+"A ticket for this agent could not have been requested from your deployment "
+"endpoint: %s"
+msgstr ""
+"Für diesen Agenten konnte kein Ticket vom Deployment-Endpoint angefordert "
+"werden: %s"
+
+#: library/Director/Dashboard/Dashlet/DeploymentDashlet.php:95
+#, php-format
+msgid ""
+"A total of %d config changes happened since your last deployed config has "
+"been rendered"
+msgstr ""
+"Insgesamt wurde die Konfiguration %d mal seit dem letzten Ausrollen geändert"
+
+#: application/forms/IcingaHostSelfServiceForm.php:49
+msgid "API Key"
+msgstr "API-Schlüssel"
+
+#: library/Director/Db/Branch/BranchModificationInspection.php:34
+msgid "API Users"
+msgstr "API Benutzer"
+
+#: application/forms/IcingaEndpointForm.php:46
+#: application/forms/KickstartForm.php:155
+msgid "API user"
+msgstr "API Benutzer"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1434
+msgid "Accept passive checks"
+msgstr "Passive Checkergebnisse akzeptieren"
+
+#: application/forms/IcingaHostForm.php:93
+msgid "Accepts config"
+msgstr "Akzeptiert Konfiguration"
+
+# Aktuell wird es so in anderen Modulen übersetzt. -ThW
+#: library/Director/IcingaConfig/TypeFilterSet.php:28
+msgid "Acknowledgement"
+msgstr "Bestätigung"
+
+#: library/Director/Web/Table/ConfigFileDiffTable.php:81
+#: library/Director/Web/Widget/ActivityLogInfo.php:514
+#: library/Director/Web/Widget/ActivityLogInfo.php:525
+#: application/controllers/BranchController.php:62
+msgid "Action"
+msgstr "Aktion"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1547
+msgid "Action URL"
+msgstr "Aktions-URL"
+
+#: library/Director/Web/Table/QuickTable.php:281
+#: library/Director/Web/Widget/DeployedConfigInfoHeader.php:72
+#: library/Director/Web/Widget/ActivityLogInfo.php:555
+msgid "Actions"
+msgstr "Aktionen"
+
+#: application/forms/SettingsForm.php:175
+msgid "Activation Tool"
+msgstr "Aktivierungswerkzeug"
+
+#: application/forms/SettingsForm.php:154
+msgid "Active-Passive"
+msgstr "Aktiv-Passiv"
+
+#: library/Director/Web/Widget/SyncRunDetails.php:30
+#: application/controllers/BranchController.php:48
+msgid "Activity"
+msgstr "Aktivität"
+
+#: library/Director/Dashboard/Dashlet/ActivityLogDashlet.php:11
+#: library/Director/Web/Tabs/InfraTabs.php:29
+#: application/controllers/ConfigController.php:160
+msgid "Activity Log"
+msgstr "Aktivitätslog"
+
+#: library/Director/Web/Controller/ObjectController.php:304
+#, php-format
+msgid "Activity Log: %s"
+msgstr "Aktivitätslog: %s"
+
+#: configuration.php:173
+msgid "Activity log"
+msgstr "Aktivitätslog"
+
+#: library/Director/Web/ActionBar/TemplateActionBar.php:19
+#: library/Director/Web/ActionBar/ChoicesActionBar.php:16
+#: library/Director/Web/ActionBar/ObjectsActionBar.php:16
+#: library/Director/Web/Form/DirectorObjectForm.php:504
+#: library/Director/Web/Controller/ActionController.php:166
+#: library/Director/Web/Controller/ObjectsController.php:315
+#: library/Director/Web/Controller/ObjectsController.php:356
+#: application/forms/AddToBasketForm.php:73
+#: application/controllers/DataController.php:34
+#: application/controllers/DataController.php:77
+#: application/controllers/DataController.php:95
+#: application/controllers/DataController.php:171
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: library/Director/Web/Tabs/ObjectTabs.php:51
+#: library/Director/Web/Controller/ObjectController.php:104
+#, php-format
+msgid "Add %s"
+msgstr "%s hinzufügen"
+
+#: application/forms/AddToBasketForm.php:69
+#, php-format
+msgid "Add %s objects"
+msgstr "%s Objekte hinzufügen"
+
+#: library/Director/Web/Controller/ObjectController.php:446
+#, php-format
+msgid "Add %s: %s"
+msgstr "%s hinzufügen: %s"
+
+#: application/controllers/HostsController.php:40
+#: application/controllers/HostsController.php:79
+msgid "Add Service"
+msgstr "Service hinzufügen"
+
+#: application/controllers/HostsController.php:45
+#: application/controllers/HostsController.php:110
+msgid "Add Service Set"
+msgstr "Service-Set hinzufügen"
+
+#: application/controllers/HostsController.php:127
+#, php-format
+msgid "Add Service Set to %d hosts"
+msgstr "Füge Service-Set zu %d Hosts hinzu"
+
+#: application/controllers/HostController.php:121
+#, php-format
+msgid "Add Service Set to %s"
+msgstr "Service-Set zu %s hinzufügen"
+
+#: application/controllers/HostController.php:107
+#, php-format
+msgid "Add Service to %s"
+msgstr "Service zu %s hinzufügen"
+
+#: application/controllers/DatafieldController.php:33
+msgid "Add a new Data Field"
+msgstr "Einen neues Datenfeld hinzufügen"
+
+#: application/controllers/DatafieldcategoryController.php:39
+msgid "Add a new Data Field Category"
+msgstr "Eine neue Datenfeldkategorie hinzufügen"
+
+#: application/controllers/DataController.php:64
+msgid "Add a new Data List"
+msgstr "Datenliste hinzufügen"
+
+#: application/controllers/ImportsourcesController.php:35
+msgid "Add a new Import Source"
+msgstr "Importquelle hinzufügen"
+
+#: application/controllers/JobsController.php:15
+#: application/controllers/JobController.php:35
+msgid "Add a new Job"
+msgstr "Job hinzufügen"
+
+#: application/controllers/SyncrulesController.php:28
+msgid "Add a new Sync Rule"
+msgstr "Synchronisationsregel hinzufügen"
+
+#: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:514
+msgid "Add a new entry"
+msgstr "Einen neuen Eintrag hinzufügen"
+
+#: application/controllers/DataController.php:216
+msgid "Add a new instance"
+msgstr "Neue Instanz hinzufügen"
+
+#: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:271
+msgid "Add a new one..."
+msgstr "Einen Neuen hinzufügen..."
+
+#: application/controllers/ServicesetController.php:51
+#, php-format
+msgid "Add a service set to \"%s\""
+msgstr "Füge ein Service-Set zu \"%s\" hinzu"
+
+#: application/controllers/ServiceController.php:118
+#, php-format
+msgid "Add a service to \"%s\""
+msgstr "Füge einen Service zu \"%s\" hinzu"
+
+#: application/views/helpers/FormDataFilter.php:516
+msgid "Add another filter"
+msgstr "Weiteren Filter hinzufügen"
+
+#: application/controllers/BasketController.php:85
+msgid "Add chosen objects to a Configuration Basket"
+msgstr "Gewählte Objekte zu einem Konfigurationsbasket hinzufügen"
+
+#: application/forms/DirectorDatalistEntryForm.php:60
+msgid "Add data list entry"
+msgstr "Datenlisteneintrag hinzufügen"
+
+#: application/controllers/ImportsourceController.php:108
+msgid "Add import source"
+msgstr "Importquelle hinzufügen"
+
+#: library/Director/Web/Controller/ObjectController.php:452
+#, php-format
+msgid "Add new Icinga %s"
+msgstr "Neuen Icinga %s hinzufügen"
+
+#: library/Director/Web/Controller/ObjectController.php:435
+#, php-format
+msgid "Add new Icinga %s template"
+msgstr "Neue Icinga %s Vorlage hinzufügen"
+
+#: application/controllers/ImportsourceController.php:253
+msgid "Add property modifier"
+msgstr "Eigenschaftsmodifikator hinzufügen"
+
+#: application/controllers/HostController.php:139
+#: application/controllers/ServicesetController.php:68
+msgid "Add service"
+msgstr "Service hinzufügen"
+
+#: application/controllers/HostController.php:144
+msgid "Add service set"
+msgstr "Service-Set hinzufügen"
+
+#: application/controllers/HostsController.php:96
+#, php-format
+msgid "Add service to %d hosts"
+msgstr "Füge einen Service zu %d Hosts hinzu"
+
+#: application/controllers/SyncruleController.php:580
+msgid "Add sync property rule"
+msgstr "Regel für Synchronisationseigenschaft hinzufügen"
+
+#: application/controllers/SyncruleController.php:630
+#, php-format
+msgid "Add sync property: %s"
+msgstr "Synchronisationseigenschaft hinzufügen: %s"
+
+#: application/controllers/SyncruleController.php:522
+msgid "Add sync rule"
+msgstr "Synchronisationsregel hinzufügen"
+
+#: library/Director/Web/Controller/ObjectController.php:417
+#: library/Director/Web/Controller/TemplateController.php:129
+#: application/controllers/HostsController.php:70
+#: application/controllers/ServicesController.php:36
+#: application/controllers/BasketController.php:84
+#: application/controllers/ImportsourceController.php:67
+#: application/controllers/JobController.php:89
+#: application/controllers/SyncruleController.php:673
+#: application/controllers/DataController.php:370
+msgid "Add to Basket"
+msgstr "Zu Basket hinzufügen"
+
+#: configuration.php:61
+msgid ""
+"Additional (monitoring module) object filter to further restrict write access"
+msgstr ""
+"Zusätzliche (Monitoring-Modul-spezifische) Objekt-Filter, um den "
+"Schreibzugriff weiter einzuschränken"
+
+#: library/Director/Import/ImportSourceRestApi.php:151
+msgid "Additional headers for the HTTP request."
+msgstr "Zusätzliche HTTP-Header für diesen Request"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1533
+msgid "Additional notes for this object"
+msgstr "Weitere Notizen zu diesem Objekt"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1586
+msgid "Additional properties"
+msgstr "Weitere Eigenschaften"
+
+#: library/Director/Web/Tabs/ObjectTabs.php:145
+msgid "Agent"
+msgstr "Agent"
+
+#: application/forms/SelfServiceSettingsForm.php:154
+msgid "Agent Version"
+msgstr "Agenten-Version"
+
+#: library/Director/PropertyModifier/PropertyModifierSimpleGroupBy.php:60
+msgid "Aggregation Columns"
+msgstr "Aggregationsspalten"
+
+#: application/forms/IcingaHostSelfServiceForm.php:31
+msgid "Alias"
+msgstr "Alias"
+
+#: library/Director/Import/ImportSourceDirectorObject.php:80
+msgid "All Object Types"
+msgstr "Alle Objekttypen"
+
+#: application/controllers/ConfigController.php:173
+msgid "All changes"
+msgstr "Alle Änderungen"
+
+#: application/forms/SettingsForm.php:78
+msgid ""
+"All changes are tracked in the Director database. In addition you might also "
+"want to send an audit log through the Icinga Web 2 logging mechanism. That "
+"way all changes would be written to either Syslog or the configured log "
+"file. When enabling this please make sure that you configured Icinga Web 2 "
+"to log at least at \"informational\" level."
+msgstr ""
+"Alle Änderungen werden in der Director-Datenbank nachvollziehbar "
+"gespeichert. Zusätzlich kann ein Revisionslog durch den Logging-Mechanismus "
+"von Icinga Web 2 geschickt werden. Auf diese Weise werden alle Änderungen "
+"entweder an Syslog oder die konfigurierte Logdatei geschickt. Dafür muss "
+"Icinga Web 2 mindestens mit dem \"Info\" Level loggen."
+
+#: application/forms/SyncPropertyForm.php:309
+msgid "All custom variables (vars)"
+msgstr "Alle benutzerdefinierten Variablen (vars)"
+
+#: application/forms/BasketForm.php:56
+msgid "All of them"
+msgstr "All diese"
+
+#: application/forms/IcingaServiceForm.php:766
+#, php-format
+msgid "All overrides have been removed from \"%s\""
+msgstr "Alle überschriebenen Eigenschaften wurden von \"%s\" entfernt"
+
+#: library/Director/Web/Controller/ObjectsController.php:307
+#, php-format
+msgid "All your %s Apply Rules"
+msgstr "Alle %s Apply Regeln"
+
+#: library/Director/Web/Controller/ObjectsController.php:252
+#, php-format
+msgid "All your %s Templates"
+msgstr "Alle %s Templates"
+
+#: application/forms/SelfServiceSettingsForm.php:187
+msgid "Allow Updates"
+msgstr "Updates erlauben"
+
+#: library/Director/DataType/DataTypeDatalist.php:153
+msgid "Allow for values not on the list"
+msgstr "Erlaube Werte die nicht au f der Liste stehen"
+
+#: configuration.php:39
+msgid "Allow readonly users to see where a Service came from"
+msgstr "Erlaube Nur-Lesen-Benutzern zu sehen woher ein Service kommt"
+
+#: configuration.php:10
+msgid "Allow to access the director API"
+msgstr "Zugriff auf die Director API erlauben"
+
+#: configuration.php:11
+msgid "Allow to access the full audit log"
+msgstr "Zugriff auf das volle Audit-Log erlauben"
+
+#: configuration.php:21
+msgid "Allow to configure hosts"
+msgstr "Erlauben, Hosts zu konfigurieren"
+
+#: configuration.php:26 configuration.php:29
+msgid "Allow to configure notifications (unrestricted)"
+msgstr "Erlaube (unbeschränkt) Benachrichtigungen zu konfigurieren"
+
+#: configuration.php:23
+msgid "Allow to configure service sets"
+msgstr "Erlauben, Service-Sets zu konfigurieren"
+
+#: configuration.php:22
+msgid "Allow to configure services"
+msgstr "Erlauben, Services zu konfigurieren"
+
+#: configuration.php:25
+msgid "Allow to configure users"
+msgstr "Erlauben, Benutzer zu konfigurieren"
+
+#: configuration.php:24
+msgid "Allow to define Service Set Apply Rules"
+msgstr "Erlaube Definieren von Service-Set Apply-Regeln"
+
+#: configuration.php:20
+msgid "Allow to deploy configuration"
+msgstr "Das Ausrollen von Konfigurationen erlauben"
+
+#: configuration.php:34
+msgid ""
+"Allow to inspect objects through the Icinga 2 API (could contain sensitive "
+"information)"
+msgstr ""
+"Untersuchen von Objekten über die API von Icinga 2 erlauben (könnte sensible "
+"Daten enthalten)"
+
+#: configuration.php:14
+msgid "Allow to show configuration (could contain sensitive information)"
+msgstr "Anzeigen der Konfiguration erlauben (könnte sensible Daten enthalten)"
+
+#: configuration.php:18
+msgid "Allow to show the full executed SQL queries in some places"
+msgstr ""
+"Erlaube das Anzeigen der vollständigen ausgeführten SQL-Statements an "
+"einigen Stellen"
+
+#: application/forms/DirectorDatalistEntryForm.php:48
+msgid ""
+"Allow to use this entry only to users with one of these Icinga Web 2 roles"
+msgstr ""
+"Erlaube es ausschließlich Benutzern mit einer dieser Icinga Web 2 Rollen, "
+"diesen Eintrag zu nutzen"
+
+#: configuration.php:49
+msgid "Allow unrestricted access to Icinga Director"
+msgstr "Unbeschränkten Zugriff auf die Director API erlauben"
+
+#: configuration.php:43
+msgid ""
+"Allow users to modify Hosts they are allowed to see in the monitoring module"
+msgstr ""
+"Erlaube Benutzern, Hosts zu bearbeiten, welche sie im Monitoring-Modul sehen "
+"dürfen"
+
+#: configuration.php:47
+msgid ""
+"Allow users to modify Service they are allowed to see in the monitoring "
+"module"
+msgstr ""
+"Erlaube Benutzern, Services zu bearbeiten, welche sie im Monitoring-Modul "
+"sehen dürfen"
+
+#: configuration.php:67
+msgid "Allow users with Hostgroup restrictions to access the Groups field"
+msgstr ""
+"Mache Benutzern mit Hostgruppenbeschränkung das Feld \"Gruppen\" zugänglich"
+
+#: application/forms/IcingaTemplateChoiceForm.php:85
+msgid "Allowed maximum"
+msgstr "Erlaubtes Maximum"
+
+#: application/forms/DirectorDatalistEntryForm.php:44
+msgid "Allowed roles"
+msgstr "Erlaubte Rollen"
+
+#: application/forms/IcingaCloneObjectForm.php:102
+msgid "Also clone fields provided by this Template"
+msgstr "Klone auch Felder welche durch diese Vorlage bereitgestellt werden"
+
+#: application/forms/IcingaCloneObjectForm.php:70
+msgid "Also clone single Service Sets defined for this Host"
+msgstr "Klone auch Service-Sets welche für diesen Host definiert wurden"
+
+#: application/forms/IcingaCloneObjectForm.php:61
+msgid "Also clone single Services defined for this Host"
+msgstr "Klone auch Einzelservices welche für diesen Host definiert wurden"
+
+#: library/Director/Import/ImportSourceRestApi.php:211
+msgid "Also deeper keys can be specific by a dot-notation:"
+msgstr ""
+"Auch tieferliegende Schlüssel können via Punkt-Notation erreicht werden:"
+
+#: application/forms/SelfServiceSettingsForm.php:204
+msgid ""
+"Also install NSClient++. It can be used through the Icinga Agent and comes "
+"with a bunch of additional Check Plugins"
+msgstr ""
+"Installiere auch NSClient++. Dieser kann über den installierten Icinga Agent "
+"genutzt werden und bringt eine Reihe zusätzlicher Check-Plugins"
+
+#: application/forms/DirectorDatafieldForm.php:109
+#, php-format
+msgid "Also rename all \"%s\" custom variables to \"%s\" on %d objects?"
+msgstr ""
+"Auch alle benutzerdefinierten \"%s\" Variablen nach \"%s\" auf %d Objekten "
+"umbenennen?"
+
+#: application/forms/DirectorDatafieldForm.php:66
+#, php-format
+msgid "Also wipe all \"%s\" custom variables from %d objects?"
+msgstr ""
+"Außerdem alle \"%s\" benutzerdefinierten Variablen von %d Objekten entfernen?"
+
+#: application/forms/IcingaHostForm.php:355
+msgid ""
+"Alternative name for this host. Might be a host alias or and kind of string "
+"helping your users to identify this host"
+msgstr ""
+"Alternativer Name für diesen Host. Kann ein Alias oder jede Zeichenkette "
+"sein, die Benutzern hilft, diesen Host zu identifizieren"
+
+#: application/forms/IcingaUserForm.php:135
+msgid ""
+"Alternative name for this user. In case your object name is a username, this "
+"could be the full name of the corresponding person"
+msgstr ""
+"Alternativer Name für diesen Benutzer. Falls der Name des Objekts ein "
+"Benutzername ist, könnte hier der vollständige Name der betreffenden Person "
+"hinterlegt werden"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1567
+msgid "Alternative text to be shown in case above icon is missing"
+msgstr "Alternativer Text der angezeigt werden soll, falls obiges Icon fehlt"
+
+#: application/forms/IcingaCommandArgumentForm.php:91
+msgid ""
+"An Icinga DSL expression that returns a boolean value, e.g.: var cmd = "
+"bool(macro(\"$cmd$\")); return cmd ..."
+msgstr ""
+"Ein Icinga DSL Ausdruck welcher einen booleschen Wert liefert, z.B.: var cmd "
+"= bool(macro(\"$cmd$\")); return cmd ..."
+
+#: application/forms/IcingaCommandArgumentForm.php:52
+msgid ""
+"An Icinga DSL expression, e.g.: var cmd = macro(\"$cmd$\"); return "
+"typeof(command) == String ..."
+msgstr ""
+"Ein Icinga DSL Ausdruck, z.B.: var cmd = macro(\"$cmd$\"); return "
+"typeof(command) == String ..."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1549
+msgid ""
+"An URL leading to additional actions for this object. Often used with Icinga "
+"Classic, rarely with Icinga Web 2 as it provides far better possibilities to "
+"integrate addons"
+msgstr ""
+"Eine URL zu weiteren Aktionen für dieses Objekt. Wird oft mit Icinga "
+"Classic, jedoch selten mit Icinga Web 2 genutzt, da dieses viel bessere "
+"Möglichkeiten zur Integration von Addons bietet"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1542
+msgid "An URL pointing to additional notes for this object"
+msgstr "Eine URL zu Notizen für dieses Objekt"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1558
+msgid ""
+"An URL pointing to an icon for this object. Try \"tux.png\" for icons "
+"relative to public/img/icons or \"cloud\" (no extension) for items from the "
+"Icinga icon font"
+msgstr ""
+"Eine URL zu einem Icon für dieses Objekt. \"tux.png\" für Icons relativ zu "
+"public/img/icons oder \"cloud\" (ohne Erweiterung) für Objekte aus dem "
+"Icinga Icon-Fundus"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1314
+msgid ""
+"An alternative display name for this group. If you wonder how this could be "
+"helpful just leave it blank"
+msgstr ""
+"Ein alternativer Anzeigename für diese Gruppe. Kann leer gelassen werden"
+
+#: application/forms/ImportRowModifierForm.php:54
+msgid ""
+"An extended description for this Import Row Modifier. This should explain "
+"it's purpose and why it has been put in place at all."
+msgstr ""
+"Eine erweiterte Beschreibung für diesen Eigenschaftsmodifikator. Diese soll "
+"seine Aufgabe sowie seinen Sinn und Zweck beschreiben."
+
+#: application/forms/ImportSourceForm.php:26
+msgid ""
+"An extended description for this Import Source. This should explain what "
+"kind of data you're going to import from this source."
+msgstr ""
+"Eine erweiterte Beschreibung für diese Import-Quelle. Diese sollte "
+"erläutern, welche Art von Daten von dieser Quelle bereitgestellt werden."
+
+#: application/forms/SyncRuleForm.php:38
+msgid ""
+"An extended description for this Sync Rule. This should explain what this "
+"Rule is going to accomplish."
+msgstr ""
+"Eine erweiterte Beschreibung für diese Synchronisationsregel. Sollte "
+"erläutern was diese Regel bezwecken will."
+
+#: application/forms/DirectorDatafieldForm.php:161
+msgid ""
+"An extended description for this field. Will be shown as soon as a user puts "
+"the focus on this field"
+msgstr ""
+"Eine ausführliche Beschreibung dieses Felds. Wird angezeigt, sobald ein "
+"Benutzer den Fokus auf dieses Feld legt"
+
+#: library/Director/Import/ImportSourceLdap.php:58
+msgid ""
+"An object class to search for. Might be \"user\", \"group\", \"computer\" or "
+"similar"
+msgstr ""
+"Die Objektklasse, nach der gesucht werden soll. z.B. \"user\", \"group\", "
+"\"computer\" oder Ähnliches"
+
+#: library/Director/PropertyModifier/PropertyModifierGetPropertyFromOtherImportSource.php:35
+msgid ""
+"Another Import Source. We're going to look up the row with the key matching "
+"the value in the chosen column"
+msgstr ""
+"Eine andere Import-Quelle. Wir suchen dort eine Zeile mit einem Schlüssel, "
+"der dem Wert in der gewählten Spalte entspricht"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:20
+msgid "Any first (leftmost) component"
+msgstr "Beliebige erste (linkeste) Komponente"
+
+#: library/Director/Web/SelfService.php:70
+#: library/Director/Web/SelfService.php:111
+msgid "Api Key:"
+msgstr "API-Schlüssel:"
+
+#: library/Director/Web/Controller/TemplateController.php:54
+#, php-format
+msgid "Applied %s"
+msgstr "Angewendete(r) %s"
+
+#: application/forms/IcingaHostForm.php:231
+msgid "Applied groups"
+msgstr "Angewendete Gruppen"
+
+#: application/controllers/HostController.php:417
+#, php-format
+msgid "Applied service: %s"
+msgstr "Zugewiesener Service: %s"
+
+#: application/controllers/HostController.php:261
+#: application/controllers/HostController.php:345
+msgid "Applied services"
+msgstr "Zugewiesene Services"
+
+#: library/Director/Web/Tabs/ObjectsTabs.php:49
+msgid "Apply"
+msgstr "Anwenden"
+
+#: application/controllers/ServiceController.php:123
+#, php-format
+msgid "Apply \"%s\""
+msgstr "Apply \"%s\""
+
+#: application/forms/ApplyMigrationsForm.php:25
+#, php-format
+msgid "Apply %d pending schema migrations"
+msgstr "%d Schema-Migrations-Scripte anwenden"
+
+#: application/forms/IcingaServiceForm.php:623
+msgid "Apply For"
+msgstr "Anwenden auf"
+
+#: library/Director/Web/Controller/TemplateController.php:169
+msgid "Apply Rule"
+msgstr "Apply-Regel"
+
+#: library/Director/Web/Table/ApplyRulesTable.php:165
+msgid "Apply Rule rendering preview"
+msgstr "Rendering-Vorschau für diese Apply-Regel"
+
+#: library/Director/Import/ImportSourceDirectorObject.php:84
+#: library/Director/Web/Table/DependencyTemplateUsageTable.php:11
+#: library/Director/Web/Table/NotificationTemplateUsageTable.php:11
+#: library/Director/Web/Table/ServiceTemplateUsageTable.php:12
+msgid "Apply Rules"
+msgstr "Apply-Regeln"
+
+#: application/forms/ApplyMigrationsForm.php:20
+msgid "Apply a pending schema migration"
+msgstr "Ein ausstehende Schema-Migration durchführen"
+
+#: library/Director/Job/SyncJob.php:92
+msgid "Apply changes"
+msgstr "Änderungen anwenden"
+
+#: library/Director/Dashboard/Dashlet/NotificationApplyDashlet.php:19
+msgid "Apply notifications with specific properties according to given rules."
+msgstr ""
+"Benachrichtigungen mit bestimmten Eigenschaften anhand von gegebenen Regeln "
+"anwenden"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1123
+msgid "Apply rule"
+msgstr "Apply Regel"
+
+#: library/Director/Web/Table/ApplyRulesTable.php:172
+msgid "Apply rule history"
+msgstr "Apply-Regel Historie"
+
+#: application/forms/KickstartForm.php:38
+msgid "Apply schema migrations"
+msgstr "Schema-Migrations-Scripte anwenden"
+
+#: application/forms/IcingaNotificationForm.php:81
+#: application/forms/IcingaDependencyForm.php:93
+#: application/forms/IcingaScheduledDowntimeForm.php:82
+msgid "Apply to"
+msgstr "Anwenden auf"
+
+#: application/controllers/ServiceController.php:224
+#, php-format
+msgid "Apply: %s"
+msgstr "Apply: %s"
+
+#: library/Director/Web/Table/BranchedIcingaCommandArgumentTable.php:46
+#: library/Director/Web/Table/IcingaCommandArgumentTable.php:49
+msgid "Argument"
+msgstr "Argument"
+
+#: application/forms/IcingaObjectFieldForm.php:99
+msgid "Argument macros"
+msgstr "Argument Makros"
+
+#: application/forms/IcingaCommandArgumentForm.php:25
+msgid "Argument name"
+msgstr "Argumentname"
+
+#: application/forms/SyncPropertyForm.php:315
+msgid "Arguments"
+msgstr "Argumente"
+
+#: library/Director/DataType/DataTypeDirectorObject.php:80
+#: library/Director/DataType/DataTypeSqlQuery.php:77
+#: library/Director/DataType/DataTypeDatalist.php:133
+msgid "Array"
+msgstr "Array"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1619
+msgid "Assign where"
+msgstr "Zuweisen wo"
+
+#: application/forms/IcingaTemplateChoiceForm.php:95
+msgid "Associated Template"
+msgstr "Zugehörige Vorlage"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:506
+#: application/forms/IcingaScheduledDowntimeForm.php:31
+#: application/controllers/BranchController.php:60
+msgid "Author"
+msgstr "Autor"
+
+#: library/Director/DataType/DataTypeDatalist.php:151
+msgid "Autocomplete"
+msgstr "Automatische Vervollständigung"
+
+#: library/Director/Dashboard/AutomationDashboard.php:15
+msgid "Automate all tasks"
+msgstr "Automatisiere alle Aufgaben"
+
+#: configuration.php:169
+msgid "Automation"
+msgstr "Automatisierung"
+
+#: application/forms/IcingaTemplateChoiceForm.php:64
+msgid "Available choices"
+msgstr "Verfügbare Auswahlmöglichkeiten"
+
+#: library/Director/Web/Controller/TemplateController.php:95
+#: application/controllers/BasketController.php:54
+#: application/controllers/DataController.php:165
+msgid "Back"
+msgstr "Zurück"
+
+#: library/Director/Web/Table/BasketTable.php:31
+#: application/forms/AddToBasketForm.php:61
+#: application/controllers/BasketController.php:36
+msgid "Basket"
+msgstr "Basket"
+
+#: application/forms/BasketForm.php:38
+msgid "Basket Definitions"
+msgstr "Basket-Definitionen"
+
+#: application/forms/BasketUploadForm.php:29
+#: application/forms/BasketForm.php:48
+msgid "Basket Name"
+msgstr "Basket-Name"
+
+#: application/controllers/BasketController.php:142
+msgid "Basket Snapshots"
+msgstr "Basket-Snapshots"
+
+#: application/forms/BasketUploadForm.php:145
+msgid "Basket has been uploaded"
+msgstr "Basket wurde hochgeladen"
+
+#: application/controllers/BasketsController.php:17
+#: application/controllers/BasketController.php:78
+msgid "Baskets"
+msgstr "Baskets"
+
+#: application/forms/SyncRuleForm.php:103
+msgid ""
+"Be careful: this is usually NOT what you want, as it makes Sync \"blind\" "
+"for objects matching this filter. This means that \"Purge\" will not work as "
+"expected. The \"Black/Whitelist\" Import Property Modifier is probably what "
+"you're looking for."
+msgstr ""
+"Vorsicht: das ist für gewöhnlich NICHT das was man möchte, denn es macht "
+"Sync \"blind\" für Objekte die diesem Filter entsprechen. Das bedeutet meist "
+"dass das \"Bereinigen\" nicht wie erwartet funktioniert. Der \"Black/"
+"Whitelist\"-Eigenschaftsmodifikator ist für gewöhnlich was man stattdessen "
+"nutzen möchte."
+
+#: library/Director/PropertyModifier/PropertyModifierTrim.php:20
+msgid "Beginning and Ending"
+msgstr "Anfang und Ende"
+
+#: library/Director/PropertyModifier/PropertyModifierTrim.php:21
+msgid "Beginning only"
+msgstr "Nur den Anfang"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:79
+msgid "Binary"
+msgstr "Binary"
+
+#: application/controllers/BranchController.php:49
+msgid "Branch Activity"
+msgstr "Aktivität in diesem Zweig"
+
+#: library/Director/DataType/DataTypeDictionary.php:36
+msgid "Can be managed once this object has been created"
+msgstr "Kann verwaltet werden, sobald dieses Objekt erstellt wurde"
+
+#: library/Director/Db/Branch/MergeErrorModificationForMissingObject.php:10
+#, php-format
+msgid "Cannot apply modification for %s %s, object does not exist"
+msgstr ""
+"Änderung für %s %s kann nicht angewandt werden, das Objekt existiert nicht"
+
+#: library/Director/Db/Branch/MergeErrorDeleteMissingObject.php:10
+#, php-format
+msgid "Cannot delete %s %s, it does not exist"
+msgstr "%s %s kann nicht gelöscht werden, es existiert nicht"
+
+#: library/Director/Db/Branch/MergeErrorRecreateOnMerge.php:10
+#, php-format
+msgid "Cannot recreate %s %s"
+msgstr "%s %s kann nicht erneut erstellt werden"
+
+#: application/forms/DirectorDatafieldForm.php:150
+#: application/forms/IcingaObjectFieldForm.php:125
+msgid "Caption"
+msgstr "Beschriftung"
+
+#: library/Director/Dashboard/Dashlet/DatafieldCategoryDashlet.php:17
+msgid "Categories bring structure to your Data Fields"
+msgstr "Kategorien bringen Struktur in konfigurierte Datenfelder"
+
+#: library/Director/Web/Table/DatafieldTable.php:51
+msgid "Category"
+msgstr "Kategorie"
+
+#: library/Director/Web/Table/DatafieldCategoryTable.php:47
+msgid "Category Name"
+msgstr "Kategoriename"
+
+#: application/forms/DirectorDatafieldCategoryForm.php:23
+msgid "Category name"
+msgstr "Kategoriename"
+
+#: application/forms/IcingaMultiEditForm.php:270
+#, php-format
+msgid "Changing this value affects %d object(s): %s"
+msgstr "Diesen Wert zu ändern beeinflusst %d Objekt(e): %s"
+
+#: library/Director/PropertyModifier/PropertyModifierTrim.php:28
+msgid "Character Mask"
+msgstr "Zeichenmaske"
+
+#: library/Director/Import/ImportSourceCoreApi.php:57
+msgid "Check Commands"
+msgstr "Check-Kommando"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1335
+msgid "Check command"
+msgstr "Check-Kommando"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1336
+#: application/forms/IcingaNotificationForm.php:263
+msgid "Check command definition"
+msgstr "Check-Kommandodefinition"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1404
+msgid ""
+"Check command timeout in seconds. Overrides the CheckCommand's timeout "
+"attribute"
+msgstr ""
+"Timeout für das Check-Kommando in Sekunden. Überschreibt die Timeout-"
+"Konfiguration des Kommandos"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:336
+msgid "Check execution"
+msgstr "Check-Ausführung"
+
+#: application/forms/ImportCheckForm.php:23
+#: application/forms/SyncCheckForm.php:24
+msgid "Check for changes"
+msgstr "Auf Änderungen prüfen"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1371
+msgid "Check interval"
+msgstr "Check-Intervall"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1416
+msgid "Check period"
+msgstr "Checkzeitraum"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1402
+msgid "Check timeout"
+msgstr "Check-Timeout"
+
+#: application/forms/ImportCheckForm.php:45
+msgid "Checking this Import Source failed"
+msgstr "Überprüfen dieser Importquelle fehlgeschlagen"
+
+#: application/forms/SyncCheckForm.php:66
+msgid "Checking this sync rule failed"
+msgstr "Überprüfen dieser Synchronisationsregel fehlgeschlagen"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:550
+msgid "Checksum"
+msgstr "Prüfsumme"
+
+#: application/forms/IcingaDependencyForm.php:233
+msgid "Child Host"
+msgstr "Kind-Host"
+
+#: application/forms/IcingaDependencyForm.php:246
+msgid "Child Service"
+msgstr "Kind-Service"
+
+#: application/forms/IcingaTemplateChoiceForm.php:48
+msgid "Choice name"
+msgstr "Auswahlname"
+
+#: library/Director/Dashboard/Dashlet/ChoicesDashlet.php:11
+#: library/Director/Web/Tabs/ObjectsTabs.php:74
+msgid "Choices"
+msgstr "Auswahl"
+
+#: application/forms/BasketForm.php:82
+msgid ""
+"Choose \"All\" to always add all of them, \"Ignore\" to not care about a "
+"specific Type at all and opt for \"Custom Selection\" in case you want to "
+"choose just some specific Objects."
+msgstr ""
+"Wählen Sie \"Alle\" um immer alle davon hinzuzufügen, \"Ignorieren\" um sich "
+"nicht um einen bestimmten Typ zu kümmern und entscheiden Sie sich für "
+"\"Benutzerdefinierte Auswahl\" wenn nur bestimmte Objekte manuell gewählt "
+"werden sollen."
+
+#: application/forms/IcingaTemplateChoiceForm.php:97
+msgid "Choose Choice Associated Template"
+msgstr "Wähle eine der Auswahl zugehörige Vorlage"
+
+#: application/controllers/IndexController.php:53
+msgid "Choose DB Resource"
+msgstr "Datenbankressource wählen"
+
+#: application/forms/IcingaHostForm.php:188
+msgid "Choose a Host Template"
+msgstr "Wähle eine Service-Vorlage"
+
+#: application/forms/IcingaAddServiceForm.php:105
+msgid "Choose a service template"
+msgstr "Wähle eine Service-Vorlage"
+
+#: application/forms/SyncRuleForm.php:46
+msgid "Choose an object type"
+msgstr "Einen Objekttyp auswählen"
+
+#: application/forms/BasketUploadForm.php:35
+msgid "Choose file"
+msgstr "Datei wählen"
+
+#: application/forms/IcingaServiceForm.php:601
+msgid "Choose the host this single service should be assigned to"
+msgstr "Host wählen, dem dieser einzelne Service zugewiesen werden soll"
+
+#: application/forms/IcingaTemplateChoiceForm.php:75
+msgid ""
+"Choosing this many options will be mandatory for this Choice. Setting this "
+"to zero will leave this Choice optional, setting it to one results in a "
+"\"required\" Choice. You can use higher numbers to enforce multiple options, "
+"this Choice will then turn into a multi-selection element."
+msgstr ""
+"Diese Anzahl an Optionen müssen für diese Auswahl zwingend gewählt werden. "
+"Setzt man diese Einstellung auf Null, wird die Auswahl optional, setzt man "
+"sie auf Eins wird die Auswahl zwingend. Setzt man eine höhere Anzahl kann "
+"man mehrere Optionen erzwingen, die Auswahl wandelt sich dann in ein "
+"Mehrfach-Auswahlfeld."
+
+#: application/forms/IcingaZoneForm.php:37
+msgid "Chose an (optional) parent zone"
+msgstr "Eine (optionale) Elternzone auswählen"
+
+#: library/Director/Web/Widget/Documentation.php:38
+#, php-format
+msgid "Click to read our documentation: %s"
+msgstr "Anklicken um unsere Dokumentation zu lesen: %s"
+
+#: library/Director/Web/ActionBar/AutomationObjectActionBar.php:44
+#: library/Director/Web/Form/CloneImportSourceForm.php:35
+#: library/Director/Web/Form/CloneSyncRuleForm.php:35
+#: library/Director/Web/Controller/ObjectController.php:381
+#: application/controllers/ImportsourceController.php:148
+#: application/controllers/SyncruleController.php:548
+msgid "Clone"
+msgstr "Klonen"
+
+#: application/forms/IcingaCloneObjectForm.php:108
+#, php-format
+msgid "Clone \"%s\""
+msgstr "Klone \"%s\""
+
+#: application/forms/IcingaCloneObjectForm.php:68
+msgid "Clone Service Sets"
+msgstr "Klone Service-Set"
+
+#: application/forms/IcingaCloneObjectForm.php:59
+msgid "Clone Services"
+msgstr "Klone Services"
+
+#: application/forms/IcingaCloneObjectForm.php:100
+msgid "Clone Template Fields"
+msgstr "Vorlagen-Felder klonen"
+
+#: application/forms/IcingaCloneObjectForm.php:49
+msgid "Clone the object as is, preserving imports"
+msgstr "Objekt vollständig unter Erhalt der Vererbung klonen"
+
+#: application/forms/IcingaCloneObjectForm.php:89
+msgid "Clone this service to the very same or to another Host"
+msgstr "Klone diesen Service zum selben oder einem anderen Host"
+
+#: application/forms/IcingaCloneObjectForm.php:80
+msgid "Clone this service to the very same or to another Service Set"
+msgstr "Klone diesen Service"
+
+#: library/Director/Web/Controller/ObjectController.php:214
+#, php-format
+msgid "Clone: %s"
+msgstr "Klone %s"
+
+#: library/Director/Web/Controller/ObjectController.php:221
+msgid "Cloning Apply Rules"
+msgstr "Apply-Regeln klonen"
+
+#: application/controllers/ImportsourceController.php:149
+msgid "Cloning Import Sources"
+msgstr "Importquellen klonen"
+
+#: application/controllers/SyncruleController.php:559
+msgid "Cloning Sync Rules"
+msgstr "Synchronisationsregeln klonen"
+
+#: library/Director/Web/Controller/ObjectController.php:217
+msgid "Cloning Templates"
+msgstr "Vorlagen Klonen"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1162
+msgid "Cluster Zone"
+msgstr "Cluster Zone"
+
+#: library/Director/Dashboard/Dashlet/ChoicesDashlet.php:17
+msgid ""
+"Combine multiple templates into meaningful Choices, making life easier for "
+"your users"
+msgstr ""
+"Kombiniere mehrere Vorlagen zu sprechenden Wahlmöglichkeiten, um die "
+"Benutzung zu vereinfachen"
+
+#: library/Director/PropertyModifier/PropertyModifierSimpleGroupBy.php:62
+msgid ""
+"Comma-separated list of columns that should be aggregated (transformed into "
+"an Array). For all other columns only the first value will be kept."
+msgstr ""
+"Kommagetrennte Liste von Spalten, welche aggregiert (in ein Array "
+"verwandelt) werden sollen. Für alle anderen Spalten wird lediglich der erste "
+"Wert beibehalten."
+
+#: library/Director/TranslationDummy.php:16
+#: application/forms/IcingaCommandForm.php:58
+#: application/forms/SyncRuleForm.php:20
+msgid "Command"
+msgstr "Kommando"
+
+#: application/forms/BasketForm.php:17
+msgid "Command Definitions"
+msgstr "Kommandodefinitionen"
+
+#: application/forms/BasketForm.php:19
+msgid "Command Template"
+msgstr "Kommando-Vorlage"
+
+#: library/Director/Dashboard/Dashlet/CommandTemplatesDashlet.php:19
+msgid "Command Templates"
+msgstr "Kommando-Vorlagen"
+
+#: application/controllers/CommandController.php:92
+#, php-format
+msgid "Command arguments: %s"
+msgstr "Kommandoargumente: %s"
+
+#: application/forms/IcingaHostForm.php:114
+msgid "Command endpoint"
+msgstr "Kommandoendpunkt"
+
+#: application/forms/IcingaCommandForm.php:47
+msgid "Command name"
+msgstr "Kommandoname"
+
+#: application/forms/IcingaCommandForm.php:17
+msgid "Command type"
+msgstr "Kommandotyp"
+
+#: configuration.php:161
+#: library/Director/Dashboard/Dashlet/CommandObjectDashlet.php:13
+#: library/Director/Dashboard/Dashlet/CheckCommandsDashlet.php:19
+#: library/Director/Db/Branch/BranchModificationInspection.php:37
+#: library/Director/Web/Table/CustomvarVariantsTable.php:57
+msgid "Commands"
+msgstr "Kommandos"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:39
+msgid "Comment"
+msgstr "Kommentar"
+
+#: application/controllers/BasketController.php:345
+#, php-format
+msgid "Comparing %s \"%s\" from Snapshot \"%s\" to current config"
+msgstr ""
+"Vergleiche %s \"%s\" aus dem Snapshot \"%s\" mit der aktuellen Konfiguration"
+
+#: application/forms/IcingaCommandArgumentForm.php:89
+#: application/forms/IcingaCommandArgumentForm.php:98
+msgid "Condition (set_if)"
+msgstr "Bedingung (set_if)"
+
+#: application/forms/IcingaCommandArgumentForm.php:75
+msgid "Condition format"
+msgstr "Bedingungsformat"
+
+#: library/Director/Web/Table/CoreApiFieldsTable.php:85
+#: library/Director/Web/Widget/DeploymentInfo.php:60
+#: application/controllers/JobController.php:112
+#: application/controllers/ConfigController.php:277
+#: application/controllers/ConfigController.php:515
+msgid "Config"
+msgstr "Konfiguration"
+
+#: library/Director/Dashboard/Dashlet/DeploymentDashlet.php:18
+msgid "Config Deployment"
+msgstr "Ausrollen der Konfiguration"
+
+#: application/forms/DeployConfigForm.php:100
+#: application/forms/DeploymentLinkForm.php:165
+#: application/controllers/ConfigController.php:490
+msgid "Config deployment failed"
+msgstr "Ausrollen der Konfiguration fehlgeschlagen"
+
+#: application/controllers/ConfigController.php:364
+#: application/controllers/ConfigController.php:365
+msgid "Config diff"
+msgstr "Konfigurationsunterschied"
+
+#: application/controllers/ConfigController.php:323
+#: application/controllers/ConfigController.php:425
+#, php-format
+msgid "Config file \"%s\""
+msgstr "Konfigurationsdatei \"%s\""
+
+#: application/forms/DeployConfigForm.php:76
+#: application/forms/DeployConfigForm.php:95
+#: application/forms/DeploymentLinkForm.php:152
+#: application/controllers/ConfigController.php:470
+msgid "Config has been submitted, validation is going on"
+msgstr "Konfiguration wurde übergeben, Überprüfung ist im Gange"
+
+#: application/forms/DeployFormsBug7530.php:87
+msgid "Config has not been deployed"
+msgstr "Konfiguration wurde nicht ausgerollt"
+
+#: library/Director/Web/ObjectPreview.php:41
+#, php-format
+msgid "Config preview: %s"
+msgstr "Konfigurationsvorschau: %s"
+
+#: library/Director/ProvidedHook/Monitoring/ServiceActions.php:65
+#: library/Director/Web/Widget/DeploymentInfo.php:82
+msgid "Configuration"
+msgstr "Konfiguration"
+
+#: application/controllers/HostController.php:285
+msgid "Configuration (read-only)"
+msgstr "Konfiguration (nur lesen)"
+
+#: library/Director/Dashboard/Dashlet/BasketDashlet.php:11
+#: application/controllers/BasketsController.php:32
+msgid "Configuration Baskets"
+msgstr "Konfigurationsbaskets"
+
+#: application/forms/SettingsForm.php:121
+msgid "Configuration format"
+msgstr "Konfigurationsformat"
+
+#: application/forms/KickstartForm.php:309
+msgid "Configuration has been stored"
+msgstr "Konfiguration wurde gespeichert"
+
+#: application/forms/AddToBasketForm.php:112
+#, php-format
+msgid "Configuration objects have been added to the chosen basket \"%s\""
+msgstr "Konfigurationsobjekte wurden zum gewählten Basket \"%s\" hinzugefügt"
+
+#: library/Director/Web/SelfService.php:192
+msgid "Configure this Agent via Self Service API"
+msgstr "Konfiguriere diesen Agent über die Selbstbedienungs-API"
+
+#: application/controllers/BasketController.php:231
+msgid "Content Checksum"
+msgstr "Prüfsumme (Inhalt)"
+
+#: application/controllers/BasketsController.php:20
+msgid "Create"
+msgstr "Erstellen"
+
+#: application/controllers/BasketController.php:104
+msgid "Create Basket"
+msgstr "Basket erstellen"
+
+#: application/controllers/IndexController.php:46
+msgid "Create Schema"
+msgstr "Schema erstellen"
+
+#: application/forms/BasketCreateSnapshotForm.php:23
+msgid "Create Snapshot"
+msgstr "Snapshot erstellen"
+
+#: library/Director/Web/Controller/ObjectsController.php:320
+#, php-format
+msgid "Create a new %s Apply Rule"
+msgstr "Erstelle eine neue %s Apply-Regel"
+
+#: library/Director/Web/Controller/ObjectsController.php:361
+#, php-format
+msgid "Create a new %s Set"
+msgstr "Erstelle ein neues %s-Set"
+
+#: library/Director/Web/Controller/TemplateController.php:157
+#, php-format
+msgid "Create a new %s inheriting from this one"
+msgstr "Neuen und von diesem erbenden %s erstellen"
+
+#: library/Director/Web/Controller/TemplateController.php:147
+#: library/Director/Web/Controller/TemplateController.php:167
+#, php-format
+msgid "Create a new %s inheriting from this template"
+msgstr "Einen neuen von dieser Vorlage erbenden %s erstellen"
+
+#: application/controllers/BasketController.php:105
+msgid "Create a new Configuration Basket"
+msgstr "Erstelle einen neuen Konfigurationsbasket"
+
+#: library/Director/Web/ActionBar/TemplateActionBar.php:23
+#: library/Director/Web/Controller/ObjectController.php:147
+msgid "Create a new Template"
+msgstr "Neue Vorlage erstellen"
+
+#: library/Director/Web/ActionBar/ObjectsActionBar.php:20
+msgid "Create a new object"
+msgstr "Neues Objekt erstellen"
+
+#: library/Director/Web/ActionBar/ChoicesActionBar.php:20
+msgid "Create a new template choice"
+msgstr "Neue Template-Auswahl erstellen"
+
+#: application/forms/KickstartForm.php:37
+msgid "Create database schema"
+msgstr "Datenbankschema erstellen"
+
+#: application/forms/ApplyMigrationsForm.php:31
+msgid "Create schema"
+msgstr "Datenbankschema erstellen"
+
+#: application/controllers/BasketController.php:230
+msgid "Created"
+msgstr "Erstellt"
+
+#: application/controllers/ImportsourceController.php:109
+msgid "Creating Import Sources"
+msgstr "Importquellen erstellen"
+
+#: application/controllers/JobController.php:36
+msgid "Creating Jobs"
+msgstr "Aufträge erstellen"
+
+#: application/controllers/SyncruleController.php:524
+msgid "Creating Sync Rules"
+msgstr "Synchronisationsregeln erstellen"
+
+#: library/Director/Web/Controller/ObjectController.php:146
+msgid "Creating Templates"
+msgstr "Vorlagen erstellen"
+
+#: library/Director/IcingaConfig/StateFilterSet.php:26
+msgid "Critical"
+msgstr "Kritisch"
+
+#: library/Director/Web/Controller/TemplateController.php:186
+msgid "Current Template Usage"
+msgstr "Aktuelle Nutzung dieser Vorlage"
+
+#: application/forms/IcingaHostForm.php:104
+msgid "Custom Endpoint Name"
+msgstr "Individueller Endpunktname"
+
+#: application/forms/BasketForm.php:57
+msgid "Custom Selection"
+msgstr "Benutzerdefinierte Auswahl"
+
+#: application/controllers/CustomvarController.php:13
+msgid "Custom Variable"
+msgstr "Benutzerdefinierte Variable"
+
+#: application/controllers/CustomvarController.php:14
+#, php-format
+msgid "Custom Variable variants: %s"
+msgstr "Varianten der benutzerdefinierten Variable: %s"
+
+#: library/Director/Web/Tabs/DataTabs.php:30
+msgid "Custom Variables"
+msgstr "Benutzerdefinierte Variablen"
+
+#: application/controllers/DataController.php:110
+msgid "Custom Vars - Overview"
+msgstr "Benutzerdefinierte Variablen - Übersicht"
+
+#: application/forms/SyncPropertyForm.php:180
+msgid "Custom expression"
+msgstr "Benutzerdefinierter Ausdruck"
+
+#: library/Director/Web/Controller/ObjectController.php:250
+#, php-format
+msgid "Custom fields: %s"
+msgstr "Benutzerdefinierte Felder: \"%s\""
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:25
+msgid "Custom notification"
+msgstr "Benutzerdefinierte Benachrichtigung"
+
+#: library/Director/Web/Form/IcingaObjectFieldLoader.php:266
+#: application/forms/IcingaServiceForm.php:464
+msgid "Custom properties"
+msgstr "Benutzerdefinierte Eigenschaften"
+
+#: application/forms/SyncPropertyForm.php:67
+msgid "Custom variable"
+msgstr "Benutzerdefinierte Variable"
+
+#: application/forms/SyncPropertyForm.php:308
+msgid "Custom variable (vars.)"
+msgstr "Benutzerdefinierte Variable (vars.)"
+
+#: library/Director/Objects/IcingaService.php:756
+#: library/Director/Objects/IcingaHost.php:164
+#: application/controllers/SuggestController.php:253
+#: application/controllers/SuggestController.php:263
+msgid "Custom variables"
+msgstr "Benutzerdefinierte Variablen"
+
+#: library/Director/Dashboard/Dashlet/CustomvarDashlet.php:11
+msgid "CustomVar Overview"
+msgstr "Benutzerdefinierte Variable - Übersicht"
+
+#: library/Director/Import/ImportSourceSql.php:41
+msgid "DB Query"
+msgstr "Datenbank-Abfrage"
+
+#: application/forms/KickstartForm.php:222
+msgid "DB Resource"
+msgstr "Datenbankressource"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:15
+msgid "DN component"
+msgstr "DN Komponente"
+
+#: library/Director/PropertyModifier/PropertyModifierDnsRecords.php:25
+msgid "DNS record type"
+msgstr "DNS-Record-Typ"
+
+#: library/Director/Web/Tabs/MainTabs.php:34
+msgid "Daemon"
+msgstr "Dienst"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:40
+#, php-format
+msgid "Daemon has been stopped %s, was running with PID %s as %s@%s"
+msgstr "Dienst wurde %s gestoppt, lief zuvor mit PID %s als %s@%s"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:62
+#, php-format
+msgid "Daemon is running with PID %s as %s@%s, last refresh happened %s"
+msgstr ""
+"Dienst läuft mit PID %s als %s@%s, die letzte Aktualisierung fand %s statt"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:51
+#, php-format
+msgid ""
+"Daemon keep-alive is outdated, was last seen running with PID %s as %s@%s %s"
+msgstr ""
+"Daemon keep-alive is outdated, was last seen running with PID %s as %s@%s %s"
+
+#: library/Director/Dashboard/Dashlet/DatafieldCategoryDashlet.php:11
+#: application/controllers/DataController.php:93
+msgid "Data Field Categories"
+msgstr "Datenfeldkategorien"
+
+#: application/forms/DirectorDatafieldForm.php:168
+msgid "Data Field Category"
+msgstr "Datenfeldkategorie"
+
+#: application/controllers/DataController.php:75
+msgid "Data Fields"
+msgstr "Datenfelder"
+
+#: application/controllers/DataController.php:65
+msgid "Data List"
+msgstr "Datenliste"
+
+#: application/forms/SyncRuleForm.php:19
+msgid "Data List Entry"
+msgstr "Datenlisteneintrag"
+
+#: application/controllers/DataController.php:59
+#, php-format
+msgid "Data List: %s"
+msgstr "Datenliste: %s"
+
+#: application/forms/BasketForm.php:34
+msgid "Data Lists"
+msgstr "Datenlisten"
+
+#: library/Director/Web/Tabs/DataTabs.php:24
+msgid "Data field categories"
+msgstr "Datenfeldkategorien"
+
+#: application/forms/DirectorDatafieldCategoryForm.php:17
+msgid ""
+"Data field categories allow to structure Data Fields. Fields with a category "
+"will be shown grouped by category."
+msgstr ""
+"Datenfeldkategorien erlauben es, Datenfelder zu strukturieren. Felder mit "
+"einer Kategorie werden nach Kategorie gruppiert angezeigt."
+
+#: library/Director/Web/Tabs/DataTabs.php:21
+msgid "Data fields"
+msgstr "Datenfelder"
+
+#: application/forms/DirectorDatafieldForm.php:133
+msgid ""
+"Data fields allow you to customize input controls for Icinga custom "
+"variables. Once you defined them here, you can provide them through your "
+"defined templates. This gives you a granular control over what properties "
+"your users should be allowed to configure in which way."
+msgstr ""
+"Datenfelder erlauben es, Eingabefelder für benutzerdefinierte Variablen zu "
+"personalisieren. Sobald diese hier definiert wurden, können sie über "
+"definierte Templates zur Verfügung gestellt werden. Das erlaubt eine "
+"granuläre Kontrolle darüber, welche Eigenschaften in welche Weise "
+"konfigurierbar sein sollen."
+
+#: library/Director/Dashboard/Dashlet/DatafieldDashlet.php:17
+msgid "Data fields make sure that configuration fits your rules"
+msgstr ""
+"Datenfelder sorgen dafür, dass die Konfiguration in vorgegebene Regeln passt"
+
+#: application/forms/DirectorDatalistForm.php:24
+msgid "Data list"
+msgstr "Datenliste"
+
+#: library/Director/Web/Tabs/DataTabs.php:27
+#: application/controllers/DataController.php:32
+msgid "Data lists"
+msgstr "Datenlisten"
+
+#: application/forms/DirectorDatalistForm.php:15
+msgid ""
+"Data lists are mainly used as data providers for custom variables presented "
+"as dropdown boxes boxes. You can manually manage their entries here in "
+"place, but you could also create dedicated sync rules after creating a new "
+"empty list. This would allow you to keep your available choices in sync with "
+"external data providers"
+msgstr ""
+"Datenlisten werden hauptsächlich als Datenquelle für benutzerdefinierte "
+"Variablen benutzt, die in Dropdown-Auswahlfeldern präsentiert werden. Ihre "
+"Einträge können hier manuell, oder über eine dedizierte "
+"Synchronisationsregel nach dem Anlegen einer leeren Liste verwaltet werden. "
+"Letzteres erlaubt das Synchronisieren der verfügbaren Auswahlmöglichkeiten "
+"mit externen Datenquellen"
+
+#: application/forms/DirectorDatafieldForm.php:181
+msgid "Data type"
+msgstr "Datentyp"
+
+#: application/forms/KickstartForm.php:272
+msgid "Database backend"
+msgstr "Datenbankbackend"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:507
+#: application/controllers/BranchController.php:61
+msgid "Date"
+msgstr "Datum"
+
+#: library/Director/Web/Table/IcingaTimePeriodRangeTable.php:45
+#: library/Director/Web/Table/IcingaScheduledDowntimeRangeTable.php:51
+#: application/forms/IcingaTimePeriodRangeForm.php:21
+#: application/forms/IcingaScheduledDowntimeRangeForm.php:22
+msgid "Day(s)"
+msgstr "Tag(e)"
+
+#: application/forms/IcingaServiceForm.php:173
+msgid "Deactivate"
+msgstr "Deaktivieren"
+
+#: application/forms/SettingsForm.php:130
+msgid ""
+"Default configuration format. Please note that v1.x is for special "
+"transitional projects only and completely unsupported. There are no plans to "
+"make Director a first-class configuration backends for Icinga 1.x"
+msgstr ""
+"Standardkonfigurationsformat. Bitte beachten, dass v1.x nur für ganz "
+"spezielle Migrationsprojekte implementiert wurde und in keiner Weise "
+"unterstützt wird. Es gibt keine Pläne aus dem Director ein "
+"Konfigurationswerkzeug für Icinga 1.x zu machen"
+
+#: application/forms/SettingsForm.php:32
+msgid "Default global zone"
+msgstr "Globale Standard-Zone"
+
+#: library/Director/Dashboard/CommandsDashboard.php:23
+msgid ""
+"Define Check-, Notification- or Event-Commands. Command definitions are the "
+"glue between your Host- and Service-Checks and the Check plugins on your "
+"Monitoring (or monitored) systems"
+msgstr ""
+"Definiere Check-, Benachrichtigungs- oder Event-Kommandos. "
+"Kommandodefinitionen sind das Verbindungsstück zwischen Host- und Service-"
+"Checks und den Check-Plugins auf dem Monitoring- (oder dem überwachten) "
+"System"
+
+#: library/Director/Dashboard/Dashlet/DatafieldDashlet.php:11
+msgid "Define Data Fields"
+msgstr "Datenfelder definieren"
+
+#: library/Director/Dashboard/Dashlet/HostGroupsDashlet.php:17
+msgid ""
+"Define Host Groups to give your configuration more structure. They are "
+"useful for Dashboards, Notifications or Restrictions"
+msgstr ""
+"Definieren Host-Gruppen um der Konfiguration mehr Struktur zu geben. "
+"Nützlich sind diese auch für Dashboards, Benachrichtigungen oder "
+"Berechtigungen"
+
+#: application/forms/SelfServiceSettingsForm.php:116
+msgid ""
+"Define a download Url or local directory from which the a specific Icinga 2 "
+"Agent MSI Installer package should be fetched. Please ensure to only define "
+"the base download Url or Directory. The Module will generate the MSI file "
+"name based on your operating system architecture and the version to install. "
+"The Icinga 2 MSI Installer name is internally build as follows: Icinga2-"
+"v[InstallAgentVersion]-[OSArchitecture].msi (full example: Icinga2-v2.6.3-"
+"x86_64.msi)"
+msgstr ""
+"Definieren einen Download-URL oder ein lokales Verzeichnis von welchem ein "
+"bestimmtes MSI-Installer-Paket für den Icinga-2-Agenten geladen werden soll. "
+"Bitte sicherstellen, dass nur Basis-URL oder -Verzeichnis angegeben werden. "
+"Das Powershell-Modul erstellt den MSI-Dateinamen auf Basis der jeweiligen "
+"Betriebssystemarchitektur und zu installierenden Version. Intern wird der "
+"MSI-Installer-Name wie folgt erstellt: Icinga2-v[InstallAgentVersion]-"
+"[OSArchitecture].msi (volles Beispiel: Icinga2-v2.6.3-x86_64.msi)"
+
+#: library/Director/Dashboard/Dashlet/ImportSourceDashlet.php:29
+msgid "Define and manage imports from various data sources"
+msgstr "Definiert und verwaltet Importe von diversen Datenquellen"
+
+#: library/Director/Dashboard/TimeperiodsDashboard.php:14
+msgid "Define custom Time Periods"
+msgstr "Benutzerdefinierte Zeiträume festlegen"
+
+#: library/Director/Dashboard/Dashlet/SyncDashlet.php:29
+msgid "Define how imported data should be synchronized with Icinga"
+msgstr ""
+"Definieren, wie importierte Daten mit Icinga synchronisiert werden sollen"
+
+#: application/forms/SyncRuleForm.php:54
+msgid ""
+"Define what should happen when an object with a matching key already exists. "
+"You could merge its properties (import source wins), replace it completely "
+"with the imported object or ignore it (helpful for one-time imports). "
+"\"Update only\" means that this Rule would never create (or delete) full "
+"Objects."
+msgstr ""
+"Angeben, was geschehen soll wenn ein Objekt mit gleichem Schlüssel bereits "
+"existiert. Die Eigenschaften können zusammengeführt (Importquelle gewinnt), "
+"durch das importierte Objekt ersetzt oder ignoriert (hilfreich für einmalige "
+"Importe) werden."
+
+#: library/Director/Dashboard/ObjectsDashboard.php:15
+msgid "Define whatever you want to be monitored"
+msgstr "Angeben, was überwacht werden soll"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1393
+msgid "Defines after how many check attempts a new hard state is reached"
+msgstr ""
+"Legt fest, nach wie vielen Versuchen ein neuer Hard State erreicht wird"
+
+#: library/Director/Dashboard/Dashlet/UserGroupsDashlet.php:17
+msgid ""
+"Defining Notifications for User Groups instead of single Users gives more "
+"flexibility"
+msgstr ""
+"Für Benutzergruppen anstelle einzelner Benutzer definierte "
+"Benachrichtigungen geben mehr Flexibilität"
+
+#: library/Director/Dashboard/Dashlet/ServiceGroupsDashlet.php:17
+msgid ""
+"Defining Service Groups get more structure. Great for Dashboards. "
+"Notifications and Permissions might be based on groups."
+msgstr ""
+"Definiere Service-Gruppen für mehr Struktur. Nützlich für Dashboards. "
+"Benachrichtigungen und Berechtigungen können auf Gruppen basieren."
+
+#: application/forms/IcingaNotificationForm.php:199
+msgid "Delay unless the first notification should be sent"
+msgstr "Verzögerung bis die erste Benachrichtigung verschickt werden soll"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:925
+#: application/forms/IcingaObjectFieldForm.php:193
+#: application/forms/SyncRuleForm.php:87
+msgid "Delete"
+msgstr "Löschen"
+
+#: library/Director/PropertyModifier/PropertyModifierSplit.php:13
+msgid "Delimiter"
+msgstr "Trenner"
+
+#: library/Director/Dashboard/Dashlet/DependencyObjectDashlet.php:13
+#: library/Director/Db/Branch/BranchModificationInspection.php:47
+#: application/forms/BasketForm.php:33
+msgid "Dependencies"
+msgstr "Abhängigkeiten"
+
+#: application/forms/SyncRuleForm.php:24
+msgid "Dependency"
+msgstr "Abhängigkeit"
+
+#: application/forms/DeploymentLinkForm.php:94
+msgid "Deploy"
+msgstr "Ausrollen"
+
+#: application/forms/DeployConfigForm.php:37
+#, php-format
+msgid "Deploy %d pending changes"
+msgstr "%d ausstehende Änderungen ausrollen"
+
+#: library/Director/Dashboard/DeploymentDashboard.php:15
+msgid "Deploy configuration to your Icinga nodes"
+msgstr "Konfiguration auf Icinga Knoten ausrollen"
+
+#: library/Director/Job/ConfigJob.php:45
+msgid "Deploy modified config"
+msgstr "Veränderte Konfiguration ausrollen"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:54
+#: application/controllers/ConfigController.php:270
+#: application/controllers/ConfigController.php:507
+msgid "Deployment"
+msgstr "Deployment"
+
+#: application/forms/SettingsForm.php:165
+msgid "Deployment Path"
+msgstr "Deployment-Pfad"
+
+#: application/controllers/DeploymentController.php:22
+msgid "Deployment details"
+msgstr "Deployment-Details"
+
+#: application/forms/SettingsForm.php:150
+msgid "Deployment mode"
+msgstr "Ausrollmodus"
+
+#: application/forms/SettingsForm.php:159
+msgid "Deployment mode for Icinga 1 configuration"
+msgstr "Ausrollmodus für Icinga 1 Konfiguration"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:77
+msgid "Deployment time"
+msgstr "Deployment-Zeit"
+
+#: configuration.php:178
+#: library/Director/Web/Tabs/InfraTabs.php:36
+#: application/controllers/ConfigController.php:57
+msgid "Deployments"
+msgstr "Deployments"
+
+#: library/Director/Web/Table/CoreApiFieldsTable.php:87
+msgid "Deprecated"
+msgstr "Abgekündigt"
+
+#: application/forms/IcingaCommandArgumentForm.php:31
+#: application/forms/ImportSourceForm.php:24
+#: application/forms/DirectorDatafieldCategoryForm.php:31
+#: application/forms/DirectorDatafieldForm.php:159
+#: application/forms/IcingaServiceSetForm.php:102
+#: application/forms/IcingaObjectFieldForm.php:133
+#: application/forms/SyncRuleForm.php:36
+#: application/forms/ImportRowModifierForm.php:52
+#: application/forms/IcingaTemplateChoiceForm.php:56
+msgid "Description"
+msgstr "Beschreibung"
+
+#: application/forms/IcingaCommandArgumentForm.php:32
+msgid "Description of the argument"
+msgstr "Beschreibung des Arguments"
+
+#: library/Director/Web/Table/SyncpropertyTable.php:63
+msgid "Destination"
+msgstr "Ziel"
+
+#: application/forms/SyncPropertyForm.php:48
+msgid "Destination Field"
+msgstr "Zielfeld"
+
+#: application/controllers/HealthController.php:25
+msgid ""
+"Did you know that you can run this entire Health Check (or just some "
+"sections) as an Icinga Check on a regular base?"
+msgstr ""
+"Wussten Sie, dass sich dieser Health-Check (oder auch nur Abschnitte daraus) "
+"als regelmäßiger Icinga-Check ausführen lässt?"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:367
+#: application/controllers/ConfigController.php:426
+msgid "Diff"
+msgstr "Diff"
+
+#: library/Director/Web/Widget/DeployedConfigInfoHeader.php:84
+msgid "Diff with other config"
+msgstr "Mit anderer Konfiguration vergleichen"
+
+#: library/Director/Web/Table/TemplateUsageTable.php:55
+msgid "Direct"
+msgstr "Direkt"
+
+#: application/controllers/DaemonController.php:20
+#: application/controllers/DaemonController.php:22
+msgid "Director Background Daemon"
+msgstr "Director Hintergrunddienst"
+
+#: application/controllers/HealthController.php:17
+msgid "Director Health"
+msgstr "Director-Health"
+
+#: application/controllers/KickstartController.php:16
+msgid "Director Kickstart Wizard"
+msgstr "Director Kickstart-Assistent"
+
+#: library/Director/Import/ImportSourceDirectorObject.php:69
+msgid "Director Object"
+msgstr "Director-Objekt"
+
+#: library/Director/Dashboard/Dashlet/SettingsDashlet.php:11
+msgid "Director Settings"
+msgstr "Director-Einstellungen"
+
+#: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:81
+msgid "Director database schema has not been created yet"
+msgstr "Datenbankschema für Director wurde noch nicht erstellt"
+
+#: application/forms/SyncRuleForm.php:88
+msgid "Disable"
+msgstr "Deaktivien"
+
+#: application/forms/IcingaDependencyForm.php:159
+msgid "Disable Checks"
+msgstr "Checks deaktivieren"
+
+#: application/forms/IcingaDependencyForm.php:167
+msgid "Disable Notificiations"
+msgstr "Benachrichtigungen deaktivieren"
+
+#: application/forms/SettingsForm.php:54
+msgid "Disable all Jobs"
+msgstr "Alle Aufträge deaktivieren"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1296
+#: application/forms/DirectorJobForm.php:37
+msgid "Disabled"
+msgstr "Deaktiviert"
+
+#: application/forms/IcingaCommandForm.php:79
+msgid "Disabled by default, and should only be used in rare cases."
+msgstr ""
+"Standardmäßig deaktiviert, sollte nur in seltenen Fällen benutzt werden."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1297
+msgid "Disabled objects will not be deployed"
+msgstr "Deaktivierte Objekte werden nicht ausgerollt"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1312
+#: application/forms/IcingaTimePeriodForm.php:20
+msgid "Display Name"
+msgstr "Anzeigename"
+
+#: application/forms/IcingaUserForm.php:133
+#: application/forms/IcingaHostForm.php:352
+msgid "Display name"
+msgstr "Anzeigename"
+
+#: library/Director/Web/Table/CustomvarTable.php:42
+msgid "Distinct Commands"
+msgstr "Unterschiedliche Kommandos"
+
+#: library/Director/Dashboard/DataDashboard.php:16
+msgid "Do more with custom data"
+msgstr "Mehr mit benutzerdefinierten Daten anfangen"
+
+#: application/forms/SelfServiceSettingsForm.php:36
+msgid "Do not transform at all"
+msgstr "Überhaupt nicht umwandeln"
+
+#: library/Director/Web/SelfService.php:177
+msgid "Documentation"
+msgstr "Dokumentation"
+
+#: application/forms/SelfServiceSettingsForm.php:50
+msgid "Don't care, my host settings are fine"
+msgstr "Keine Sorge, meine Host-Einstellungen sind in Ordnung"
+
+#: library/Director/IcingaConfig/StateFilterSet.php:21
+msgid "Down"
+msgstr "Down"
+
+#: library/Director/Web/SelfService.php:249
+#: library/Director/Web/SelfService.php:262
+#: application/controllers/SchemaController.php:80
+#: application/controllers/BasketController.php:214
+msgid "Download"
+msgstr "Download"
+
+#: application/controllers/ImportsourceController.php:176
+msgid "Download JSON"
+msgstr "JSON herunterladen"
+
+#: library/Director/Web/Widget/AdditionalTableActions.php:59
+msgid "Download as JSON"
+msgstr "Als JSON herunterladen"
+
+#: application/forms/SelfServiceSettingsForm.php:83
+msgid "Download from a custom url"
+msgstr "Von einer benutzerdefinierten URL laden"
+
+#: application/forms/SelfServiceSettingsForm.php:82
+msgid "Download from packages.icinga.com"
+msgstr "Von packages.icinga.com herunterladen"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:30
+msgid "Downtime ends"
+msgstr "Downtime endet"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:21
+msgid "Downtime name"
+msgstr "Downtime-Name"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:31
+msgid "Downtime removed"
+msgstr "Downtime entfernt"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:29
+msgid "Downtime starts"
+msgstr "Downtime startet"
+
+#: application/forms/IcingaForgetApiKeyForm.php:22
+msgid "Drop Self Service API key"
+msgstr "Selbstbedienungs-API-Schlüssel verwerfen"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayToRow.php:23
+#: library/Director/PropertyModifier/PropertyModifierDictionaryToRow.php:30
+msgid "Drop the current row"
+msgstr "Die aktuelle Zeile verwerfen"
+
+#: library/Director/DataType/DataTypeDatalist.php:150
+msgid "Dropdown (list values only)"
+msgstr "Aufklappmenü (nur Listeneinträge)"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:83
+#: library/Director/Web/Widget/SyncRunDetails.php:29
+#: application/forms/IcingaScheduledDowntimeForm.php:56
+msgid "Duration"
+msgstr "Dauer"
+
+#: library/Director/PropertyModifier/PropertyModifierListToObject.php:18
+msgid ""
+"Each Array in the list must contain this property. It's value will be used "
+"as the key/object property name for the row."
+msgstr ""
+"Jedes Array in der Liste enthält diese Eigenschaft. Dessen Wert wird als "
+"Schlüssel/Objektbezeichner für die Zeile benutzt."
+
+#: application/controllers/DatafieldcategoryController.php:37
+msgid "Edit a Category"
+msgstr "Kategorie bearbeiten"
+
+#: application/controllers/DatafieldController.php:31
+msgid "Edit a Field"
+msgstr "Ein Feld bearbeiten"
+
+#: application/controllers/DataController.php:397
+msgid "Edit list"
+msgstr "Liste bearbeiten"
+
+#: library/Director/DataType/DataTypeDatalist.php:144
+msgid "Element behavior"
+msgstr "Verhalten des Elements"
+
+#: application/forms/IcingaUserForm.php:36
+msgid "Email"
+msgstr "E-Mail"
+
+#: application/forms/SettingsForm.php:69
+msgid "Enable audit log"
+msgstr "Revisionslog aktivieren"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1446
+msgid "Enable event handler"
+msgstr "Eventhandler aktivieren"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1458
+msgid "Enable flap detection"
+msgstr "Flap-Erkennung aktivieren"
+
+#: application/forms/SettingsForm.php:111
+msgid ""
+"Enabled the feature for custom endpoint names, where you can choose a "
+"different name for the generated endpoint object. This uses some Icinga "
+"config snippets and a special custom variable. Please do NOT enable this, "
+"unless you really need divergent endpoint names!"
+msgstr ""
+"Aktiviere das Feature für freie Endpunktnamen. Hiermit lässt sich ein "
+"anderer Name für das generierte Endpunktobjekt wählen. Hierzu werden "
+"spezielle Icinga-Konfigurationsschnipsel und eine spezielle "
+"benutzerdefinierte Variable eingesetzt. Bitte NICHT aktivieren, wenn "
+"abweichende Endpunktnamen nicht wirklich erforderlich sind!"
+
+#: library/Director/PropertyModifier/PropertyModifierTrim.php:22
+msgid "Ending only"
+msgstr "Nur das Ende"
+
+#: library/Director/Import/ImportSourceDirectorObject.php:72
+#: library/Director/Web/Table/ObjectsTableEndpoint.php:19
+#: application/forms/IcingaEndpointForm.php:24
+#: application/forms/SyncRuleForm.php:25
+msgid "Endpoint"
+msgstr "Endpunkt"
+
+#: application/forms/KickstartForm.php:121
+msgid "Endpoint Name"
+msgstr "Name des Endpunkts"
+
+#: application/forms/IcingaEndpointForm.php:31
+msgid "Endpoint address"
+msgstr "Adresse des Endpunkts"
+
+#: library/Director/Web/Widget/InspectPackages.php:46
+msgid "Endpoint in your Root Zone"
+msgstr "Endpunkte in Rootzone"
+
+#: application/forms/IcingaEndpointForm.php:18
+msgid "Endpoint template name"
+msgstr "Name der Endpunktsvorlage"
+
+#: library/Director/Dashboard/Dashlet/EndpointObjectDashlet.php:17
+#: library/Director/Db/Branch/BranchModificationInspection.php:35
+#: library/Director/Import/ImportSourceCoreApi.php:59
+msgid "Endpoints"
+msgstr "Endpunkte"
+
+#: application/controllers/PhperrorController.php:15
+#: application/controllers/PhperrorController.php:34
+msgid "Error"
+msgstr "Fehler"
+
+#: application/forms/IcingaHostForm.php:86
+msgid "Establish connection"
+msgstr "Verbindung herstellen"
+
+#: application/forms/IcingaServiceForm.php:627
+msgid ""
+"Evaluates the apply for rule for all objects with the custom attribute "
+"specified. E.g selecting \"host.vars.custom_attr\" will generate \"for "
+"(config in host.vars.array_var)\" where \"config\" will be accessible "
+"through \"$config$\". NOTE: only custom variables of type \"Array\" are "
+"eligible."
+msgstr ""
+"Berechnet die Apply-Regel für alle Objekte für welche diese "
+"benutzerdefinierte Eigenschaft spezifiziert wurde. Wählt man z.B. \"host."
+"vars.custom_attr\", wird \"for (config in host.vars.array_var)\" generiert. "
+"Dabei ist \"config\" dann als \"$config$\" zugänglich. HINWEIS: nur "
+"benutzerdefinierte Eigenschaften vom Typ \"Array\" sind wählbar."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1350
+msgid "Event command"
+msgstr "Event-Kommando"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1351
+msgid "Event command definition"
+msgstr "Event-Kommandodefinition"
+
+#: library/Director/PropertyModifier/PropertyModifierDictionaryToRow.php:23
+msgid ""
+"Every Dictionary entry has a key, its value will be provided in this column"
+msgstr ""
+
+#: application/forms/IcingaScheduledDowntimeForm.php:41
+msgid "Every related downtime will show this comment"
+msgstr "Jede zugehörige Downtime wird diesen Kommentar anzeigen"
+
+#: application/forms/IcingaTimePeriodForm.php:70
+msgid "Exclude other time periods from this."
+msgstr "Andere Zeiträume von diesem ausschließen."
+
+#: application/forms/IcingaTimePeriodForm.php:67
+msgid "Exclude period"
+msgstr "Zeitraum ausschließen"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1428
+msgid "Execute active checks"
+msgstr "Aktive Checks ausführen"
+
+#: application/forms/DirectorJobForm.php:48
+msgid "Execution interval for this job, in seconds"
+msgstr "Ausführungsintervall dieses Auftrags, in Sekunden"
+
+#: application/forms/SyncPropertyForm.php:251
+msgid "Existing Data Lists"
+msgstr "Vorhandene Datenlisten"
+
+#: application/forms/SyncPropertyForm.php:236
+msgid "Existing templates"
+msgstr "Vorhandene Vorlagen"
+
+#: application/controllers/BranchController.php:46
+msgid "Expected Modification"
+msgstr "Erwartete Änderungen"
+
+#: application/forms/SyncPropertyForm.php:179
+msgid "Expert mode"
+msgstr "Expertenmodus"
+
+#: library/Director/DataType/DataTypeDatalist.php:154
+msgid "Extend the list with new values"
+msgstr "Erweitere die Liste mit neuen Werten"
+
+#: library/Director/Web/Tabs/ObjectsTabs.php:35
+msgid "External"
+msgstr "Extern"
+
+#: application/forms/BasketForm.php:18
+msgid "External Command Definitions"
+msgstr "Externe Kommandodefinitionen"
+
+#: library/Director/Dashboard/Dashlet/ExternalCheckCommandsDashlet.php:19
+msgid "External Commands"
+msgstr "Externe Kommandos"
+
+#: library/Director/Dashboard/Dashlet/ExternalCheckCommandsDashlet.php:12
+msgid ""
+"External Commands have been defined in your local Icinga 2 Configuration."
+msgstr ""
+"Externe Kommandos wurden in der lokalen Icinga-2-Konfiguration definiert."
+
+#: library/Director/Dashboard/Dashlet/ExternalNotificationCommandsDashlet.php:19
+msgid "External Notification Commands"
+msgstr "Externe Benachrichtigungskommandos"
+
+#: library/Director/Dashboard/Dashlet/CommandTemplatesDashlet.php:12
+#: library/Director/Dashboard/Dashlet/ExternalNotificationCommandsDashlet.php:12
+msgid ""
+"External Notification Commands have been defined in your local Icinga 2 "
+"Configuration."
+msgstr ""
+"Externe Benachrichtigungskommandos wurden in der lokalen Icinga-2-"
+"Konfiguration definiert."
+
+#: library/Director/Import/ImportSourceDirectorObject.php:83
+msgid "External Objects"
+msgstr "Externe Objekte"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:75
+msgid "FQDN"
+msgstr "FQDN"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:141
+msgid "Failed"
+msgstr "Fehlgeschlagen"
+
+#: application/forms/IcingaImportObjectForm.php:42
+#, php-format
+msgid "Failed to import %s \"%s\""
+msgstr "Import von %s fehlgeschlagen \"%s\""
+
+#: application/forms/SettingsForm.php:109
+msgid "Feature: Custom Endpoint Name"
+msgstr "Feature: Individueller Endpunktname"
+
+#: application/forms/IcingaObjectFieldForm.php:196
+msgid "Field has been removed"
+msgstr "Feld wurde entfernt"
+
+#: library/Director/Web/Table/IcingaObjectDatafieldTable.php:50
+#: library/Director/Web/Table/DatafieldTable.php:50
+#: application/forms/DirectorDatafieldForm.php:141
+msgid "Field name"
+msgstr "Feldname"
+
+#: application/forms/DirectorDatafieldForm.php:182
+msgid "Field type"
+msgstr "Feldtyp"
+
+#: library/Director/Web/Tabs/ObjectTabs.php:103
+msgid "Fields"
+msgstr "Felder"
+
+#: library/Director/Web/Table/GeneratedConfigFileTable.php:84
+#: library/Director/Web/Table/ConfigFileDiffTable.php:82
+msgid "File"
+msgstr "Datei"
+
+#: library/Director/Web/Widget/InspectPackages.php:54
+#, php-format
+msgid "File Content: %s"
+msgstr "Dateiinhalt: %s"
+
+#: library/Director/Web/Widget/InspectPackages.php:52
+#, php-format
+msgid "Files in Stage: %s"
+msgstr "Dateien im Stage: %s"
+
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:44
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:54
+msgid "Filter"
+msgstr "Filter"
+
+#: application/forms/SyncPropertyForm.php:103
+#: application/forms/SyncRuleForm.php:95
+msgid "Filter Expression"
+msgstr "Filterausdruck"
+
+#: configuration.php:80
+msgid "Filter available notification apply rules"
+msgstr "Verfügbare Benachrichtigungs-Apply-Regeln filtern"
+
+#: configuration.php:87
+msgid "Filter available scheduled downtime rules"
+msgstr "Verfügbare Geplante-Downtime-Regeln filtern"
+
+#: configuration.php:73
+msgid "Filter available service apply rules"
+msgstr "Verfügbare Service-Apply-Regeln filtern"
+
+#: configuration.php:94
+msgid ""
+"Filter available service set templates. Use asterisks (*) as wildcards, like "
+"in DB* or *net*"
+msgstr ""
+"Verfügbare Service-Set-Vorlagen filtern. Benutze Sternchen (*) als "
+"Platzhalter, wie in DB* oder *net*"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:29
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:27
+msgid "Filter method"
+msgstr "Filter-Methode"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:33
+msgid "First Element"
+msgstr "Erstes Element"
+
+#: application/forms/IcingaNotificationForm.php:197
+msgid "First notification delay"
+msgstr "Verzögerung der ersten Benachrichtigung"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:47
+msgid "Fixed"
+msgstr "Fix"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:33
+msgid "Flapping"
+msgstr "Flapping"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:35
+msgid "Flapping ends"
+msgstr "Flapping endet"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1479
+msgid ""
+"Flapping lower bound in percent for a service to be considered not flapping"
+msgstr ""
+"Untere Flapping-Grenze in Prozent um einen Service nicht als Flapping "
+"einzuordnen"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:34
+msgid "Flapping starts"
+msgstr "Flapping beginnt"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1466
+msgid "Flapping threshold (high)"
+msgstr "Flapping Schwellewert (hoch)"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1477
+msgid "Flapping threshold (low)"
+msgstr "Flapping Schwellwert (niedrig)"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1468
+msgid "Flapping upper bound in percent for a service to be considered flapping"
+msgstr ""
+"Obere Flapping-Grenze in Prozent um einen Service als Flapping einzuordnen"
+
+#: application/forms/IcingaCloneObjectForm.php:50
+msgid "Flatten all inherited properties, strip imports"
+msgstr "Alle vererbten Eigenschaften flach machen, Importierte entfernen"
+
+#: application/forms/SelfServiceSettingsForm.php:100
+msgid "Flush API directory"
+msgstr "API-Verzeichnis leeren"
+
+#: library/Director/Web/SelfService.php:245
+msgid "For manual configuration"
+msgstr "Manuelle Konfiguration"
+
+#: library/Director/Job/ConfigJob.php:31
+msgid "Force rendering"
+msgstr "Erstellen erzwingen"
+
+#: library/Director/Objects/DirectorDatafield.php:237
+#, php-format
+msgid "Form element could not be created, %s is missing"
+msgstr "Formularelement konnte nicht erstellt werden, %s ist nicht vorhanden"
+
+#: library/Director/Web/Form/QuickForm.php:524
+#: library/Director/Web/Form/QuickForm.php:551
+msgid "Form has successfully been sent"
+msgstr "Formular wurde erfolgreich abgeschickt"
+
+#: application/forms/IcingaServiceVarForm.php:32
+#: application/forms/IcingaHostVarForm.php:32
+msgid "Format"
+msgstr "Format"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:393
+msgid "Former object"
+msgstr "Vorheriges Objekt"
+
+#: application/forms/SelfServiceSettingsForm.php:24
+msgid "Fully qualified domain name (FQDN)"
+msgstr "Voll qualifizierter Domain-Name (FQDN)"
+
+#: application/forms/IcingaGenerateApiKeyForm.php:24
+msgid "Generate Self Service API key"
+msgstr "Selbstservice-API-Schlüssel generieren"
+
+#: library/Director/Web/SelfService.php:114
+msgid "Generate a new key"
+msgstr "Neuen Schlüssel generieren"
+
+#: library/Director/Web/SelfService.php:132
+msgid ""
+"Generated Host keys will continue to work, but you'll no longer be able to "
+"register new Hosts with this key"
+msgstr ""
+"Generierte Host-Schlüssel werden weiterhin funktionieren, aber es wird nicht "
+"mehr möglich sein neue Hosts mit diesem Schlüssel zu registrieren"
+
+#: application/controllers/ConfigController.php:281
+msgid "Generated config"
+msgstr "Erzeugte Konfiguration"
+
+#: library/Director/Dashboard/AlertsDashboard.php:17
+msgid "Get alerts when something goes wrong"
+msgstr "Werde alarmiert, wenn etwas schief läuft"
+
+#: library/Director/Dashboard/Dashlet/CustomvarDashlet.php:17
+msgid "Get an overview of used CustomVars and their variants"
+msgstr "Eine Übersicht über benutzerdefinierte Variablen und deren Varianten"
+
+#: library/Director/PropertyModifier/PropertyModifierGetHostByAddr.php:27
+msgid "Get host by address (Reverse DNS lookup)"
+msgstr "Host über Adresse ermitteln (Reverse DNS Lookup)"
+
+#: library/Director/PropertyModifier/PropertyModifierGetHostByName.php:27
+msgid "Get host by name (DNS lookup)"
+msgstr "Adresse für Hostname ermitteln (DNS Lookup)"
+
+#: application/controllers/ConfigController.php:241
+msgid "Global Director Settings"
+msgstr "Globale Director-Einstellungen"
+
+#: library/Director/Web/SelfService.php:101
+msgid "Global Self Service Setting"
+msgstr "Globale Selbstbedienungs-Einstellungen"
+
+#: application/forms/SelfServiceSettingsForm.php:57
+msgid "Global Zones"
+msgstr "Globale Zonen"
+
+#: application/forms/IcingaZoneForm.php:22
+msgid "Global zone"
+msgstr "Globale Zone"
+
+#: library/Director/PropertyModifier/PropertyModifierJoin.php:13
+msgid "Glue"
+msgstr "Kleben"
+
+#: library/Director/Web/ActionBar/DirectorBaseActionBar.php:40
+#, php-format
+msgid "Go back to \"%s\" Dashboard"
+msgstr "Zurück zum \"%s\" Dashboard"
+
+#: library/Director/Job/ConfigJob.php:57
+msgid "Grace period"
+msgstr "Gnadenfrist"
+
+#: library/Director/Web/Table/GroupMemberTable.php:72
+msgid "Group"
+msgstr "Gruppe"
+
+#: library/Director/PropertyModifier/PropertyModifierSimpleGroupBy.php:14
+msgid "Group by a column, aggregate others"
+msgstr "Gruppiere nach einer Spalte, aggregiere andere"
+
+#: application/forms/IcingaHostForm.php:248
+msgid ""
+"Group has been inherited, but will be overridden by locally assigned group(s)"
+msgstr ""
+"Die Gruppe wurde geerbt, wird aber von lokal gesetzten Gruppen überschrieben"
+
+#: application/forms/SyncPropertyForm.php:318
+msgid "Group membership"
+msgstr "Gruppenmitgliedschaft"
+
+#: library/Director/Web/Controller/ObjectController.php:329
+#, php-format
+msgid "Group membership: %s"
+msgstr "Gruppenmitgliedschaft: %s"
+
+#: library/Director/Dashboard/Dashlet/ServiceSetsDashlet.php:17
+msgid ""
+"Grouping your Services into Sets allow you to quickly assign services often "
+"used together in a single operation all at once"
+msgstr ""
+"Das Bündel von Services in Sets erlaubt es, Services welche häufig gemeinsam "
+"benutzt werden in einem Einzelschritt zuzuweisen"
+
+#: library/Director/Web/Tabs/ObjectsTabs.php:65
+#: application/forms/IcingaUserForm.php:109
+#: application/forms/IcingaHostForm.php:217
+#: application/forms/IcingaServiceForm.php:649
+msgid "Groups"
+msgstr "Gruppen"
+
+#: library/Director/Import/ImportSourceRestApi.php:134
+msgid "HTTP (this is plaintext!)"
+msgstr "HTTP (das ist Klartext)"
+
+#: library/Director/Import/ImportSourceRestApi.php:149
+msgid "HTTP Header"
+msgstr "HTTP-Header"
+
+#: library/Director/Import/ImportSourceRestApi.php:250
+msgid "HTTP proxy"
+msgstr "HTTP-Proxy"
+
+#: library/Director/Import/ImportSourceRestApi.php:133
+msgid "HTTPS (strongly recommended)"
+msgstr "HTTPS (dringend empfohlen)"
+
+#: library/Director/Web/Tabs/MainTabs.php:31
+msgid "Health"
+msgstr "Health"
+
+#: library/Director/Dashboard/Dashlet/SingleServicesDashlet.php:17
+msgid "Here you can find all single services directly attached to single hosts"
+msgstr ""
+"Hier finden sich alle Einzel-Services welche einzelnen Hosts zugewiesen "
+"wurden"
+
+#: library/Director/DataType/DataTypeString.php:27
+#: library/Director/Web/Table/CoreApiFieldsTable.php:89
+msgid "Hidden"
+msgstr "Versteckt"
+
+#: library/Director/Web/Widget/AdditionalTableActions.php:70
+msgid "Hide SQL"
+msgstr "SQL verbergeb"
+
+#: application/controllers/HealthController.php:23
+msgid "Hint: Check Plugin"
+msgstr "Hinweis: Check-Plugin"
+
+#: application/forms/IcingaServiceForm.php:166
+msgid "Hints regarding this service"
+msgstr "Hinweise zu diesem Service"
+
+#: library/Director/Web/Tabs/ImportsourceTabs.php:45
+#: library/Director/Web/Tabs/SyncRuleTabs.php:43
+#: library/Director/Web/Tabs/ObjectTabs.php:95
+msgid "History"
+msgstr "Historie"
+
+#: library/Director/TranslationDummy.php:13
+#: library/Director/Import/ImportSourceDirectorObject.php:71
+#: library/Director/Web/Table/ObjectsTableService.php:106
+#: library/Director/Web/Table/ObjectsTableEndpoint.php:20
+#: application/forms/IcingaHostVarForm.php:15
+#: application/forms/IcingaServiceForm.php:597
+#: application/forms/SyncRuleForm.php:12
+#: application/controllers/ServiceController.php:280
+msgid "Host"
+msgstr "Host"
+
+#: library/Director/Objects/IcingaService.php:769
+#: application/controllers/SuggestController.php:262
+msgid "Host Custom variables"
+msgstr "Benutzerdefinierte Host-Variablen"
+
+#: application/forms/SyncRuleForm.php:13
+#: application/forms/BasketForm.php:20
+msgid "Host Group"
+msgstr "Hostgruppe"
+
+#: library/Director/Dashboard/Dashlet/HostGroupsDashlet.php:11
+msgid "Host Groups"
+msgstr "Hostgruppen"
+
+#: application/forms/SelfServiceSettingsForm.php:19
+msgid "Host Name"
+msgstr "Hostname"
+
+#: application/forms/IcingaHostForm.php:169
+#: application/forms/IcingaHostForm.php:186
+msgid "Host Template"
+msgstr "Host-Vorlage"
+
+#: application/forms/BasketForm.php:21
+msgid "Host Template Choice"
+msgstr "Auswahlmöglichkeit für Hostvorlagen"
+
+#: library/Director/Dashboard/Dashlet/HostTemplatesDashlet.php:11
+#: application/forms/BasketForm.php:22
+msgid "Host Templates"
+msgstr "Host-Vorlagen"
+
+#: application/forms/IcingaHostForm.php:327
+#: application/forms/IcingaHostSelfServiceForm.php:35
+msgid "Host address"
+msgstr "Hostadresse"
+
+#: application/forms/IcingaHostForm.php:329
+#: application/forms/IcingaHostSelfServiceForm.php:37
+msgid ""
+"Host address. Usually an IPv4 address, but may be any kind of address your "
+"check plugin is able to deal with"
+msgstr ""
+"Hostadresse. Üblicherweise eine IPv4 Adresse, kann jedoch jede Art von "
+"Adresse sein, mit der das Plugin umgehen kann"
+
+#: configuration.php:99
+msgid "Host configs"
+msgstr "Host-Konfigurationen"
+
+#: library/Director/DataType/DataTypeDirectorObject.php:57
+msgid "Host groups"
+msgstr "Hostgruppen"
+
+#: application/forms/IcingaHostSelfServiceForm.php:25
+msgid "Host name"
+msgstr "Hostname"
+
+#: application/forms/SelfServiceSettingsForm.php:25
+msgid "Host name (local part, without domain)"
+msgstr "Hostname (lokaler Teil, ohne Domain)"
+
+#: library/Director/Dashboard/Dashlet/HostObjectDashlet.php:13
+msgid "Host objects"
+msgstr "Hostobjekte"
+
+#: library/Director/Objects/IcingaService.php:768
+#: library/Director/Objects/IcingaHost.php:163
+#: application/controllers/SuggestController.php:252
+#: application/controllers/SuggestController.php:261
+msgid "Host properties"
+msgstr "Hosteigenschaften"
+
+#: application/controllers/TemplatechoiceController.php:20
+msgid "Host template choice"
+msgstr "Auswahlmöglichkeit für Hostvorlagen"
+
+#: application/controllers/TemplatechoicesController.php:19
+msgid "Host template choices"
+msgstr "Auswahlmöglichkeiten für Hostvorlagen"
+
+#: application/forms/IcingaHostGroupForm.php:14
+msgid "Hostgroup"
+msgstr "Hostgruppe"
+
+#: library/Director/Db/Branch/BranchModificationInspection.php:39
+#: library/Director/Import/ImportSourceCoreApi.php:61
+msgid "Hostgroups"
+msgstr "Hostgruppen"
+
+#: application/forms/IcingaHostForm.php:220
+msgid ""
+"Hostgroups that should be directly assigned to this node. Hostgroups can be "
+"useful for various reasons. You might assign service checks based on "
+"assigned hostgroup. They are also often used as an instrument to enforce "
+"restricted views in Icinga Web 2. Hostgroups can be directly assigned to "
+"single hosts or to host templates. You might also want to consider assigning "
+"hostgroups using apply rules"
+msgstr ""
+"Hostgruppen, die diesem Knoten direkt zugeordnet werden sollen. Hostgruppen "
+"für verschiedene Zwecke verwendet werden. Services können anhand von "
+"Hostgruppen zugeordnet werden. Außerdem werden sie oft zum Umsetzen von "
+"eingeschränkten Ansichten in Icinga Web 2 verwendet. Hostgruppen können "
+"direkt einzelnen Hosts oder Hostvorlagen zugeordnet werden. Auch über Apply "
+"Regeln können Hostgruppen zugewiesen werden"
+
+#: library/Director/Web/Table/IcingaServiceSetHostTable.php:38
+#: library/Director/Web/Table/IcingaHostsMatchingFilterTable.php:48
+#: application/forms/IcingaHostForm.php:39
+msgid "Hostname"
+msgstr "Hostname"
+
+#: library/Director/Import/ImportSourceRestApi.php:262
+msgid "Hostname, IP or <host>:<port>"
+msgstr "Hostname, IP oder <host>:<port>"
+
+#: configuration.php:153
+#: library/Director/Dashboard/Dashlet/HostsDashlet.php:11
+#: library/Director/IcingaConfig/StateFilterSet.php:19
+#: library/Director/DataType/DataTypeDirectorObject.php:56
+#: library/Director/DataType/DataTypeDictionary.php:59
+#: library/Director/Db/Branch/BranchModificationInspection.php:38
+#: library/Director/Import/ImportSourceCoreApi.php:60
+#: library/Director/Web/Table/CustomvarVariantsTable.php:58
+#: library/Director/Web/Table/CustomvarTable.php:43
+#: application/forms/IcingaNotificationForm.php:89
+#: application/forms/IcingaServiceForm.php:711
+#: application/forms/IcingaDependencyForm.php:100
+#: application/forms/IcingaScheduledDowntimeForm.php:89
+msgid "Hosts"
+msgstr "Hosts"
+
+#: application/controllers/ServicesetController.php:85
+#, php-format
+msgid "Hosts using this set: %s"
+msgstr "Hosts welche dieses Set benutzen: %s"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:58
+msgid ""
+"How long the downtime lasts. Only has an effect for flexible (non-fixed) "
+"downtimes. Time in seconds, supported suffixes include ms (milliseconds), s "
+"(seconds), m (minutes), h (hours) and d (days). To express \"90 minutes\" "
+"you might want to write 1h 30m"
+msgstr ""
+"Wie lang die Downtime dauert. Beeinflusst nur flexible (keine fixen) "
+"Downtimes. Zeit in Sekunden, unterstützt auch die Suffixes ms "
+"(Millisekunden), s (Sekunden), m (Minuten), h (Stunden) and d (Tage). Um "
+"\"90 Minuten\" auszudrücken könnte man 1h 30m schreiben"
+
+#: application/forms/DeployFormsBug7530.php:114
+msgid "I know what I'm doing, deploy anyway"
+msgstr "Ich weiß was ich tue, bitte dennoch ausrollen"
+
+#: application/forms/DeployFormsBug7530.php:115
+msgid "I know, please don't bother me again"
+msgstr "Ich weiß, und möchte damit nicht mehr belästigt werden"
+
+#: application/forms/IcingaEndpointForm.php:32
+msgid "IP address / hostname of remote node"
+msgstr "IP Adresse / Hostname des entfernten Knoten"
+
+#: application/forms/KickstartForm.php:133
+msgid ""
+"IP address / hostname of your Icinga node. Please note that this information "
+"will only be used for the very first connection to your Icinga instance. The "
+"Director then relies on a correctly configured Endpoint object. Correctly "
+"configures means that either it's name is resolvable or that it's host "
+"property contains either an IP address or a resolvable host name. Your "
+"Director must be able to reach this endpoint"
+msgstr ""
+"IP Adresse / Hostname des Icinga Knotens. Diese Information wird nur für den "
+"ersten Verbindungsaufbau zur Icinga Instanz verwendet. Danach verlässt sich "
+"der Director auf ein richtig konfiguriertes Endpunkt-Objekt. \"Richtig "
+"konfiguriert\" bedeutet dabei, dass entweder der Name auflösbar ist oder die "
+"host-Eigenschaft entweder eine IP Adresse oder einen auflösbaren Hostname "
+"enthält. Der Director muss diesen Endpunkt erreichen können"
+
+#: application/forms/IcingaHostForm.php:335
+#: application/forms/IcingaHostSelfServiceForm.php:43
+msgid "IPv6 address"
+msgstr "IPv6 Adresse"
+
+#: library/Director/Web/Controller/ObjectsController.php:350
+#, php-format
+msgid "Icinga %s Sets"
+msgstr "Icinga %s-Sets"
+
+#: application/controllers/InspectController.php:38
+#, php-format
+msgid "Icinga 2 - Objects: %s"
+msgstr "Icinga-2-Objekte: %s"
+
+#: application/controllers/InspectController.php:144
+msgid "Icinga 2 API - Status"
+msgstr "Icinga 2 API - Status"
+
+#: library/Director/Web/SelfService.php:216
+msgid "Icinga 2 Client documentation"
+msgstr "Icinga 2 Client-Dokumentation"
+
+#: library/Director/Web/SelfService.php:158
+#: library/Director/Web/SelfService.php:164
+msgid "Icinga 2 Powershell Module"
+msgstr "Icinga 2 Powershell Modul"
+
+#: application/forms/IcingaHostForm.php:147
+#: application/forms/IcingaServiceForm.php:697
+msgid "Icinga Agent and zone settings"
+msgstr "Icinga Agenten- und Zoneneinstellungen"
+
+#: library/Director/Dashboard/Dashlet/ApiUserObjectDashlet.php:13
+msgid "Icinga Api users"
+msgstr "Icinga API Benutzer"
+
+#: application/forms/IcingaCommandArgumentForm.php:39
+#: application/forms/IcingaCommandArgumentForm.php:78
+msgid "Icinga DSL"
+msgstr "Icinga-DSL"
+
+#: configuration.php:118
+msgid "Icinga Director"
+msgstr "Icinga-Director"
+
+#: application/controllers/DashboardController.php:45
+msgid "Icinga Director - Main Dashboard"
+msgstr "Icinga Director - Übersichtsdashboard"
+
+#: application/controllers/DaemonController.php:46
+msgid "Icinga Director Background Daemon"
+msgstr "Icinga Director Hintergrunddienst"
+
+#: library/Director/Dashboard/DirectorDashboard.php:15
+msgid "Icinga Director Configuration"
+msgstr "Icinga Director Konfiguration"
+
+#: application/controllers/IndexController.php:45
+#: application/controllers/IndexController.php:52
+#, php-format
+msgid "Icinga Director Setup: %s"
+msgstr "Icinga Director Setup: %s"
+
+#: application/forms/SettingsForm.php:35
+msgid ""
+"Icinga Director decides to deploy objects like CheckCommands to a global "
+"zone. This defaults to \"director-global\" but might be adjusted to a custom "
+"Zone name"
+msgstr ""
+"Icinga Director bevorzugt es, Objekte wie CheckCommands in eine globale Zone "
+"auszubringen. Der Standard dafür ist \"director-global\", es kann aber auch "
+"eine benutzerdefinierte Zone verwendet werden"
+
+#: application/controllers/PhperrorController.php:40
+msgid ""
+"Icinga Director depends on the following modules, please install/upgrade as "
+"required"
+msgstr ""
+"Der Icinga Director benötigt folgende Module, bitte wie angegeben "
+"installieren und/oder aktualisieren"
+
+#: library/Director/Dashboard/Dashlet/SelfServiceDashlet.php:17
+msgid ""
+"Icinga Director offers a Self Service API, allowing new Icinga nodes to "
+"register themselves"
+msgstr ""
+"Der Icinga Director stellt eine Selbstbedienungs-API bereit, über welche "
+"sich neue Icinga-Knoten selbst registrieren können"
+
+#: application/forms/KickstartForm.php:131
+msgid "Icinga Host"
+msgstr "Icinga-Host"
+
+#: library/Director/Dashboard/Dashlet/InfrastructureDashlet.php:11
+msgid "Icinga Infrastructure"
+msgstr "Icinga-Infrastruktur"
+
+#: application/forms/SettingsForm.php:43
+msgid "Icinga Package Name"
+msgstr "Icinga Package Name"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1164
+msgid ""
+"Icinga cluster zone. Allows to manually override Directors decisions of "
+"where to deploy your config to. You should consider not doing so unless you "
+"gained deep understanding of how an Icinga Cluster stack works"
+msgstr ""
+"Icinga-Cluster-Zone. Erlaubt ein manuelles Überschreiben der Entscheidung, "
+"wohin der Director die Konfiguration ausrollt. Sollte nicht ohne "
+"ausreichendes Wissen um den Icinga-Cluster-Stack verändert werden"
+
+#: library/Director/Web/SelfService.php:145
+#: library/Director/Web/SelfService.php:151
+msgid "Icinga for Windows"
+msgstr "Icinga für Windows"
+
+#: application/forms/IcingaHostGroupForm.php:16
+msgid "Icinga object name for this host group"
+msgstr "Icinga-Objektname für diese Hostgruppe"
+
+#: application/forms/IcingaHostForm.php:46
+msgid ""
+"Icinga object name for this host. This is usually a fully qualified host "
+"name but it could basically be any kind of string. To make things easier for "
+"your users we strongly suggest to use meaningful names for templates. E.g. "
+"\"generic-host\" is ugly, \"Standard Linux Server\" is easier to understand"
+msgstr ""
+"Icinga-Objektname für diesen Host. Dies ist üblicherweise ein FQDN, kann "
+"jedoch jede beliebige Zeichenkette sein. Der Einfachheit halber sollten "
+"sprechende Namen für Vorlagen verwendet werden. z.B. ist \"Standard Linux "
+"Server\" leichter verständlich als \"generic-host\""
+
+#: application/forms/IcingaServiceGroupForm.php:16
+msgid "Icinga object name for this service group"
+msgstr "Icinga-Objektname für diese Servicegruppe"
+
+#: application/forms/IcingaUserGroupForm.php:19
+msgid "Icinga object name for this user group"
+msgstr "Icinga-Objektname für diese Benutzergruppe"
+
+#: application/forms/SettingsForm.php:126
+msgid "Icinga v1.x"
+msgstr "Icinga v1.x"
+
+#: application/forms/SettingsForm.php:100
+msgid ""
+"Icinga v2.11.0 breaks some configurations, the Director will warn you before "
+"every deployment in case your config is affected. This setting allows to "
+"hide this warning."
+msgstr ""
+"Mit Icinga v2.11.0 schlagen bestimmte Konfigurationen fehl, der Director "
+"warnt vor jedem Deployment falls die auszurollende Konfiguration betroffen "
+"ist. Diese Einstellung erlaubt es diese Warnung zu verbergen."
+
+#: application/forms/SettingsForm.php:125
+msgid "Icinga v2.x"
+msgstr "Icinga v2.x"
+
+#: application/forms/IcingaHostForm.php:77
+msgid "Icinga2 Agent"
+msgstr "Icinga-2-Agent"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1556
+msgid "Icon image"
+msgstr "Icon Bild"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1565
+msgid "Icon image alt"
+msgstr "Icon Bild alternativ"
+
+#: library/Director/Web/Table/CoreApiFieldsTable.php:81
+msgid "Id"
+msgstr "ID"
+
+#: application/forms/IcingaCommandForm.php:52
+msgid "Identifier for the Icinga command you are going to create"
+msgstr "Bezeichner für das Icinga-Kommando, das erstellt werden soll"
+
+#: application/forms/IcingaCommandForm.php:78
+msgid "If enabled you can not define arguments."
+msgstr "Wenn aktiviert können keine Argumente definiert werden."
+
+#: application/forms/SyncRuleForm.php:64
+#: application/forms/BasketForm.php:55
+msgid "Ignore"
+msgstr "Ignorieren"
+
+#: application/forms/SettingsForm.php:91
+msgid "Ignore Bug #7530"
+msgstr "Bug #7530 ignorieren"
+
+#: application/forms/IcingaDependencyForm.php:175
+msgid "Ignore Soft States"
+msgstr "Soft-States ignorieren"
+
+#: library/Director/PropertyModifier/PropertyModifierGetPropertyFromOtherImportSource.php:33
+msgid "Import Source"
+msgstr "Importquelle"
+
+#: application/forms/BasketForm.php:35
+msgid "Import Sources"
+msgstr "Importquellen"
+
+#: library/Director/Dashboard/Dashlet/ImportSourceDashlet.php:14
+msgid "Import data sources"
+msgstr "Import-Datenquellen"
+
+#: application/forms/IcingaImportObjectForm.php:26
+#, php-format
+msgid "Import external \"%s\""
+msgstr "Externe \"%s\" importieren"
+
+#: application/controllers/ImportrunController.php:14
+#: application/controllers/ImportrunController.php:15
+msgid "Import run"
+msgstr "Importlauf"
+
+#: application/controllers/ImportsourceController.php:266
+#, php-format
+msgid "Import run history: %s"
+msgstr "Importlaufhistorie: %s"
+
+#: library/Director/Job/ImportJob.php:80
+#: library/Director/Web/Tabs/ImportsourceTabs.php:37
+#: library/Director/Web/Tabs/ImportTabs.php:20
+#: application/controllers/ImportsourcesController.php:32
+msgid "Import source"
+msgstr "Importquelle"
+
+#: application/forms/ImportSourceForm.php:15
+msgid "Import source name"
+msgstr "Name der Importquelle"
+
+#: application/controllers/ImportsourceController.php:170
+#, php-format
+msgid "Import source preview: %s"
+msgstr "Vorschau der Importquelle: %s"
+
+#: application/controllers/ImportsourceController.php:92
+#: application/controllers/ImportsourceController.php:135
+#, php-format
+msgid "Import source: %s"
+msgstr "Importquelle: %s"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1270
+msgid ""
+"Importable templates, add as many as you want. Please note that order "
+"matters when importing properties from multiple templates: last one wins"
+msgstr ""
+"Importierbare Vorlagen. Es können beliebig viele erstellt werden, wobei die "
+"Reihenfolge wichtig ist, wenn Eigenschaften von mehreren Vorlagen geerbt "
+"werden: Der letzte Eintrag gewinnt"
+
+#: application/forms/ImportRunForm.php:33
+msgid "Imported new data from this Import Source"
+msgstr "Neue Daten von dieser Import-Datenquelle importiert"
+
+#: library/Director/Web/Table/ImportrunTable.php:32
+msgid "Imported rows"
+msgstr "Importierte Reihen"
+
+#: application/forms/IcingaImportObjectForm.php:16
+msgid ""
+"Importing an object means that its type will change from \"external\" to "
+"\"object\". That way it will make part of the next deployment. So in case "
+"you imported this object from your Icinga node make sure to remove it from "
+"your local configuration before issueing the next deployment. In case of a "
+"conflict nothing bad will happen, just your config won't deploy."
+msgstr ""
+"Ein Objekt zu importieren bedeutet, dass es von einem \"externen Objekt\" zu "
+"einem \"Objekt\" verändert wird. Damit wird es mit der nächsten "
+"Konfiguration ausgerollt. Falls dieses Objekt aus dem Icinga Knoten "
+"importiert wurde, muss es aus vor dem nächsten Ausrollen aus der lokalen "
+"Konfiguration entfernt werden. Sollte ein Konflikt auftreten, geschieht "
+"nichts weiter, als dass die Konfiguration nicht ausgerollt werden kann."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1268
+msgid "Imports"
+msgstr "Importe"
+
+#: application/controllers/SelfServiceController.php:110
+msgid ""
+"In case an Icinga Admin provided you with a self service API token, this is "
+"where you can register new hosts"
+msgstr ""
+"Wenn ein Icinga-Administrator einen Selbstbedienungs-API-"
+"Schlüsselbereitstellt, können hier neue Hosts registriert werden"
+
+#: application/forms/SelfServiceSettingsForm.php:189
+msgid ""
+"In case the Icinga 2 Agent is already installed on the system, this "
+"parameter will allow you to configure if you wish to upgrade / downgrade to "
+"a specified version with the as well."
+msgstr ""
+"Wenn der Icinga-2-Agent bereits auf dem System installiert ist, erlaubt es "
+"dieser Parameter festzulegen, ob auch Up- und Downgrades zu der spezifierten "
+"Icinga 2 Version gewünscht sind."
+
+#: application/forms/SelfServiceSettingsForm.php:156
+msgid ""
+"In case the Icinga 2 Agent should be automatically installed, this has to be "
+"a string value like: 2.6.3"
+msgstr ""
+"Falls der Icinga-2-Agent automatisch installiert werden soll, muss dies in "
+"String der Form 2.6.3 sein"
+
+#: application/forms/SelfServiceSettingsForm.php:102
+msgid ""
+"In case the Icinga Agent will accept configuration from the parent Icinga 2 "
+"system, it will possibly write data to /var/lib/icinga2/api/*. By setting "
+"this parameter to true, all content inside the api directory will be flushed "
+"before an eventual restart of the Icinga 2 Agent"
+msgstr ""
+"Wenn der Icinga-Agent Konfiguration von seinem übergeordneten Icinga-2-"
+"System akzeptiert, wird er für gewöhnlich Daten nach /var/lib/icinga2/api/* "
+"schreiben. Wird dieser Schalter auf Ja gesetzt, wird jeglicher Inhalt dieses "
+"Verzeichnisses vor einem eventuellen Restart des Icinga-2-Agenten geleert"
+
+#: library/Director/Web/SelfService.php:147
+#, php-format
+msgid "In case you're using %s, please run this Script:"
+msgstr "Falls %s benutzt wird, bitte dieses Script ausführen:"
+
+#: library/Director/Web/SelfService.php:160
+#, php-format
+msgid "In case you're using the legacy %s, please run:"
+msgstr "Falls das vorherige %s benutzt wird, bitte dieses Script ausführen:"
+
+#: library/Director/Import/ImportSourceRestApi.php:246
+msgid ""
+"In case your API is only reachable through a proxy, please choose it's "
+"protocol right here"
+msgstr ""
+"Wenn die API nur über einen Proxy zugänglich ist, bitte hier dessen "
+"Protokoll auswählen"
+
+#: library/Director/Import/ImportSourceRestApi.php:270
+msgid "In case your proxy requires authentication, please configure this here"
+msgstr ""
+"Falls der Proxy eine Authentifizierung verlangt, kann diese hier "
+"konfiguriert werden"
+
+#: application/forms/IcingaTimePeriodForm.php:62
+msgid "Include other time periods into this."
+msgstr "Andere Zeiträume in diesen einbinden."
+
+#: application/forms/IcingaTimePeriodForm.php:59
+msgid "Include period"
+msgstr "Zeitraum einbinden"
+
+#: library/Director/Web/Table/TemplateUsageTable.php:56
+msgid "Indirect"
+msgstr "Indirekt"
+
+#: application/controllers/HostController.php:214
+#: application/controllers/HostController.php:295
+msgid "Individual Service objects"
+msgstr "Individuelle Service-Objekte"
+
+#: library/Director/Web/Tabs/InfraTabs.php:43
+msgid "Infrastructure"
+msgstr "Infrastruktur"
+
+#: application/forms/SyncPropertyForm.php:312
+msgid "Inheritance (import)"
+msgstr "Vererbung (Import)"
+
+#: library/Director/Web/SelfService.php:195
+msgid "Inherited Template Api Key:"
+msgstr "Vom Template geerbter API-Schlüssel:"
+
+#: application/controllers/HostController.php:232
+#, php-format
+msgid "Inherited from %s"
+msgstr "Geerbt von %s"
+
+#: application/forms/IcingaHostForm.php:256
+msgid "Inherited groups"
+msgstr "Geerbte Gruppen"
+
+#: application/controllers/HostController.php:461
+#, php-format
+msgid "Inherited service: %s"
+msgstr "Geerbter Service: %s"
+
+#: library/Director/ProvidedHook/Monitoring/HostActions.php:36
+#: library/Director/ProvidedHook/Monitoring/ServiceActions.php:43
+#: library/Director/Web/Tabs/ObjectTabs.php:132
+#: application/controllers/HostController.php:621
+msgid "Inspect"
+msgstr "Inspizieren"
+
+#: application/controllers/InspectController.php:63
+msgid "Inspect - object list"
+msgstr "Inspizieren - Objektliste"
+
+#: application/controllers/InspectController.php:170
+msgid "Inspect File Content"
+msgstr "Dateiinhalt inspizieren"
+
+#: application/controllers/InspectController.php:168
+msgid "Inspect Packages"
+msgstr "Pakete Inspizieren"
+
+#: application/forms/SelfServiceSettingsForm.php:202
+msgid "Install NSClient++"
+msgstr "NSClient++ installieren"
+
+#: application/forms/SelfServiceSettingsForm.php:72
+msgid "Installation Source"
+msgstr "Installationsquelle"
+
+#: library/Director/Web/Table/Dependency/DependencyInfoTable.php:39
+msgid "Installed"
+msgstr "Installiert"
+
+#: application/forms/SelfServiceSettingsForm.php:165
+msgid "Installer Hashes"
+msgstr "Prüfsummen für den Installer"
+
+#: application/forms/IcingaCommandForm.php:25
+msgid "Internal commands"
+msgstr "Interne Kommandos"
+
+#: application/controllers/SyncruleController.php:140
+#, php-format
+msgid "It has been renamed since then, its former name was %s"
+msgstr "Es wurde seither umbenannt. Sein bisheriger Name war %s"
+
+#: library/Director/Web/SelfService.php:72
+msgid ""
+"It is not a good idea to do so as long as your Agent still has a valid Self "
+"Service API key!"
+msgstr ""
+"Dies ist keine gute Idee solange der Agent noch über einen gültigen "
+"Selbstbedienungs-API-Schlüssel verfügt!"
+
+#: application/forms/IcingaTemplateChoiceForm.php:87
+msgid ""
+"It will not be allowed to choose more than this many options. Setting it to "
+"one (1) will result in a drop-down box, a higher number will turn this into "
+"a multi-selection element."
+msgstr ""
+"Es wird nicht erlaubt, mehr Optionen zu wählen als durch diese Einstellung "
+"vorgegeben wird. Setzt man sie auf Eins (1) erhält man ein Dropdown-Feld, "
+"eine höhere Nummer verwandelt diese in ein Mehrfach-Auswahlfeld."
+
+#: library/Director/Web/Widget/ImportSourceDetails.php:35
+msgid ""
+"It's currently unknown whether we are in sync with this Import Source. You "
+"should either check for changes or trigger a new Import Run."
+msgstr ""
+"Aktuell ist unbekannt ob die Konfiguration mit dieser Importquelle synchron "
+"ist. Es sollte auf Änderungen geprüft oder ein neuer Importlauf angestoßen "
+"werden."
+
+#: application/controllers/SyncruleController.php:91
+msgid ""
+"It's currently unknown whether we are in sync with this rule. You should "
+"either check for changes or trigger a new Sync Run."
+msgstr ""
+"Aktuell ist unbekannt, ob die Konfiguration mit dieser Regel synchron ist. "
+"Es sollte auf Änderungen geprüft oder ein neuer Importlauf angestoßen werden."
+
+#: application/forms/BasketUploadForm.php:130
+#: application/forms/BasketForm.php:126
+msgid "It's not allowed to store an empty basket"
+msgstr "Das Speichern eines leeren Baskets ist nicht erlaubt"
+
+#: application/controllers/JobController.php:108
+msgid "Job"
+msgstr "Auftrag"
+
+#: application/forms/BasketForm.php:37
+msgid "Job Definitions"
+msgstr "Job-Definitionen"
+
+#: application/forms/DirectorJobForm.php:17
+msgid "Job Type"
+msgstr "Auftragstyp"
+
+#: library/Director/Web/Table/JobTable.php:60
+#: application/forms/DirectorJobForm.php:72
+msgid "Job name"
+msgstr "Auftragsname"
+
+#: application/controllers/JobController.php:26
+#: application/controllers/JobController.php:57
+#, php-format
+msgid "Job: %s"
+msgstr "Auftrag: %s"
+
+#: library/Director/Dashboard/Dashlet/JobDashlet.php:14
+#: library/Director/Web/Tabs/ImportTabs.php:26
+#: application/controllers/JobsController.php:13
+msgid "Jobs"
+msgstr "Aufträge"
+
+#: library/Director/Web/Table/BranchActivityTable.php:70
+#: library/Director/Web/Table/ActivityLogTable.php:220
+msgid "Jump to this object"
+msgstr "Zu diesem Objekt springen"
+
+#: library/Director/Web/SelfService.php:267
+msgid "Just download and run this script on your Linux Client Machine:"
+msgstr ""
+"Einfach dieses Skript herunterladen und auf dem Linux Client-Rechner "
+"ausführen:"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:57
+msgid "Keep matching elements"
+msgstr "Übereinstimmende Elemente behalten"
+
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:73
+msgid "Keep only matching rows"
+msgstr "Behalte nur passende Zeilen"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:31
+msgid "Keep the DN as is"
+msgstr "DN unverändert behalten"
+
+#: library/Director/PropertyModifier/PropertyModifierJsonDecode.php:26
+msgid "Keep the JSON string as is"
+msgstr "JSON-String beibehalten"
+
+#: library/Director/PropertyModifier/PropertyModifierListToObject.php:27
+msgid "Keep the first row with that key"
+msgstr "Behalte die erste Zeile mit diesem Schlüssel"
+
+#: library/Director/PropertyModifier/PropertyModifierListToObject.php:28
+msgid "Keep the last row with that key"
+msgstr "Behalte die letzte Zeile mit diesem Schlüssel"
+
+#: library/Director/PropertyModifier/PropertyModifierGetHostByAddr.php:18
+#: library/Director/PropertyModifier/PropertyModifierGetHostByName.php:18
+msgid "Keep the property (hostname) as is"
+msgstr "Die Eigenschaft (hostname) behalten, wie sie ist"
+
+#: library/Director/PropertyModifier/PropertyModifierParseURL.php:40
+#: library/Director/PropertyModifier/PropertyModifierDnsRecords.php:35
+msgid "Keep the property as is"
+msgstr "Die Eigenschaft beibehalten"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayToRow.php:25
+#: library/Director/PropertyModifier/PropertyModifierDictionaryToRow.php:32
+msgid "Keep the row, set the column value to null"
+msgstr "Behalte die Zeile so wie sie ist, setze den Spaltenwert auf null"
+
+#: library/Director/Web/Table/DatalistEntryTable.php:54
+#: application/forms/DirectorDatalistEntryForm.php:21
+msgid "Key"
+msgstr "Schlüssel"
+
+#: application/controllers/DataController.php:327
+msgid "Key / Instance"
+msgstr "Schlüssel / Instanz"
+
+#: library/Director/PropertyModifier/PropertyModifierListToObject.php:15
+msgid "Key Property"
+msgstr "Schlüsseleigenschaft"
+
+#: library/Director/PropertyModifier/PropertyModifierDictionaryToRow.php:21
+msgid "Key Property Name"
+msgstr "Schlüsseleigenschaft"
+
+#: application/forms/ImportSourceForm.php:87
+msgid "Key column name"
+msgstr "Schlüsselspaltenname"
+
+#: application/controllers/KickstartController.php:15
+#: application/controllers/KickstartController.php:17
+msgid "Kickstart"
+msgstr "Kickstart"
+
+#: library/Director/Dashboard/Dashlet/KickstartDashlet.php:11
+#: application/forms/KickstartForm.php:292
+msgid "Kickstart Wizard"
+msgstr "Kickstart Assistent"
+
+#: library/Director/Import/ImportSourceLdap.php:50
+msgid "LDAP Search Base"
+msgstr "LDAP Suchbasis"
+
+#: library/Director/Web/Table/DatalistEntryTable.php:55
+#: library/Director/Web/Table/IcingaObjectDatafieldTable.php:49
+#: library/Director/Web/Table/DatafieldTable.php:49
+#: application/forms/DirectorDatalistEntryForm.php:30
+msgid "Label"
+msgstr "Bezeichnung"
+
+#: library/Director/Web/Widget/IcingaObjectInspection.php:58
+msgid "Last Check Result"
+msgstr "Letztes Check-Ergebnis"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:34
+msgid "Last Element"
+msgstr "Letztes Element"
+
+#: application/forms/IcingaNotificationForm.php:208
+msgid "Last notification"
+msgstr "Letzte Benachrichtigung"
+
+#: library/Director/Web/Widget/DeployedConfigInfoHeader.php:77
+msgid "Last related activity"
+msgstr "Zuletzt verwendete Konfiguration"
+
+#: application/controllers/SyncruleController.php:136
+msgid "Last sync run details"
+msgstr "Details des letzten Imports"
+
+#: application/forms/IcingaCommandArgumentForm.php:69
+msgid ""
+"Leave empty for non-positional arguments. Can be a positive or negative "
+"number and influences argument ordering"
+msgstr ""
+"Leer lassen für Argumente, deren Position egal ist. Kann eine positive oder "
+"negative Zahl sein und beeinflusst die Reihenfolge der Argumente"
+
+#: application/forms/DirectorDatafieldForm.php:44
+msgid ""
+"Leaving custom variables in place while removing the related field is "
+"perfectly legal and might be a desired operation. This way you can no longer "
+"modify related custom variables in the Director GUI, but the variables "
+"themselves will stay there and continue to be deployed. When you re-add a "
+"field for the same variable later on, everything will continue to work as "
+"before"
+msgstr ""
+"Benutzerdefinierte Eigenschaften beizubehalten während das zugehörige Feld "
+"entfernt wird ist durchaus legal und kann eine gewünschte Operation sein. "
+"Auf diesem Wege lassen sich zugehörige Felder dann nicht mehr in der "
+"Director-Oberfläche bearbeiten, aber die jeweiligen Werte bleiben "
+"konfiguriert und werden weiterhin ausgerollt. Wenn man ein Feld mit "
+"demselben Namen zu einem späteren Zeitpunkt wieder hinzufügt, wird alles "
+"wieder funktionieren wie zuvor"
+
+#: application/forms/DirectorDatafieldForm.php:87
+msgid ""
+"Leaving custom variables in place while renaming the related field is "
+"perfectly legal and might be a desired operation. This way you can no longer "
+"modify related custom variables in the Director GUI, but the variables "
+"themselves will stay there and continue to be deployed. When you re-add a "
+"field for the same variable later on, everything will continue to work as "
+"before"
+msgstr ""
+"Benutzerdefinierte Eigenschaften beizubehalten während das zugehörige Feld "
+"umbenannt wird ist durchaus legal und kann eine gewünschte Operation sein. "
+"Auf diesem Wege lassen sich zugehörige Felder dann nicht mehr in der "
+"Director-Oberfläche bearbeiten, aber die jeweiligen Werte bleiben "
+"konfiguriert und werden weiterhin ausgerollt. Wenn man ein Feld mit "
+"demselben Namen zu einem späteren Zeitpunkt wieder hinzufügt, wird alles "
+"wieder funktionieren wie zuvor"
+
+#: library/Director/PropertyModifier/PropertyModifierMap.php:35
+#: library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:45
+msgid "Let the import fail"
+msgstr "Import fehlschlagen lassen"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:55
+msgid "Let the whole Import Run fail"
+msgstr "Den ganzen Importlauf fehlschlagen lassen"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:32
+#: library/Director/PropertyModifier/PropertyModifierGetHostByAddr.php:19
+#: library/Director/PropertyModifier/PropertyModifierListToObject.php:26
+#: library/Director/PropertyModifier/PropertyModifierParseURL.php:41
+#: library/Director/PropertyModifier/PropertyModifierJsonDecode.php:27
+#: library/Director/PropertyModifier/PropertyModifierArrayToRow.php:24
+#: library/Director/PropertyModifier/PropertyModifierDnsRecords.php:36
+#: library/Director/PropertyModifier/PropertyModifierGetHostByName.php:19
+#: library/Director/PropertyModifier/PropertyModifierDictionaryToRow.php:31
+msgid "Let the whole import run fail"
+msgstr "Den ganzen Importlauf fehlschlagen lassen"
+
+#: configuration.php:54
+msgid "Limit access to the given comma-separated list of hostgroups"
+msgstr ""
+"Den Zugriff auf diese Kommagetrennte Liste von Host-Gruppen beschränken"
+
+#: library/Director/Web/SelfService.php:260
+msgid "Linux commandline"
+msgstr "Linux Kommandozeile"
+
+#: application/controllers/DataController.php:125
+msgid "List Entries"
+msgstr "Listeneinträge"
+
+#: application/controllers/DataController.php:401
+msgid "List entries"
+msgstr "Listeneinträge"
+
+#: library/Director/Web/Table/DatalistTable.php:31
+#: application/forms/DirectorDatalistForm.php:13
+msgid "List name"
+msgstr "Listenname"
+
+#: library/Director/Import/ImportSourceRestApi.php:213
+msgid "Literal dots in a key name can be written in the escape notation:"
+msgstr "Punkte im Schlüsselbezeichner können bei Bedarf verschont werden:"
+
+#: application/forms/SettingsForm.php:167
+msgid ""
+"Local directory to deploy Icinga 1.x configuration. Must be writable by "
+"icingaweb2. (e.g. /etc/icinga/director)"
+msgstr ""
+"Lokales Verzeichnis in welches die Icinga 1.x Konfiguration ausgerollt "
+"werden soll. Muss von icingaweb2 beschreibbar sein (z.B. /etc/icinga/"
+"director)"
+
+#: application/forms/IcingaEndpointForm.php:41
+msgid "Log Duration"
+msgstr "Behaltefrist des Logs"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:576
+#: application/forms/IcingaAddServiceForm.php:67
+msgid "Main properties"
+msgstr "Haupteigenschaften"
+
+#: library/Director/Dashboard/Dashlet/CheckCommandsDashlet.php:12
+msgid ""
+"Manage definitions for your Commands that should be executed as Check "
+"Plugins, Notifications or based on Events"
+msgstr ""
+"Definitionen für Kommandos verwalten, welche als Check-Plugins "
+"Benachrichtigungen oder Event-basiert ausgeführt werden sollen"
+
+#: library/Director/Dashboard/Dashlet/HostTemplatesDashlet.php:17
+msgid ""
+"Manage your Host Templates. Use Fields to make it easy for your users to get "
+"them customized."
+msgstr ""
+"Host-Vorlagen verwalten. Verwende Felder um Benutzern deren Anpassung zu "
+"erleichtern."
+
+#: library/Director/Dashboard/Dashlet/InfrastructureDashlet.php:17
+msgid ""
+"Manage your Icinga 2 infrastructure: Masters, Zones, Satellites and more"
+msgstr "Icinga 2 Infrastruktur verwalten: Master, Zonen, Satelliten und mehr"
+
+#: library/Director/Dashboard/CommandsDashboard.php:17
+msgid "Manage your Icinga Commands"
+msgstr "Icinga Kommandos verwalten"
+
+#: library/Director/Dashboard/HostsDashboard.php:16
+msgid "Manage your Icinga Hosts"
+msgstr "Icinga Hosts verwalten"
+
+#: library/Director/Dashboard/InfrastructureDashboard.php:24
+msgid "Manage your Icinga Infrastructure"
+msgstr "Icinga 2 Infrastruktur verwalten"
+
+#: library/Director/Dashboard/ServicesDashboard.php:18
+msgid "Manage your Icinga Service Checks"
+msgstr "Icinga Service Checks verwalten"
+
+#: library/Director/Dashboard/Dashlet/ServiceTemplatesDashlet.php:17
+msgid ""
+"Manage your Service Templates. Use Fields to make it easy for your users to "
+"get them customized."
+msgstr ""
+"Service-Vorlagen verwalten. Verwende Felder um Benutzern deren Anpassung zu "
+"erleichtern."
+
+#: library/Director/Web/Controller/ObjectController.php:254
+msgid "Managing Fields"
+msgstr "Datenfelder verwalten"
+
+#: library/Director/Web/Table/IcingaObjectDatafieldTable.php:51
+#: application/forms/IcingaObjectFieldForm.php:142
+#: application/forms/IcingaObjectFieldForm.php:147
+msgid "Mandatory"
+msgstr "Pflicht"
+
+#: application/forms/SettingsForm.php:155
+msgid "Master-less"
+msgstr "Masterlos"
+
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:35
+msgid "Match NULL value columns"
+msgstr "Triff auf Spalten NULL-Werten zu"
+
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:34
+msgid "Match boolean FALSE"
+msgstr "Triff auf boolesches FALSE zu"
+
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:33
+msgid "Match boolean TRUE"
+msgstr "Triff auf boolesches TRUE zu"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1391
+msgid "Max check attempts"
+msgstr "Maximale Checkwiederholungen"
+
+#: library/Director/Web/Table/GroupMemberTable.php:73
+#: library/Director/Web/Table/GroupMemberTable.php:78
+msgid "Member"
+msgstr "Mitglied"
+
+#: library/Director/Web/Tabs/ObjectTabs.php:114
+msgid "Members"
+msgstr "Mitglieder"
+
+#: library/Director/Web/Controller/ObjectController.php:615
+#: application/forms/SyncRuleForm.php:62
+msgid "Merge"
+msgstr "Zusammenführen"
+
+#: application/forms/SyncPropertyForm.php:117
+msgid "Merge Policy"
+msgstr "Zusammenführungsrichtlinie"
+
+#: application/forms/IcingaTimePeriodRangeForm.php:23
+#: application/forms/IcingaScheduledDowntimeRangeForm.php:24
+msgid ""
+"Might be monday, tuesday or 2016-01-28 - have a look at the documentation "
+"for more examples"
+msgstr ""
+"Mögliche Werte sind z.B. monday, tuesday oder 2016-01-28 - Mehr Beispiele "
+"finden sich in der Dokumentation"
+
+#: application/forms/IcingaTemplateChoiceForm.php:73
+msgid "Minimum required"
+msgstr "Erforderliches Minimum"
+
+#: application/controllers/BranchController.php:112
+msgid "Modification"
+msgstr "Änderung"
+
+#: application/forms/ImportRowModifierForm.php:69
+msgid "Modifier"
+msgstr "Modifikator"
+
+#: library/Director/Web/Tabs/ImportsourceTabs.php:41
+msgid "Modifiers"
+msgstr "Modifikatoren"
+
+#: library/Director/ProvidedHook/Monitoring/HostActions.php:55
+#: library/Director/ProvidedHook/Monitoring/ServiceActions.php:56
+#: library/Director/ProvidedHook/Monitoring/ServiceActions.php:62
+#: library/Director/Web/ActionBar/AutomationObjectActionBar.php:38
+#: library/Director/Web/Tabs/SyncRuleTabs.php:37
+#: library/Director/Web/Controller/TemplateController.php:121
+#: application/controllers/ImportsourceController.php:126
+#: application/controllers/SyncruleController.php:553
+msgid "Modify"
+msgstr "Ändere"
+
+#: library/Director/ProvidedHook/CubeLinks.php:52
+#: library/Director/ProvidedHook/IcingaDbCubeLinks.php:53
+#, php-format
+msgid "Modify %d hosts"
+msgstr "%d Hosts verändern"
+
+#: library/Director/Web/Controller/ObjectsController.php:215
+#, php-format
+msgid "Modify %d objects"
+msgstr "%d Objekte bearbeiten"
+
+#: application/controllers/DatafieldController.php:28
+#: application/controllers/DatafieldcategoryController.php:34
+#, php-format
+msgid "Modify %s"
+msgstr "Ändere %s"
+
+#: library/Director/ProvidedHook/CubeLinks.php:35
+#: library/Director/ProvidedHook/IcingaDbCubeLinks.php:30
+msgid "Modify a host"
+msgstr "Ändere einen Host"
+
+#: application/forms/DirectorDatalistEntryForm.php:61
+msgid "Modify data list entry"
+msgstr "Datenlisteneintrag verändern"
+
+#: application/controllers/DataController.php:214
+#, php-format
+msgid "Modify instance: %s"
+msgstr "Instanz ändern: %s"
+
+#: library/Director/Web/Table/ApplyRulesTable.php:158
+msgid "Modify this Apply Rule"
+msgstr "Diese Apply-Regeln ändern"
+
+#: library/Director/Web/Controller/ObjectController.php:180
+msgid "Modifying Apply Rules"
+msgstr "Apply-Regeln ändern"
+
+#: application/controllers/ImportsourceController.php:127
+#: application/controllers/ImportsourceController.php:285
+#: application/controllers/ImportsourceController.php:315
+msgid "Modifying Import Sources"
+msgstr "Importquellen ändern"
+
+#: application/controllers/JobController.php:59
+msgid "Modifying Jobs"
+msgstr "Aufträge ändern"
+
+#: application/controllers/SyncruleController.php:517
+#: application/controllers/SyncruleController.php:625
+#: application/controllers/SyncruleController.php:633
+msgid "Modifying Sync Rules"
+msgstr "Synchronisationsregeln ändern"
+
+#: application/controllers/TemplatechoiceController.php:36
+msgid "Modifying Template Choices"
+msgstr "Auswahlmöglichkeit für Vorlagen abändern"
+
+#: library/Director/Web/Controller/ObjectController.php:176
+#: application/controllers/ServiceController.php:147
+msgid "Modifying Templates"
+msgstr "Vorlagen ändern"
+
+#: library/Director/Web/Table/Dependency/DependencyInfoTable.php:37
+msgid "Module name"
+msgstr "Modulname"
+
+#: library/Director/Dashboard/Dashlet/ServiceObjectDashlet.php:15
+msgid "Monitored Services"
+msgstr "Überwachte Services"
+
+#: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:544
+msgid "Move down"
+msgstr "Nach unten bewegen"
+
+#: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:534
+msgid "Move up"
+msgstr "Nach oben bewegen"
+
+#: library/Director/Web/Controller/ObjectsController.php:213
+msgid "Multiple objects"
+msgstr "Mehrere Objekte"
+
+#: application/forms/SelfServiceSettingsForm.php:51
+msgid "My Agents should use DNS to look up Endpoint names"
+msgstr "Meine Agents sollen DNS benutzen, um Endpoint-Namen nachzuschlagen"
+
+#: application/controllers/ConfigController.php:181
+msgid "My changes"
+msgstr "Meine Änderungen"
+
+#: application/controllers/SchemaController.php:16
+msgid "MySQL schema"
+msgstr "MySQL Schema"
+
+#: library/Director/Web/Table/ChoicesTable.php:41
+#: library/Director/Web/Table/CoreApiObjectsTable.php:57
+#: library/Director/Web/Table/CoreApiPrototypesTable.php:40
+#: library/Director/Web/Table/CoreApiFieldsTable.php:79
+#: library/Director/Web/Table/ObjectSetTable.php:45
+#: application/forms/IcingaServiceVarForm.php:22
+#: application/forms/IcingaHostForm.php:38
+#: application/forms/IcingaHostVarForm.php:22
+#: application/forms/IcingaTimePeriodForm.php:15
+#: application/forms/IcingaCommandForm.php:46
+#: application/forms/IcingaServiceForm.php:575
+#: application/forms/IcingaDependencyForm.php:74
+#: application/forms/IcingaApiUserForm.php:14
+#: application/forms/IcingaAddServiceForm.php:143
+#: application/forms/IcingaServiceDictionaryMemberForm.php:22
+msgid "Name"
+msgstr "Name"
+
+#: application/forms/IcingaDependencyForm.php:76
+msgid "Name for the Icinga dependency you are going to create"
+msgstr "Name der Icinga-Abhängigkeit, die erstellt werden soll"
+
+#: application/forms/IcingaEndpointForm.php:20
+msgid "Name for the Icinga endpoint template you are going to create"
+msgstr "Name der Icinga-Endpunkt-Vorlage, die erstellt werden soll"
+
+#: application/forms/IcingaEndpointForm.php:26
+msgid "Name for the Icinga endpoint you are going to create"
+msgstr "Name des Icinga-Endpunkt, der erstellt werden soll"
+
+#: application/forms/IcingaNotificationForm.php:21
+msgid "Name for the Icinga notification template you are going to create"
+msgstr "Name der Icinga-Benachrichtigungs-Vorlage, die erstellt werden soll"
+
+#: application/forms/IcingaNotificationForm.php:27
+msgid "Name for the Icinga notification you are going to create"
+msgstr "Name der Icinga-Benachrichtigung, die erstellt werden soll"
+
+#: application/forms/IcingaServiceForm.php:578
+#: application/forms/IcingaAddServiceForm.php:146
+msgid "Name for the Icinga service you are going to create"
+msgstr "Name des Icinga-Service, der erstellt werden soll"
+
+#: application/forms/IcingaUserForm.php:30
+msgid "Name for the Icinga user object you are going to create"
+msgstr "Name für das Icinga-Benutzerobjekt, das Sie erstellen möchten"
+
+#: application/forms/IcingaUserForm.php:24
+msgid "Name for the Icinga user template you are going to create"
+msgstr "Name für die Icinga-Benutzervorlage, die Sie erstellen möchten"
+
+#: application/forms/IcingaZoneForm.php:17
+msgid "Name for the Icinga zone you are going to create"
+msgstr "Name der Icinga-Zone, die erstellt werden soll"
+
+#: application/forms/IcingaServiceDictionaryMemberForm.php:25
+msgid "Name for the instance you are going to create"
+msgstr "Name der Instanz, die erstellt werden soll"
+
+#: application/forms/IcingaCloneObjectForm.php:151
+msgid "Name needs to be changed when cloning a Template"
+msgstr "Beim Klonen einer Vorlage muss der Name geändert werden"
+
+#: library/Director/Web/Table/CoreApiFieldsTable.php:90
+msgid "Nav"
+msgstr "Nav"
+
+#: application/controllers/DatafieldcategoryController.php:40
+msgid "New Category"
+msgstr "Neue Kategorie"
+
+#: application/controllers/DatafieldController.php:34
+msgid "New Field"
+msgstr "Neues Feld"
+
+#: application/controllers/JobController.php:34
+msgid "New Job"
+msgstr "Neuer Job"
+
+#: library/Director/Web/Tabs/ImportsourceTabs.php:54
+msgid "New import source"
+msgstr "Neue Importquelle"
+
+#: library/Director/Web/Form/CloneImportSourceForm.php:31
+#: library/Director/Web/Form/CloneSyncRuleForm.php:31
+#: application/forms/IcingaCloneObjectForm.php:39
+msgid "New name"
+msgstr "Neuer Name"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:379
+msgid "New object"
+msgstr "Neues Objekt"
+
+#: application/forms/IcingaHostForm.php:31
+#: application/forms/IcingaAddServiceForm.php:35
+msgid "Next"
+msgstr "Weiter"
+
+#: library/Director/Job/ImportJob.php:102
+#: library/Director/Job/ConfigJob.php:40
+#: library/Director/Job/ConfigJob.php:52
+#: library/Director/Job/SyncJob.php:102
+#: library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:26
+#: application/forms/IcingaZoneForm.php:29
+#: application/forms/SettingsForm.php:58
+#: application/forms/SettingsForm.php:73
+#: application/forms/SettingsForm.php:95
+#: application/forms/SelfServiceSettingsForm.php:240
+msgid "No"
+msgstr "Nein"
+
+#: application/controllers/DataController.php:184
+#, php-format
+msgid "No %s have been created yet"
+msgstr "Bisher wurden keine %s erstellt"
+
+#: library/Director/Util.php:167
+#, php-format
+msgid "No %s resource available"
+msgstr "Keine %s Ressource verfügbar"
+
+#: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:101
+msgid "No API user configured, you might run the kickstart helper"
+msgstr ""
+"Kein API Benutzer konfiguriert. Der kickstart helper sollte ausgeführt werden"
+
+#: application/forms/IcingaHostForm.php:175
+msgid "No Host Template has been provided yet"
+msgstr "Es wurde noch keine passende Host-Vorlage bereitgestellt"
+
+#: application/forms/IcingaHostForm.php:163
+msgid "No Host template has been chosen"
+msgstr "Keine Host-Vorlage wurde ausgewählt"
+
+#: application/forms/IcingaAddServiceForm.php:95
+msgid "No Service Templates have been provided yet"
+msgstr "Es wurde noch keine passende Vorlage bereitgestellt"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:670
+#: application/forms/IcingaCommandArgumentForm.php:181
+#: application/forms/IcingaTimePeriodRangeForm.php:94
+#: application/forms/IcingaServiceForm.php:777
+#: application/forms/IcingaScheduledDowntimeRangeForm.php:99
+msgid "No action taken, object has not been modified"
+msgstr "Keine Aktion durchgeführt, das Objekt wurde nicht verändert"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:162
+msgid "No apply rule has been defined yet"
+msgstr "Bisher wurde kein Apply-Regel definiert"
+
+#: library/Director/Web/Widget/SyncRunDetails.php:43
+msgid "No changes have been made"
+msgstr "Keine Änderungen wurden gemacht"
+
+#: application/controllers/DashboardController.php:73
+msgid "No dashboard available, you might have not enough permissions"
+msgstr ""
+"Kein Dashboard verfügbar, eventuell wurden nicht genügend Zugriffsrechte "
+"gewährt"
+
+#: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:70
+msgid "No database has been configured for Icinga Director"
+msgstr "Keine Datenbank für den Icinga-Director wurde konfiguriert"
+
+#: application/forms/KickstartForm.php:215
+msgid ""
+"No database resource has been configured yet. Please choose a resource to "
+"complete your config"
+msgstr ""
+"Es wurde bisher keine Datenbankressource konfiguriert. Bitte eine Ressource "
+"auswählen, um die Konfiguration zu vervollständigen"
+
+#: application/forms/KickstartForm.php:56
+msgid "No database schema has been created yet"
+msgstr "Kein Datenbankschema wurde bisher erstellt"
+
+#: application/forms/AddToBasketForm.php:105
+msgid "No object has been chosen"
+msgstr "Keine Objekt wurde ausgewählt"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:180
+msgid "No object has been defined yet"
+msgstr "Kein Objekt wurde bisher definiert"
+
+#: application/forms/IcingaMultiEditForm.php:88
+msgid "No object has been modified"
+msgstr "Kein Objekt wurde verändert"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1245
+msgid "No related template has been provided yet"
+msgstr "Es wurde noch keine passende Vorlage bereitgestellt"
+
+#: application/forms/IcingaAddServiceForm.php:83
+msgid "No service has been chosen"
+msgstr "Keine Service wurde ausgewählt"
+
+#: application/controllers/HostController.php:167
+#, php-format
+msgid "No such service: %s"
+msgstr "Kein solcher Service: %s"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1240
+msgid "No template has been chosen"
+msgstr "Keine Vorlage wurde ausgewählt"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:144
+msgid "No template has been defined yet"
+msgstr "Es wurde noch keine Vorlage definiert"
+
+#: application/forms/IcingaServiceForm.php:625
+msgid "None"
+msgstr "Keine"
+
+#: library/Director/Dashboard/Dashlet/EndpointObjectDashlet.php:57
+msgid "None could be used for deployments right now"
+msgstr "Keines kann momentan zum Ausrollen verwendet werden"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1531
+msgid "Notes"
+msgstr "Notizen"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1540
+msgid "Notes URL"
+msgstr "Notizen-URL"
+
+#: application/forms/SyncRunForm.php:60
+msgid "Nothing changed, rule is in sync"
+msgstr "Keine Änderung, Regel ist synchron"
+
+#: application/forms/ImportCheckForm.php:38
+#: application/forms/ImportRunForm.php:38
+msgid ""
+"Nothing to do, data provided by this Import Source didn't change since the "
+"last import run"
+msgstr ""
+"Keine Aktion nötig. Die Daten von dieser Importquelle haben sich seit dem "
+"letzten Lauf nicht geändert"
+
+#: application/forms/RestoreObjectForm.php:76
+msgid "Nothing to do, restore would not modify the current object"
+msgstr ""
+"Nichts zu tun, eine Wiederherstellung würde das aktuelle Objekt nicht ändern"
+
+#: application/forms/SyncRunForm.php:64
+msgid "Nothing to do, rule is in sync"
+msgstr "Nichts zu tun, Regel ist synchron"
+
+#: application/forms/SyncCheckForm.php:63
+msgid "Nothing would change, this rule is still in sync"
+msgstr "Es würde sich nichts ändern, diese Regel ist noch synchron"
+
+#: library/Director/TranslationDummy.php:18
+#: application/forms/IcingaNotificationForm.php:25
+#: application/forms/SyncRuleForm.php:22
+msgid "Notification"
+msgstr "Benachrichtigung"
+
+#: library/Director/DataType/DataTypeDirectorObject.php:58
+msgid "Notification Apply Rules"
+msgstr "Benachrichtigungs-Apply-Regeln"
+
+#: library/Director/Web/Controller/TemplateController.php:57
+#, php-format
+msgid "Notification Apply Rules based on %s"
+msgstr "Benachrichtigungs-Apply-Regeln basierend auf %s"
+
+#: library/Director/Dashboard/Dashlet/NotificationCommandsDashlet.php:19
+#: library/Director/Import/ImportSourceCoreApi.php:58
+msgid "Notification Commands"
+msgstr "Benachrichtigungskommandos"
+
+#: library/Director/Dashboard/Dashlet/NotificationCommandsDashlet.php:12
+msgid ""
+"Notification Commands allow you to trigger any action you want when a "
+"notification takes place"
+msgstr ""
+"Benachrichtigungs-Kommandos erlauben das Ausführen beliebiger Aktionen wenn "
+"eine Benachrichtigung stattfinden soll"
+
+#: application/forms/IcingaNotificationForm.php:19
+msgid "Notification Template"
+msgstr "Benachrichtigungsvorlage"
+
+#: application/forms/BasketForm.php:30
+msgid "Notification Templates"
+msgstr "Benachrichtigungsvorlagen"
+
+#: application/forms/IcingaNotificationForm.php:262
+msgid "Notification command"
+msgstr "Benachrichtigungskommando"
+
+#: application/forms/IcingaNotificationForm.php:176
+msgid "Notification interval"
+msgstr "Benachrichtigungsintervall"
+
+#: application/controllers/TemplatechoicesController.php:29
+msgid "Notification template choices"
+msgstr "Auswahlmöglichkeiten für Benachrichtigungsvorlagen"
+
+#: library/Director/Dashboard/Dashlet/NotificationTemplateDashlet.php:13
+msgid "Notification templates"
+msgstr "Benachrichtigungsvorlagen"
+
+#: configuration.php:165
+#: library/Director/Dashboard/Dashlet/NotificationApplyDashlet.php:13
+#: library/Director/Dashboard/Dashlet/NotificationsDashlet.php:13
+#: library/Director/Db/Branch/BranchModificationInspection.php:46
+#: library/Director/Web/Table/CustomvarVariantsTable.php:61
+#: library/Director/Web/Table/CustomvarTable.php:46
+#: application/forms/BasketForm.php:31
+msgid "Notifications"
+msgstr "Benachrichtigungen"
+
+#: library/Director/Dashboard/NotificationsDashboard.php:20
+msgid ""
+"Notifications are sent when a host or service reaches a non-ok hard state or "
+"recovers from such. One might also want to send them for special events like "
+"when a Downtime starts, a problem gets acknowledged and much more. You can "
+"send specific notifications only within specific time periods, you can delay "
+"them and of course re-notify at specific intervals.\n"
+"\n"
+" Combine those possibilities in case you need to define escalation levels, "
+"like notifying operators first and your management later on in case the "
+"problem remains unhandled for a certain time.\n"
+"\n"
+" You might send E-Mail or SMS, make phone calls or page on various "
+"channels. You could also delegate notifications to external service "
+"providers. The possibilities are endless, as you are allowed to define as "
+"many custom notification commands as you want"
+msgstr ""
+"Benachrichtigungen werden gesendet, wenn ein Host oder Services einen harten "
+"Nicht-OK-Zustand erreicht oder sich von einem solchen erholt. Es könnte "
+"zudem wünschenswert sein, Benachrichtigungen auch für spezielle Events wie "
+"den Beginn einer Downtime, das Bestätigen eines Problems und mehr zu "
+"versenden. Benachrichtigungen lassen sich auf Wunsch nur innerhalb "
+"bestimmter Zeitfenster versenden. Zudem können sie künstlich verzögert und / "
+"oder in bestimmten Intervallen neu versandt werden.\n"
+"\n"
+"Wer Eskalationsebenen umsetzen möchte kombiniert diese Möglichkeiten. Man "
+"könnte z.B. erst das Operating benachrichtigen, und erst wenn das Problem "
+"für längere Zeit unbehandelt bleibt das Management mit einbeziehen.\n"
+"\n"
+"Man könnte E-Mails oder SMS versenden, Telefonanrufe durchführen und sich "
+"auf unterschiedlichsten Kanälen anpiepen lassen. Benachrichtigungen lassen "
+"sich natürlich auch an externe Serviceanbieter auslagern. Die Möglichkeiten "
+"sind endlos, nachdem man beliebig viele eigene Kommandos anbinden kann"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:43
+msgid "Numeric position or key name"
+msgstr "Numerische Position oder Schlüsselbezeichner"
+
+#: library/Director/IcingaConfig/StateFilterSet.php:24
+msgid "OK"
+msgstr "Ok"
+
+#: library/Director/DataType/DataTypeDirectorObject.php:67
+#: library/Director/Web/Form/DirectorObjectForm.php:1114
+#: library/Director/Web/Form/DirectorObjectForm.php:1119
+#: library/Director/Web/Controller/TemplateController.php:149
+msgid "Object"
+msgstr "Objekt"
+
+#: application/controllers/InspectController.php:102
+msgid "Object Inspection"
+msgstr "Objekt-Inspektion"
+
+#: library/Director/Import/ImportSourceDirectorObject.php:78
+#: application/forms/SyncRuleForm.php:45
+msgid "Object Type"
+msgstr "Objekttyp"
+
+#: library/Director/Import/ImportSourceLdap.php:56
+msgid "Object class"
+msgstr "Objektklasse"
+
+#: library/Director/Dashboard/Dashlet/DependencyObjectDashlet.php:18
+msgid "Object dependency relationships."
+msgstr "Objekt-Abhängigkeiten."
+
+#: application/forms/RestoreObjectForm.php:80
+msgid "Object has been re-created"
+msgstr "Objekt wurde wiederhergestellt"
+
+#: application/forms/RestoreObjectForm.php:72
+msgid "Object has been restored"
+msgstr "Objekt wurde wiederhergestellt"
+
+#: application/forms/SyncPropertyForm.php:359
+msgid "Object properties"
+msgstr "Objekteigenschaften"
+
+#: library/Director/Web/Table/SyncruleTable.php:46
+#: library/Director/Web/Form/DirectorObjectForm.php:1127
+msgid "Object type"
+msgstr "Objekttyp"
+
+#: application/controllers/InspectController.php:65
+#, php-format
+msgid "Object type \"%s\""
+msgstr "Objekttyp \"%s\""
+
+#: library/Director/Web/Table/GeneratedConfigFileTable.php:85
+msgid "Object/Tpl/Apply"
+msgstr "Objekt/Vorlage/Apply"
+
+#: library/Director/Import/ImportSourceDirectorObject.php:81
+#: library/Director/Web/Table/HostTemplateUsageTable.php:11
+#: library/Director/Web/Table/TemplateUsageTable.php:24
+#: library/Director/Web/Table/ServiceTemplateUsageTable.php:11
+msgid "Objects"
+msgstr "Objekte"
+
+#: library/Director/Import/ImportSourceRestApi.php:209
+msgid ""
+"Often the expected result is provided in a property like \"objects\". Please "
+"specify this if required."
+msgstr ""
+"Häufig wird das zu erwartende Ergebnis in einer Eigenschaft wie \"objects\" "
+"zurückgeliefert. Bitte angeben falls erforderlich."
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:27
+#: library/Director/PropertyModifier/PropertyModifierParseURL.php:34
+msgid "On failure"
+msgstr "Bei Fehler"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:166
+msgid "One apply rule has been defined"
+msgstr "Eine Apply-Regel wurde definiert"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:188
+msgid "One external object has been defined, it will not be deployed"
+msgstr "Ein externes Objekt wurde erstellt, es wird nicht ausgerollt"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:191
+msgid "One object has been defined"
+msgstr "Ein Objekt wurde definiert"
+
+#: library/Director/Web/Widget/SyncRunDetails.php:46
+#: application/forms/IcingaMultiEditForm.php:90
+msgid "One object has been modified"
+msgstr "Ein Objekt wurde verändert"
+
+#: library/Director/PropertyModifier/PropertyModifierSplit.php:16
+msgid "One or more characters that should be used to split this string"
+msgstr ""
+"Ein oder mehrere Zeichen, die zum Trennen der Zeichenkette genutzt werden "
+"sollen"
+
+#: library/Director/PropertyModifier/PropertyModifierJoin.php:16
+msgid ""
+"One or more characters that will be used to glue an input array to a string. "
+"Can be left empty"
+msgstr ""
+"Ein oder mehrere Zeichen, die verwendet werden, um einen Eingabearray an "
+"eine Zeichenkette zu heften. Kann leer bleiben"
+
+#: application/forms/IcingaTimePeriodRangeForm.php:30
+#: application/forms/IcingaScheduledDowntimeRangeForm.php:31
+msgid "One or more time periods, e.g. 00:00-24:00 or 00:00-09:00,17:00-24:00"
+msgstr ""
+"Einer oder mehrere Zeiträume, z.B. 00:00-24:00 oder 00:00-09:00,17:00-24:00"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:148
+#: library/Director/Dashboard/Dashlet/Dashlet.php:185
+msgid "One template has been defined"
+msgstr "Eine Vorlage wurde definiert"
+
+#: application/forms/IcingaCommandArgumentForm.php:100
+msgid ""
+"Only set this parameter if the argument value resolves to a numeric value. "
+"String values are not supported"
+msgstr ""
+"Nur setzen, wenn der Wert des Arguments numereisch ist. Zeichenketten als "
+"Wert werden nicht unterstützt"
+
+#: application/forms/IcingaObjectFieldForm.php:146
+msgid "Optional"
+msgstr "Optional"
+
+#: application/forms/IcingaCommandForm.php:71
+msgid ""
+"Optional command timeout. Allowed values are seconds or durations postfixed "
+"with a specific unit (e.g. 1m or also 3m 30s)."
+msgstr ""
+"Optionaler Kommando-Timeout. Erlaubt sind Werte in Sekunden oder Werte mit "
+"nachgestellter Zeiteinheit. z.B. 1m oder auch 3m 30s."
+
+#: application/forms/IcingaDependencyForm.php:248
+msgid ""
+"Optional. The child service. If omitted this dependency object is treated as "
+"host dependency."
+msgstr ""
+"Optional. Der Kind-Service. Falls leer wird dieses Objekt als Host-"
+"Abhängigkeit behandelt."
+
+#: application/forms/IcingaDependencyForm.php:218
+msgid ""
+"Optional. The parent service. If omitted this dependency object is treated "
+"as host dependency."
+msgstr ""
+"Optional. Der Eltern-Service. Falls leer wird dieses Objekt als Host-"
+"Abhängigkeit behandelt."
+
+#: application/forms/IcingaObjectFieldForm.php:103
+msgid "Other available fields"
+msgstr "Andere verfügbare Felder"
+
+#: application/forms/SyncPropertyForm.php:274
+msgid "Other sources"
+msgstr "Andere Quellen"
+
+#: application/forms/IcingaServiceForm.php:160
+#: application/forms/IcingaServiceForm.php:435
+#: application/forms/IcingaServiceForm.php:467
+msgid "Override vars"
+msgstr "Variablen überschreiben"
+
+#: library/Director/Web/ActionBar/AutomationObjectActionBar.php:32
+#: library/Director/Web/Tabs/MainTabs.php:26
+msgid "Overview"
+msgstr "Überblick"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:81
+msgid "PHP Binary"
+msgstr "PHP Binary"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:84
+msgid "PHP Integer"
+msgstr "PHP Integer"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:83
+msgid "PHP Version"
+msgstr "PHP-Version"
+
+#: application/controllers/PhperrorController.php:19
+#, php-format
+msgid ""
+"PHP version 5.4.x is required for Director >= 1.4.0, you're running %s. "
+"Please either upgrade PHP or downgrade Icinga Director"
+msgstr ""
+"PHP Version 5.4.x ist für den Director >= 1.4.0 erforderlich, hier läuft %s. "
+"Bitte entweder PHP upgraden oder den Icinga Director downgraden"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:73
+msgid "PID"
+msgstr "PID"
+
+#: library/Director/Web/Tabs/ObjectTabs.php:137
+msgid "Packages"
+msgstr "Pakete"
+
+#: library/Director/Web/Widget/InspectPackages.php:48
+#, php-format
+msgid "Packages on Endpoint: %s"
+msgstr "Pakete auf Endpunkt: %s"
+
+#: application/forms/IcingaUserForm.php:41
+msgid "Pager"
+msgstr "Pager"
+
+#: application/forms/IcingaDependencyForm.php:200
+msgid "Parent Host"
+msgstr "Eltern-Host"
+
+#: application/forms/IcingaDependencyForm.php:216
+msgid "Parent Service"
+msgstr "Eltern-Service"
+
+#: application/forms/IcingaZoneForm.php:36
+msgid "Parent Zone"
+msgstr "Übergeordnete Zone"
+
+#: library/Director/Import/ImportSourceRestApi.php:233
+#: application/forms/IcingaApiUserForm.php:19
+#: application/forms/KickstartForm.php:163
+msgid "Password"
+msgstr "Passwort"
+
+#: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:13
+#: library/Director/PropertyModifier/PropertyModifierCombine.php:14
+msgid "Pattern"
+msgstr "Muster"
+
+#: application/forms/ApplyMigrationsForm.php:39
+msgid "Pending database schema migrations have successfully been applied"
+msgstr ""
+"Ausstehende Datenbankschemamigrationsskripte wurden erfolgreich angewandt"
+
+#: library/Director/Util.php:169
+msgid "Please ask an administrator to grant you access to resources"
+msgstr "Zugriff auf Ressourcen kann durch Administrator gewährt werden"
+
+#: application/forms/AddToBasketForm.php:117
+#, php-format
+msgid ""
+"Please check your Basket configuration, %s does not support single \"%s\" "
+"configuration objects"
+msgstr ""
+"Bitte Basketkonfiguration überprüfen, %s unterstützt keine einzelnen "
+"Konfigurationsobjekte vom Typ \"%s\""
+
+#: library/Director/PropertyModifier/PropertyModifierMap.php:19
+msgid "Please choose a data list that can be used for map lookups"
+msgstr "Eine Datenliste auswählen, die für Map lookups verwendet wird"
+
+#: library/Director/DataType/DataTypeDirectorObject.php:69
+#: library/Director/DataType/DataTypeDictionary.php:66
+msgid "Please choose a specific Icinga object type"
+msgstr "Bitte einen bestimmten Icinga-Objekttyp auswählen"
+
+#: library/Director/Job/ImportJob.php:82
+msgid ""
+"Please choose your import source that should be executed. You could create "
+"different schedules for different sources or also opt for running all of "
+"them at once."
+msgstr ""
+"Eine Importquelle die ausgeführt werden soll auswählen. Es können "
+"verschiedene Zeitpläne für verschiedene Quellen erstellt oder alle "
+"gleichzeitig ausgeführt werden."
+
+#: library/Director/Job/SyncJob.php:82
+msgid ""
+"Please choose your synchronization rule that should be executed. You could "
+"create different schedules for different rules or also opt for running all "
+"of them at once."
+msgstr ""
+"Eine Synchronisationsregel die ausgeführt werden soll auswählen. Es können "
+"verschiedene Zeitpläne für verschiedene Regeln erstellt oder alle "
+"gleichzeitig ausgeführt werden."
+
+#: library/Director/Import/ImportSourceSql.php:55
+msgid "Please click \"Store\" once again to determine query columns"
+msgstr ""
+"Bitte klicke \"Speicher\" erneut um die von der Abfrage bereitgestellten "
+"Spalten zu ermitteln"
+
+#: application/forms/KickstartForm.php:234
+#, php-format
+msgid "Please click %s to create new DB resources"
+msgstr "%s klicken, um neue Datenbankressourcen zu erstellen"
+
+#: library/Director/Util.php:159
+#, php-format
+msgid "Please click %s to create new resources"
+msgstr "%s klicken, um neue Ressourcen zu erstellen"
+
+#: application/forms/IcingaHostForm.php:167
+#: application/forms/IcingaAddServiceForm.php:87
+#, php-format
+msgid "Please define a %s first"
+msgstr "Bitte zuerst eine %s definieren"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1243
+msgid "Please define a related template first"
+msgstr "Bitte zuerst eine entsprechende Vorlage definieren"
+
+#: application/forms/KickstartForm.php:472
+msgid ""
+"Please make sure that your database exists and your user has been granted "
+"enough permissions"
+msgstr ""
+"Überprüfen, ob die Datenbank existiert und der Benutzer ausreichende "
+"Berechtigungen hat"
+
+#: application/controllers/ImportsourceController.php:98
+#, php-format
+msgid ""
+"Please note that importing data will take place in your main Branch. "
+"Modifications to Import Sources are not allowed while being in a "
+"Configuration Branch. To get the full functionality, please deactivate %s"
+msgstr ""
+"Bitte beachten, dass das Importieren von Daten im Hauptzweig stattfindet. "
+"Änderungen an Importquellen sind nicht erlaubt, während man sich in einem "
+"anderen Konfigurationszweig befindet. Für die volle Funktionalität bitte %s "
+"deaktivieren"
+
+#: application/forms/SettingsForm.php:23
+msgid ""
+"Please only change those settings in case you are really sure that you are "
+"required to do so. Usually the defaults chosen by the Icinga Director should "
+"make a good fit for your environment."
+msgstr ""
+"Diese Einstellungen sollten nur dann geändert werden, wenn es als unbedingt "
+"nötig erachtet wird. Für gewöhnlich sollten die vom Icinga Director "
+"gewählten Standardwerte für Umgebungen jeglicher Art passend sein."
+
+#: application/forms/SyncRuleForm.php:31
+msgid "Please provide a rule name"
+msgstr "Bitte einen Regelnamen angeben"
+
+#: library/Director/PropertyModifier/PropertyModifierSubstring.php:17
+#: library/Director/PropertyModifier/PropertyModifierSubstring.php:27
+#, php-format
+msgid "Please see %s for detailled instructions of how start and end work"
+msgstr ""
+"Siehe %s für eine detaillierte Anleitung, wie Beginn und Ende funktionieren"
+
+#: application/forms/ImportRowModifierForm.php:32
+msgid ""
+"Please start typing for a list of suggestions. Dots allow you to access "
+"nested properties: column.some.key. Such nested properties cannot be "
+"modified in-place, but you can store the modified value to a new \"target "
+"property\""
+msgstr ""
+"Für eine Liste von Vorschlägen bitte mit dem Tippen beginnen. Punkte "
+"erlauben es, verschachtelte Eigenschaften anzusprechen: column.some.key. "
+"Solche verschachtelten EIgenschaften können nicht an Ort und Stelle "
+"verändert werden, dafür lässt sich der modifizierte Wert aber in eine neue "
+"\"Zieleigenschaft\" schreiben"
+
+#: application/forms/IcingaCommandForm.php:35
+msgid ""
+"Plugin Check commands are what you need when running checks agains your "
+"infrastructure. Notification commands will be used when it comes to notify "
+"your users. Event commands allow you to trigger specific actions when "
+"problems occur. Some people use them for auto-healing mechanisms, like "
+"restarting services or rebooting systems at specific thresholds"
+msgstr ""
+"Plugin-Check-Kommandos werden benötigt, um Infrastruktur zu prüfen. Mit "
+"Benachrichtigungskommandos werden Benutzer benachrichtigt. Event-Kommandos "
+"führen bestimmte Aktionen aus, wenn Probleme auftreten. Sie werden manchmal "
+"für Selbstheilungsmechanismen verwendet, wie das Neustarten von Services "
+"oder das Neustarten von Systemen beim Überschreiten bestimmter Schwellwerte"
+
+#: application/forms/IcingaCommandForm.php:20
+msgid "Plugin commands"
+msgstr "Plugin-Kommandos"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:50
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:65
+msgid "Policy"
+msgstr "Richtlinie"
+
+#: application/forms/IcingaEndpointForm.php:36
+#: application/forms/KickstartForm.php:145
+msgid "Port"
+msgstr "Port"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:41
+#: application/forms/IcingaCommandArgumentForm.php:67
+msgid "Position"
+msgstr "Position"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:30
+msgid "Position Type"
+msgstr "Positionstyp"
+
+#: application/controllers/SchemaController.php:17
+msgid "PostgreSQL schema"
+msgstr "PostgreSQL Schema"
+
+#: application/forms/IcingaTimePeriodForm.php:76
+msgid "Prefer includes"
+msgstr "Includes bevorzugen"
+
+#: library/Director/Dashboard/BranchesDashboard.php:24
+msgid "Prepare your configuration in a safe Environment"
+msgstr "Bereite Konfiguration in einer geschützten Umgebung vor"
+
+#: library/Director/Dashboard/Dashlet/BasketDashlet.php:17
+msgid "Preserve specific configuration objects in a specific state"
+msgstr ""
+"Bestimmte Konfigurationsobjekte in einem bestimmten Zustand aufbewahren"
+
+#: library/Director/Web/Tabs/ImportsourceTabs.php:49
+#: library/Director/Web/Tabs/SyncRuleTabs.php:33
+#: library/Director/Web/Tabs/ObjectTabs.php:86
+msgid "Preview"
+msgstr "Vorschau"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:23
+msgid "Problem"
+msgstr "Problem"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:27
+msgid "Problem handling"
+msgstr "Problembehandlung"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:94
+msgid "Process List"
+msgstr "Prozessliste"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1452
+msgid "Process performance data"
+msgstr "Performancedaten verarbeiten"
+
+#: library/Director/Import/ImportSourceLdap.php:70
+#: library/Director/Web/Tabs/SyncRuleTabs.php:39
+#: application/controllers/DataController.php:328
+msgid "Properties"
+msgstr "Eigenschaften"
+
+#: library/Director/PropertyModifier/PropertyModifierGetPropertyFromOtherImportSource.php:61
+#: library/Director/Web/Table/PropertymodifierTable.php:129
+#: library/Director/Web/Table/PropertymodifierTable.php:132
+#: application/forms/ImportRowModifierForm.php:30
+msgid "Property"
+msgstr "Eigenschaft"
+
+#: application/controllers/ImportsourceController.php:251
+#, php-format
+msgid "Property modifiers: %s"
+msgstr "Eigenschaftsmodifikatoren: %s"
+
+#: library/Director/Web/Table/CoreApiFieldsTable.php:88
+msgid "Protected"
+msgstr "Geschützt"
+
+#: library/Director/Import/ImportSourceRestApi.php:128
+msgid "Protocol"
+msgstr "Protokoll"
+
+#: application/controllers/InspectController.php:89
+msgid "Prototypes (methods)"
+msgstr "Prototypen (Methoden)"
+
+#: library/Director/Dashboard/Dashlet/DatalistDashlet.php:11
+msgid "Provide Data Lists"
+msgstr "Datenlisten bereitstellen"
+
+#: library/Director/Dashboard/Dashlet/DatalistDashlet.php:17
+msgid "Provide data lists to make life easier for your users"
+msgstr "Datenlisten erleichtern Anwendern die Arbeit"
+
+#: library/Director/Dashboard/Dashlet/TimeperiodTemplateDashlet.php:18
+msgid "Provide templates for your TimePeriod objects."
+msgstr "Vorlagen für Benachrichtigungen bereitstellen."
+
+#: library/Director/Dashboard/Dashlet/UserTemplateDashlet.php:18
+msgid "Provide templates for your User objects."
+msgstr "Vorlagen für Benutzer-Objekte bereitstellen."
+
+#: library/Director/Dashboard/Dashlet/NotificationTemplateDashlet.php:18
+msgid "Provide templates for your notifications."
+msgstr "Vorlagen für Benachrichtigungen bereitstellen."
+
+#: library/Director/Import/ImportSourceRestApi.php:244
+msgid "Proxy"
+msgstr "Proxy"
+
+#: library/Director/Import/ImportSourceRestApi.php:260
+msgid "Proxy Address"
+msgstr "Proxyadresse"
+
+#: library/Director/Import/ImportSourceRestApi.php:278
+msgid "Proxy Password"
+msgstr "Proxykennwort"
+
+#: library/Director/Import/ImportSourceRestApi.php:268
+msgid "Proxy Username"
+msgstr "Proxybenutzer"
+
+#: application/forms/SyncRuleForm.php:70
+msgid "Purge"
+msgstr "Bereinigen"
+
+#: application/forms/SyncRuleForm.php:82
+msgid "Purge Action"
+msgstr "Aktion beim Bereinigen"
+
+#: library/Director/Web/Tabs/ObjectTabs.php:122
+msgid "Ranges"
+msgstr "Bereiche"
+
+#: application/forms/DeployConfigForm.php:32
+msgid "Re-deploy now"
+msgstr "Jetzt erneut ausrollen"
+
+#: application/forms/IcingaServiceForm.php:141
+msgid "Reactivate"
+msgstr "Reaktivieren"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:24
+msgid "Recovery"
+msgstr "Erholung"
+
+#: application/forms/IcingaGenerateApiKeyForm.php:22
+msgid "Regenerate Self Service API key"
+msgstr "Selbstbedienungs-API-Schlüssel neu generieren"
+
+#: application/forms/IcingaHostSelfServiceForm.php:56
+msgid "Register"
+msgstr "Registrieren"
+
+#: library/Director/Web/SelfService.php:62
+msgid "Registered Agent"
+msgstr "Registrierter Agent"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:34
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:32
+msgid "Regular Expression"
+msgstr "Regulärer Ausdruck"
+
+#: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:16
+msgid "Regular expression pattern to split the string (e.g. /\\s+/ or /[,;]/)"
+msgstr ""
+"Regulärer Ausdruck anhand dessen eine String aufgeteilt werden soll (z.B. /"
+"\\s+/ oder /[,;]/)"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:58
+msgid "Reject matching elements"
+msgstr "Übereinstimmende Elemente ablehnen"
+
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:17
+msgid "Reject or keep rows based on property value"
+msgstr "Die ganze Zeile abhängig vom Eigenschaftswert abweisen"
+
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:72
+msgid "Reject the whole row"
+msgstr "Verwerfe die ganze Zeile"
+
+#: application/forms/IcingaDependencyForm.php:268
+msgid "Related Objects"
+msgstr "Verwandte Objekte"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:532
+msgid "Remark"
+msgstr "Anmerkung"
+
+#: library/Director/Web/Table/IcingaServiceSetServiceTable.php:225
+msgid "Remove"
+msgstr "Entfernen"
+
+#: library/Director/Web/Table/IcingaServiceSetServiceTable.php:227
+#, php-format
+msgid "Remove \"%s\" from this host"
+msgstr "\"%s\" von diesem Host entfernen"
+
+#: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:524
+msgid "Remove this entry"
+msgstr "Diesen Eintrag entfernen"
+
+#: application/views/helpers/FormDataFilter.php:507
+msgid "Remove this part of your filter"
+msgstr "Diesen Teil des Filters entfernen"
+
+#: application/forms/DirectorDatafieldForm.php:96
+msgid "Rename related vars"
+msgstr "Zugehörige Variablen umbenennen"
+
+#: application/forms/IcingaCommandForm.php:86
+msgid "Render as string"
+msgstr "Als String rendern"
+
+#: application/controllers/ConfigController.php:72
+msgid "Render config"
+msgstr "Konfiguration erstellen"
+
+#: application/forms/IcingaCommandForm.php:77
+msgid "Render the command as a plain string instead of an array."
+msgstr "Rendere das Kommando als reinen String und nicht als Array."
+
+#: application/controllers/ConfigController.php:310
+msgid "Rendered file"
+msgstr "Erzeugte Datei"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:97
+#, php-format
+msgid "Rendered in %0.2fs, deployed in %0.2fs"
+msgstr "Erstellt in %0.2fs, ausgerollt in %0.2fs"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:539
+#: library/Director/Web/Widget/ActivityLogInfo.php:544
+msgid "Rendering"
+msgstr "Erstellen"
+
+#: application/forms/IcingaCommandArgumentForm.php:107
+msgid "Repeat key"
+msgstr "Schlüssel wiederholen"
+
+#: application/forms/SyncRuleForm.php:63
+msgid "Replace"
+msgstr "Ersetzen"
+
+#: library/Director/Web/Table/CoreApiFieldsTable.php:86
+#: library/Director/Web/Table/Dependency/DependencyInfoTable.php:38
+#: application/forms/IcingaCommandArgumentForm.php:124
+msgid "Required"
+msgstr "Benötigt"
+
+#: library/Director/Import/ImportSourceDirectorObject.php:90
+msgid "Resolved"
+msgstr "Aufgelöst"
+
+#: application/forms/RestoreBasketForm.php:58
+#: application/controllers/BasketController.php:208
+msgid "Restore"
+msgstr "Wiederherstellen"
+
+#: application/forms/RestoreObjectForm.php:17
+msgid "Restore former object"
+msgstr "Vorheriges Objekt wiederherstellen"
+
+#: application/forms/RestoreBasketForm.php:52
+msgid "Restore to this target Director DB"
+msgstr "In dieser Director-Ziel-DB wiederherstellen"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1380
+msgid "Retry interval"
+msgstr "Wiederholungsintervall"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1382
+msgid ""
+"Retry interval, will be applied after a state change unless the next hard "
+"state is reached"
+msgstr ""
+"Wiederholungsintervall, wird nach einem Statuswechsel verwendet, bis der "
+"nächste Hard Status erreicht wurde"
+
+#: library/Director/PropertyModifier/PropertyModifierMap.php:34
+msgid "Return lookup key unmodified"
+msgstr "Suchschlüssel unverändert zurück geben"
+
+#: library/Director/Web/Widget/InspectPackages.php:69
+msgid "Root Zone"
+msgstr "Rootzone"
+
+#: library/Director/Web/Table/SyncruleTable.php:45
+#: application/forms/SyncRuleForm.php:30
+msgid "Rule name"
+msgstr "Regelname"
+
+#: library/Director/Job/ImportJob.php:119
+msgid "Run all imports at once"
+msgstr "Alle Importe gleichzeitig ausführen"
+
+#: library/Director/Job/SyncJob.php:125
+msgid "Run all rules at once"
+msgstr "Alle Regeln gleichzeitig ausführen"
+
+#: library/Director/Job/ImportJob.php:92
+#: application/forms/KickstartForm.php:189
+msgid "Run import"
+msgstr "Import ausführen"
+
+#: application/forms/DirectorJobForm.php:46
+msgid "Run interval"
+msgstr "Laufintervall"
+
+#: application/forms/IcingaServiceForm.php:678
+msgid "Run on agent"
+msgstr "Auf Agent ausführen"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:76
+msgid "Running with systemd"
+msgstr "Läuft mit systemd"
+
+#: library/Director/Import/ImportSourceRestApi.php:251
+msgid "SOCKS5 proxy"
+msgstr "SOCKS5 Proxy"
+
+#: library/Director/Dashboard/Dashlet/JobDashlet.php:29
+msgid ""
+"Schedule and automate Import, Syncronization, Config Deployment, "
+"Housekeeping and more"
+msgstr ""
+"Import, Synchronisation, Ausrollen der Konfiguration, Bereinigung und mehr "
+"planen und automatisieren"
+
+#: library/Director/Dashboard/NotificationsDashboard.php:14
+#: library/Director/Dashboard/UsersDashboard.php:15
+msgid "Schedule your notifications"
+msgstr "Benachrichtigungen planen"
+
+#: library/Director/Dashboard/Dashlet/NotificationsDashlet.php:19
+msgid ""
+"Schedule your notifications. Define who should be notified, when, and for "
+"which kind of problem"
+msgstr ""
+"Benachrichtigungen planen. Wer soll wann benachrichtigt werden, wofür, und "
+"für welche Art von Problemen"
+
+#: application/forms/SyncRuleForm.php:23
+msgid "Scheduled Downtime"
+msgstr "Geplante Downtime"
+
+#: library/Director/Dashboard/Dashlet/ScheduledDowntimeApplyDashlet.php:13
+#: library/Director/Db/Branch/BranchModificationInspection.php:48
+msgid "Scheduled Downtimes"
+msgstr "Geplante Downtimes"
+
+#: application/forms/SettingsForm.php:177
+msgid ""
+"Script or tool to call when activating a new configuration stage. (e.g. "
+"sudo /usr/local/bin/icinga-director-activate) (name of the stage will be the "
+"argument for the script)"
+msgstr ""
+"Skript oder Tools welches beim Aktivieren einer neuen Konfigurationsphase "
+"ausgeführt werden soll. (z.B. sudo /usr/local/bin/icinga-director-activate) "
+"(der Name der Konfiguration wird dem Skript als Argument mitgegeben)"
+
+#: application/controllers/SettingsController.php:43
+#: application/controllers/SelfServiceController.php:107
+msgid "Self Service"
+msgstr "Selbstbedienung"
+
+#: application/controllers/SelfServiceController.php:108
+msgid "Self Service - Host Registration"
+msgstr "Selbstbedienung - Host-Registrierung"
+
+#: library/Director/Dashboard/Dashlet/SelfServiceDashlet.php:11
+#: library/Director/Web/SelfService.php:180
+msgid "Self Service API"
+msgstr "Selbstbedienungs-API"
+
+#: application/controllers/SettingsController.php:44
+msgid "Self Service API - Global Settings"
+msgstr "Selbstbedienungs-API - Globale Einstellungen"
+
+#: application/forms/SelfServiceSettingsForm.php:298
+msgid "Self Service Settings have been stored"
+msgstr "Selbstbedienungseinstellungen wurden gespeichert"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1440
+#: application/forms/IcingaUserForm.php:89
+msgid "Send notifications"
+msgstr "Benachrichtigungen senden"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:78
+msgid "Sent to"
+msgstr "Senden an"
+
+#: library/Director/TranslationDummy.php:14
+#: application/forms/IcingaServiceVarForm.php:15
+#: application/forms/IcingaAddServiceForm.php:104
+#: application/forms/SyncRuleForm.php:14
+msgid "Service"
+msgstr "Service"
+
+#: library/Director/Dashboard/Dashlet/ServiceApplyRulesDashlet.php:11
+msgid "Service Apply Rules"
+msgstr "Service Apply-Regeln"
+
+#: application/forms/SyncRuleForm.php:15
+msgid "Service Group"
+msgstr "Servicegruppe"
+
+#: library/Director/Dashboard/Dashlet/ServiceGroupsDashlet.php:11
+#: application/forms/BasketForm.php:23
+msgid "Service Groups"
+msgstr "Servicegruppen"
+
+#: library/Director/Web/Table/ObjectsTableService.php:107
+msgid "Service Name"
+msgstr "Servicename"
+
+#: library/Director/DataType/DataTypeDirectorObject.php:61
+#: application/forms/SyncRuleForm.php:16
+msgid "Service Set"
+msgstr "Service-Set"
+
+#: application/forms/RemoveLinkForm.php:55
+msgid "Service Set has been removed"
+msgstr "Service-Set wurde entfernt"
+
+#: library/Director/Dashboard/Dashlet/ServiceSetsDashlet.php:11
+#: library/Director/Web/Table/CustomvarVariantsTable.php:60
+#: library/Director/Web/Table/CustomvarTable.php:45
+#: application/forms/BasketForm.php:26
+msgid "Service Sets"
+msgstr "Service-Sets"
+
+#: application/forms/IcingaAddServiceForm.php:89
+msgid "Service Template"
+msgstr "Service-Vorlage"
+
+#: application/forms/BasketForm.php:24
+msgid "Service Template Choice"
+msgstr "Auswahlmöglichkeit für Service-Vorlagen"
+
+#: library/Director/Dashboard/Dashlet/ServiceTemplatesDashlet.php:11
+#: application/forms/BasketForm.php:25
+msgid "Service Templates"
+msgstr "Service-Vorlagen"
+
+#: application/forms/SelfServiceSettingsForm.php:179
+msgid "Service User"
+msgstr "Dienst-Benutzeraccount"
+
+#: library/Director/DataType/DataTypeDirectorObject.php:60
+msgid "Service groups"
+msgstr "Servicegruppen"
+
+#: application/forms/IcingaServiceForm.php:653
+msgid ""
+"Service groups that should be directly assigned to this service. "
+"Servicegroups can be useful for various reasons. They are helpful to "
+"provided service-type specific view in Icinga Web 2, either for custom "
+"dashboards or as an instrument to enforce restrictions. Service groups can "
+"be directly assigned to single services or to service templates."
+msgstr ""
+"Servicegruppen, die diesem Service direkt zugeordnet werden sollen. "
+"Servicegruppen können für diverse Anwendungen praktisch sein, wie auf "
+"Service-Typ eingeschränkte Ansichten in Icinga Web 2, für benutzerdefinierte "
+"Dashboards oder zum Umsetzen von Einschränkungen. Servicegruppen können "
+"direkt einem einzelnen Service zugeordnet werden oder Service-Vorlagen."
+
+#: library/Director/Web/Table/IcingaHostAppliedForServiceTable.php:102
+msgid "Service name"
+msgstr "Servicename"
+
+#: library/Director/Objects/IcingaService.php:755
+#: application/controllers/SuggestController.php:260
+msgid "Service properties"
+msgstr "Service-Eigenschaften"
+
+#: application/forms/IcingaServiceSetForm.php:87
+#: application/forms/IcingaAddServiceSetForm.php:86
+msgid "Service set"
+msgstr "Service-Set"
+
+#: application/forms/IcingaServiceSetForm.php:28
+msgid "Service set name"
+msgstr "Service-Set Name"
+
+#: application/controllers/TemplatechoiceController.php:25
+msgid "Service template choice"
+msgstr "Auswahlmöglichkeite für Service-Vorlagen"
+
+#: application/controllers/TemplatechoicesController.php:24
+msgid "Service template choices"
+msgstr "Auswahlmöglichkeiten für Service-Vorlagen"
+
+#: application/controllers/ServiceController.php:301
+msgid "ServiceSet"
+msgstr "Service-Set"
+
+#: application/forms/IcingaServiceGroupForm.php:14
+msgid "Servicegroup"
+msgstr "Servicegruppe"
+
+#: library/Director/Db/Branch/BranchModificationInspection.php:41
+msgid "Servicegroups"
+msgstr "Servicegruppen"
+
+#: library/Director/Web/Table/IcingaAppliedServiceTable.php:32
+#: library/Director/Web/Table/ObjectsTableService.php:103
+#: library/Director/Web/Table/IcingaServiceSetServiceTable.php:168
+msgid "Servicename"
+msgstr "Servicename"
+
+#: configuration.php:157
+#: library/Director/IcingaConfig/StateFilterSet.php:23
+#: library/Director/DataType/DataTypeDirectorObject.php:59
+#: library/Director/DataType/DataTypeDictionary.php:60
+#: library/Director/Db/Branch/BranchModificationInspection.php:40
+#: library/Director/Web/Table/CustomvarVariantsTable.php:59
+#: library/Director/Web/Table/CustomvarTable.php:44
+#: library/Director/Web/Tabs/ObjectTabs.php:75
+#: application/forms/IcingaNotificationForm.php:90
+#: application/forms/IcingaDependencyForm.php:101
+#: application/forms/IcingaScheduledDowntimeForm.php:90
+#: application/controllers/ServiceController.php:284
+#: application/controllers/ServiceController.php:305
+msgid "Services"
+msgstr "Services"
+
+#: application/controllers/ServicesetController.php:64
+#, php-format
+msgid "Services in this set: %s"
+msgstr "Services in diesem Set: %s"
+
+#: application/controllers/HostController.php:286
+#, php-format
+msgid "Services on %s"
+msgstr "Services auf %s"
+
+#: application/controllers/HostController.php:206
+#, php-format
+msgid "Services: %s"
+msgstr "Services: %s"
+
+#: library/Director/Db/Branch/BranchModificationInspection.php:42
+msgid "Servicesets"
+msgstr "Service-Sets"
+
+#: application/forms/SyncPropertyForm.php:84
+msgid "Set based on filter"
+msgstr "Basierend auf Filter setzen"
+
+#: library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:44
+msgid "Set false"
+msgstr "Auf \"false\" setzen"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:30
+#: library/Director/PropertyModifier/PropertyModifierGetHostByAddr.php:17
+#: library/Director/PropertyModifier/PropertyModifierParseURL.php:39
+#: library/Director/PropertyModifier/PropertyModifierJsonDecode.php:25
+#: library/Director/PropertyModifier/PropertyModifierDnsRecords.php:34
+#: library/Director/PropertyModifier/PropertyModifierGetHostByName.php:17
+msgid "Set no value (null)"
+msgstr "Keinen Wert setzen (null)"
+
+#: library/Director/PropertyModifier/PropertyModifierMap.php:33
+#: library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:42
+msgid "Set null"
+msgstr "Auf \"null\" setzen"
+
+#: library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:43
+msgid "Set true"
+msgstr "Auf \"true\" setzen"
+
+#: library/Director/Web/Tabs/ObjectsTabs.php:81
+msgid "Sets"
+msgstr "Sets"
+
+#: application/forms/IcingaHostForm.php:116
+msgid ""
+"Setting a command endpoint allows you to force host checks to be executed by "
+"a specific endpoint. Please carefully study the related Icinga documentation "
+"before using this feature"
+msgstr ""
+"Das Setzen eines Kommandoenpunkts erlaubt das Ausführen von Host-Checks auf "
+"einem bestimmten Endpoint. Bitte nicht verwenden, ohne die entsprechende "
+"Icinga-Dokumentation gelesen zu haben"
+
+#: library/Director/Web/SelfService.php:97
+#: application/controllers/ConfigController.php:240
+msgid "Settings"
+msgstr "Einstellungen"
+
+#: application/forms/SettingsForm.php:230
+msgid "Settings have been stored"
+msgstr "Einstellungen wurden gespeichert"
+
+#: library/Director/Web/SelfService.php:90
+msgid "Share this Template for Self Service API"
+msgstr "Für die Selbstbedienungs-API freigeben"
+
+#: library/Director/Web/SelfService.php:88
+msgid "Shared for Self Service API"
+msgstr "Für die Selbstbedienungs-API freigegeben"
+
+#: library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:21
+msgid "Should all the other characters be lowercased first?"
+msgstr ""
+"Sollen alle anderen Zeichen zuvor in Kleinbuchstaben umgewandelt werden?"
+
+#: application/controllers/HostController.php:597
+msgid "Show"
+msgstr "Zeigen"
+
+#: application/controllers/BasketController.php:202
+msgid "Show Basket"
+msgstr "Basket anzeigen"
+
+#: application/forms/DeployFormsBug7530.php:101
+#, php-format
+msgid "Show Issue %s on GitHub"
+msgstr "Issue %s auf GitHub anzeigen"
+
+#: library/Director/Web/Widget/AdditionalTableActions.php:75
+msgid "Show SQL"
+msgstr "SQL anzeigen"
+
+#: library/Director/Web/Table/ApplyRulesTable.php:151
+msgid "Show affected Objects"
+msgstr "Betroffene Objekte zeigen"
+
+#: library/Director/Web/Widget/SyncRunDetails.php:97
+msgid "Show all actions"
+msgstr "Alle Aktionen anzeigen"
+
+#: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:501
+msgid "Show available options"
+msgstr "Verfügbare Optionen anzeigen"
+
+#: application/forms/IcingaObjectFieldForm.php:183
+msgid "Show based on filter"
+msgstr "Basierend auf Filter zeigen"
+
+#: library/Director/Web/Table/BranchActivityTable.php:86
+#: library/Director/Web/Table/ActivityLogTable.php:230
+msgid "Show details related to this change"
+msgstr "Details zu dieser Änderung zeigen"
+
+#: library/Director/Web/ObjectPreview.php:52
+msgid "Show normal"
+msgstr "Normal anzeigen"
+
+#: library/Director/Web/ObjectPreview.php:61
+msgid "Show resolved"
+msgstr "Aufgelöst anzeigen"
+
+#: library/Director/Web/Widget/BranchedObjectsHint.php:23
+#, php-format
+msgid ""
+"Showing a branched view, with potential changes being visible only in this %s"
+msgstr ""
+"Zeige eine abgezweigte Ansicht, mit potentiell nur in diesem %s sichtbaren "
+"Änderungen"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:33
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:31
+msgid "Simple match with wildcards (*)"
+msgstr "Einfache Suche mit Platzhaltern (*)"
+
+#: application/controllers/BasketController.php:343
+msgid "Single Object Diff"
+msgstr "Einfacher Objekt-Diff"
+
+#: library/Director/Dashboard/Dashlet/SingleServicesDashlet.php:11
+msgid "Single Services"
+msgstr "Einzelne Services"
+
+#: library/Director/Web/Table/GeneratedConfigFileTable.php:86
+msgid "Size"
+msgstr "Größe"
+
+#: application/forms/IcingaCommandArgumentForm.php:115
+msgid "Skip key"
+msgstr "Schlüssel überspringen"
+
+#: library/Director/PropertyModifier/PropertyModifierSkipDuplicates.php:13
+msgid "Skip row if this value appears more than once"
+msgstr "Zeile überspringen wenn dieser Wert mehr als einmal vorkommt"
+
+#: application/controllers/BasketController.php:249
+#: application/controllers/BasketController.php:373
+msgid "Snapshot"
+msgstr "Snapshot"
+
+#: library/Director/Web/Table/BasketTable.php:32
+#: application/controllers/BasketController.php:40
+#: application/controllers/BasketController.php:143
+msgid "Snapshots"
+msgstr "Snapshots"
+
+#: library/Director/Import/ImportSourceRestApi.php:194
+msgid "Something like https://api.example.com/rest/v2/objects"
+msgstr "So etwas wie https://api.example.com/rest/v2/objects"
+
+#: application/forms/SyncPropertyForm.php:183
+msgid "Source Column"
+msgstr "Quellspalte"
+
+#: application/forms/SyncPropertyForm.php:213
+msgid "Source Expression"
+msgstr "Quellausdruck"
+
+#: application/forms/SyncPropertyForm.php:38
+msgid "Source Name"
+msgstr "Quellenname"
+
+#: application/forms/SelfServiceSettingsForm.php:114
+msgid "Source Path"
+msgstr "Quellpfad"
+
+#: application/forms/ImportSourceForm.php:33
+msgid "Source Type"
+msgstr "Quellentyp"
+
+#: application/forms/SyncPropertyForm.php:160
+msgid "Source columns"
+msgstr "Quellspalten"
+
+#: library/Director/Web/Table/SyncpropertyTable.php:62
+msgid "Source field"
+msgstr "Quellenfeld"
+
+#: library/Director/Web/Table/ImportrunTable.php:30
+#: library/Director/Web/Table/ImportsourceTable.php:18
+#: library/Director/Web/Table/SyncpropertyTable.php:61
+msgid "Source name"
+msgstr "Quellenname"
+
+#: application/forms/SyncPropertyForm.php:356
+msgid "Special properties"
+msgstr "Spezielle Eigenschaften"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:36
+msgid "Specific Element (by key name)"
+msgstr "Spezifisches Element (nach Schlüsselname)"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:35
+msgid "Specific Element (by position)"
+msgstr "Spezifisches Element (nach Position)"
+
+#: library/Director/Import/ImportSourceRestApi.php:152
+msgid ""
+"Specify headers in text format \"Header: Value\", each header on a new line."
+msgstr ""
+"Header im Textformat angeben \"Header: Wert\", jeden Header auf einer Zeile."
+
+#: library/Director/PropertyModifier/PropertyModifierTrim.php:30
+msgid ""
+"Specify the characters that trim should remove.Default is: \" "
+"\\t\\n\\r\\0\\x0B\""
+msgstr ""
+"Zeichen welche von Trim entfernt werden sollen. Standard: \" "
+"\\t\\n\\r\\0\\x0B\""
+
+#: library/Director/Web/Widget/DeploymentInfo.php:87
+msgid "Stage name"
+msgstr "Phasenname"
+
+#: library/Director/Web/Widget/InspectPackages.php:50
+#, php-format
+msgid "Stages in Package: %s"
+msgstr "Phasen in Paket: %s"
+
+#: library/Director/Web/Widget/SyncRunDetails.php:28
+msgid "Start time"
+msgstr "Startzeit"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:88
+msgid "Startup"
+msgstr "Start"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:162
+msgid "Startup Log"
+msgstr "Start-Log"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:72
+msgid "Startup Time"
+msgstr "Startzeit"
+
+#: library/Director/Web/Table/CoreApiFieldsTable.php:84
+msgid "State"
+msgstr "Zustand"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1688
+msgid "State and transition type filters"
+msgstr "Status- und Übergangstypen-Filter"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:22
+msgid "State changes"
+msgstr "Zustandsänderungen"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1663
+msgid "States"
+msgstr "Zustände"
+
+#: library/Director/Web/Widget/DeployedConfigInfoHeader.php:91
+msgid "Statistics"
+msgstr "Statistiken"
+
+#: application/controllers/InspectController.php:42
+#: application/controllers/InspectController.php:143
+msgid "Status"
+msgstr "Zustand"
+
+#: library/Director/Web/SelfService.php:127
+msgid "Stop sharing this Template"
+msgstr "Diese Vorlage nicht mehr bereitstellen"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:508
+#: application/forms/SettingsForm.php:139
+msgid "Store"
+msgstr "Speichern"
+
+#: application/forms/KickstartForm.php:36
+msgid "Store configuration"
+msgstr "Konfiguration speichern"
+
+#: library/Director/DataType/DataTypeDatalist.php:152
+msgid "Strict, list values only"
+msgstr "Strikt, nur Listeneinträge"
+
+#: library/Director/DataType/DataTypeDirectorObject.php:79
+#: library/Director/DataType/DataTypeSqlQuery.php:76
+#: library/Director/DataType/DataTypeDatalist.php:132
+#: application/forms/IcingaCommandArgumentForm.php:38
+#: application/forms/IcingaCommandArgumentForm.php:77
+msgid "String"
+msgstr "Zeichenkette"
+
+#: application/views/helpers/FormDataFilter.php:534
+msgid "Strip this operator, preserve child nodes"
+msgstr "Diesen Operator entfernen, Kind-Knoten beibehalten"
+
+#: library/Director/Web/Form/QuickForm.php:221
+msgid "Submit"
+msgstr "Absenden"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:139
+msgid "Succeeded"
+msgstr "Gelungen"
+
+#: application/forms/IcingaObjectFieldForm.php:94
+msgid "Suggested fields"
+msgstr "Vorgeschlagene Felder"
+
+#: library/Director/Web/ActionBar/TemplateActionBar.php:37
+msgid "Switch to Table view"
+msgstr "Zur Tabellenansicht wechseln"
+
+#: library/Director/Web/ActionBar/TemplateActionBar.php:36
+msgid "Switch to Tree view"
+msgstr "Zur Baumansicht wechseln"
+
+#: application/controllers/SyncruleController.php:621
+#, php-format
+msgid "Sync \"%s\": %s"
+msgstr "\"%s\": \"%s\" synchronisieren"
+
+#: application/controllers/BranchController.php:45
+#: application/controllers/SyncruleController.php:203
+msgid "Sync Preview"
+msgstr "Synchronisationsvorschau"
+
+#: application/controllers/SyncruleController.php:155
+msgid "Sync Properties"
+msgstr "Synchronisationseigenschaften"
+
+#: application/forms/BasketForm.php:36
+msgid "Sync Rules"
+msgstr "Synchronisationsregeln"
+
+#: application/controllers/SyncruleController.php:653
+msgid "Sync history"
+msgstr "Synchronisationshistorie"
+
+#: application/forms/SyncRuleForm.php:98
+#, php-format
+msgid ""
+"Sync only part of your imported objects with this rule. Icinga Web 2 filter "
+"syntax is allowed, so this could look as follows: %s"
+msgstr ""
+"Nur einen Teil der importierten Objekte mit dieser Regel synchronisieren. "
+"Die Icinga Web 2 Filter Syntax kann verwendet werden. z.B: %s"
+
+#: application/controllers/SyncruleController.php:585
+msgid "Sync properties"
+msgstr "Synchronisationseigenschaften"
+
+#: library/Director/Web/Tabs/SyncRuleTabs.php:29
+#: library/Director/Web/Tabs/SyncRuleTabs.php:50
+#: library/Director/Web/Tabs/ImportTabs.php:23
+#: application/controllers/SyncrulesController.php:25
+#: application/controllers/SyncruleController.php:544
+msgid "Sync rule"
+msgstr "Synchronisationsregel"
+
+#: application/controllers/SyncruleController.php:55
+#: application/controllers/SyncruleController.php:509
+#, php-format
+msgid "Sync rule: %s"
+msgstr "Synchronisationsregel: %s"
+
+#: application/forms/SyncRunForm.php:35
+#, php-format
+msgid "Sync to Branch: %s"
+msgstr ""
+"In Branch s\n"
+"ynchronisieren: %s"
+
+#: application/controllers/SyncruleController.php:63
+msgid "Synchronization failed"
+msgstr "Synchronisation fehlgeschlagen"
+
+#: library/Director/Job/SyncJob.php:80
+msgid "Synchronization rule"
+msgstr "Synchronisationsregel"
+
+#: library/Director/Dashboard/Dashlet/SyncDashlet.php:14
+msgid "Synchronize"
+msgstr "Synchronisieren"
+
+#: application/controllers/SyncruleController.php:128
+#, php-format
+msgid "Synchronizing '%s'"
+msgstr "'%s' synchronisieren"
+
+#: library/Director/Web/ActionBar/TemplateActionBar.php:30
+msgid "Table"
+msgstr "Tabelle"
+
+#: application/forms/RestoreBasketForm.php:51
+msgid "Target DB"
+msgstr "Ziel-DB"
+
+#: application/forms/IcingaCloneObjectForm.php:87
+msgid "Target Host"
+msgstr "Zielhost"
+
+#: application/forms/IcingaCloneObjectForm.php:78
+msgid "Target Service Set"
+msgstr "Ziel-Service-Set"
+
+#: library/Director/DataType/DataTypeDirectorObject.php:77
+#: library/Director/DataType/DataTypeSqlQuery.php:74
+#: library/Director/DataType/DataTypeDatalist.php:130
+msgid "Target data type"
+msgstr "Zieldatentyp"
+
+#: application/forms/ImportRowModifierForm.php:42
+msgid "Target property"
+msgstr "Zieleigenschaft"
+
+#: library/Director/DataType/DataTypeDictionary.php:86
+#: library/Director/Web/Form/DirectorObjectForm.php:1111
+#: library/Director/Web/Form/DirectorObjectForm.php:1115
+#: library/Director/Web/Controller/TemplateController.php:159
+msgid "Template"
+msgstr "Vorlage"
+
+#: library/Director/DataType/DataTypeDictionary.php:64
+msgid "Template (Object) Type"
+msgstr "Vorlagentyp (Objekt)"
+
+#: library/Director/Web/Table/TemplatesTable.php:52
+msgid "Template Name"
+msgstr "Vorlagenname"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:16
+msgid "Template name"
+msgstr "Vorlagenname"
+
+#: library/Director/Web/Controller/ObjectController.php:348
+#: library/Director/Web/Controller/TemplateController.php:116
+#, php-format
+msgid "Template: %s"
+msgstr "Vorlage: %s"
+
+#: library/Director/Import/ImportSourceDirectorObject.php:82
+#: library/Director/Web/Tree/TemplateTreeRenderer.php:43
+#: library/Director/Web/Table/DependencyTemplateUsageTable.php:10
+#: library/Director/Web/Table/NotificationTemplateUsageTable.php:10
+#: library/Director/Web/Table/HostTemplateUsageTable.php:10
+#: library/Director/Web/Table/TemplateUsageTable.php:23
+#: library/Director/Web/Table/ServiceTemplateUsageTable.php:10
+#: library/Director/Web/Tabs/ObjectsTabs.php:58
+#: application/forms/IcingaServiceForm.php:710
+msgid "Templates"
+msgstr "Vorlagen"
+
+#: application/forms/IcingaCloneObjectForm.php:32
+msgid "Templates cannot be cloned in Configuration Branches"
+msgstr "Vorlagen können in Konfigurationszweigen nicht geklont werden"
+
+#: application/forms/DeployFormsBug7530.php:116
+msgid "Thanks, I'll verify this and come back later"
+msgstr "Danke, ich überprüfe das und komme wieder"
+
+#: library/Director/Job/ImportJob.php:67
+msgid "The \"Import\" job allows to run import actions at regular intervals"
+msgstr ""
+"Der \"Import\" Auftrag erlaubt das Ausführen von Importen in regelmäßigen "
+"Abständen"
+
+#: library/Director/Job/SyncJob.php:65
+msgid "The \"Sync\" job allows to run sync actions at regular intervals"
+msgstr ""
+"Der \"Sync\" Auftrag erlaubt das Ausführen von Synchronisationen in "
+"regelmäßigen Abständen"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:661
+#: application/forms/IcingaTimePeriodRangeForm.php:84
+#: application/forms/IcingaScheduledDowntimeRangeForm.php:89
+#, php-format
+msgid "The %s has successfully been stored"
+msgstr "%s wurde erfolgreich gespeichert"
+
+#: library/Director/Job/ConfigJob.php:71
+msgid ""
+"The Config job allows you to generate and eventually deploy your Icinga 2 "
+"configuration"
+msgstr ""
+"Der Auftrag \"Konfiguration\" erlaubt das Erstellen und eventuelle Ausrollen "
+"der Icinga 2 Konfiguration"
+
+#: application/forms/IcingaUserForm.php:37
+msgid "The Email address of the user."
+msgstr "Die E-Mail-Adresse des Benutzers."
+
+#: library/Director/Job/HousekeepingJob.php:21
+msgid ""
+"The Housekeeping job provides various task that keep your Director database "
+"fast and clean"
+msgstr ""
+"Der \"Bereinigen\" Auftrag bietet verschiedene Aktionen, die die Director-"
+"Datenbank schnell und sauber halten"
+
+#: application/controllers/DaemonController.php:39
+#, php-format
+msgid ""
+"The Icinga Director Background Daemon is not running. Please check our %s in "
+"case you need step by step instructions showing you how to fix this."
+msgstr ""
+"Der Icinga Director Hintergrunddienst läuft nicht. Um eine Schritt-für-"
+"Schritt-Anleitung hierzu anzuzeigen bitte unsere %s zu Rate ziehen."
+
+#: application/controllers/SettingsController.php:38
+msgid ""
+"The Icinga Director Self Service API allows your Hosts to register "
+"themselves. This allows them to get their Icinga Agent configured, installed "
+"and upgraded in an automated way."
+msgstr ""
+"Die Icinga Director Selbstbedienungs-API erlaubt es Hosts sich selbst zu "
+"registrieren. Auf diese Weise wird deren Icinga-Agent konfiguriert, "
+"installiert und automatisch aktualisiert."
+
+#: application/forms/SettingsForm.php:45
+msgid ""
+"The Icinga Package name Director uses to deploy it's configuration. This "
+"defaults to \"director\" and should not be changed unless you really know "
+"what you're doing"
+msgstr ""
+"Der Icinga Package-Name welchen der Director zum Ausrollen seiner "
+"Konfiguration benutzt. Für gewöhnlich ist das \"director\" und sollte nur "
+"geändert werden, wenn die Auswirkung dieser Anpassung bewusst ist"
+
+#: library/Director/Import/ImportSourceLdap.php:72
+msgid ""
+"The LDAP properties that should be fetched. This is required to be a comma-"
+"separated list like: \"cn, dnshostname, operatingsystem, sAMAccountName\""
+msgstr ""
+"Die LDAP Eigenschaften, die geholt werden sollen. Muss eine Komma-separierte "
+"Liste sein, wie \"cn, dnshostname, operatingsystem, sAMAccountName\""
+
+#: application/forms/IcingaForgetApiKeyForm.php:31
+#, php-format
+msgid "The Self Service API key for %s has been dropped"
+msgstr "Der Selbstbedienungs-API-Schlüssel für %s wurde verworfen"
+
+#: application/forms/IcingaAddServiceSetForm.php:116
+#, php-format
+msgid "The Service Set \"%s\" has been added to %d hosts"
+msgstr "Das Service-Set \"%s\" wurde zu %d Hosts hinzugefügt"
+
+#: application/forms/IcingaCommandArgumentForm.php:173
+#, php-format
+msgid "The argument %s has successfully been stored"
+msgstr "Das Argument %s wurde erfolgreich gespeichert"
+
+#: application/forms/IcingaObjectFieldForm.php:129
+msgid "The caption which should be displayed"
+msgstr "Die Beschriftung, die angezeigt werden soll"
+
+#: application/forms/DirectorDatafieldForm.php:153
+msgid ""
+"The caption which should be displayed to your users when this field is shown"
+msgstr "Die Beschriftung welche Benutzern zu diesem Feld angezeigt werden soll"
+
+#: application/forms/IcingaDependencyForm.php:234
+msgid "The child host."
+msgstr "Der Kind-Host."
+
+#: application/forms/IcingaCommandForm.php:61
+msgid ""
+"The command Icinga should run. Absolute paths are accepted as provided, "
+"relative paths are prefixed with \"PluginDir + \", similar Constant prefixes "
+"are allowed. Spaces will lead to separation of command path and standalone "
+"arguments. Please note that this means that we do not support spaces in "
+"plugin names and paths right now."
+msgstr ""
+"Das Kommando, das Icinga ausführen soll. Absolute Pfade werden wie angegeben "
+"übernommen, relativen Pfaden wird ein \"PluginDir +\" vorangestellt, wobei "
+"ähnliche Konstanten als Prefix erlaubt sind. Leerzeichen können zur Teilung "
+"des Pfads zum Kommandos und eigenständigen Argumenten verwendet werden. Das "
+"bedeutet, das aktuell keine Leerzeichen in Plugin-Namen und Pfaden "
+"unterstützt werden."
+
+#: application/forms/KickstartForm.php:165
+msgid "The corresponding password"
+msgstr "Das entsprechende Passwort"
+
+#: library/Director/PropertyModifier/PropertyModifierStripDomain.php:14
+msgid "The domain name you want to be stripped"
+msgstr "Der Domänenname, der entfernt werden soll"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:18
+msgid "The first (leftmost) CN"
+msgstr "Der erste (linkeste) CN"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:19
+msgid "The first (leftmost) OU"
+msgstr "Die erste (linkeste) OU"
+
+#: library/Director/Web/Controller/ObjectController.php:718
+#: application/controllers/ConfigController.php:443
+#, php-format
+msgid "The following modifications are visible in this %s only..."
+msgstr "Die folgenden Änderungen sind nur in diesem %s sichtbar..."
+
+#: application/forms/IcingaServiceForm.php:767
+#, php-format
+msgid "The given properties have been stored for \"%s\""
+msgstr "Die übergebenen Eigenschaften wurden für \"%s\" gespeichert"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1666
+msgid "The host/service states you want to get notifications for"
+msgstr ""
+"Die Host/Service Status, für die Benachrichtigungen versandt werden sollen"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:21
+msgid "The last (rightmost) OU"
+msgstr "Die letzte (rechteste) OU"
+
+#: library/Director/Web/Widget/JobDetails.php:60
+#, php-format
+msgid "The last attempt failed %s: %s"
+msgstr "Der letzte Versuch schlug %s fehl: %s"
+
+#: library/Director/Web/Widget/JobDetails.php:55
+#, php-format
+msgid "The last attempt succeeded %s"
+msgstr "Der letzte Versuch war %s erfolgreich"
+
+#: library/Director/Dashboard/Dashlet/DeploymentDashlet.php:83
+msgid "The last deployment did not succeed"
+msgstr "Das letzte Ausrollen war nicht erfolgreich"
+
+#: library/Director/Dashboard/Dashlet/DeploymentDashlet.php:85
+msgid "The last deployment is currently pending"
+msgstr "Das Ausrollen der Konfiguration ist im Gange"
+
+#: application/forms/IcingaEndpointForm.php:42
+msgid "The log duration time."
+msgstr "Die Dauer der Aufzeichnungen."
+
+#: application/forms/IcingaUserForm.php:160
+msgid ""
+"The name of a time period which determines when notifications to this User "
+"should be triggered. Not set by default."
+msgstr ""
+"Der Name des Zeitraumes, der angibt, wann Benachrichtigungen für diesen "
+"Benutzer ausgelöst werden sollen. Kein Default-Wert."
+
+#: application/forms/IcingaNotificationForm.php:242
+#: application/forms/IcingaDependencyForm.php:143
+msgid ""
+"The name of a time period which determines when this notification should be "
+"triggered. Not set by default."
+msgstr ""
+"Der Name des Zeitraumes, der angibt, wann diese Benachrichtigung ausgelöst "
+"werden soll. Kein Default-Wert."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1418
+msgid ""
+"The name of a time period which determines when this object should be "
+"monitored. Not limited by default."
+msgstr ""
+"Der Name des Zeitraumes, der angibt, wann dieses Objekt überwacht wird. "
+"Standardmäßig nicht eingeschränkt."
+
+#: application/forms/DirectorJobForm.php:62
+msgid ""
+"The name of a time period within this job should be active. Supports only "
+"simple time periods (weekday and multiple time definitions)"
+msgstr ""
+"Der Name des Zeitraums innerhalb derer dieser Auftrag aktiv sein soll. "
+"Erlaubt nur einfache Zeiträume (Wochentag und mehrere Zeitangaben)"
+
+#: application/forms/IcingaHostVarForm.php:16
+msgid "The name of the host"
+msgstr "Der Name des Hosts"
+
+#: application/forms/IcingaServiceVarForm.php:16
+msgid "The name of the service"
+msgstr "Der Name des Service"
+
+#: application/forms/IcingaNotificationForm.php:178
+msgid ""
+"The notification interval (in seconds). This interval is used for active "
+"notifications. Defaults to 30 minutes. If set to 0, re-notifications are "
+"disabled."
+msgstr ""
+"Der Benachrichtigungsintervall (in Sekunden). Dieser Intervall wird für "
+"aktive Benachrichtigungen verwendet. Default-Wert ist 30 Minuten. Wird er "
+"auf 0 gesetzt, sind Benachrichtungswiederholungen deaktiviert."
+
+#: library/Director/PropertyModifier/PropertyModifierBitmask.php:16
+msgid ""
+"The numeric bitmask you want to apply. In case you have a hexadecimal or "
+"binary mask please transform it to a decimal number first. The result of "
+"this modifier is a boolean value, telling whether the given mask applies to "
+"the numeric value in your source column"
+msgstr ""
+"Die numerische Bitmaske welche angewandt werden soll. Hexadezimale und "
+"binäre Masken müssen zuvor in eine dezimale Zahl umgewandelt werden. Das "
+"Ergebnis ist ein boolescher Wert welcher angibt, ob die Maske auf den "
+"numerischen Wert in der Quellspalte zutrifft"
+
+#: application/forms/IcingaUserForm.php:42
+msgid "The pager address of the user."
+msgstr "Die Pageradresse des Benutzers."
+
+#: application/forms/IcingaDependencyForm.php:202
+msgid ""
+"The parent host. You might want to refer Host Custom Variables via $host."
+"vars.varname$"
+msgstr ""
+"Der Elternhost. Benutzerdefinierte Hosteigenschaften lassen sich via $host."
+"vars.varname$ referenzieren"
+
+#: library/Director/PropertyModifier/PropertyModifierRegexReplace.php:15
+msgid ""
+"The pattern you want to search for. This can be a regular expression like /"
+"^www\\d+\\./"
+msgstr ""
+"Das Muster, nach dem gesucht werden soll. Kann ein regulärer Ausdruck wie /"
+"^www\\d+\\./ sein"
+
+#: application/forms/IcingaEndpointForm.php:37
+msgid "The port of the endpoint."
+msgstr "Der Port des Endpunkts."
+
+#: application/forms/KickstartForm.php:148
+msgid ""
+"The port you are going to use. The default port 5665 will be used if none is "
+"set"
+msgstr ""
+"Der Port, der genutzt werden soll. Wird kein Wert gesetzt, gilt der Default-"
+"Wert 5665"
+
+#: library/Director/PropertyModifier/PropertyModifierGetPropertyFromOtherImportSource.php:64
+msgid "The property to get from the row we found in the chosen Import Source"
+msgstr ""
+"Die Eigenschaft welche wir aus der Zeile die wir in der gewählten "
+"Importquelle gefunden haben extrahieren wollen"
+
+#: application/forms/IcingaAddServiceForm.php:176
+#, php-format
+msgid "The service \"%s\" has been added to %d hosts"
+msgstr "Der Service \"%s\" wurde zu %d Hosts hinzugefügt"
+
+#: application/forms/IcingaAddServiceSetForm.php:88
+msgid "The service Set that should be assigned"
+msgstr "Das Service-Set welches zugewiesen werden soll"
+
+#: application/forms/IcingaServiceSetForm.php:89
+msgid "The service set that should be assigned to this host"
+msgstr "Das Service-Set welches diesem Host zugewiesen werden soll"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1676
+msgid "The state transition types you want to get notifications for"
+msgstr ""
+"Die Arten von Statusänderungen, für die Benachrichtigungen verschickt werden "
+"sollen"
+
+#: library/Director/PropertyModifier/PropertyModifierRegexReplace.php:23
+msgid "The string that should be used as a preplacement"
+msgstr "Die Zeichenkette, die als Ersatz genutzt werden soll"
+
+#: library/Director/PropertyModifier/PropertyModifierReplace.php:14
+msgid "The string you want to search for"
+msgstr "Die Zeichenkette, nach der gesucht werden soll"
+
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:56
+msgid ""
+"The string/pattern you want to search for, use regular expression like /"
+"^www\\d+\\./"
+msgstr ""
+"Das Muster, nach dem gesucht werden soll. Kann ein regulärer Ausdruck wie /"
+"^www\\d+\\./ sein"
+
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:46
+msgid ""
+"The string/pattern you want to search for, use wildcard matches like www.* "
+"or *linux*"
+msgstr ""
+"Das Muster, nach dem gesucht werden soll, Platzhalter wie www.* oder *linux* "
+"sind möglich"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:41
+msgid ""
+"The string/pattern you want to search for. Depends on the chosen method, use "
+"www.* or *linux* for wildcard matches and expression like /^www\\d+\\./ in "
+"case you opted for a regular expression"
+msgstr ""
+"Der String/das Muster nach dem gesucht werden soll. Abhängig von der "
+"gewählten Methode, benutze www.* oder *linux* für Platzhalter-basierte "
+"Suchen und Ausdrücken wie /^www\\d+\\./ falls Reguläre Ausdrücke bevorzugt "
+"wurden"
+
+#: application/forms/DirectorDatafieldCategoryForm.php:25
+msgid ""
+"The unique name of the category used for grouping your custom Data Fields."
+msgstr ""
+"Der eindeutige Kategoriebezeichner welcher zum Gruppieren der "
+"benutzerdefinierten Felder benutzt werden soll."
+
+#: application/forms/DirectorDatafieldForm.php:143
+msgid ""
+"The unique name of the field. This will be the name of the custom variable "
+"in the rendered Icinga configuration."
+msgstr ""
+"Der eindeutige Bezeichner dieses Feldes. Dieser wird als Name der "
+"benutzerdefinierten Eigenschaft in der gerenderten Icinga-Konfiguration "
+"benutzt."
+
+#: application/forms/SelfServiceSettingsForm.php:181
+msgid "The user that should run the Icinga 2 service on Windows."
+msgstr ""
+"Der Benutzeraccount unter welchem der Icinga-2-Dienst unter Windows laufen "
+"soll."
+
+#: application/forms/DirectorDatafieldForm.php:74
+#, php-format
+msgid ""
+"There are %d objects with a related property. Should I also remove the "
+"\"%s\" property from them?"
+msgstr ""
+"Es gibt %d Objekte mit einer entsprechenden Eigenschaft. Soll der Wert für "
+"\"%s\" von all diesen entfernt werden?"
+
+#: application/forms/DirectorDatafieldForm.php:118
+#, php-format
+msgid ""
+"There are %d objects with a related property. Should I also rename the "
+"\"%s\" property to \"%s\" on them?"
+msgstr ""
+"Es gibt %d Objekte mit einer entsprechenden Eigenschaft. Soll auf all diesen "
+"die Variable \"%s\" nach \"%s\" umbenannt werden?"
+
+#: application/forms/DeploymentLinkForm.php:66
+#, php-format
+msgid "There are %d pending changes"
+msgstr "Es gibt %d noch nicht ausgerollte Änderungen"
+
+#: application/forms/DeploymentLinkForm.php:79
+#, php-format
+msgid "There are %d pending changes, %d of them applied to this object"
+msgstr ""
+"Es sind %d Änderungen ausständig, wovon %d auf dieses Objekt angewendet "
+"werden"
+
+#: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:90
+#, php-format
+msgid "There are %d pending database migrations"
+msgstr "Es sind %d Datenbankmigrationen ausständig"
+
+#: application/forms/IcingaObjectFieldForm.php:117
+msgid ""
+"There are no data fields available. Please ask an administrator to create "
+"such"
+msgstr ""
+"Es sind keine Datenfelder verfügbar. Ein Administrator kann welche anlegen"
+
+#: library/Director/Dashboard/Dashlet/DeploymentDashlet.php:91
+msgid "There are no pending changes"
+msgstr "Es gibt keine anstehenden Änderungen"
+
+#: application/forms/DeployConfigForm.php:34
+msgid "There are no pending changes. Deploy anyway"
+msgstr "Es gibt keine anstehenden Änderungen. Dennoch ausrollen"
+
+#: library/Director/Web/Widget/ImportSourceDetails.php:52
+msgid ""
+"There are pending changes for this Import Source. You should trigger a new "
+"Import Run."
+msgstr ""
+"Es gibt ausstehende Änderungen für diese Importquelle. Ein neuer Importlauf "
+"sollte angestoßen werden."
+
+#: application/controllers/SyncruleController.php:108
+msgid ""
+"There are pending changes for this Sync Rule. You should trigger a new Sync "
+"Run."
+msgstr ""
+"Es gibt ausstehende Änderungen für diese Synchronisationsregel. Ein neuer "
+"Synchronisationslauf sollte angestoßen werden."
+
+#: application/forms/KickstartForm.php:66
+msgid "There are pending database migrations"
+msgstr "Es sind Datenbankmigrationen ausständig"
+
+#: application/forms/DeploymentLinkForm.php:71
+msgid ""
+"There has been a single change to this object, nothing else has been modified"
+msgstr ""
+"An diesem Objekt wurde eine einzelne Änderung vorgenommen. Nichts Anderes "
+"wurde verändert"
+
+#: application/forms/DeploymentLinkForm.php:74
+#, php-format
+msgid ""
+"There have been %d changes to this object, nothing else has been modified"
+msgstr ""
+"An diesem Objekt wurden %d Änderungen vorgenommen, nichts anderes wurde "
+"verändert"
+
+#: application/forms/DeploymentLinkForm.php:63
+msgid "There is a single pending change"
+msgstr "Es gibt eine einzelne ausstehende Änderung"
+
+#: application/forms/DirectorJobForm.php:21
+msgid "These are different available job types"
+msgstr "Verschiedene verfügbare Auftragstypen"
+
+#: application/forms/ImportSourceForm.php:37
+msgid ""
+"These are different data providers fetching data from various sources. You "
+"didn't find what you're looking for? Import sources are implemented as a "
+"hook in Director, so you might find (or write your own) Icinga Web 2 module "
+"fetching data from wherever you want"
+msgstr ""
+"Dies sind verschiedene Datenanbieter, die Daten von diversen Quellen holen. "
+"Falls der gesuchte Anbieter nicht dabei ist, kann ein weiteres (evtl. selbst "
+"geschriebenes) Icinga Web 2 Modul diese Funktionalität nachrüsten, da "
+"Importquellen als Hook in Director realisiert werden"
+
+#: application/controllers/CommandController.php:76
+#, php-format
+msgid "This Command is currently being used by %s"
+msgstr "Dieses Kommando wird gegenwärtig von %s benutzt"
+
+#: application/controllers/CommandController.php:82
+msgid "This Command is currently not in use"
+msgstr "Dieses Kommando wird gegenwärtig nicht benutzt"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:951
+#, php-format
+msgid "This Command is still in use by %d other objects"
+msgstr "Dieses Kommando wird von %d anderen Objekten benutzt"
+
+#: library/Director/Web/Widget/ImportSourceDetails.php:59
+#, php-format
+msgid "This Import Source failed when last checked at %s: %s"
+msgstr "Diese Importquelle schlug bei der letzten Prüfung um %s fehl: %s"
+
+#: library/Director/Web/Widget/ImportSourceDetails.php:67
+#, php-format
+msgid "This Import Source has an invalid state: %s"
+msgstr "Diese Importquelle hat einen ungültigen Zustand: %s"
+
+#: application/forms/ImportCheckForm.php:33
+msgid "This Import Source provides modified data"
+msgstr "Diese Importquelle stellt veränderte Daten zur Verfügung"
+
+#: library/Director/Web/Widget/ImportSourceDetails.php:42
+#, php-format
+msgid "This Import Source was last found to be in sync at %s."
+msgstr "Diese Importquelle war zuletzt um %s syncron."
+
+#: application/forms/IcingaServiceForm.php:136
+msgid "This Service has been deactivated on this host"
+msgstr "Dieser Service wurde auf diesem Host deaktiviert"
+
+#: application/controllers/SyncruleController.php:115
+#, php-format
+msgid "This Sync Rule failed when last checked at %s: %s"
+msgstr ""
+"Diese Synchronisationsregel schlug bei der letzten Prüfung um %s fehl: %s"
+
+#: application/controllers/SyncruleController.php:85
+msgid "This Sync Rule has never been run before."
+msgstr "Diese Synchronisationsregel wurde noch nie ausgeführt."
+
+#: application/controllers/SyncruleController.php:258
+msgid "This Sync Rule is in sync and would currently not apply any changes"
+msgstr ""
+"Diese Sync-Regel ist synchron und würde aktuell keine Änderungen verursachen"
+
+#: application/controllers/SyncruleController.php:97
+#, php-format
+msgid "This Sync Rule was last found to by in Sync at %s."
+msgstr "Diese Synchronisationsregel war zuletzt synchron um %s."
+
+#: application/forms/SyncPropertyForm.php:105
+msgid ""
+"This allows to filter for specific parts within the given source expression. "
+"You are allowed to refer all imported columns. Examples: host=www* would set "
+"this property only for rows imported with a host property starting with "
+"\"www\". Complex example: host=www*&!(address=127.*|address6=::1)"
+msgstr ""
+"Erlaubt das Filtern nach bestimmten Teilen innerhalb des angegebenen "
+"Quellausdrucks. Alle importierten Spalten können angegeben werden. "
+"Beispiele: host=www* würde diese Eigenschaft nur für importierte Zeilen "
+"setzen, bei denen die Host Eigenschaft mit \"www\" beginnt. Komplexes "
+"Beispiel: host=www*&!(address=127.*|address6=::1)"
+
+#: library/Director/DataType/DataTypeDatalist.php:147
+msgid "This allows to show either a drop-down list or an auto-completion"
+msgstr ""
+"Dies erlaubt es, entweder eine Ausklappmenü oder ein Feld mit automatischer "
+"Vervollständigung anzuzeigen"
+
+#: application/forms/DirectorJobForm.php:39
+msgid "This allows to temporarily disable this job"
+msgstr "Erlaubt das vorübergehende Deaktivieren dieses Auftrags"
+
+#: application/forms/IcingaHostGroupForm.php:30
+#: application/forms/IcingaNotificationForm.php:106
+#: application/forms/IcingaServiceGroupForm.php:30
+#: application/forms/IcingaServiceForm.php:476
+#: application/forms/IcingaDependencyForm.php:115
+#: application/forms/IcingaScheduledDowntimeForm.php:115
+msgid ""
+"This allows you to configure an assignment filter. Please feel free to "
+"combine as many nested operators as you want. The \"contains\" operator is "
+"valid for arrays only. Please use wildcards and the = (equals) operator when "
+"searching for partial string matches, like in *.example.com"
+msgstr ""
+"Hiermit lässt sich ein Zuweisungsfilter (assign) definieren. Dabei lassen "
+"sich beliebig viele Operatoren beliebig tief verschachtelt benutzen. Der "
+"Operator \"contains\" (\"enthält\") ist nur für Arrays zulässig. Um "
+"Teilstrings zu vergleichen bitte Jokerzeichen (wildcards) benutzen, wie in *."
+"example.com"
+
+#: application/forms/IcingaServiceSetForm.php:123
+msgid ""
+"This allows you to configure an assignment filter. Please feel free to "
+"combine as many nested operators as you want. You might also want to skip "
+"this, define it later and/or just add this set of services to single hosts. "
+"The \"contains\" operator is valid for arrays only. Please use wildcards and "
+"the = (equals) operator when searching for partial string matches, like in *."
+"example.com"
+msgstr ""
+"Hiermit lässt sich ein Zuweisungsfilter (assign) definieren. Dabei lassen "
+"sich beliebig viele Operatoren beliebig tief verschachtelt benutzen. Dieser "
+"Schritt lässt sich auch überspringen und eventuell später umsetzen. "
+"Alternativ (oder zusätzlich) kann dieses Service-Set einzelne Hosts direkt "
+"zugewiesen werden. Der Operator \"contains\" (\"enthält\") ist nur für "
+"Arrays zulässig. Um Teilstrings zu vergleichen bitte Jokerzeichen "
+"(wildcards) benutzen, wie in *.example.com"
+
+#: library/Director/Job/ConfigJob.php:47
+msgid "This allows you to immediately deploy a modified configuration"
+msgstr "Dies erlaubt das sofortige Ausrollen einer veränderten Konfiguration"
+
+#: library/Director/ProvidedHook/CubeLinks.php:37
+#: library/Director/ProvidedHook/IcingaDbCubeLinks.php:32
+#, php-format
+msgid "This allows you to modify properties for \"%s\""
+msgstr "Erlaubt das Ändern der Eigenschaften von \"%s\""
+
+#: library/Director/ProvidedHook/CubeLinks.php:54
+#: library/Director/ProvidedHook/IcingaDbCubeLinks.php:55
+msgid "This allows you to modify properties for all chosen hosts at once"
+msgstr ""
+"Hiermit lassen sich Eigenschaften für alle gewählten Hosts auf einmal ändern"
+
+#: application/controllers/BasketController.php:64
+msgid "This basket is empty"
+msgstr "Dieser Basket ist leer"
+
+#: application/forms/KickstartForm.php:230
+msgid "This has to be a MySQL or PostgreSQL database"
+msgstr "Muss eine MySQL oder PostgeSQL Datenbank sein"
+
+#: library/Director/Web/SelfService.php:65
+msgid ""
+"This host has been registered via the Icinga Director Self Service API. In "
+"case you re-installed the host or somehow lost it's secret key, you might "
+"want to dismiss the current key. This would allow you to register the same "
+"host again."
+msgstr ""
+"Dieser Host wurde über die Icinga Director Selbstbedienungs-API registriert. "
+"Falls der Host neu installiert wurde oder der Schlüssel anderweitig verloren "
+"ging, kann es erwünscht sein, den aktuellen Schlüssel zu verwerfen. Das "
+"würde es erlauben, denselben Host neu zu registrieren."
+
+#: application/controllers/InspectController.php:71
+msgid "This is an abstract object type."
+msgstr "Das ist ein abstrakter Objekttyp."
+
+#: application/forms/SelfServiceSettingsForm.php:45
+msgid ""
+"This is only important in case your master/satellite nodes do not have IP "
+"addresses as their \"host\" property. The Agent can be told to issue related "
+"DNS lookups on it' own"
+msgstr ""
+"Das ist nur wichtig wenn Master- oder Satellitenknoten keine IP als \"host\"-"
+"Eigenschaft gesetzt haben. Dem Agent kann angewiesen werden, eigenständig "
+"entsprechende DNS-Lookups eigenständig vorzunehmen"
+
+#: library/Director/Web/Controller/TemplateController.php:179
+#, php-format
+msgid "This is the \"%s\" %s Template. Based on this, you might want to:"
+msgstr "Das ist die \"%s\" %s Vorlage. Basierend auf diese, kann man:"
+
+#: application/forms/KickstartForm.php:123
+msgid ""
+"This is the name of the Endpoint object (and certificate name) you created "
+"for your ApiListener object. In case you are unsure what this means please "
+"make sure to read the documentation first"
+msgstr ""
+"Der Name (und Zertifikatsname) des Endpunkt-Objekts, der für das ApiListener-"
+"Objekt erstellt wurde. Bei Unklarheit, was damit gemeint ist, sollte die "
+"Dokumentation erneut zu Rate gezogen werden"
+
+#: library/Director/Dashboard/Dashlet/HostsDashlet.php:17
+msgid ""
+"This is where you add all your servers, containers, network or sensor "
+"devices - and much more. Every subject worth to be monitored"
+msgstr ""
+"Hier werden alle Server, Container, Netzwerk- oder Sensor-Geräte und vieles "
+"mehr hinzugefügt. Jede Komponente die es wert ist, überwacht zu werden"
+
+#: library/Director/Dashboard/HostsDashboard.php:22
+msgid ""
+"This is where you manage your Icinga 2 Host Checks. Host templates are your "
+"main building blocks. You can bundle them to \"choices\", allowing (or "
+"forcing) your users to choose among a given set of preconfigured templates."
+msgstr ""
+"Hier werden Icinga 2 Host-Checks verwaltet. Host-Vorlagen stellen die "
+"Hauptbausteine dar. Diese können in \"Auswahlmöglichkeiten\" gebündelt "
+"werden, um es eigenen Benutzern zu erlauben, aus einem definierten Set von "
+"Vorlagen zu wählen - oder dies gar zu erzwingen."
+
+#: library/Director/Dashboard/ServicesDashboard.php:24
+msgid ""
+"This is where you manage your Icinga 2 Service Checks. Service Templates are "
+"your base building blocks, Service Sets allow you to assign multiple "
+"Services at once. Apply Rules make it possible to assign Services based on "
+"Host properties. And the list of all single Service Objects gives you the "
+"possibility to still modify (or delete) many of them at once."
+msgstr ""
+"Hier werden Icinga 2 Service-Checks verwaltet. Service-Vorlagen stellen die "
+"Hauptbausteine dar, Service-Sets erlauben es mehrere Services gemeinsam "
+"zuzuweisen. Apply-Regeln ermöglichen es, Services basierend auf Host-"
+"Eigenschaften zuzuweisen. Und die Liste aller Einzel-Services erlaubt es, "
+"einzelne oder mehrere zugleich zu bearbeiten oder zu löschen."
+
+#: library/Director/Dashboard/UsersDashboard.php:21
+msgid ""
+"This is where you manage your Icinga 2 User (Contact) objects. Try to keep "
+"your User objects simply by movin complexity to your templates. Bundle your "
+"users in groups and build Notifications based on them. Running MS Active "
+"Directory or another central User inventory? Stay away from fiddling with "
+"manual config, try to automate all the things with Imports and related Sync "
+"Rules!"
+msgstr ""
+"Hier werden Icingga 2 Benutzer-Objekte (Kontakte) verwaltet. Es wird "
+"empfohlen Benutzerobjekte einfach zu halten, und Komplexität in die "
+"entsprechenden Vorlagen zu verschieben. Das Bündeln von Benutzern in Gruppen "
+"erlaubt auf selbige basierende Benachrichtigungen. Ist MS Active Directory "
+"oder ein anderes zentrales Benutzerverzeichnis vorhanden? Dann gilt es sich "
+"am Besten überhaupt nicht mit manueller Konfiguration abzumühen. Über die "
+"Import-Funktion und entsprechende Synchronisationsregeln lässt sich nahezu "
+"alles automatisieren!"
+
+#: library/Director/Dashboard/InfrastructureDashboard.php:39
+msgid ""
+"This is where you manage your Icinga 2 infrastructure. When adding a new "
+"Icinga Master or Satellite please re-run the Kickstart Helper once."
+msgstr ""
+"Hier wird die Icinga 2 Infrastruktur verwaltet. Den Kickstart-Helper beim "
+"Hinzufügen von neuen Icinga Mastern oder Satelliten bitte erneut ausführen."
+
+#: library/Director/Web/Table/ObjectsTableEndpoint.php:47
+msgid "This is your Config master and will receive our Deployments"
+msgstr ""
+"Dies ist der Konfigurations-Master zu welchem sämtliche Konfiguration "
+"ausgerollt wird"
+
+#: library/Director/Web/Widget/JobDetails.php:66
+msgid "This job has not been executed yet"
+msgstr "Dieser Auftrag wurde bisher nicht ausgeführt"
+
+#: library/Director/Web/Widget/JobDetails.php:36
+#, php-format
+msgid "This job runs every %ds and is currently pending"
+msgstr "Dieser Auftrag läuft alle %d und ist aktuell ausständig"
+
+#: library/Director/Web/Widget/JobDetails.php:40
+#, php-format
+msgid "This job runs every %ds."
+msgstr "Dieser Auftrag läuft alle %d."
+
+#: library/Director/Web/Widget/JobDetails.php:27
+#, php-format
+msgid ""
+"This job would run every %ds. It has been disabled and will therefore not be "
+"executed as scheduled"
+msgstr ""
+"Dieser Auftrag würde alle %d ausgeführt. Er ist deaktiviert und wird deshalb "
+"nicht wie geplant ausgeführt"
+
+#: library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:33
+msgid ""
+"This modifier transforms 0/\"0\"/false/\"false\"/\"n\"/\"no\" to false and "
+"1, \"1\", true, \"true\", \"y\" and \"yes\" to true, both in a case "
+"insensitive way. What should happen if the given value does not match any of "
+"those? You could return a null value, or default to false or true. You might "
+"also consider interrupting the whole import process as of invalid source data"
+msgstr ""
+"Dieser Modifikator verwandelt 0/\"0\"/false/\"false\"/\"n\"/\"no\" nach "
+"false und , \"1\", true, \"true\", \"y\" and \"yes\" nach true, jeweils "
+"unabhängig von Groß-/Kleinschreibung. Was soll passieren falls keiner dieser "
+"Fälle zutrifft? In diesem Fall lässt sich ein Null-Wert zurückgeben oder "
+"aber true oder false als Fallback nutzen. Alternativ kann man auch den "
+"komplette Importvorgang aufgrund ungültiger Daten fehlschlagen lassen"
+
+#: application/forms/ImportSourceForm.php:89
+msgid ""
+"This must be a column containing unique values like hostnames. Unless "
+"otherwise specified this will then be used as the object_name for the "
+"syncronized Icinga object. Especially when getting started with director "
+"please make sure to strictly follow this rule. Duplicate values for this "
+"column on different rows will trigger a failure, your import run will not "
+"succeed. Please pay attention when synching services, as \"purge\" will only "
+"work correctly with a key_column corresponding to host!name. Check the "
+"\"Combine\" property modifier in case your data source cannot provide such a "
+"field"
+msgstr ""
+"Muss eine Spalte sein, die eindeutige Werte wie Hostnamen enthält. Wenn "
+"nicht anders angegeben, wird dieser Wert dann als object_name für die "
+"synchronisierten Icinga Objekte verwendet. Insbesondere Benutzer mit wenig "
+"Erfahrung mit dem Director sollten sich unbedingt an diese Regel halten. "
+"Doppelte Werte in dieser Spalte erzeugen einen Fehler und der gesamte "
+"Importlauf schlägt fehl. Bitte beim Synchronisieren von Services Acht geben, "
+"\"bereinigen\" wird nur mit einer der host!name Syntax entsprechenden "
+"Schlüsselspalte funktionieren. Nutze den Eigenschaftsmodifikator "
+"\"Kombinieren\", falls die gegebenen Datenquelle keine solche Spalte "
+"bereitstellen kann"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:33
+msgid "This name will show up as the author for ever related downtime comment"
+msgstr ""
+"Der Name wird als Autor für sämtliche zugehörigen Downtime-Kommentare "
+"aufscheinen"
+
+#: library/Director/Web/Widget/BranchedObjectHint.php:57
+#, php-format
+msgid "This object has been created in %s"
+msgstr "Dieses Objekt wurde in %s erstellt"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:545
+msgid "This object has been disabled"
+msgstr "Dieses Objekt wurde deaktiviert"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:540
+msgid "This object has been enabled"
+msgstr "Dieses Objekt wurde aktiviert"
+
+#: library/Director/Web/Widget/BranchedObjectHint.php:62
+#, php-format
+msgid "This object has modifications visible only in %s"
+msgstr "Dieses Objekt hat Änderungen, welche nur in %s sichtbar sind"
+
+#: library/Director/Web/Widget/BranchedObjectHint.php:34
+#, php-format
+msgid ""
+"This object will be created in %s. It will not be part of any deployment "
+"unless being merged"
+msgstr ""
+"Das Objekt wird in %s erstellt. Es sind nicht Teil eines eventuellen "
+"Deployments, solange die Änderungen nicht zusammengeführt werden"
+
+#: library/Director/Web/ObjectPreview.php:75
+msgid "This object will not be deployed as it has been disabled"
+msgstr "Das Objekt wird nicht ausgerollt, da es deaktiviert wurde"
+
+#: library/Director/PropertyModifier/PropertyModifierCombine.php:17
+msgid ""
+"This pattern will be evaluated, and variables like ${some_column} will be "
+"filled accordingly. A typical use-case is generating unique service "
+"identifiers via ${host}!${service} in case your data source doesn't allow "
+"you to ship such. The chosen \"property\" has no effect here and will be "
+"ignored."
+msgstr ""
+"Dieses Muster wird ausgewertet, und Variablen wie ${eine_spalte} werden "
+"entsprechend befüllt. Ein typischer Anwendungsfall ist das Erstellen von "
+"eindeutigen Service-Bezeichnern via ${host}!${service} falls die Datenquelle "
+"einen solchen nicht bereitstellt. Die gewählte \"Eigenschaft\" hat hier "
+"keine Auswirkung und wird ignoriert."
+
+#: application/controllers/SyncruleController.php:219
+#, php-format
+msgid "This preview has been generated %s, please click %s to regenerate it"
+msgstr ""
+"Dieser Vorschau wurde %s generiert, zwecks Aktualisierung bitte %s klicken"
+
+#: library/Director/Web/SelfService.php:256
+msgid ""
+"This requires the Icinga Agent to be installed. It generates and signs it's "
+"certificate and it also generates a minimal icinga2.conf to get your agent "
+"connected to it's parents"
+msgstr ""
+"Hierfür muss der Icinga Agent installiert sein. Es erstellt und signiert "
+"sein Zertifikat und erstellt eine minimale icinga2.conf mit welcher der "
+"Agent zu den ihm übergeordneten Systemen verbunden wird"
+
+#: application/forms/IcingaServiceForm.php:403
+#, php-format
+msgid ""
+"This service belongs to the %s Service Set. Still, you might want to "
+"override the following properties for this host only."
+msgstr ""
+"Dieser Service gehört zum Service Set %s. Dennoch können die folgenden "
+"Eigenschaften nur für diesen speziellen Host geändert werden."
+
+#: application/forms/IcingaServiceForm.php:443
+#, php-format
+msgid ""
+"This service belongs to the service set \"%s\". Still, you might want to "
+"change the following properties for this host only."
+msgstr ""
+"Dieser Service gehört zum Set \"%s\". Dennoch können die folgenden "
+"Eigenschaften nur für diesen speziellen Host geändert werden."
+
+#: application/forms/IcingaServiceForm.php:384
+msgid ""
+"This service has been generated in an automated way, but still allows you to "
+"override the following properties in a safe way."
+msgstr ""
+"Dieser Service wurde durch einen Automatismus erstellt, erlaubt es aber "
+"dennoch die folgenden Eigenschaften auf sichere Weise zu überschreiben."
+
+#: application/forms/IcingaServiceForm.php:390
+#, php-format
+msgid ""
+"This service has been generated using the %s apply rule, assigned where %s"
+msgstr ""
+"Dieser Service wurde durch die Apply-Regel %s erstellt, und wird zugewiesen "
+"wo %s"
+
+#: application/forms/IcingaServiceForm.php:415
+#, php-format
+msgid ""
+"This service has been inherited from %s. Still, you might want to change the "
+"following properties for this host only."
+msgstr ""
+"Dieser Service wurde von %s geerbt. Dennoch können die folgenden "
+"Eigenschaften nur für diesen speziellen Host geändert werden."
+
+#: library/Director/Web/Table/IcingaServiceSetServiceTable.php:216
+#, php-format
+msgid "This set has been inherited from %s"
+msgstr "Dieses Set wurde von %s geerbt"
+
+#: library/Director/Dashboard/Dashlet/KickstartDashlet.php:17
+msgid ""
+"This synchronizes Icinga Director to your Icinga 2 infrastructure. A new run "
+"should be triggered on infrastructure changes"
+msgstr ""
+"Synchronisiert den Icinga Director mit der Icinga 2 Infrastruktur. Bei "
+"Änderungen an derselben sollte ein neuer Lauf angestoßen werden"
+
+#: library/Director/Web/Table/TemplateUsageTable.php:103
+msgid "This template is not in use"
+msgstr "Diese Vorlage ist nicht in Verwendung"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:941
+#, php-format
+msgid "This template is still in use by %d other objects"
+msgstr "Diese Vorlage ist noch in Verwendung durch %d andere Objekte"
+
+#: application/forms/IcingaTemplateChoiceForm.php:51
+msgid "This will be shown as a label for the given choice"
+msgstr "Dies wird als Bezeichner für diese Auswahlmöglichkeit angezeigt werden"
+
+#: application/forms/DirectorDatalistEntryForm.php:33
+msgid "This will be the visible caption for this entry"
+msgstr "Die sichtbare Bezeichnung für diesen Eintrag"
+
+#: library/Director/Web/SelfService.php:116
+msgid "This will invalidate the former key"
+msgstr "Das macht den vorherigen Schlüssel ungültig"
+
+#: library/Director/Web/SelfService.php:246
+msgid "Ticket"
+msgstr "Ticket"
+
+#: application/forms/SyncRuleForm.php:21
+msgid "Time Period"
+msgstr "Zeitraum"
+
+#: application/forms/BasketForm.php:32
+msgid "Time Periods"
+msgstr "Zeiträume"
+
+#: application/forms/IcingaUserForm.php:158
+#: application/forms/IcingaNotificationForm.php:240
+#: application/forms/DirectorJobForm.php:60
+#: application/forms/IcingaDependencyForm.php:141
+msgid "Time period"
+msgstr "Zeitraum"
+
+#: application/controllers/TimeperiodController.php:17
+#: application/controllers/ScheduledDowntimeController.php:24
+msgid "Time period ranges"
+msgstr "Zeiträume"
+
+#: application/forms/IcingaScheduledDowntimeRangeForm.php:56
+#, php-format
+msgid "Time range \"%s\" has been removed from %s"
+msgstr "Der Zeitraum \"%s\" wurden von \"%s\" entfernt"
+
+#: application/forms/SyncPropertyForm.php:321
+msgid "Time ranges"
+msgstr "Zeiträume"
+
+#: application/forms/IcingaCommandForm.php:69
+msgid "Timeout"
+msgstr "Timeout"
+
+#: library/Director/Dashboard/Dashlet/TimeperiodTemplateDashlet.php:13
+msgid "Timeperiod Templates"
+msgstr "Zeitraumvorlage"
+
+#: library/Director/Dashboard/Dashlet/TimeperiodObjectDashlet.php:16
+#: library/Director/Dashboard/Dashlet/TimeperiodsDashlet.php:13
+#: library/Director/Db/Branch/BranchModificationInspection.php:45
+#: library/Director/Web/Table/IcingaTimePeriodRangeTable.php:46
+#: library/Director/Web/Table/IcingaScheduledDowntimeRangeTable.php:52
+#: application/forms/IcingaScheduledDowntimeRangeForm.php:29
+msgid "Timeperiods"
+msgstr "Zeiträume"
+
+#: application/forms/IcingaTimePeriodRangeForm.php:28
+msgid "Timerperiods"
+msgstr "Zeiträume"
+
+#: library/Director/Web/Table/ImportrunTable.php:31
+msgid "Timestamp"
+msgstr "Zeitstempel"
+
+#: library/Director/DataType/DataTypeDictionary.php:28
+msgid "To be managed on objects only"
+msgstr "Kann nur auf Objekten verwaltet werden"
+
+#: application/forms/SelfServiceSettingsForm.php:59
+#: application/forms/SelfServiceSettingsForm.php:167
+msgid ""
+"To ensure downloaded packages are build by the Icinga Team and not "
+"compromised by third parties, you will be able to provide an array of SHA1 "
+"hashes here. In case you have defined any hashses, the module will not "
+"continue with updating / installing the Agent in case the SHA1 hash of the "
+"downloaded MSI package is not matching one of the provided hashes of this "
+"setting"
+msgstr ""
+"Um sicherzustellen, dass die heruntergeladenen Pakete vom Icinga-Team "
+"stammen und nicht von Dritten kompromittiert wurden, kann hier eine Liste "
+"von SHA1 Prüfsummen bereitgestellt werden. Falls hier ein oder mehrere "
+"solche Hash-Werte bereitgestellt werden, und das heruntergeladenen MSI-Paket "
+"keinem davon entspricht, wird das Powershell-Modul sich weigern mit Update "
+"oder Installation des Agenten fortzufahren"
+
+#: library/Director/Web/SelfService.php:221
+msgid "Top Down"
+msgstr "Top Down"
+
+#: library/Director/Web/Table/TemplateUsageTable.php:57
+msgid "Total"
+msgstr "Gesamt"
+
+#: application/forms/SelfServiceSettingsForm.php:31
+msgid "Transform Host Name"
+msgstr "Hostname transformieren"
+
+#: application/forms/SelfServiceSettingsForm.php:43
+msgid "Transform Parent Host to IP"
+msgstr "Elternhost in IP umwandeln"
+
+#: application/forms/SelfServiceSettingsForm.php:37
+msgid "Transform to lowercase"
+msgstr "In Kleinbuchstaben umwandeln"
+
+#: application/forms/SelfServiceSettingsForm.php:38
+msgid "Transform to uppercase"
+msgstr "In Großbuchstaben umwandeln"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1673
+msgid "Transition types"
+msgstr "Änderungsstypen"
+
+#: library/Director/Web/ActionBar/TemplateActionBar.php:30
+msgid "Tree"
+msgstr "Baum"
+
+#: application/forms/ImportRunForm.php:23
+msgid "Trigger Import Run"
+msgstr "Importlauf anstoßen"
+
+#: application/forms/SyncRunForm.php:37
+msgid "Trigger this Sync"
+msgstr "Diese Synchronisation anstoßen"
+
+#: application/forms/ImportRunForm.php:45
+msgid "Triggering this Import Source failed"
+msgstr "Anstoßen dieser Importquelle schlug fehl"
+
+#: library/Director/PropertyModifier/PropertyModifierTrim.php:16
+msgid "Trim Method"
+msgstr "Trim-Methode"
+
+#: library/Director/Dashboard/Dashlet/SettingsDashlet.php:17
+msgid "Tweak some global Director settings"
+msgstr "Einige globale Director-Einstellungen anpassen"
+
+#: library/Director/Web/Table/CoreApiFieldsTable.php:80
+#: library/Director/Web/Table/ObjectsTableEndpoint.php:22
+msgid "Type"
+msgstr "Typ"
+
+#: application/controllers/InspectController.php:82
+msgid "Type attributes"
+msgstr "Typ-Attribute"
+
+#: library/Director/PropertyModifier/PropertyModifierParseURL.php:27
+#: library/Director/PropertyModifier/PropertyModifierParseURL.php:28
+msgid "URL component"
+msgstr "URL- Komponente"
+
+#: library/Director/PropertyModifier/PropertyModifierUuidBinToHex.php:12
+msgid "UUID: from binary to hex"
+msgstr "UUID: binär in hexadezimal umwandeln"
+
+#: application/forms/DeployFormsBug7530.php:72
+msgid "Unable to detect your Icinga 2 Core version"
+msgstr "Die Icinga 2 Core-Version konnte nicht ermittelt werden"
+
+#: library/Director/DataType/DataTypeSqlQuery.php:27
+#: application/forms/SyncPropertyForm.php:168
+#, php-format
+msgid "Unable to fetch data: %s"
+msgstr "Daten konnten nicht geholt werden: %s"
+
+#: application/forms/IcingaHostForm.php:383
+msgid ""
+"Unable to store a host with the given properties because of insufficient "
+"permissions"
+msgstr ""
+"Ein Host konnte aufgrund unzureichender Berechtigungen nicht mit den "
+"gegebenen Eigenschaften abgespeichert werden"
+
+#: application/forms/KickstartForm.php:316
+#, php-format
+msgid ""
+"Unable to store the configuration to \"%s\". Please check file permissions "
+"or manually store the content shown below"
+msgstr ""
+"Die Konfiguration kann nicht nach \"%s\" gespeichert werden. Bitte "
+"Dateisystemberechtigungen prüfen oder den unten angegebenen Inhalt manuell "
+"speichern"
+
+#: library/Director/Db/Housekeeping.php:49
+msgid "Undeployed configurations"
+msgstr "Nicht ausgerollte Konfigurationen"
+
+#: application/forms/IcingaNotificationForm.php:221
+msgid ""
+"Unit is seconds unless a suffix is given. Supported suffixes include ms "
+"(milliseconds), s (seconds), m (minutes), h (hours) and d (days)."
+msgstr ""
+"Wie lang die Downtime dauert. Beeinflusst nur flexible (keine fixen) "
+"Downtimes. Zeit in Sekunden, unterstützt auch die Suffixes ms "
+"(Millisekunden), s (Sekunden), m (Minuten), h (Stunden) and d (Tage). Um "
+"\"90 Minuten\" auszudrücken könnte man 1h 30m schreiben."
+
+#: library/Director/IcingaConfig/StateFilterSet.php:27
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:136
+msgid "Unknown, failed to collect related information"
+msgstr "Unbekannt, entsprechende Information konnte nicht gesammelt werden"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:134
+msgid "Unknown, still waiting for config check outcome"
+msgstr "Unbekannt, warte auf Ergebnis der Konfigurationsprüfung"
+
+#: library/Director/Db/Housekeeping.php:53
+msgid "Unlinked imported properties"
+msgstr "Nicht-verknüpfte importierte Eigenschaften"
+
+#: library/Director/Db/Housekeeping.php:51
+msgid "Unlinked imported row sets"
+msgstr "Nicht-verknüpfte importierte Zeilensets"
+
+#: library/Director/Db/Housekeeping.php:52
+msgid "Unlinked imported rows"
+msgstr "Nicht-verknüpfte importierte Zeilen"
+
+#: application/controllers/PhperrorController.php:22
+#: application/controllers/PhperrorController.php:37
+msgid "Unsatisfied dependencies"
+msgstr "Unerfüllte Abhängigkeiten"
+
+#: library/Director/Db/Housekeeping.php:50
+msgid "Unused rendered files"
+msgstr "Nicht verwendete, generierte Dateien"
+
+#: library/Director/IcingaConfig/StateFilterSet.php:20
+msgid "Up"
+msgstr "Up"
+
+#: application/forms/IcingaTimePeriodForm.php:25
+msgid "Update Method"
+msgstr "Aktualisierungsmethode"
+
+#: application/forms/SyncRuleForm.php:52
+msgid "Update Policy"
+msgstr "Aktualisierungsrichtlinie"
+
+#: application/forms/SyncRuleForm.php:65
+msgid "Update only"
+msgstr "Nur aktualisieren"
+
+#: application/forms/DeployFormsBug7530.php:109
+msgid "Upgrading Icinga 2 - Confic Sync: Zones in Zones"
+msgstr "Upgrading Icinga 2 - Confic Sync: Zones in Zones"
+
+#: application/forms/DeployFormsBug7530.php:111
+msgid "Upgrading documentation"
+msgstr "Upgrading-Dokumentation"
+
+#: application/forms/BasketUploadForm.php:43
+#: application/controllers/BasketsController.php:26
+msgid "Upload"
+msgstr "Hochladen"
+
+#: application/controllers/BasketController.php:122
+msgid "Upload a Basket"
+msgstr "Basket hochladen"
+
+#: application/controllers/BasketController.php:123
+msgid "Upload a Configuration Basket"
+msgstr "Konfigurationsbasket hochladen"
+
+#: library/Director/Web/Controller/ObjectController.php:367
+msgid "Usage"
+msgstr "Benutzung"
+
+#: library/Director/Web/Widget/AdditionalTableActions.php:101
+#, php-format
+msgid "Usage (%s)"
+msgstr "Benutzung (%s)"
+
+#: application/forms/IcingaHostForm.php:106
+msgid ""
+"Use a different name for the generated endpoint object than the host name "
+"and add a custom variable to allow services setting the correct command "
+"endpoint."
+msgstr ""
+"Benutze einen anderen Bezeichner (als den Hostnamen) für das generierte "
+"Endpunktobjekt und füge eine benutzerdefinierte Variable hinzu, welche es "
+"Services erlaubt, den korrekten Commandendpunkt zu setzen."
+
+#: application/forms/SelfServiceSettingsForm.php:84
+msgid "Use a local file or network share"
+msgstr "Benutze eine lokales Verzeichnis oder eine Netzwerkfreigabe"
+
+#: library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:18
+msgid "Use lowercase first"
+msgstr "Erst in Kleinbuchstaben umwandeln"
+
+#: application/forms/SyncPropertyForm.php:273
+msgid "Used sources"
+msgstr "Verwendete Quellen"
+
+#: library/Director/TranslationDummy.php:17
+#: application/forms/SyncRuleForm.php:17
+msgid "User"
+msgstr "Benutzer"
+
+#: application/forms/SyncRuleForm.php:18
+msgid "User Group"
+msgstr "Benutzergruppe"
+
+#: library/Director/Dashboard/Dashlet/UserGroupsDashlet.php:11
+#: application/forms/BasketForm.php:27
+msgid "User Groups"
+msgstr "Benutzergruppen"
+
+#: library/Director/Dashboard/Dashlet/UserTemplateDashlet.php:13
+#: application/forms/BasketForm.php:28
+msgid "User Templates"
+msgstr "Benutzervorlagen"
+
+#: library/Director/DataType/DataTypeDirectorObject.php:63
+#: application/forms/IcingaNotificationForm.php:156
+msgid "User groups"
+msgstr "Benutzergruppen"
+
+#: application/forms/IcingaUserForm.php:113
+msgid ""
+"User groups that should be directly assigned to this user. Groups can be "
+"useful for various reasons. You might prefer to send notifications to groups "
+"instead of single users"
+msgstr ""
+"Benutzergruppen, die direkt diesem Benutzer zugeordnet werden sollen. "
+"Gruppen können für verschiedene Aufgaben verwendet werden. Eventuell ist es "
+"besser, Benachrichtigungen an Gruppen statt an einzelne Benutzer zu schicken"
+
+#: application/forms/IcingaNotificationForm.php:158
+msgid "User groups that should be notified by this notifications"
+msgstr ""
+"Benutzergruppen, die durch diese Benachrichtigungen verständigt werden sollen"
+
+#: application/forms/IcingaUserForm.php:194
+msgid "User properties"
+msgstr "Benutzereigenschaften"
+
+#: application/forms/IcingaUserForm.php:22
+msgid "User template name"
+msgstr "Benutzervorlagenname"
+
+#: application/forms/IcingaUserGroupForm.php:17
+msgid "Usergroup"
+msgstr "Benutzergruppe"
+
+#: library/Director/Db/Branch/BranchModificationInspection.php:44
+#: library/Director/Import/ImportSourceCoreApi.php:63
+msgid "Usergroups"
+msgstr "Benutzergruppen"
+
+#: library/Director/Import/ImportSourceRestApi.php:226
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:74
+#: application/forms/IcingaUserForm.php:28
+msgid "Username"
+msgstr "Benutzername"
+
+#: library/Director/DataType/DataTypeDirectorObject.php:62
+#: library/Director/Db/Branch/BranchModificationInspection.php:43
+#: library/Director/Import/ImportSourceCoreApi.php:62
+#: library/Director/Web/Table/CustomvarVariantsTable.php:62
+#: library/Director/Web/Table/CustomvarTable.php:47
+#: application/forms/IcingaNotificationForm.php:131
+#: application/forms/BasketForm.php:29
+msgid "Users"
+msgstr "Benutzer"
+
+#: library/Director/Dashboard/Dashlet/UserObjectDashlet.php:16
+#: library/Director/Dashboard/Dashlet/UsersDashlet.php:13
+msgid "Users / Contacts"
+msgstr "Benutzer / Kontakte"
+
+#: application/forms/IcingaNotificationForm.php:133
+msgid "Users that should be notified by this notifications"
+msgstr "Benutzer, die durch diese Benachrichtigungen verständigt werden sollen"
+
+#: library/Director/Dashboard/Dashlet/ServiceApplyRulesDashlet.php:17
+msgid ""
+"Using Apply Rules a Service can be applied to multiple hosts at once, based "
+"on filters dealing with any combination of their properties"
+msgstr ""
+"Mittels Apply-Regeln kann ein Service mehreren Hosts auf einmal zugewiesen "
+"werden, und zwar basierend auf Filtern welche einzelne oder mehrere "
+"Eigenschaften derselben kombinieren"
+
+#: application/forms/IcingaHostForm.php:336
+#: application/forms/IcingaHostSelfServiceForm.php:44
+msgid "Usually your hosts main IPv6 address"
+msgstr "Üblicherweise die Haupt-IPv6-Adresse des Hosts"
+
+#: library/Director/Web/Table/BranchedIcingaCommandArgumentTable.php:47
+#: library/Director/Web/Table/IcingaCommandArgumentTable.php:50
+#: application/forms/IcingaServiceVarForm.php:27
+#: application/forms/IcingaCommandArgumentForm.php:50
+#: application/forms/IcingaCommandArgumentForm.php:59
+#: application/forms/CustomvarForm.php:21
+#: application/forms/IcingaHostVarForm.php:27
+msgid "Value"
+msgstr "Wert"
+
+#: application/forms/IcingaCommandArgumentForm.php:36
+msgid "Value type"
+msgstr "Werttyp"
+
+#: library/Director/Web/Table/CustomvarVariantsTable.php:56
+msgid "Variable Value"
+msgstr "Variablenwert"
+
+#: library/Director/Web/Table/CustomvarTable.php:41
+#: application/forms/CustomvarForm.php:16
+msgid "Variable name"
+msgstr "Variablenname"
+
+#: library/Director/Import/ImportSourceRestApi.php:176
+msgid "Verify Host"
+msgstr "Host überprüfen"
+
+#: library/Director/Import/ImportSourceRestApi.php:169
+msgid "Verify Peer"
+msgstr "Peer überprüfen"
+
+#: library/Director/DataType/DataTypeString.php:24
+msgid "Visibility"
+msgstr "Sichtbarkeit"
+
+#: library/Director/DataType/DataTypeString.php:26
+msgid "Visible"
+msgstr "Sichtbar"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1486
+msgid "Volatile"
+msgstr "Sprunghaft (Volatile)"
+
+#: application/forms/IcingaCommandForm.php:80
+msgid ""
+"WARNING, this can allow shell script injection via custom variables used in "
+"command."
+msgstr ""
+"VORSICHT, hiermit schafft man die Möglichkeit über benutzerdefinierte "
+"Variablen Shell-Code in Kommandos zu injizieren."
+
+#: library/Director/Dashboard/InfrastructureDashboard.php:50
+#, php-format
+msgid "Want to connect to your Icinga Agents? Have a look at our %s!"
+msgstr ""
+"Sollen Icinga Agents verbunden werden? Riskieren einen Blick in unsere %s!"
+
+#: library/Director/Dashboard/TimeperiodsDashboard.php:20
+msgid ""
+"Want to define to execute specific checks only withing specific time "
+"periods? Get mobile notifications only out of office hours, but mail "
+"notifications all around the clock? Time Periods allow you to tackle those "
+"and similar requirements."
+msgstr ""
+"Sollen bestimmte Checks nur innerhalb bestimmter Zeiträume ausgeführt "
+"werden? Mobile Benachrichtigungen nur außerhalb der Bürozeiten, aber "
+"Alarmierung via E-Mail rund um die Uhr? Zeiträume erlauben es, diese und "
+"ähnliche Anforderungen zu erfüllen."
+
+#: library/Director/IcingaConfig/StateFilterSet.php:25
+msgid "Warning"
+msgstr "Warnung"
+
+#: application/forms/DeployFormsBug7530.php:94
+#, php-format
+msgid ""
+"Warning: you're running Icinga v2.11.0 and our configuration looks like you "
+"could face issue %s. We're already working on a solution. The GitHub Issue "
+"and our %s contain related details."
+msgstr ""
+"Vorsicht: hier läuft Icinga v2.11.0 und die erstellte Konfiguration sieht "
+"aus als würde sie von Issue %s betroffen sein. Wir arbeiten bereits an einer "
+"Lösung. Das GitHub-Issue und unsere %s enthalten weiterführende "
+"Informationen."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1129
+msgid ""
+"What kind of object this should be. Templates allow full access to any "
+"property, they are your building blocks for \"real\" objects. External "
+"objects should usually not be manually created or modified. They allow you "
+"to work with objects locally defined on your Icinga nodes, while not "
+"rendering and deploying them with the Director. Apply rules allow to assign "
+"services, notifications and groups to other objects."
+msgstr ""
+"Welche Art von Objekt dies werden soll. Vorlagen erlauben vollen Zugriff auf "
+"alle Eigenschaften - sie sind die Bauklötze für \"echte\" Objekte. Externe "
+"Objekte sollten üblicherweise nicht erstellt oder verändert werden. Sie "
+"erlauben es, mit Objekten zu arbeiten, die lokal auf den Icinga Knoten "
+"definiert wurden, ohne sie über den Director auszubringen. Apply regeln "
+"erlauben das Zuweisen von Services, Benachrichtigungen und Gruppen an andere "
+"Objekte."
+
+#: library/Director/PropertyModifier/PropertyModifierMap.php:28
+msgid ""
+"What should happen if the lookup key does not exist in the data list? You "
+"could return a null value, keep the unmodified imported value or interrupt "
+"the import process"
+msgstr ""
+"Was soll geschehen, wenn der Suchschlüssel sich nicht in der Datenliste "
+"befindet? Es kann ein null Wert zurückgegeben werden, der importierte Wert "
+"unverändert übernommen oder der Importvorgang unterbrochen werden"
+
+#: library/Director/PropertyModifier/PropertyModifierSplit.php:24
+#: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:24
+msgid "What should happen when the given string is empty?"
+msgstr "Was soll passieren wenn der übergebene String leer ist?"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:66
+msgid "What should happen when the result array is empty?"
+msgstr "Was soll passieren wenn das resultierende Array leer ist?"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:51
+msgid "What should happen when the specified element is not available?"
+msgstr "Was soll passieren wenn das spezifizierte Element nicht verfügbar ist?"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:53
+msgid "What should happen with matching elements?"
+msgstr "Was soll mit passenden Elementen passieren?"
+
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:68
+msgid ""
+"What should happen with the row, when this property matches the given "
+"expression?"
+msgstr ""
+"Was soll mit der Zeile passieren, wenn der gegebene Ausdruck auf diese "
+"Eigenschaft zutrifft?"
+
+#: library/Director/PropertyModifier/PropertyModifierDnsRecords.php:32
+msgid "What should we do if the DNS lookup fails?"
+msgstr "Was soll geschehen, wenn die (DNS) Auflösung fehlschlägt?"
+
+#: library/Director/PropertyModifier/PropertyModifierParseURL.php:36
+msgid ""
+"What should we do if the URL could not get parsed or component not found?"
+msgstr ""
+"Was soll mit der URL geschehen, wenn sie nicht geparsed werden kann oder "
+"aber Komponenten davon nicht gefunden werden?"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:28
+msgid "What should we do if the desired part does not exist?"
+msgstr "Was soll geschehen, wenn der gewünschte Teil nicht existiert?"
+
+#: library/Director/PropertyModifier/PropertyModifierGetHostByAddr.php:15
+#: library/Director/PropertyModifier/PropertyModifierGetHostByName.php:15
+msgid "What should we do if the host (DNS) lookup fails?"
+msgstr "Was soll geschehen, wenn die (DNS) Auflösung fehlschlägt?"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayToRow.php:21
+#: library/Director/PropertyModifier/PropertyModifierDictionaryToRow.php:28
+msgid "What should we do in case the given value is empty?"
+msgstr "Was soll passieren wenn der übergebene Wert leer ist?"
+
+#: library/Director/PropertyModifier/PropertyModifierJsonDecode.php:22
+msgid "What should we do in case we are unable to decode the given string?"
+msgstr ""
+"Was soll geschehen, wenn sich der übergebene String nicht dekodieren lässt?"
+
+#: library/Director/PropertyModifier/PropertyModifierListToObject.php:24
+msgid "What should we do, if the same key occurs twice?"
+msgstr "Was soll geschehen, wenn derselbe Schlüssel zweimal auftaucht?"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:16
+msgid "What should we extract from the DN?"
+msgstr "Was soll aus dem DN extrahiert werden?"
+
+#: application/forms/BasketForm.php:61
+msgid ""
+"What should we place into this Basket every time we create new snapshot?"
+msgstr "Was sollen wir beim Erstellen eines Snapshots in diesen Basket geben?"
+
+#: application/forms/SelfServiceSettingsForm.php:21
+msgid "What to use as your Icinga 2 Agent's Host Name"
+msgstr "Was soll als Hostname für den Icinga-2-Agent genutzt werden?"
+
+#: library/Director/Job/ConfigJob.php:59
+msgid ""
+"When deploying configuration, wait at least this amount of seconds unless "
+"the next deployment should take place"
+msgstr ""
+"Beim Ausrollen einer Konfiguration mindestens diese Anzahl an Sekunden "
+"warten, bevor das nächste Ausrollen durchgeführt wird"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:63
+#: library/Director/PropertyModifier/PropertyModifierSplit.php:21
+#: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:21
+#: library/Director/PropertyModifier/PropertyModifierDictionaryToRow.php:27
+msgid "When empty"
+msgstr "Falls leer"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:48
+msgid "When not available"
+msgstr "Wenn nicht verfügbar"
+
+#: application/forms/IcingaNotificationForm.php:210
+msgid "When the last notification should be sent"
+msgstr "Wann die letzte Nachricht versenderwerden"
+
+#: library/Director/Dashboard/InfrastructureDashboard.php:44
+msgid ""
+"When you feel the desire to manually create Zone or Endpoint objects please "
+"rethink this twice. Doing so is mostly the wrong way, might lead to a dead "
+"end, requiring quite some effort to clean up the whole mess afterwards."
+msgstr ""
+"Das Bedürfnis, neue Zonen- oder Endpunkt-Objekte manuell zu erstellen bitte "
+"zweimal überdenken. Das ist meistens der falsche Weg, kann in Sackgassen "
+"führen und damit eine Menge Arbeit beim manuellen Aufräumen verursachen."
+
+#: library/Director/PropertyModifier/PropertyModifierTrim.php:17
+msgid "Where to trim the string(s)"
+msgstr "Wo String(s) gestutzt werden soll"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:104
+msgid ""
+"Whether Downtimes should also explicitly be scheduled for all Services "
+"belonging to affected Hosts"
+msgstr ""
+"Ob Downtimes zudem explizit auch für alle zu den betroffenen Hosts gehörigen "
+"Services eingeplant werden sollen"
+
+#: application/forms/SettingsForm.php:63
+msgid "Whether all configured Jobs should be disabled"
+msgstr "Ob alle konfigurierten Jobs deaktiviert werden sollen"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1459
+msgid "Whether flap detection is enabled on this object"
+msgstr "Ob die Flapping-Erkennung für dieses Objekt aktiviert werden soll"
+
+#: library/Director/Job/ConfigJob.php:33
+msgid ""
+"Whether rendering should be forced. If not enforced, this job re-renders the "
+"configuration only when there have been activities since the last rendered "
+"config"
+msgstr ""
+"Ob das Erstellen erzwungen werden soll. Wird es nicht erzwungen, wird die "
+"Konfiguration nur erstellt, falls seit dem letzten Erstellen Aktivitäten "
+"durchgeführt wurden"
+
+#: application/forms/IcingaHostForm.php:94
+msgid "Whether the agent is configured to accept config"
+msgstr ""
+"Ja, falls der Agent so konfiguriert ist, dass er Konfiguration akzeptiert"
+
+#: application/forms/IcingaCommandArgumentForm.php:42
+msgid ""
+"Whether the argument value is a string (allowing macros like $host$) or an "
+"Icinga DSL lambda function (will be enclosed with {{ ... }}"
+msgstr ""
+"Ist der Wert des Arguments eine Zeichenkette (erlaubt Makros wie $host$) "
+"oder eine Icinga-DSL-Lambda-Funktion? (wird in {{ ... }} eingeschlossen"
+
+#: application/forms/IcingaServiceForm.php:680
+msgid ""
+"Whether the check commmand for this service should be executed on the Icinga "
+"agent"
+msgstr ""
+"Ob das Kommando für diesen Service auf dem Icinga-Agent ausgeführt werden "
+"soll"
+
+#: application/forms/IcingaCommandArgumentForm.php:117
+msgid ""
+"Whether the parameter name should not be passed to the command. Per default, "
+"the parameter name (e.g. -H) will be appended, so no need to explicitly set "
+"this to \"No\"."
+msgstr ""
+"Ob der Parameter-Name an das Kommando übergeben werden soll. Normalerweise "
+"wird dieser (z.B. -H) hinzugefügt, es ist also nicht erforderlich dies "
+"explizit auf \"Nein\" zu setzen."
+
+#: application/forms/IcingaHostForm.php:88
+msgid ""
+"Whether the parent (master) node should actively try to connect to this agent"
+msgstr ""
+"Soll der (Master) Knoten aktiv versuchen, sich zu diesem Agenten zu "
+"verbinden?"
+
+#: application/forms/IcingaCommandArgumentForm.php:81
+msgid ""
+"Whether the set_if parameter is a string (allowing macros like $host$) or an "
+"Icinga DSL lambda function (will be enclosed with {{ ... }}"
+msgstr ""
+"Ist der set_if Parameter eine Zeichenkette (erlaubt Makros wie $host$) oder "
+"eine Icinga-DSL-Lambda-Funktion? (wird in {{ ... }} eingeschlossen"
+
+#: application/forms/IcingaCommandArgumentForm.php:126
+msgid "Whether this argument should be required"
+msgstr "Soll dieses Argument erforderlich sein?"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1487
+msgid "Whether this check is volatile."
+msgstr "Ist dieser Check sprunghaft (volatile)?"
+
+#: application/forms/IcingaDependencyForm.php:95
+#: application/forms/IcingaScheduledDowntimeForm.php:84
+msgid "Whether this dependency should affect hosts or services"
+msgstr "Soll diese Abhängigkeit Hosts oder Services betreffen"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:49
+msgid ""
+"Whether this downtime is fixed or flexible. If unsure please check the "
+"related documentation: https://icinga.com/docs/icinga2/latest/doc/08-"
+"advanced-topics/#downtimes"
+msgstr ""
+"Ob diese Downtime fix oder flexibel ist. Im Zweifel bitte die entsprechende "
+"Dokumentation zu Rate ziehen: https://icinga.com/docs/icinga2/latest/doc/08-"
+"advanced-topics/#downtimes"
+
+#: application/forms/IcingaObjectFieldForm.php:143
+msgid "Whether this field should be mandatory"
+msgstr "Soll dieses Feld Pflicht sein?"
+
+#: application/forms/IcingaHostForm.php:79
+msgid "Whether this host has the Icinga 2 Agent installed"
+msgstr "Hat dieser Host den Icinga-2-Agent installiert?"
+
+#: application/forms/IcingaNotificationForm.php:83
+msgid "Whether this notification should affect hosts or services"
+msgstr "Soll diese Benachrichtigung Hosts oder Services betreffen"
+
+#: application/forms/IcingaCommandArgumentForm.php:109
+msgid ""
+"Whether this parameter should be repeated when multiple values (read: array) "
+"are given"
+msgstr ""
+"Soll dieser Parameter wiederholt werden, wenn mehrere Werte (in einem Array) "
+"angegeben werden"
+
+#: library/Director/DataType/DataTypeDatalist.php:136
+msgid ""
+"Whether this should be a String or an Array in the generated Icinga "
+"configuration. In case you opt for Array, Director users will be able to "
+"select multiple elements from the list"
+msgstr ""
+"Ob dies ein String oder ein Array in der generierten Icinga-Konfiguration "
+"sein soll. Wird Array gewählt, können Director-Benutzer mehrere Elemente aus "
+"einer Liste wählen"
+
+#: application/forms/IcingaZoneForm.php:24
+msgid ""
+"Whether this zone should be available everywhere. Please note that it rarely "
+"leads to the desired result when you try to distribute global zones in "
+"distrubuted environments"
+msgstr ""
+"Soll diese Zone überall verfügbar sein? Beachte, dass es selten zielführend "
+"ist, globale Zonen in verteilten Umgebungen zu verteilen"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1435
+msgid "Whether to accept passive check results for this object"
+msgstr "Sollen passive Checkergebnisse für dieses Objekt akzeptiert werden?"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1429
+msgid "Whether to actively check this object"
+msgstr "Soll dieses Objekt aktiv geprüft werden?"
+
+#: application/forms/SelfServiceSettingsForm.php:33
+msgid "Whether to adjust your host name"
+msgstr "Ob der Hostname angepasst werden soll"
+
+#: application/forms/SyncRuleForm.php:84
+msgid "Whether to delete or to disable objects subject to purge"
+msgstr "Ob zu bereinigende Objekte deaktiviert oder gelöscht werden sollen"
+
+#: application/forms/IcingaDependencyForm.php:161
+msgid ""
+"Whether to disable checks when this dependency fails. Defaults to false."
+msgstr ""
+"Ob Checks deaktiviert werden sollen, wenn diese Abhängigkeit fehlschlägt. "
+"Standardmäßig ist dies nicht der Fall."
+
+#: application/forms/IcingaDependencyForm.php:169
+msgid ""
+"Whether to disable notifications when this dependency fails. Defaults to "
+"true."
+msgstr ""
+"Sollen Benachrichtigungen deaktiviert werden, wenn diese Abhängigkeit "
+"fehlschlägt. Standard-Einstellung ist Ja."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1447
+msgid "Whether to enable event handlers this object"
+msgstr "Sollen Event-Handler für dieses Objekt aktiviert werden?"
+
+#: application/forms/IcingaDependencyForm.php:177
+msgid ""
+"Whether to ignore soft states for the reachability calculation. Defaults to "
+"true."
+msgstr ""
+"Ob Soft-States für die Berechnung der Erreichbarkeit berücksichtigt werden "
+"sollen. Dies ist standardmäßig der Fall."
+
+#: application/forms/IcingaTimePeriodForm.php:77
+msgid "Whether to prefer timeperiods includes or excludes. Default to true."
+msgstr ""
+"Ob das Einbinden oder Ausschließen von Zeiträumen bevorzugt werden soll. "
+"Standard-Einstellung ist Ja."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1453
+msgid "Whether to process performance data provided by this object"
+msgstr "Sollen Performancedaten von diesem Objekt verarbeitet werden?"
+
+#: application/forms/SyncRuleForm.php:72
+msgid ""
+"Whether to purge existing objects. This means that objects of the same type "
+"will be removed from Director in case they no longer exist at your import "
+"source."
+msgstr ""
+"Sollen existierende Objekte entfernt werden? Das bedeutet, dass Objekte "
+"desselben Typs aus dem Director entfernt werden, falls sie in der "
+"Importquelle nicht mehr vorhanden sein sollten."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1441
+msgid "Whether to send notifications for this object"
+msgstr "Sollen Benachrichtigungen für dieses Objekt verschickt werden?"
+
+#: application/forms/IcingaUserForm.php:90
+msgid "Whether to send notifications for this user"
+msgstr "Sollen Benachrichtigungen für diesen Benutzer verschickt werden?"
+
+#: library/Director/Import/ImportSourceRestApi.php:130
+msgid "Whether to use encryption when talking to the REST API"
+msgstr ""
+"Ob für die Verbindung zu dieser REST-API Verschlüsselung benutzt werden soll"
+
+#: library/Director/Import/ImportSourceRestApi.php:171
+msgid ""
+"Whether we should check that our peer's certificate has been signed by a "
+"trusted CA. This is strongly recommended."
+msgstr ""
+"Ob wir prüfen sollen, dass das Zertifikat unseres Gegenübers von einer "
+"vertrauenswürdigen Zertifizierungsstelle signiert wurde. Das wird "
+"strengstens empfohlen."
+
+#: library/Director/Import/ImportSourceRestApi.php:178
+msgid "Whether we should check that the certificate matches theconfigured host"
+msgstr ""
+"Ob geprüft werden soll, dass die Zertifikate zum konfigurierten Host passen"
+
+#: application/forms/SyncPropertyForm.php:119
+msgid ""
+"Whether you want to merge or replace the destination field. Makes no "
+"difference for strings"
+msgstr ""
+"Soll das Zielfeld zusammengeführt oder ersetzt werden? Macht keinen "
+"Unterschied für Zeichenketten"
+
+#: application/forms/DirectorDatalistEntryForm.php:24
+msgid ""
+"Will be stored as a custom variable value when this entry is chosen from the "
+"list"
+msgstr ""
+"Wird als benutzerdefinierte Variable gespeichert, wenn dieser Eintrag aus "
+"der Liste gewählt wird"
+
+#: library/Director/Import/ImportSourceRestApi.php:228
+msgid "Will be used to authenticate against your REST API"
+msgstr "Wird für die Authentifizierung gegen die REST-API benutzt"
+
+#: library/Director/Web/SelfService.php:247
+msgid "Windows Kickstart Script"
+msgstr "Kickstart-Skript für Windows"
+
+#: application/forms/DirectorDatafieldForm.php:53
+msgid "Wipe related vars"
+msgstr "Zugehörige Eigenschaften leeren"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:102
+msgid "With Services"
+msgstr "Mit Services"
+
+#: library/Director/Dashboard/Dashlet/ActivityLogDashlet.php:17
+msgid "Wondering about what changed why? Track your changes!"
+msgstr "Hier kann nachvollzogen werden, was weshalb verändert wurde."
+
+#: library/Director/Dashboard/InfrastructureDashboard.php:35
+msgid "Working with Agents and Config Zones"
+msgstr "Mit Agenten und Konfigurationszonen arbeiten"
+
+#: application/views/helpers/FormDataFilter.php:525
+msgid "Wrap this expression into an operator"
+msgstr "Diesen Ausdruck in einen Operator packen"
+
+#: application/forms/IcingaDeleteObjectForm.php:17
+#, php-format
+msgid "YES, please delete \"%s\""
+msgstr "JA, bitte \"%s\" löschen"
+
+#: library/Director/Job/ImportJob.php:101
+#: library/Director/Job/ConfigJob.php:39
+#: library/Director/Job/ConfigJob.php:51
+#: library/Director/Job/SyncJob.php:101
+#: library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:25
+#: application/forms/IcingaZoneForm.php:30
+#: application/forms/SettingsForm.php:59
+#: application/forms/SettingsForm.php:74
+#: application/forms/SettingsForm.php:96
+#: application/forms/SelfServiceSettingsForm.php:239
+msgid "Yes"
+msgstr "Ja"
+
+#: application/controllers/BasketsController.php:41
+msgid ""
+"You can create Basket snapshots at any time, this will persist a serialized "
+"representation of all involved objects at that moment in time. Snapshots can "
+"be exported, imported, shared and restored - to the very same or another "
+"Director instance."
+msgstr ""
+"Basket-Snapshots können jederzeit erstellt werden, damit wird eine "
+"serialisierte Darstellung aller involvierten Objekte zum gegebenen Zeitpunkt "
+"persistiert. Snapshots können exportiert, importiert, geteilt und "
+"wiederhergestellt werden - zur selben oder einer anderen Director-Instanz."
+
+#: library/Director/Web/SelfService.php:129
+msgid ""
+"You can stop sharing a Template at any time. This will immediately "
+"invalidate the former key."
+msgstr ""
+"Die Freigabe einer Vorlage kann jederzeit widerrufen werden. Das macht den "
+"vorherigen Schlüssel sofort ungültig."
+
+#: library/Director/Job/ImportJob.php:94
+#: library/Director/Job/SyncJob.php:94
+msgid ""
+"You could immediately apply eventual changes or just learn about them. In "
+"case you do not want them to be applied immediately, defining a job still "
+"makes sense. You will be made aware of available changes in your Director "
+"GUI."
+msgstr ""
+"Änderungen können sofort angewandt oder nur angezeigt werden. Falls sie "
+"nicht sofort angewandt werden, ist es immer noch sinnvoll, einen Auftrag zu "
+"erstellen. Verfügbare Änderungen werden in der Director-GUI angezeigt."
+
+#: application/forms/SelfServiceSettingsForm.php:74
+msgid ""
+"You might want to let the generated Powershell script install the Icinga 2 "
+"Agent in an automated way. If so, please choose where your Windows nodes "
+"should fetch the Agent installer"
+msgstr ""
+"Es kann erwünscht sein, dass das generierte Powershell-Script den Icinga-2-"
+"Agenten automatisch installiert. Falls das gewünscht ist gilt es hier zu "
+"wühlen, von wo sich die Windows-Knoten den Agenten-Installer besorgen sollen"
+
+#: application/forms/IcingaObjectFieldForm.php:169
+msgid ""
+"You might want to show this field only when certain conditions are met. "
+"Otherwise it will not be available and values eventually set before will be "
+"cleared once stored"
+msgstr ""
+"Es könnte erwünscht sein, dieses Feld nur unter bestimmten Bedingungen "
+"anzuzeigen. Treffen diese nicht zu wird es nicht angezeigt, eventuell "
+"zugehörige Eigenschaften werden beim Speichern dann auch wieder entfernt."
+
+#: application/forms/ImportRowModifierForm.php:44
+msgid ""
+"You might want to write the modified value to another (new) property. This "
+"property name can be defined here, the original property would remain "
+"unmodified. Please leave this blank in case you just want to modify the "
+"value of a specific property"
+msgstr ""
+"Es kann erwünscht sein, den geänderten Wert in eine andere (neue) "
+"Eigenschaft zu schreiben. Dieser Eigenschaftsname kann hier definiert "
+"werden, die ursprüngliche Eigenschaft bleibt dann unverändert. Falls "
+"lediglich der ursprüngliche Wert an Ort und Stelle geändert werden soll, "
+"dieses Feld bitte leer lassen"
+
+#: application/controllers/SyncruleController.php:153
+#, php-format
+msgid "You must define some %s before you can run this Sync Rule"
+msgstr ""
+"Bevor dieses Synchronisationsregel ausgeführt werden kann, müssen %s "
+"definiert werden"
+
+#: library/Director/Dashboard/BranchesDashboard.php:19
+#, php-format
+msgid "You're currently working in a Configuration Branch: %s"
+msgstr "Gegenwärtig wird in einem Konfigurationszweig gearbeitet: %s"
+
+#: application/controllers/IndexController.php:35
+#, php-format
+msgid ""
+"Your DB schema (migration #%d) is newer than your code base. Downgrading "
+"Icinga Director is not supported and might lead to unexpected problems."
+msgstr ""
+"Das Datenbankschema (Migration #%d) ist neuer als der installierte "
+"Quellcode. Ein Downgrade des Icinga Directors wird nicht unterstützt und "
+"kann zu unerwarteten Problemen führen."
+
+#: application/forms/KickstartForm.php:157
+msgid "Your Icinga 2 API username"
+msgstr "Der Icinga-2-API Benutzername"
+
+#: library/Director/Import/ImportSourceLdap.php:52
+msgid ""
+"Your LDAP search base. Often something like OU=Users,OU=HQ,DC=your,"
+"DC=company,DC=tld"
+msgstr ""
+"Die LDAP Suchbasis. Meist etwas wie OU=Users,OU=HQ,DC=your,DC=company,DC=tld"
+
+#: library/Director/Web/Widget/BranchedObjectHint.php:42
+#, php-format
+msgid ""
+"Your changes will be stored in %s. The'll not be part of any deployment "
+"unless being merged"
+msgstr ""
+"Änderungen werden in %s gespeichert. Sie sind nicht Teil eines eventuellen "
+"Deployments, solange sie nicht zusammengeführt werden"
+
+#: application/forms/KickstartForm.php:98
+msgid ""
+"Your configuration looks good. Still, you might want to re-run this "
+"kickstart wizard to (re-)import modified or new manually defined Command "
+"definitions or to get fresh new ITL commands after an Icinga 2 Core upgrade."
+msgstr ""
+"Die Konfiguration sieht gut aus. Dennoch kann dieser Kickstart-Assistent "
+"jederzeit neu ausgeführt werden, um geänderte oder neu erstellte "
+"Kommandodefinitionen oder neue ITL-Kommandos nach einem Icinga-2-Core-"
+"Upgrade (neu) zu importieren."
+
+#: application/forms/KickstartForm.php:76
+#, php-format
+msgid "Your database looks good, you are ready to %s"
+msgstr ""
+"Datenbank sieht gut aus. Icinga Director sollte jetzt fertig für %s sein."
+
+#: application/forms/KickstartForm.php:110
+msgid ""
+"Your installation of Icinga Director has not yet been prepared for "
+"deployments. This kickstart wizard will assist you with setting up the "
+"connection to your Icinga 2 server."
+msgstr ""
+"Diese Icinga-Director-Installation wurde noch nicht zum Ausrollen von "
+"Konfiguration vorbereitet. Dieser Kickstart-Assistent hilft bei der "
+"Einrichtung der Verbindung zum Icinga 2 Server."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1372
+msgid "Your regular check interval"
+msgstr "Der übliche Check-Intervall"
+
+#: library/Director/PropertyModifier/PropertyModifierReplace.php:20
+#: library/Director/PropertyModifier/PropertyModifierReplaceNull.php:20
+msgid "Your replacement string"
+msgstr "Die Ersatzzeichenkette"
+
+#: application/forms/IcingaTemplateChoiceForm.php:67
+msgid "Your users will be allowed to choose among those templates"
+msgstr "Benutzern wird erlaubt, zwischen diesen Vorlagen zu wählen"
+
+#: library/Director/TranslationDummy.php:15
+#: library/Director/Import/ImportSourceDirectorObject.php:73
+#: library/Director/Web/Table/ObjectsTableEndpoint.php:21
+#: application/forms/SyncRuleForm.php:26
+msgid "Zone"
+msgstr "Zone"
+
+#: application/forms/IcingaZoneForm.php:14
+msgid "Zone name"
+msgstr "Zonenname"
+
+#: application/forms/IcingaUserForm.php:76
+#: application/forms/IcingaNotificationForm.php:65
+#: application/forms/IcingaCommandForm.php:110
+#: application/forms/IcingaUserGroupForm.php:42
+#: application/forms/IcingaDependencyForm.php:61
+msgid "Zone settings"
+msgstr "Zoneneinstellungen"
+
+#: library/Director/Dashboard/Dashlet/ZoneObjectDashlet.php:13
+#: library/Director/Db/Branch/BranchModificationInspection.php:36
+#: library/Director/Import/ImportSourceCoreApi.php:64
+msgid "Zones"
+msgstr "Zonen"
+
+#: application/forms/SyncPropertyForm.php:348
+msgid "a list"
+msgstr "eine Liste"
+
+#: library/Director/Web/Widget/InspectPackages.php:122
+msgid "active"
+msgstr "aktiv"
+
+#: library/Director/Web/Widget/AdditionalTableActions.php:87
+msgid "all"
+msgstr "alle"
+
+#: library/Director/Web/ActionBar/DirectorBaseActionBar.php:35
+#: library/Director/Web/Controller/ObjectController.php:278
+#: library/Director/Web/Controller/ObjectController.php:638
+#: library/Director/Web/Controller/ActionController.php:182
+#: application/controllers/ServiceController.php:156
+#: application/controllers/ServiceController.php:216
+#: application/controllers/HostController.php:564
+#: application/controllers/BasketController.php:98
+#: application/controllers/BasketController.php:116
+#: application/controllers/BasketController.php:357
+#: application/controllers/ImportsourceController.php:366
+#: application/controllers/SyncruleController.php:612
+#: application/controllers/DataController.php:138
+msgid "back"
+msgstr "Zurück"
+
+#: library/Director/Web/Widget/BranchedObjectsHint.php:24
+#: library/Director/Web/Controller/ObjectController.php:722
+#: application/controllers/ConfigController.php:447
+msgid "configuration branch"
+msgstr "Konfigurationszweig"
+
+#: application/locale/translateMe.php:11
+msgid "critical"
+msgstr "Kritisch"
+
+#: library/Director/Web/Table/Dependency/DependencyInfoTable.php:57
+msgid "disabled"
+msgstr "deaktiviert"
+
+#: library/Director/Dashboard/InfrastructureDashboard.php:32
+#: application/controllers/DaemonController.php:43
+msgid "documentation"
+msgstr "Dokumentation"
+
+#: application/locale/translateMe.php:6
+msgid "down"
+msgstr "Down"
+
+#: application/forms/IcingaCommandArgumentForm.php:27
+msgid "e.g. -H or --hostname, empty means \"skip_key\""
+msgstr "z.B. -H oder --hostname, leer bedeutet \"skip_key\""
+
+#: application/forms/IcingaCommandArgumentForm.php:61
+msgid "e.g. 5%, $host.name$, $lower$%:$upper$%"
+msgstr "z.B. 5%, $host.name$, $lower$%:$upper$%"
+
+#: application/forms/SyncPropertyForm.php:165
+msgid "failed to fetch"
+msgstr "Abholen fehlgeschlagen"
+
+#: library/Director/Util.php:161
+#: library/Director/Web/Form/ClickHereForm.php:17
+#: application/forms/KickstartForm.php:236
+msgid "here"
+msgstr "hier"
+
+#: application/forms/IcingaHostVarForm.php:23
+msgid "host var name"
+msgstr "host var name"
+
+#: application/forms/IcingaHostVarForm.php:28
+msgid "host var value"
+msgstr "host var value"
+
+#: library/Director/Web/Table/Dependency/DependencyInfoTable.php:60
+msgid "missing"
+msgstr "fehlend"
+
+#: application/controllers/BasketController.php:304
+msgid "modified"
+msgstr "geändert"
+
+#: library/Director/Web/Table/Dependency/DependencyInfoTable.php:65
+msgid "more"
+msgstr "mehr"
+
+#: application/controllers/BasketController.php:282
+msgid "new"
+msgstr "neu"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:78
+msgid "no"
+msgstr "nein"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:222
+msgid "no related group exists"
+msgstr "keine verwandte Gruppe existiert"
+
+#: application/locale/translateMe.php:9
+msgid "ok"
+msgstr "ok"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:316
+msgid "on host"
+msgstr "auf dem Host"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:298
+msgid "on service set"
+msgstr "am Service-Set"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:224
+msgid "one related group exists"
+msgstr "eine verwandte Gruppe existiert"
+
+#: application/locale/translateMe.php:8
+msgid "pending"
+msgstr "ausstehend"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:71
+#: library/Director/PropertyModifier/PropertyModifierSplit.php:29
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:56
+#: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:29
+msgid "return NULL"
+msgstr "NULL zurückgeben"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:70
+#: library/Director/PropertyModifier/PropertyModifierSplit.php:28
+#: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:28
+msgid "return an empty array"
+msgstr "ein leeres Array zurückliefern"
+
+#: application/forms/IcingaServiceVarForm.php:23
+msgid "service var name"
+msgstr "service var name"
+
+#: application/forms/IcingaServiceVarForm.php:28
+msgid "service var value"
+msgstr "service var value"
+
+#: application/forms/KickstartForm.php:78
+msgid "start working with the Icinga Director"
+msgstr "die Arbeit mit dem Icinga Director zu beginnen"
+
+#: library/Director/Web/Widget/BranchedObjectHint.php:27
+msgid "this configuration branch"
+msgstr "diesem Konfigurationszweig"
+
+#: application/controllers/BasketController.php:308
+msgid "unchanged"
+msgstr "unverändert"
+
+#: application/locale/translateMe.php:12
+msgid "unknown"
+msgstr "Unbekannt"
+
+#: application/locale/translateMe.php:7
+msgid "unreachable"
+msgstr "unreachable"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:89
+msgid "unsupported"
+msgstr "nicht unterstützt"
+
+#: library/Director/Web/Widget/AdditionalTableActions.php:89
+msgid "unused"
+msgstr "unbenutzt"
+
+#: application/locale/translateMe.php:5
+msgid "up"
+msgstr "up"
+
+#: library/Director/Web/Widget/AdditionalTableActions.php:88
+msgid "used"
+msgstr "benutzt"
+
+#: application/forms/IcingaServiceVarForm.php:33
+#: application/forms/IcingaHostVarForm.php:33
+msgid "value format"
+msgstr "Wertformat"
+
+#: library/Director/Web/Table/GroupMemberTable.php:74
+#: library/Director/Web/Table/GroupMemberTable.php:79
+msgid "via"
+msgstr "via"
+
+#: application/locale/translateMe.php:10
+msgid "warning"
+msgstr "warning"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:77
+msgid "yes"
+msgstr "ja"
+
+#~ msgid "Create a new Service Set"
+#~ msgstr "Ein neues Service-Set erstellen"
+
+#, php-format
+#~ msgid ""
+#~ "This allows you to modify properties for \"%s\" (deployed from director)"
+#~ msgstr ""
+#~ "Dies erlaubt das Ändern von Eigenschaften für \"%s\" (ausgerollt vom "
+#~ "Director)"
+
+#~ msgid ""
+#~ "This allows you to modify properties for all chosen hosts (deployed from "
+#~ "director) at once"
+#~ msgstr ""
+#~ "Hiermit lassen sich Eigenschaften für alle gewählten (und vom Director "
+#~ "ausgerollten) Hosts auf einmal ändern"
+
+#, fuzzy
+#~ msgid "Please choose a specific Icinga object type. All "
+#~ msgstr "Bitte einen bestimmten Icinga-Objekttyp auswählen"
+
+#~ msgid "- inherited -"
+#~ msgstr "- geerbt -"
+
+#~ msgid "Blacklist"
+#~ msgstr "Blacklist"
+
+#~ msgid "Generated from host vars"
+#~ msgstr "Aus Host-Variablen generiert"
+
+#~ msgid "%s (where %s)"
+#~ msgstr "%s (wo %s)"
+
+#~ msgid "Add Service: %s"
+#~ msgstr "Service hinzufügen: %s"
+
+#~ msgid "The parent host."
+#~ msgstr "Der Eltern-Host."
+
+#~ msgid ""
+#~ "This allows you to configure an assignment filter. Please feel free to "
+#~ "combine as many nested operators as you want"
+#~ msgstr ""
+#~ "Hiermit lässt sich ein Zuweisungsfilter (assign) definieren. Dabei lassen "
+#~ "sich beliebig viele Operatoren beliebig tief verschachtelt benutzen"
+
+#~ msgid "This must be an import source column (property)"
+#~ msgstr "Muss eine Spalte der Importquelle sein (Eigenschaft)"
+
+#~ msgid "Name for the Icinga timeperiod you are going to create"
+#~ msgstr "Name des Icinga-Zeitraums, der erstellt werden soll"
+
+#~ msgid "Name for the Icinga timperiod template you are going to create"
+#~ msgstr "Name der Icinga-Zeitraum-Vorlage, die erstellt werden soll"
+
+#~ msgid "Please define a Service Template first"
+#~ msgstr "Bitte zuerst eine entsprechende Service-Vorlage definieren"
+
+#~ msgid "Serviceset"
+#~ msgstr "Service-Set"
+
+#~ msgid "Timeperiod"
+#~ msgstr "Zeitraum"
+
+#~ msgid "Timeperiod object"
+#~ msgstr "Zeitraumobjekt"
+
+#~ msgid "Timeperiod template"
+#~ msgstr "Zeitraumvorlage"
+
+#~ msgid "Timeperiod template name"
+#~ msgstr "Zeitraumvorlagenname"
+
+#~ msgid "Whether this should be a template"
+#~ msgstr "Soll dies eine Vorlage sein?"
+
+#~ msgid "the display name"
+#~ msgstr "Der Anzeigename"
+
+#~ msgid "the update method"
+#~ msgstr "die Updatemethode"
+
+#~ msgid "Change priority"
+#~ msgstr "Priorität ändern"
+
+#~ msgid "Count Query"
+#~ msgstr "Count-Abfage"
+
+#~ msgid "Move down (lower priority)"
+#~ msgstr "Nach unten schieben (Priorität verringern)"
+
+#~ msgid "Move up (raise priority)"
+#~ msgstr "Nach oben schieben (Priorität erhöhen)"
+
+#~ msgid "Next page"
+#~ msgstr "Nächste Seite"
+
+#~ msgid "Pagination"
+#~ msgstr "Seitennavigation"
+
+#~ msgid "Previous page"
+#~ msgstr "Vorhergehende Seite"
+
+#~ msgid "Prio"
+#~ msgstr "Prio"
+
+#~ msgid "SQL Query"
+#~ msgstr "SQL-Abfrage"
+
+#~ msgid "Search is simple! Try to combine multiple words"
+#~ msgstr "Suchen ist einfach! Versuche, mehrere Wörter zu kombinieren"
+
+#~ msgid "Search..."
+#~ msgstr "Suchen..."
+
+#~ msgid "Show rows %u to %u of %u"
+#~ msgstr "Zeige die Zeilen %u bis %u von %u"
+
+#~ msgid "This feature is still experimental"
+#~ msgstr "Dieses Feature ist noch experimentell"
+
+#~ msgid "Filter available service sets"
+#~ msgstr "Verfügbare Service-Sets filtern"
+
+#~ msgid "Set Members"
+#~ msgstr "Set-Mitglieder"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#~ msgid "Activity log entry"
+#~ msgstr "Aktivitätslogeintrag"
+
+#~ msgid "Add a job"
+#~ msgstr "Auftrag hinzufügen"
+
+#~ msgid "Add job"
+#~ msgstr "Auftrag hinzufügen"
+
+#~ msgid "Add list"
+#~ msgstr "Liste hinzufügen"
+
+#~ msgid "Apply Icinga %s"
+#~ msgstr "Icinga %s anwenden"
+
+#~ msgid "Clone Icinga %s"
+#~ msgstr "Klone Icinga %s"
+
+#~ msgid "Configs"
+#~ msgstr "Konfigurationen"
+
+#~ msgid "Create immediately"
+#~ msgstr "Sofort erstellen"
+
+#~ msgid "Deploy to master"
+#~ msgstr "Auf den Master ausbringen"
+
+#~ msgid "Edit import source"
+#~ msgstr "Importquelle bearbeiten"
+
+#~ msgid "Edit sync property rule"
+#~ msgstr "Synchronisationseigenschaftsregel bearbeiten"
+
+#~ msgid "Entries"
+#~ msgstr "Einträge"
+
+#~ msgid "Icinga "
+#~ msgstr "Icinga "
+
+#~ msgid "Icinga %s"
+#~ msgstr "Icinga %s"
+
+#~ msgid "Job %s"
+#~ msgstr "Auftrag %s"
+
+#~ msgid "No object found"
+#~ msgstr "Kein Objekt gefunden"
+
+#~ msgid "Object name"
+#~ msgstr "Objektname"
+
+#~ msgid "Show unfiltered"
+#~ msgstr "Ungefiltert zeigen"
+
+#~ msgid "Sync run details"
+#~ msgstr "Synchronisationslaufdetails"
+
+#~ msgid "Template tree"
+#~ msgstr "Vorlagenbaum"
+
+#~ msgid ""
+#~ "This is an external object. It has been imported from Icinga 2 through "
+#~ "the Core API and cannot be managed with the Icinga Director. It is "
+#~ "however perfectly valid to create objects using this or referring to this "
+#~ "object. You might also want to define related Fields to make work based "
+#~ "on this object more enjoyable."
+#~ msgstr ""
+#~ "Dies ist ein externes Objekt. Es wurde von Icinga 2 durch die Core API "
+#~ "importiert und kann nicht mit Icinga Director verwaltet werden. Objekte, "
+#~ "die sich auf dieses Objekt beziehen, können jedoch mit dem Director "
+#~ "erstellt werden. Außerdem können darauf bezugnehmende Felder erstellt "
+#~ "werden, um die Arbeit zu erleichtern."
+
+#~ msgid "Time"
+#~ msgstr "Zeit"
+
+#~ msgid "Allow to see template details"
+#~ msgstr "Erlauben, Details von Vorlagen zu sehen"
+
+#~ msgid "Allow to use only host templates matching this filter"
+#~ msgstr ""
+#~ "Nur die Verwendung von Hostvorlagen, die diesem Filter entsprechen, "
+#~ "erlauben"
+
+#~ msgid "Allow to use only these db resources (comma separated list)"
+#~ msgstr ""
+#~ "Nur die Verwendung dieser DB Ressourcen erlauben (kommaseparierte Liste)"
+
+#~ msgid "Command-specific custom vars"
+#~ msgstr "Kommandospezifische benutzerdefinierte Variablen"
+
+#~ msgid "Config history"
+#~ msgstr "Konfigurationshistorie"
+
+#~ msgid ""
+#~ "Data fields allow you to customize input controls your custom variables."
+#~ msgstr ""
+#~ "Datenfelder erlauben das Anpassen der Eingabekontrollen von "
+#~ "benutzerdefinierten Variablen."
+
+#~ msgid "Expression"
+#~ msgstr "Ausdruck"
+
+#~ msgid "Operator"
+#~ msgstr "Operator"
+
+#~ msgid "Owner"
+#~ msgstr "Besitzer"
+
+#~ msgid "Service configs"
+#~ msgstr "Servicekonfigurationen"
+
+#~ msgid "The unique name of the field"
+#~ msgstr "Der eindeutige Name des Felds"
+
+#~ msgid "There are pending database schema migrations"
+#~ msgstr "Es sind Datenbankmigrationen ausständig"
+
+#~ msgid "by host group property"
+#~ msgstr "Nach Hostgruppeneigenschaft"
+
+#~ msgid "check command"
+#~ msgstr "Check-Kommando"
+
+#~ msgid "to a host group"
+#~ msgstr "zu einer Hostgruppe"
+
+#~ msgid "%s template \"%s\": custom fields"
+#~ msgstr "%s Vorlage \"%s\": benutzerdefinierte Felder"
+
+#~ msgid "Add entry"
+#~ msgstr "Eintrag hinzufügen"
+
+#~ msgid "Deployments / History"
+#~ msgstr "Deployments / Historie"
+
+#~ msgid "Edit sync rule"
+#~ msgstr "Synchronisationsregel bearbeiten"
+
+#~ msgid "Filter string"
+#~ msgstr "Filterzeichenkette"
+
+#~ msgid "Import / Sync"
+#~ msgstr "Import / Synchronisierung"
+
+#~ msgid "Import runs"
+#~ msgstr "Importläufe"
+
+#~ msgid "Run"
+#~ msgstr "Ausführen"
+
+#~ msgid "Unable to store the configuration to \"%s\""
+#~ msgstr "Konfiguration kann nicht nach \"%s\" gespeichert werden"
+
+#~ msgid "Purge existing values."
+#~ msgstr "Existierende Werte bereinigen"
+
+#~ msgid "Whether the field should be merged, replaced or ignored"
+#~ msgstr "Soll das Feld zusammengeführt, ersetzt oder ignoriert werden?"
+
+#~ msgid "Alert your users"
+#~ msgstr "Benutzer alarmieren"
+
+#~ msgid "Manage deployments, access audit log and history"
+#~ msgstr ""
+#~ "Deployments verwalten, auf die Revisionsaufzeichnungen und die Historie "
+#~ "zugreifen"
+
+#~ msgid "Name for the Icinga zone (templat) you are going to create"
+#~ msgstr "Name der Icinga-Zone (Vorlage), die erstellt werden soll"
+
+#~ msgid "Zone (template) name"
+#~ msgstr "Zonen(vorlagen)name"
+
+#~ msgid "click here"
+#~ msgstr "Hier klicken"
+
+#~ msgid "database schema"
+#~ msgstr "Datenbankschema"
+
+#~ msgid "e.g. "
+#~ msgstr "z.B."
+
+#~ msgid "start using"
+#~ msgstr "start mit"
diff --git a/application/locale/it_IT/LC_MESSAGES/director.mo b/application/locale/it_IT/LC_MESSAGES/director.mo
new file mode 100644
index 0000000..66e4bb7
--- /dev/null
+++ b/application/locale/it_IT/LC_MESSAGES/director.mo
Binary files differ
diff --git a/application/locale/it_IT/LC_MESSAGES/director.po b/application/locale/it_IT/LC_MESSAGES/director.po
new file mode 100644
index 0000000..c4f6d2d
--- /dev/null
+++ b/application/locale/it_IT/LC_MESSAGES/director.po
@@ -0,0 +1,7431 @@
+# Icinga Web 2 - Head for multiple monitoring backends.
+# Copyright (C) 2020 Icinga Development Team
+# This file is distributed under the same license as Director Module.
+# Thomas Widhalm <widhalmt@widhalm.or.at>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Director Module (master)\n"
+"Report-Msgid-Bugs-To: dev@icinga.com\n"
+"POT-Creation-Date: 2020-02-11 10:27+0000\n"
+"PO-Revision-Date: 2019-09-25 14:01+0200\n"
+"Language: it_IT\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Basepath: .\n"
+"Language-Team: \n"
+"X-Generator: Poedit 2.0.6\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:613
+#, php-format
+msgid " (inherited from \"%s\")"
+msgstr " (ereditato da \"%s\")"
+
+#: library/Director/Web/Table/TemplatesTable.php:63
+msgid " - not in use -"
+msgstr " - non utilizzato -"
+
+#: library/Director/Web/Table/DatafieldTable.php:49
+msgid "# Used"
+msgstr "# in uso"
+
+#: library/Director/Web/Table/DatafieldTable.php:50
+msgid "# Vars"
+msgstr "# Vars"
+
+#: library/Director/Web/Table/CustomvarTable.php:29
+#, php-format
+msgid "%d / %d"
+msgstr "%d / %d"
+
+#: library/Director/Resolver/CommandUsage.php:51
+#, php-format
+msgid "%d Host Template(s)"
+msgstr "%d Host-Template"
+
+#: library/Director/Resolver/CommandUsage.php:50
+#, php-format
+msgid "%d Host(s)"
+msgstr "%d Host(s)"
+
+#: library/Director/Resolver/CommandUsage.php:61
+#, php-format
+msgid "%d Notification Apply Rule(s)"
+msgstr "%d Regole-Apply-Notifica"
+
+#: library/Director/Resolver/CommandUsage.php:60
+#, php-format
+msgid "%d Notification Template(s)"
+msgstr "%d template di notifica"
+
+#: library/Director/Resolver/CommandUsage.php:59
+#, php-format
+msgid "%d Notification(s)"
+msgstr "%d Notifiche"
+
+#: library/Director/Resolver/CommandUsage.php:56
+#, php-format
+msgid "%d Service Apply Rule(s)"
+msgstr "%d Regole Service Apply"
+
+#: library/Director/Resolver/CommandUsage.php:55
+#, php-format
+msgid "%d Service Template(s)"
+msgstr "%d Service-Template(n)"
+
+
+#: library/Director/Resolver/CommandUsage.php:54
+#, php-format
+msgid "%d Service(s)"
+msgstr "%d Service(s)"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:231
+#, php-format
+msgid "%d apply rules have been defined"
+msgstr "%d Sono definite regole di Apply"
+
+#: library/Director/Web/Table/SyncRunTable.php:46
+#, php-format
+msgid "%d created"
+msgstr "%d creato"
+
+#: library/Director/Web/Table/SyncRunTable.php:58
+#, php-format
+msgid "%d deleted"
+msgstr "%d cancellato"
+
+
+#: library/Director/Web/Widget/DeploymentInfo.php:110
+#, php-format
+msgid "%d files"
+msgstr "%d files"
+
+#: library/Director/Web/Widget/DeployedConfigInfoHeader.php:83
+#, php-format
+msgid "%d files rendered in %0.2fs"
+msgstr "%d file creati in %0.2fs"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:273
+#, php-format
+msgid "%d have been externally defined and will not be deployed"
+msgstr "%d sono stati creati all'esterno e non vengono distribuiti"
+
+#: library/Director/Web/Table/SyncRunTable.php:52
+#, php-format
+msgid "%d modified"
+msgstr "%d modificato"
+
+#: application/controllers/SyncruleController.php:273
+#, php-format
+msgid "%d object(s) will be created"
+msgstr "creati %d oggetti"
+
+#: application/controllers/SyncruleController.php:254
+#, php-format
+msgid "%d object(s) will be deleted"
+msgstr "%d oggetti verranno cancellati"
+
+#: application/controllers/SyncruleController.php:263
+#, php-format
+msgid "%d object(s) will be modified"
+msgstr "%d oggetti verranno modificati"
+
+#: application/controllers/InspectController.php:78
+#, php-format
+msgid "%d objects found"
+msgstr "%d oggetti trovati"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:256
+#, php-format
+msgid "%d objects have been defined"
+msgstr "%d oggetti sono stati definiti"
+
+#: application/forms/IcingaMultiEditForm.php:93
+#, php-format
+msgid "%d objects have been modified"
+msgstr "%d oggetti sono stati modificati"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:119
+#, php-format
+msgid "%d objects, %d templates, %d apply rules"
+msgstr "%d oggetti, %d template, %d regole-Apply"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:265
+#, php-format
+msgid "%d of them are templates"
+msgstr "%d di questi sono template"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:213
+#, php-format
+msgid "%d templates have been defined"
+msgstr "%d template sono stati definiti"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:604
+#, php-format
+msgid "%s \"%s\" has been created"
+msgstr "%s \"%s\" é stato creato"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:607
+#, php-format
+msgid "%s \"%s\" has been deleted"
+msgstr "%s \"%s\" é stato cancellato"
+
+#: application/forms/IcingaImportObjectForm.php:36
+#, php-format
+msgid "%s \"%s\" has been imported\""
+msgstr "%s \"%s\" é stato importato\""
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:610
+#, php-format
+msgid "%s \"%s\" has been modified"
+msgstr "%s \"%s\" é stato modificato"
+
+#: library/Director/Web/Table/IcingaHostAppliedServicesTable.php:107
+#, php-format
+msgid "%s %s(%s)"
+msgstr "%s %s(%s)"
+
+#: library/Director/Web/Table/ObjectSetTable.php:57
+#, php-format
+msgid "%s (%d members)"
+msgstr "%s (%d membri)"
+
+#: application/controllers/HostController.php:178
+#: application/controllers/HostController.php:262
+#, php-format
+msgid "%s (Applied Service set)"
+msgstr "%s (Service-Set associati)"
+
+#: application/controllers/HostController.php:312
+#, php-format
+msgid "%s (Service set)"
+msgstr "%s (Service-Set)"
+
+#: application/forms/SelfServiceSettingsForm.php:243
+#: application/forms/SettingsForm.php:177
+#, php-format
+msgid "%s (default)"
+msgstr "%s (default)"
+
+#: library/Director/Web/Controller/TemplateController.php:71
+#, php-format
+msgid "%s Templates"
+msgstr "%s Template"
+
+#: library/Director/Web/Controller/TemplateController.php:36
+#, php-format
+msgid "%s based on %s"
+msgstr "%s basato su %s"
+
+#: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:112
+#, php-format
+msgid "%s config changes happend since the last deployed configuration"
+msgstr ""
+"%s cambimenti di configurazione dopo l'ultima distribuzione di configurazioni"
+
+#: application/forms/IcingaServiceForm.php:256
+#, php-format
+msgid "%s has been blacklisted on %s"
+msgstr "%s é stato messo in blacklist %s"
+
+#: application/forms/IcingaServiceForm.php:292
+#, php-format
+msgid "%s is no longer blacklisted on %s"
+msgstr "%s non é più nella lista di blacklist %s"
+
+#: library/Director/Web/Widget/SyncRunDetails.php:48
+#, php-format
+msgid "%s objects have been modified"
+msgstr "%s oggetti sono stati cambiati"
+
+#: application/controllers/HostController.php:460
+#, php-format
+msgid "%s on %s (from set: %s)"
+msgstr "%s auf %s (da questo set \"%s\")"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:288
+#, php-format
+msgid "%s related group objects have been created"
+msgstr "sono stati creati %s oggetti di gruppo associati"
+
+#: library/Director/Web/Controller/TemplateController.php:74
+#, php-format
+msgid "%s templates based on %s"
+msgstr "%s template basati su %s"
+
+#: library/Director/Web/Widget/HealthCheckPluginOutput.php:46
+#, php-format
+msgid "%s: %d"
+msgstr "%s: %d"
+
+#: application/controllers/BasketController.php:193
+#, php-format
+msgid "%s: %s (Snapshot)"
+msgstr "%s: %s (Snapshot)"
+
+#: application/controllers/ImportsourceController.php:224
+#, php-format
+msgid "%s: Property Modifier"
+msgstr "%s: modificatore di proprietá"
+
+#: application/controllers/BasketController.php:144
+#, php-format
+msgid "%s: Snapshots"
+msgstr "%s: Snapshots"
+
+#: application/controllers/ImportsourceController.php:198
+#, php-format
+msgid "%s: add Property Modifier"
+msgstr "%s: aggiunta di modificatore di proprietá"
+
+#: library/Director/Db/Housekeeping.php:54
+msgid "(Host) group resolve cache"
+msgstr "cache di risoluzione gruppo (Hosts)"
+
+#: application/controllers/ServiceController.php:169
+#, php-format
+msgid "(on %s)"
+msgstr "(su %s)"
+
+#: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:234
+msgid "- add more -"
+msgstr "- aggiungere altro -"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1065
+msgid "- click to add more -"
+msgstr "- premi per aggiungere altro -"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:622
+msgid "- inherited -"
+msgstr "- eereditato -"
+
+#: application/forms/SelfServiceSettingsForm.php:66
+msgid "- no automatic installation -"
+msgstr "- nessuna installazione automatica -"
+
+#: application/views/helpers/FormDataFilter.php:465
+#: application/controllers/ConfigController.php:363
+#: application/controllers/ConfigController.php:374
+#: application/forms/SelfServiceSettingsForm.php:239
+#: application/forms/SettingsForm.php:181
+#: library/Director/Web/Form/QuickBaseForm.php:120
+#: library/Director/DataType/DataTypeDirectorObject.php:43
+#: library/Director/DataType/DataTypeSqlQuery.php:37
+#: library/Director/Job/ImportJob.php:118
+#: library/Director/Job/SyncJob.php:124
+msgid "- please choose -"
+msgstr "- prego scegliere -"
+
+#: application/controllers/SyncruleController.php:375
+#, php-format
+msgid "...and %d more"
+msgstr "...e %d altro"
+
+#: application/controllers/BasketsController.php:34
+msgid ""
+"A Configuration Basket references specific Configuration Objects or all "
+"objects of a specific type. It has been designed to share Templates, Import/"
+"Sync strategies and other base Configuration Objects. It is not a tool to "
+"operate with single Hosts or Services."
+msgstr ""
+"Un basket di configurazione si riferisce ad elementi di configurazione o tutti "
+"gli oggetti di un particolare tipo. É stato sviluppato per condividere Template, "
+"strategie di Import/Sync e altri elementi base di configurazione. "
+"Questo non é uno strumento per configurare singoli Host o Services"
+
+#: library/Director/Import/ImportSourceLdap.php:61
+msgid ""
+"A custom LDAP filter to use in addition to the object class. This allows for "
+"a lot of flexibility but requires LDAP filter skills. Simple filters might "
+"look as follows: operatingsystem=*server*"
+msgstr ""
+"Un filtro LDAP aggiuntivo da usare insieme alla classe dell'oggetto. "
+"Questo permette una grande flessibilitá ma necessita di conoscenze "
+"profonde sui filtri LDAP. Filtri semplici possono essere di questo tipo: "
+"operatingsystem=*server*"
+
+#: application/forms/SyncPropertyForm.php:214
+msgid ""
+"A custom string. Might contain source columns, please use placeholders of "
+"the form ${columnName} in such case. Structured data sources can be "
+"referenced as ${columnName.sub.key}"
+msgstr ""
+"Una stringa personalizzata. Se sono presenti colonne sorgenti, devono "
+"venir usati segnaposti nella forma di ${columnName}. È possibile fare "
+"riferimento a dati strutturati tramite ${columnName.sub.key"
+
+
+#: application/forms/IcingaObjectFieldForm.php:134
+msgid "A description about the field"
+msgstr "Una descrizione del campo"
+
+#: application/forms/IcingaTemplateChoiceForm.php:59
+msgid "A detailled description explaining what this choice is all about"
+msgstr "Una descrizione dettagliata sull'obiettivo di questa selezione"
+
+#: application/forms/IcingaServiceSetForm.php:102
+msgid ""
+"A meaningful description explaining your users what to expect when assigning "
+"this set of services"
+msgstr ""
+"Una descrizione significativa che spiega agli utenti cosa aspettarsi "
+"dall'assegnazione di questo service set"
+
+
+# Geschlecht kann hier leider nicht bestimmt werden -ThW
+#: application/forms/IcingaTimePeriodRangeForm.php:85
+#: application/forms/IcingaScheduledDowntimeRangeForm.php:90
+#: library/Director/Web/Form/DirectorObjectForm.php:652
+#, php-format
+msgid "A new %s has successfully been created"
+msgstr "Un nuovo %s é stato creato con successo"
+
+#: application/forms/IcingaGenerateApiKeyForm.php:39
+#, php-format
+msgid "A new Self Service API key for %s has been generated"
+msgstr "Un nuovo Self Service API per %s é stato creato con successo"
+
+#: application/forms/ImportRowModifierForm.php:72
+msgid ""
+"A property modifier allows you to modify a specific property at import time"
+msgstr ""
+"Un modificatore di proprietà consente di modificare una proprietà specifica "
+"al momento dell'importazione"
+
+
+#: application/forms/ImportSourceForm.php:17
+msgid ""
+"A short name identifying this import source. Use something meaningful, like "
+"\"Hosts from Puppet\", \"Users from Active Directory\" or similar"
+msgstr ""
+"Un breve nome per definire questa sorgente di importazione. "
+"Usa qualcosa di significativo come \"Hosts da Puppet\" o \"utenti da LDAP\" "
+
+
+#: application/forms/DirectorJobForm.php:74
+msgid ""
+"A short name identifying this job. Use something meaningful, like \"Import "
+"Puppet Hosts\""
+msgstr ""
+"Un breve nome per descrivere questa operazione. "
+"Usa qualcosa di significativo come \"Importazione di Host da Puppet\" "
+
+#: application/forms/IcingaServiceSetForm.php:30
+msgid "A short name identifying this set of services"
+msgstr "Un breve nome per questo Service-Set"
+
+#: library/Director/Web/SelfService.php:211
+#, php-format
+msgid ""
+"A ticket for this agent could not have been requested from your deployment "
+"endpoint: %s"
+msgstr ""
+"Non è stato possibile richiedere un ticket per questo agent da questo endpoint: %s "
+
+
+#: library/Director/Dashboard/Dashlet/DeploymentDashlet.php:95
+#, php-format
+msgid ""
+"A total of %d config changes happened since your last deployed config has "
+"been rendered"
+msgstr ""
+"Nel complesso, la configurazione è stata modificata %d volte dall'ultima distribuzione"
+
+#: application/forms/IcingaHostSelfServiceForm.php:49
+msgid "API Key"
+msgstr "API Key"
+
+#: application/forms/IcingaEndpointForm.php:46
+#: application/forms/KickstartForm.php:151
+msgid "API user"
+msgstr "utente API"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1393
+msgid "Accept passive checks"
+msgstr "Accetta check passivi"
+
+#: application/forms/IcingaHostForm.php:93
+msgid "Accepts config"
+msgstr "Accetta configurazioni"
+
+# Aktuell wird es so in anderen Modulen übersetzt. -ThW
+#: library/Director/IcingaConfig/TypeFilterSet.php:28
+msgid "Acknowledgement"
+msgstr "Conferma"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:544
+#: library/Director/Web/Widget/ActivityLogInfo.php:555
+#: library/Director/Web/Table/ConfigFileDiffTable.php:81
+msgid "Action"
+msgstr "Azione"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1506
+msgid "Action URL"
+msgstr "Action-URL"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:578
+#: library/Director/Web/Widget/DeployedConfigInfoHeader.php:62
+#: library/Director/Web/Table/QuickTable.php:280
+msgid "Actions"
+msgstr "Azione"
+
+#: application/forms/SettingsForm.php:163
+msgid "Activation Tool"
+msgstr "Strumento di attivazione"
+
+#: application/forms/SettingsForm.php:142
+msgid "Active-Passive"
+msgstr "Attivo-passivo"
+
+#: library/Director/Web/Widget/SyncRunDetails.php:27
+msgid "Activity"
+msgstr "Attivitá"
+
+#: application/controllers/ConfigController.php:141
+#: library/Director/Dashboard/Dashlet/ActivityLogDashlet.php:11
+#: library/Director/Web/Tabs/InfraTabs.php:29
+msgid "Activity Log"
+msgstr "Log di attivitá"
+
+#: library/Director/Web/Controller/ObjectController.php:240
+#, php-format
+msgid "Activity Log: %s"
+msgstr "Log di attivitá: %s"
+
+#: configuration.php:138
+msgid "Activity log"
+msgstr "Log di attivitá"
+
+#: application/controllers/DataController.php:22
+#: application/controllers/DataController.php:65
+#: application/forms/AddToBasketForm.php:72
+#: library/Director/Web/Form/DirectorObjectForm.php:503
+#: library/Director/Web/Controller/ActionController.php:144
+#: library/Director/Web/Controller/ObjectsController.php:295
+#: library/Director/Web/Controller/ObjectsController.php:336
+#: library/Director/Web/ActionBar/ChoicesActionBar.php:16
+#: library/Director/Web/ActionBar/ObjectsActionBar.php:16
+#: library/Director/Web/ActionBar/TemplateActionBar.php:19
+msgid "Add"
+msgstr "Aggiungere"
+
+#: library/Director/Web/Controller/ObjectController.php:78
+#: library/Director/Web/Tabs/ObjectTabs.php:51
+#, php-format
+msgid "Add %s"
+msgstr "%s aggiunto"
+
+#: application/forms/AddToBasketForm.php:68
+#, php-format
+msgid "Add %s objects"
+msgstr "%s oggetti aggiunti"
+
+#: library/Director/Web/Controller/ObjectController.php:381
+#, php-format
+msgid "Add %s: %s"
+msgstr "Aggiungere %s: %s"
+
+#: application/controllers/HostsController.php:40
+#: application/controllers/HostsController.php:79
+msgid "Add Service"
+msgstr "Aggiungere Service"
+
+#: application/controllers/HostsController.php:45
+#: application/controllers/HostsController.php:110
+msgid "Add Service Set"
+msgstr "Aggiungere Service-Set"
+
+#: application/controllers/HostsController.php:127
+#, php-format
+msgid "Add Service Set to %d hosts"
+msgstr "Aggiungi Service-Set a %d Hosts"
+
+#: application/controllers/HostController.php:74
+#, php-format
+msgid "Add Service Set to %s"
+msgstr "Aggiungi Service-Set a %s"
+
+#: application/controllers/HostController.php:61
+#, php-format
+msgid "Add Service to %s"
+msgstr "Aggiungi Service a %s"
+
+#: application/controllers/DatafieldController.php:39
+msgid "Add a new Data Field"
+msgstr "Aggiungi un nuovo campo dati"
+
+#: application/controllers/DataController.php:52
+msgid "Add a new Data List"
+msgstr "Aggiungi un nuovo elenco di dati"
+
+#: application/controllers/ImportsourcesController.php:49
+msgid "Add a new Import Source"
+msgstr "Aggiungi una nuova sorgente di importazione"
+
+#: application/controllers/JobsController.php:15
+#: application/controllers/JobController.php:32
+msgid "Add a new Job"
+msgstr "Aggiungi un nuovo Job"
+
+#: application/controllers/SyncrulesController.php:28
+msgid "Add a new Sync Rule"
+msgstr "Aggiungi una nuova regola di sincronizzazione"
+
+#: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:470
+msgid "Add a new entry"
+msgstr "Aggiungi un nuova voce"
+
+#: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:256
+msgid "Add a new one..."
+msgstr "Aggiungi un nuovo..."
+
+#: application/controllers/ServicesetController.php:49
+#, php-format
+msgid "Add a service set to \"%s\""
+msgstr "Aggiungi un Service-Set a \"%s\" "
+
+#: application/controllers/ServiceController.php:105
+#, php-format
+msgid "Add a service to \"%s\""
+msgstr "Aggiungi un Service a \"%s\" "
+
+#: application/views/helpers/FormDataFilter.php:516
+msgid "Add another filter"
+msgstr "Aggiungi un altro filtro"
+
+#: application/controllers/BasketController.php:83
+msgid "Add chosen objects to a Configuration Basket"
+msgstr "Aggiungi oggetti selezionati al basket di configurazione"
+
+#: application/forms/DirectorDatalistEntryForm.php:60
+msgid "Add data list entry"
+msgstr "Aggiungi la voce dell'elenco dati"
+
+#: application/controllers/ImportsourceController.php:90
+msgid "Add import source"
+msgstr "Aggiungi sorgente di importazione"
+
+#: library/Director/Web/Controller/ObjectController.php:387
+#, php-format
+msgid "Add new Icinga %s"
+msgstr "Aggiungi un nuovo Icinga %s"
+
+#: library/Director/Web/Controller/ObjectController.php:370
+#, php-format
+msgid "Add new Icinga %s template"
+msgstr "Aggiungi nuovo Icinga al template %s"
+
+#: application/controllers/ImportsourceController.php:171
+msgid "Add property modifier"
+msgstr "Aggiungi modificatore di proprietá"
+
+#: application/controllers/HostController.php:90
+#: application/controllers/ServicesetController.php:66
+msgid "Add service"
+msgstr "Aggiungi Service"
+
+#: application/controllers/HostController.php:95
+msgid "Add service set"
+msgstr "Aggiungi Service-Set"
+
+#: application/controllers/HostsController.php:96
+#, php-format
+msgid "Add service to %d hosts"
+msgstr "Aggiungi un Service a %d Hosts"
+
+#: application/controllers/SyncruleController.php:524
+msgid "Add sync property rule"
+msgstr "Aggiungi regola di sincronizzazione"
+
+#: application/controllers/SyncruleController.php:563
+#, php-format
+msgid "Add sync property: %s"
+msgstr "Aggiungi proprietá di sincronizzazione: %s"
+
+#: application/controllers/SyncruleController.php:475
+msgid "Add sync rule"
+msgstr "Aggiungere regola di sincronizzazione"
+
+#: application/controllers/HostsController.php:70
+#: application/controllers/BasketController.php:82
+#: application/controllers/ServicesController.php:36
+#: application/controllers/JobController.php:79
+#: application/controllers/DataController.php:128
+#: application/controllers/ImportsourceController.php:57
+#: application/controllers/SyncruleController.php:612
+#: library/Director/Web/Controller/ObjectController.php:352
+#: library/Director/Web/Controller/TemplateController.php:128
+msgid "Add to Basket"
+msgstr "Aggiungere a Basket"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1492
+msgid "Additional notes for this object"
+msgstr "Note aggiuntive per questo oggetto"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1545
+msgid "Additional properties"
+msgstr "Proprietá aggiuntive"
+
+#: library/Director/Web/Tabs/ObjectTabs.php:140
+msgid "Agent"
+msgstr "Agent"
+
+#: application/forms/SelfServiceSettingsForm.php:141
+msgid "Agent Version"
+msgstr "Versione Agent"
+
+#: application/forms/IcingaHostSelfServiceForm.php:31
+msgid "Alias"
+msgstr "Alias"
+
+#: application/controllers/ConfigController.php:154
+msgid "All changes"
+msgstr "Tutte le modifiche"
+
+#: application/forms/SettingsForm.php:78
+msgid ""
+"All changes are tracked in the Director database. In addition you might also "
+"want to send an audit log through the Icinga Web 2 logging mechanism. That "
+"way all changes would be written to either Syslog or the configured log "
+"file. When enabling this please make sure that you configured Icinga Web 2 "
+"to log at least at \"informational\" level."
+msgstr ""
+"Tutte le modifiche vengono loggate nel database del Director. Inoltre, è possibile "
+"inviare un log tramite il meccanismo di logging di Icinga Web 2. "
+"In questo modo tutte le modifiche vengono scritte nel Syslog o il log file configurato. "
+"Per ottenere questo risultato Icinga 2 deve girare almeno con il livello di Log \"Info\"."
+
+
+#: application/forms/SyncPropertyForm.php:308
+msgid "All custom variables (vars)"
+msgstr "Tutte le variabili personalizzate (vars)"
+
+#: application/forms/BasketForm.php:52
+msgid "All of them"
+msgstr "Tutte queste"
+
+#: application/forms/IcingaServiceForm.php:730
+#, php-format
+msgid "All overrides have been removed from \"%s\""
+msgstr "Tutte le sovrascritture sono state rimosse da \"%s\""
+
+#: library/Director/Web/Controller/ObjectsController.php:287
+#, php-format
+msgid "All your %s Apply Rules"
+msgstr "Tutte le regole Apply %s"
+
+#: library/Director/Web/Controller/ObjectsController.php:232
+#, php-format
+msgid "All your %s Templates"
+msgstr "Tutti i Template %s"
+
+#: application/forms/SelfServiceSettingsForm.php:174
+msgid "Allow Updates"
+msgstr "Abilitare le modifiche"
+
+#: library/Director/DataType/DataTypeDatalist.php:146
+msgid "Allow for values not on the list"
+msgstr "Consenti valori non presenti nell'elenco"
+
+#: configuration.php:31
+msgid "Allow readonly users to see where a Service came from"
+msgstr "Consenti agli utenti di sola lettura di vedere da dove proviene un servizio"
+
+#: configuration.php:6
+msgid "Allow to access the director API"
+msgstr "Consentire l'accesso all'API del Director"
+
+#: configuration.php:7
+msgid "Allow to access the full audit log"
+msgstr "Consentire di accedere all'audit log completo"
+
+#: configuration.php:17
+msgid "Allow to configure hosts"
+msgstr "Consenti la configurazione di Host"
+
+#: configuration.php:22
+msgid "Allow to configure notifications"
+msgstr "Consenti la configurazione di notifiche"
+
+#: configuration.php:19
+msgid "Allow to configure service sets"
+msgstr "Consenti la configurazione di Service-Sets"
+
+#: configuration.php:18
+msgid "Allow to configure services"
+msgstr "Consenti la configurazione di Services"
+
+#: configuration.php:21
+msgid "Allow to configure users"
+msgstr "Consenti la configurazione di utenti"
+
+#: configuration.php:20
+msgid "Allow to define Service Set Apply Rules"
+msgstr "Consenti la definizione di regole Apply Service-Set"
+
+#: configuration.php:16
+msgid "Allow to deploy configuration"
+msgstr "Consentire la distribuzione delle configurazioni"
+
+#: configuration.php:26
+msgid ""
+"Allow to inspect objects through the Icinga 2 API (could contain sensitive "
+"information)"
+msgstr ""
+"Consentire di ispezionare oggetti tramite l'API Icinga 2 (potrebbe contenere elementi "
+"sensibili)"
+
+
+#: configuration.php:10
+msgid "Allow to show configuration (could contain sensitive information)"
+msgstr "Consenti di mostrare la configurazione (potrebbe contenere informazioni riservate)"
+
+#: configuration.php:14
+msgid "Allow to show the full executed SQL queries in some places"
+msgstr ""
+"Consentire di mostrare le query SQL eseguite completamente in "
+"alcuni punti"
+
+
+#: application/forms/DirectorDatalistEntryForm.php:48
+msgid ""
+"Allow to use this entry only to users with one of these Icinga Web 2 roles"
+msgstr ""
+"Consentire di utilizzare questa voce solo agli utenti con uno di questi "
+"ruoli Icinga Web 2"
+
+
+#: configuration.php:33
+msgid "Allow unrestricted access to Icinga Director"
+msgstr "Consentire l'accesso senza restrizioni a Icinga Director"
+
+#: application/forms/IcingaTemplateChoiceForm.php:85
+msgid "Allowed maximum"
+msgstr "Massimo consentito"
+
+#: application/forms/DirectorDatalistEntryForm.php:44
+msgid "Allowed roles"
+msgstr "Ruoli consentiti"
+
+#: application/forms/IcingaCloneObjectForm.php:85
+msgid "Also clone fields provided by this Template"
+msgstr "Clona anche i campi forniti da questo Template"
+
+#: application/forms/IcingaCloneObjectForm.php:53
+msgid "Also clone single Service Sets defined for this Host"
+msgstr "Clonare anche singoli Service Sets definiti per questo Host"
+
+#: application/forms/IcingaCloneObjectForm.php:44
+msgid "Also clone single Services defined for this Host"
+msgstr "Clonare anche singoli Services definiti per questo Host"
+
+#: application/forms/SelfServiceSettingsForm.php:191
+msgid ""
+"Also install NSClient++. It can be used through the Icinga Agent and comes "
+"with a bunch of additional Check Plugins"
+msgstr ""
+"Installa anche NSClient++. Può essere utilizzato tramite l'agente Icinga e arriva "
+"con parecchi Check-Plugins aggiuntivi"
+
+#: application/forms/DirectorDatafieldForm.php:109
+#, php-format
+msgid "Also rename all \"%s\" custom variables to \"%s\" on %d objects?"
+msgstr ""
+"Rinominare anche variabili personalizzate da \"%s\" a \"%s\" su %d questi "
+"oggetti?"
+
+#: application/forms/DirectorDatafieldForm.php:66
+#, php-format
+msgid "Also wipe all \"%s\" custom variables from %d objects?"
+msgstr ""
+"Pulisci anche tutti le variabili personalizzate \"%s\" dagli %d oggetti?"
+
+#: application/forms/IcingaHostForm.php:336
+msgid ""
+"Alternative name for this host. Might be a host alias or and kind of string "
+"helping your users to identify this host"
+msgstr ""
+"Nome alternativo per questo Host. Può essere un Alias o qualsiasi stringa, "
+"aiuta gli utenti nell'identificare questo Host"
+
+#: application/forms/IcingaUserForm.php:135
+msgid ""
+"Alternative name for this user. In case your object name is a username, this "
+"could be the full name of the corresponding person"
+msgstr ""
+"Nome alternativo per questo utente. Se il nome dell'oggetto fosse uno username, "
+"potrebbe essere utile usare il nome completo della persona."
+
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1526
+msgid "Alternative text to be shown in case above icon is missing"
+msgstr "Testo alternativo da mostrare nel caso in cui l'icona manchi"
+
+#: application/forms/IcingaCommandArgumentForm.php:91
+msgid ""
+"An Icinga DSL expression that returns a boolean value, e.g.: var cmd = "
+"bool(macro(\"$cmd$\")); return cmd ..."
+msgstr ""
+"Un'espressione Icinga DSL che restituisce un valore booleano, e.g.: var cmd "
+"= bool(macro(\"$cmd$\")); return cmd ..."
+
+#: application/forms/IcingaCommandArgumentForm.php:52
+msgid ""
+"An Icinga DSL expression, e.g.: var cmd = macro(\"$cmd$\"); return "
+"typeof(command) == String ..."
+msgstr ""
+"Un'espressione Icinga DSL, e.g.: var cmd = macro(\"$cmd$\"); return "
+"typeof(command) == String ..."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1508
+msgid ""
+"An URL leading to additional actions for this object. Often used with Icinga "
+"Classic, rarely with Icinga Web 2 as it provides far better possibilities to "
+"integrate addons"
+msgstr ""
+"Un URL che porta ad azioni aggiuntive per questo oggetto. Viene usato spesso con Icinga "
+"Classic, meno usato con Icinga Web 2, in quanto quest'ultimo offre soluzioni di Addons migliori"
+
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1501
+msgid "An URL pointing to additional notes for this object"
+msgstr "Un URL che punta a note aggiuntive per questo oggetto"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1517
+msgid ""
+"An URL pointing to an icon for this object. Try \"tux.png\" for icons "
+"relative to public/img/icons or \"cloud\" (no extension) for items from the "
+"Icinga icon font"
+msgstr ""
+"Un URL che punta ad un'icona per questo oggetto. Prova \"tux.png\" per icone relatice al path "
+"public/img/icons o \"cloud\" (senza estensione) per oggetti dall'Icinga icon font."
+
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1273
+msgid ""
+"An alternative display name for this group. If you wonder how this could be "
+"helpful just leave it blank"
+msgstr ""
+"Un nome visualizzato alternativo per questo gruppo. Può essere lasciato vuoto."
+
+#: application/forms/ImportRowModifierForm.php:54
+msgid ""
+"An extended description for this Import Row Modifier. This should explain "
+"it's purpose and why it has been put in place at all."
+msgstr ""
+"Una descrizione estesa per questo modificatore di riga di importazione. "
+"Questo dovrebbe indicare il suo scopo e perché è stato messo in atto."
+
+#: application/forms/ImportSourceForm.php:26
+msgid ""
+"An extended description for this Import Source. This should explain what "
+"kind of data you're going to import from this source."
+msgstr ""
+"Una descrizione estesa per questa sorgente di importazione. "
+"Questo dovrebbe indicare che tipo di dati verranno importati da questa sorgente"
+
+#: application/forms/SyncRuleForm.php:38
+msgid ""
+"An extended description for this Sync Rule. This should explain what this "
+"Rule is going to accomplish."
+msgstr ""
+"Una descrizione estesa per questa regola di sincronizzazione. "
+"Questo dovrebbe indicare ciò che questa regola sta per realizzare."
+
+#: application/forms/DirectorDatafieldForm.php:161
+msgid ""
+"An extended description for this field. Will be shown as soon as a user puts "
+"the focus on this field"
+msgstr ""
+"Una descrizione estesa per questo campo. "
+"Verrà mostrato non appena un utente si sposta su questo campo"
+
+#: library/Director/Import/ImportSourceLdap.php:55
+msgid ""
+"An object class to search for. Might be \"user\", \"group\", \"computer\" or "
+"similar"
+msgstr ""
+"Una classe di oggetti da cercare. e.g. \"user\", \"group\", "
+"\"computer\" o simili"
+
+#: library/Director/PropertyModifier/PropertyModifierGetPropertyFromOtherImportSource.php:35
+msgid ""
+"Another Import Source. We're going to look up the row with the key matching "
+"the value in the chosen column"
+msgstr ""
+"Un'altra sorgente di importazione. Verrà individuata la riga la cui chiave "
+"corrisponde al valore nella colonna scelta"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:20
+msgid "Any first (leftmost) component"
+msgstr "Qualsiasi primo componente (più a sinistra)"
+
+#: library/Director/Web/SelfService.php:115
+msgid "Api Key:"
+msgstr "API Key:"
+
+#: library/Director/Web/Controller/TemplateController.php:53
+#, php-format
+msgid "Applied %s"
+msgstr "Applicato %s"
+
+#: application/forms/IcingaHostForm.php:217
+msgid "Applied groups"
+msgstr "Applicato a gruppi"
+
+#: application/controllers/HostController.php:344
+#, php-format
+msgid "Applied service: %s"
+msgstr "Applicato service: %s"
+
+#: application/controllers/HostController.php:189
+#: application/controllers/HostController.php:277
+msgid "Applied services"
+msgstr "Applicato services"
+
+#: library/Director/Web/Tabs/ObjectsTabs.php:45
+msgid "Apply"
+msgstr "Applica"
+
+#: application/controllers/ServiceController.php:110
+#, php-format
+msgid "Apply \"%s\""
+msgstr "Applica \"%s\""
+
+#: application/forms/ApplyMigrationsForm.php:25
+#, php-format
+msgid "Apply %d pending schema migrations"
+msgstr "Applica %d migrazione di schema in sospeso"
+
+#: application/forms/IcingaServiceForm.php:609
+msgid "Apply For"
+msgstr "Applica a"
+
+#: library/Director/Web/Controller/TemplateController.php:168
+msgid "Apply Rule"
+msgstr "Regola Apply"
+
+#: library/Director/Web/Table/ApplyRulesTable.php:161
+msgid "Apply Rule rendering preview"
+msgstr "Anteprima di come risulta la regola applicata"
+
+#: library/Director/Web/Table/DependencyTemplateUsageTable.php:11
+#: library/Director/Web/Table/NotificationTemplateUsageTable.php:11
+#: library/Director/Web/Table/ServiceTemplateUsageTable.php:12
+msgid "Apply Rules"
+msgstr "Regole Apply"
+
+#: application/forms/ApplyMigrationsForm.php:20
+msgid "Apply a pending schema migration"
+msgstr "Applicare una migrazione dello schema in sospeso"
+
+#: library/Director/Job/SyncJob.php:92
+msgid "Apply changes"
+msgstr "Applica le modifiche"
+
+#: library/Director/Dashboard/Dashlet/NotificationApplyDashlet.php:19
+msgid "Apply notifications with specific properties according to given rules. "
+msgstr ""
+"Applica notifiche con proprietà specifiche in base a determinate regole."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1098
+msgid "Apply rule"
+msgstr "Applica regole"
+
+#: library/Director/Web/Table/ApplyRulesTable.php:168
+msgid "Apply rule history"
+msgstr "Storico delle regole applicate"
+
+#: application/forms/KickstartForm.php:38
+msgid "Apply schema migrations"
+msgstr "Applica schema di migrazione"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:78
+#: application/forms/IcingaDependencyForm.php:93
+#: application/forms/IcingaNotificationForm.php:81
+msgid "Apply to"
+msgstr "Applica a"
+
+#: application/controllers/ServiceController.php:206
+#, php-format
+msgid "Apply: %s"
+msgstr "Applica: %s"
+
+#: library/Director/Web/Table/IcingaCommandArgumentTable.php:45
+msgid "Argument"
+msgstr "Argomento"
+
+#: application/forms/IcingaObjectFieldForm.php:99
+msgid "Argument macros"
+msgstr "Argomento macro"
+
+#: application/forms/IcingaCommandArgumentForm.php:25
+msgid "Argument name"
+msgstr "Nome argomento"
+
+#: application/forms/SyncPropertyForm.php:314
+msgid "Arguments"
+msgstr "Argomenti"
+
+#: library/Director/DataType/DataTypeDirectorObject.php:77
+#: library/Director/DataType/DataTypeSqlQuery.php:77
+#: library/Director/DataType/DataTypeDatalist.php:131
+msgid "Array"
+msgstr "Array"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1578
+msgid "Assign where"
+msgstr "Assegna dove"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:27
+#: library/Director/Web/Widget/ActivityLogInfo.php:536
+msgid "Author"
+msgstr "Autore"
+
+#: library/Director/DataType/DataTypeDatalist.php:144
+msgid "Autocomplete"
+msgstr "Autocompletamento"
+
+#: library/Director/Dashboard/AutomationDashboard.php:15
+msgid "Automate all tasks"
+msgstr "Automatizza tutte le operazioni"
+
+#: configuration.php:134
+msgid "Automation"
+msgstr "Automazione"
+
+#: application/forms/IcingaTemplateChoiceForm.php:64
+msgid "Available choices"
+msgstr "Scelte disponibili"
+
+#: application/controllers/BasketController.php:50
+#: library/Director/Web/Controller/TemplateController.php:94
+msgid "Back"
+msgstr "Indietro"
+
+#: application/controllers/BasketController.php:32
+#: application/forms/AddToBasketForm.php:60
+#: library/Director/Web/Table/BasketTable.php:31
+msgid "Basket"
+msgstr "Basket"
+
+#: application/forms/BasketForm.php:34
+msgid "Basket Definitions"
+msgstr "Definizioni Basket"
+
+#: application/forms/BasketUploadForm.php:29
+#: application/forms/BasketForm.php:44
+msgid "Basket Name"
+msgstr "Nome Basket"
+
+#: application/controllers/BasketController.php:140
+msgid "Basket Snapshots"
+msgstr "Basket Snapshots"
+
+#: application/forms/BasketUploadForm.php:145
+msgid "Basket has been uploaded"
+msgstr "Il Basket é stato caricato"
+
+#: application/controllers/BasketController.php:76
+#: application/controllers/BasketsController.php:17
+msgid "Baskets"
+msgstr "Baskets"
+
+#: application/forms/SyncRuleForm.php:87
+msgid ""
+"Be careful: this is usually NOT what you want, as it makes Sync \"blind\" "
+"for objects matching this filter. This means that \"Purge\" will not work as "
+"expected. The \"Black/Whitelist\" Import Property Modifier is probably what "
+"you're looking for."
+msgstr ""
+"Fai attenzione: di solito NON è quello che vuoi, poiché fa la "
+"Sync \"blind\" per tutti gli oggetti corrispondenti a questo filtro. Ciò significa che "
+" \"Purge\" non funzionerà come ci si aspetta. Ti consigliamo di usare invece il \"Black/Whitelist\" "
+"Import Modificatore proprietà."
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:72
+msgid "Binary"
+msgstr "Binary"
+
+#: application/forms/IcingaServiceForm.php:160
+msgid "Blacklist"
+msgstr "Blacklist"
+
+#: application/forms/IcingaObjectFieldForm.php:125
+#: application/forms/DirectorDatafieldForm.php:150
+msgid "Caption"
+msgstr "Didascalia"
+
+#: application/forms/IcingaMultiEditForm.php:269
+#, php-format
+msgid "Changing this value affects %d object(s): %s"
+msgstr "La modifica di questo valore influisce %d oggett(o,i): %s"
+
+#: library/Director/Import/ImportSourceCoreApi.php:57
+msgid "Check Commands"
+msgstr "Check Commands"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1294
+msgid "Check command"
+msgstr "Check command"
+
+#: application/forms/IcingaNotificationForm.php:255
+#: library/Director/Web/Form/DirectorObjectForm.php:1295
+msgid "Check command definition"
+msgstr "Definizione Check command"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1363
+msgid ""
+"Check command timeout in seconds. Overrides the CheckCommand's timeout "
+"attribute"
+msgstr ""
+"Check command timeout in secondi. Sovrascrive l'attributo timeout del commando"
+
+
+#: library/Director/Web/Form/DirectorObjectForm.php:323
+msgid "Check execution"
+msgstr "Check execution"
+
+#: application/forms/SyncCheckForm.php:23
+#: application/forms/ImportCheckForm.php:23
+msgid "Check for changes"
+msgstr "Verifica le modifiche"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1330
+msgid "Check interval"
+msgstr "Check interval"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1375
+msgid "Check period"
+msgstr "Check period"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1361
+msgid "Check timeout"
+msgstr "Check timeout"
+
+#: application/forms/ImportCheckForm.php:45
+msgid "Checking this Import Source failed"
+msgstr "Verifica di questa sorgente di importazione non riuscita"
+
+#: application/forms/SyncCheckForm.php:61
+msgid "Checking this sync rule failed"
+msgstr "Verifica della regola di sincronizzazione non riuscita"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:573
+msgid "Checksum"
+msgstr "Checksum"
+
+#: application/forms/IcingaDependencyForm.php:233
+msgid "Child Host"
+msgstr "Host-figlio"
+
+#: application/forms/IcingaDependencyForm.php:246
+msgid "Child Service"
+msgstr "Service-figlio"
+
+#: application/forms/IcingaTemplateChoiceForm.php:48
+msgid "Choice name"
+msgstr "Nome scelto"
+
+#: library/Director/Dashboard/Dashlet/ChoicesDashlet.php:11
+#: library/Director/Web/Tabs/ObjectsTabs.php:70
+msgid "Choices"
+msgstr "Selezione"
+
+#: application/forms/BasketForm.php:78
+msgid ""
+"Choose \"All\" to always add all of them, \"Ignore\" to not care about a "
+"specific Type at all and opt for \"Custom Selection\" in case you want to "
+"choose just some specific Objects."
+msgstr ""
+"Scegli \"Tutti\" per aggiungere sempre tutti, \"Ignora\" per non includere uno "
+"specifico Tipo e scegli \"Selezione personalizzata\" nel caso in cui si vogliano "
+"includere solo alcuni oggetti specifici."
+
+
+#: application/forms/IcingaHostForm.php:176
+msgid "Choose a Host Template"
+msgstr "Scegli un Host template"
+
+#: application/forms/IcingaAddServiceForm.php:107
+msgid "Choose a service template"
+msgstr "Scegli un Service template"
+
+#: application/forms/SyncRuleForm.php:46
+msgid "Choose an object type"
+msgstr "Scegli un tipo di oggetto"
+
+#: application/forms/BasketUploadForm.php:35
+msgid "Choose file"
+msgstr "Scegli un file"
+
+#: application/forms/IcingaServiceForm.php:587
+msgid "Choose the host this single service should be assigned to"
+msgstr "Scegli l'Host a cui assegnare questo singolo servizio"
+
+#: application/forms/IcingaTemplateChoiceForm.php:75
+msgid ""
+"Choosing this many options will be mandatory for this Choice. Setting this "
+"to zero will leave this Choice optional, setting it to one results in a "
+"\"required\" Choice. You can use higher numbers to enforce multiple options, "
+"this Choice will then turn into a multi-selection element."
+msgstr ""
+"La scelta di molte opzioni sarà obbligatoria per questa scelta. Impostando questo "
+"su zero, questa scelta sarà facoltativa, impostandola su uno diventerà una scelta "
+"\"obbligatorio\". È possibile utilizzare numeri più alti per applicare più opzioni, "
+"questa scelta si trasformerà quindi in un elemento a selezione multipla."
+
+
+#: application/forms/IcingaZoneForm.php:37
+msgid "Chose an (optional) parent zone"
+msgstr "Scegli una zona padre (facoltativa)"
+
+#: library/Director/Web/Widget/Documentation.php:31
+#, php-format
+msgid "Click to read our documentation: %s"
+msgstr "Clicca per leggere la documentazione: %s"
+
+#: application/controllers/ImportsourceController.php:123
+#: application/controllers/SyncruleController.php:498
+#: library/Director/Web/Form/CloneImportSourceForm.php:34
+#: library/Director/Web/Form/CloneSyncRuleForm.php:34
+#: library/Director/Web/Controller/ObjectController.php:316
+#: library/Director/Web/ActionBar/AutomationObjectActionBar.php:44
+msgid "Clone"
+msgstr "Clona"
+
+#: application/forms/IcingaCloneObjectForm.php:91
+#, php-format
+msgid "Clone \"%s\""
+msgstr "Clona \"%s\""
+
+#: application/forms/IcingaCloneObjectForm.php:51
+msgid "Clone Service Sets"
+msgstr "Clona Service-Set"
+
+#: application/forms/IcingaCloneObjectForm.php:42
+msgid "Clone Services"
+msgstr "Clona Services"
+
+#: application/forms/IcingaCloneObjectForm.php:83
+msgid "Clone Template Fields"
+msgstr "Clona campi template"
+
+#: application/forms/IcingaCloneObjectForm.php:32
+msgid "Clone the object as is, preserving imports"
+msgstr "Clona l'oggetto così com'è, preservando le importazioni"
+
+#: application/forms/IcingaCloneObjectForm.php:72
+msgid "Clone this service to the very same or to another Host"
+msgstr "Clonare questo Service sullo stesso o su un altro Host"
+
+#: application/forms/IcingaCloneObjectForm.php:63
+msgid "Clone this service to the very same or to another Service Set"
+msgstr "Clonare questo servizio sullo stesso o su un altro Service Set"
+
+#: library/Director/Web/Controller/ObjectController.php:174
+#, php-format
+msgid "Clone: %s"
+msgstr "Clona %s"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1137
+msgid "Cluster Zone"
+msgstr "Cluster Zone"
+
+#: library/Director/Dashboard/Dashlet/ChoicesDashlet.php:17
+msgid ""
+"Combine multiple templates into meaningful Choices, making life easier for "
+"your users"
+msgstr ""
+"Combina più template in scelte significative, semplificando la vita "
+"ai tuoi utenti"
+
+#: application/forms/IcingaCommandForm.php:59
+#: application/forms/SyncRuleForm.php:20
+#: library/Director/TranslationDummy.php:16
+msgid "Command"
+msgstr "Command"
+
+#: application/forms/BasketForm.php:17
+msgid "Command Definitions"
+msgstr "Definizione Command"
+
+#: application/forms/BasketForm.php:19
+msgid "Command Template"
+msgstr "Command Template"
+
+#: library/Director/Dashboard/Dashlet/CommandTemplatesDashlet.php:19
+msgid "Command Templates"
+msgstr "Command Templates"
+
+#: application/controllers/CommandController.php:89
+#, php-format
+msgid "Command arguments: %s"
+msgstr "Command argomenti: %s"
+
+#: application/forms/IcingaHostForm.php:103
+msgid "Command endpoint"
+msgstr "Command endpoint"
+
+#: application/forms/IcingaCommandForm.php:48
+msgid "Command name"
+msgstr "Nome command"
+
+#: application/forms/IcingaCommandForm.php:17
+msgid "Command type"
+msgstr "Tipo command"
+
+#: configuration.php:126
+#: library/Director/Dashboard/Dashlet/CommandObjectDashlet.php:13
+#: library/Director/Dashboard/Dashlet/CheckCommandsDashlet.php:19
+#: library/Director/Web/Table/CustomvarVariantsTable.php:57
+msgid "Commands"
+msgstr "Commands"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:35
+msgid "Comment"
+msgstr "Commento"
+
+#: application/controllers/BasketController.php:336
+#, php-format
+msgid "Comparing %s \"%s\" from Snapshot \"%s\" to current config"
+msgstr ""
+"Comparazione %s \"%s\" da Snapshot \"%s\" con la configurazione attuale"
+
+#: application/forms/IcingaCommandArgumentForm.php:89
+#: application/forms/IcingaCommandArgumentForm.php:98
+msgid "Condition (set_if)"
+msgstr "Condizione (set_if)"
+
+#: application/forms/IcingaCommandArgumentForm.php:75
+msgid "Condition format"
+msgstr "Formato condizione"
+
+#: application/controllers/JobController.php:102
+#: application/controllers/ConfigController.php:258
+#: application/controllers/ConfigController.php:469
+#: library/Director/Web/Widget/DeploymentInfo.php:60
+#: library/Director/Web/Table/CoreApiFieldsTable.php:80
+msgid "Config"
+msgstr "Configurazione"
+
+#: library/Director/Dashboard/Dashlet/DeploymentDashlet.php:18
+msgid "Config Deployment"
+msgstr "Distribuzione configurazione"
+
+#: application/controllers/ConfigController.php:444
+#: application/forms/DeploymentLinkForm.php:155
+#: application/forms/DeployConfigForm.php:100
+msgid "Config deployment failed"
+msgstr "Distribuzione configurazione fallita"
+
+#: application/controllers/ConfigController.php:344
+#: application/controllers/ConfigController.php:345
+msgid "Config diff"
+msgstr "Differenze configurazione"
+
+#: application/controllers/ConfigController.php:303
+#: application/controllers/ConfigController.php:405
+#, php-format
+msgid "Config file \"%s\""
+msgstr "File di configurazione \"%s\""
+
+#: application/controllers/ConfigController.php:424
+#: application/forms/DeploymentLinkForm.php:142
+#: application/forms/DeployConfigForm.php:76
+#: application/forms/DeployConfigForm.php:95
+msgid "Config has been submitted, validation is going on"
+msgstr "La configurazione è stata inviata, la convalida è in corso"
+
+#: application/forms/DeployFormsBug7530.php:83
+msgid "Config has not been deployed"
+msgstr "La configurazione non è stata distribuita"
+
+#: library/Director/Web/ObjectPreview.php:40
+#, php-format
+msgid "Config preview: %s"
+msgstr "Anteprima della configurazione: %s"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:82
+#: library/Director/ProvidedHook/Monitoring/ServiceActions.php:54
+msgid "Configuration"
+msgstr "Configurazione"
+
+#: application/controllers/HostController.php:212
+msgid "Configuration (read-only)"
+msgstr "Configurazione (solo lettura)"
+
+#: application/controllers/BasketsController.php:32
+#: library/Director/Dashboard/Dashlet/BasketDashlet.php:11
+msgid "Configuration Baskets"
+msgstr "Configurazione Baskets"
+
+#: application/forms/SettingsForm.php:109
+msgid "Configuration format"
+msgstr "Formato configurazione"
+
+#: application/forms/KickstartForm.php:332
+msgid "Configuration has been stored"
+msgstr "La Configurazione é stata salvata"
+
+#: application/forms/AddToBasketForm.php:111
+#, php-format
+msgid "Configuration objects have been added to the chosen basket \"%s\""
+msgstr "Gli oggetti di configurazione sono stati aggiunti al Basket \"%s\" selezionato"
+
+#: library/Director/Web/SelfService.php:152
+msgid "Configure this Agent via Self Service API"
+msgstr "Configurare questo agente tramite l'API self-service"
+
+#: application/controllers/BasketController.php:229
+msgid "Content Checksum"
+msgstr "Checksum contenuto"
+
+#: application/controllers/BasketsController.php:20
+msgid "Create"
+msgstr "Creato"
+
+#: application/controllers/BasketController.php:102
+msgid "Create Basket"
+msgstr "Creare Basket"
+
+#: application/forms/BasketCreateSnapshotForm.php:23
+msgid "Create Snapshot"
+msgstr "Creare Snapshot"
+
+#: library/Director/Web/Controller/ObjectsController.php:300
+#, php-format
+msgid "Create a new %s Apply Rule"
+msgstr "Crea una nuova regola %s Apply"
+
+#: library/Director/Web/Controller/ObjectsController.php:341
+#, php-format
+msgid "Create a new %s Set"
+msgstr "Crea un nuovo %s Set"
+
+#: library/Director/Web/Controller/TemplateController.php:156
+#, php-format
+msgid "Create a new %s inheriting from this one"
+msgstr "Crea un nuovo %s ereditando da questo"
+
+#: library/Director/Web/Controller/TemplateController.php:146
+#: library/Director/Web/Controller/TemplateController.php:166
+#, php-format
+msgid "Create a new %s inheriting from this template"
+msgstr "Crea un nuovo %s ereditando da questo template"
+
+#: application/controllers/BasketController.php:103
+msgid "Create a new Configuration Basket"
+msgstr "Crea un nuovo Basket di configurazione"
+
+#: library/Director/Web/ActionBar/TemplateActionBar.php:23
+msgid "Create a new Template"
+msgstr "Crea un nuovo template"
+
+#: library/Director/Web/ActionBar/ObjectsActionBar.php:20
+msgid "Create a new object"
+msgstr "Crea un nuovo oggetto"
+
+#: library/Director/Web/ActionBar/ChoicesActionBar.php:20
+msgid "Create a new template choice"
+msgstr "Crea un nuovo template di selezione"
+
+#: application/forms/KickstartForm.php:37
+msgid "Create database schema"
+msgstr "Crea lo schema di database"
+
+#: application/forms/ApplyMigrationsForm.php:31
+msgid "Create schema"
+msgstr "Crea lo schema"
+
+#: application/controllers/BasketController.php:228
+msgid "Created"
+msgstr "Creato"
+
+#: library/Director/IcingaConfig/StateFilterSet.php:26
+msgid "Critical"
+msgstr "Critico"
+
+#: library/Director/Web/Controller/TemplateController.php:185
+msgid "Current Template Usage"
+msgstr "Utilizzo template corrente"
+
+#: application/forms/BasketForm.php:53
+msgid "Custom Selection"
+msgstr "Selezione personalizzata"
+
+#: application/controllers/CustomvarController.php:13
+msgid "Custom Variable"
+msgstr "Variable personalizzata"
+
+#: application/controllers/CustomvarController.php:14
+#, php-format
+msgid "Custom Variable variants: %s"
+msgstr "Varianti di varibili personalizzate: %s"
+
+#: library/Director/Web/Tabs/DataTabs.php:27
+msgid "Custom Variables"
+msgstr "Variabili personalizzate"
+
+#: application/controllers/DataController.php:80
+msgid "Custom Vars - Overview"
+msgstr "Vars personalizzati - Panoramica"
+
+#: application/forms/SyncPropertyForm.php:179
+msgid "Custom expression"
+msgstr "Espressione personalizzata"
+
+#: library/Director/Web/Controller/ObjectController.php:190
+#, php-format
+msgid "Custom fields: %s"
+msgstr "Campi personalizzati: \"%s\""
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:25
+msgid "Custom notification"
+msgstr "Notifica personalizzata"
+
+#: application/forms/IcingaServiceForm.php:438
+#: library/Director/Web/Form/IcingaObjectFieldLoader.php:227
+msgid "Custom properties"
+msgstr "Proprietà personalizzate"
+
+#: application/forms/SyncPropertyForm.php:67
+msgid "Custom variable"
+msgstr "Variabile personalizzata"
+
+#: application/forms/SyncPropertyForm.php:307
+msgid "Custom variable (vars.)"
+msgstr "Variabile personalizzata (vars.)"
+
+#: application/controllers/SuggestController.php:250
+#: application/controllers/SuggestController.php:260
+#: library/Director/Objects/IcingaHost.php:157
+#: library/Director/Objects/IcingaService.php:727
+msgid "Custom variables"
+msgstr "Variabili personalizzate"
+
+#: library/Director/Dashboard/Dashlet/CustomvarDashlet.php:11
+msgid "CustomVar Overview"
+msgstr "Panoramica di variabili personalizzate"
+
+#: library/Director/Import/ImportSourceSql.php:40
+msgid "DB Query"
+msgstr "Query DB"
+
+#: application/forms/KickstartForm.php:245
+msgid "DB Resource"
+msgstr "Risorsa DB"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:15
+msgid "DN component"
+msgstr "DN componente"
+
+#: library/Director/PropertyModifier/PropertyModifierDnsRecords.php:25
+msgid "DNS record type"
+msgstr "DNS record type"
+
+#: library/Director/Web/Tabs/MainTabs.php:34
+msgid "Daemon"
+msgstr "Servizio"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:41
+#, php-format
+msgid "Daemon has been stopped %s, was running with PID %s as %s@%s"
+msgstr "Il servizio %s è stato arrestato, girava prima con PID %s e %s@%s"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:90
+#, php-format
+msgid "Daemon is running with PID %s as %s@%s, last refresh happened %s"
+msgstr ""
+"Il servizio è in esecuzione con PID %s %s@%s, l'ultimo aggiornamento è avvenuto in %s "
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:54
+#, php-format
+msgid ""
+"Daemon keep-alive is outdated, was last seen running with PID %s as %s@%s %s"
+msgstr ""
+"Servizio keep-alive è obsoleto, è stato visto per l'ultima volta in esecuzione con PID %s %s@%s %s"
+
+#: application/controllers/DataController.php:63
+msgid "Data Fields"
+msgstr "Campi dati"
+
+
+#: application/controllers/DataController.php:53
+msgid "Data List"
+msgstr "Elenco dati"
+
+#: application/forms/SyncRuleForm.php:19
+msgid "Data List Entry"
+msgstr "Voce dell'elenco dati"
+
+#: application/controllers/DataController.php:47
+#, php-format
+msgid "Data List: %s"
+msgstr "Elenco dati: %s"
+
+#: application/forms/BasketForm.php:30
+msgid "Data Lists"
+msgstr "Elenchi di dati"
+
+#: library/Director/Web/Tabs/DataTabs.php:21
+msgid "Data fields"
+msgstr "Campi dati"
+
+#: application/forms/DirectorDatafieldForm.php:133
+msgid ""
+"Data fields allow you to customize input controls for Icinga custom "
+"variables. Once you defined them here, you can provide them through your "
+"defined templates. This gives you a granular control over what properties "
+"your users should be allowed to configure in which way."
+msgstr ""
+"I campi dati consentono di personalizzare i controlli di input per le "
+"custom variables di Icinga. Dopo averli definiti qui, è possibile utilizzarli nelle "
+"definitioni dei template. Questo ti dà un controllo granulare su quali proprietà "
+"i tuoi utenti dovrebbero essere autorizzati a configurare e in che modo."
+
+#: library/Director/Dashboard/Dashlet/DatafieldDashlet.php:17
+msgid "Data fields make sure that configuration fits your rules"
+msgstr ""
+"I campi dati assicurano che la configurazione soddisfi le tue regole."
+
+#: application/forms/DirectorDatalistForm.php:24
+msgid "Data list"
+msgstr "Elenco campi"
+
+#: application/controllers/DataController.php:20
+#: library/Director/Web/Tabs/DataTabs.php:24
+msgid "Data lists"
+msgstr "Elenchi di dati"
+
+#: application/forms/DirectorDatalistForm.php:15
+msgid ""
+"Data lists are mainly used as data providers for custom variables presented "
+"as dropdown boxes boxes. You can manually manage their entries here in "
+"place, but you could also create dedicated sync rules after creating a new "
+"empty list. This would allow you to keep your available choices in sync with "
+"external data providers"
+msgstr ""
+"Gli elenchi di dati vengono utilizzati principalmente come sorgente di dati per "
+"le variabili personalizzate presentate come caselle. Puoi gestire manualmente "
+"le loro voci direttamente qui, ma puoi anche creare regole di sincronizzazione "
+"dedicate, dopo aver creato un nuovo elenco. Ciò ti consente di mantenere "
+"sincronizzate le opzioni disponibili con sorgenti di dati esterni"
+
+#: application/forms/DirectorDatafieldForm.php:176
+msgid "Data type"
+msgstr "Tipo di dati"
+
+#: application/forms/KickstartForm.php:295
+msgid "Database backend"
+msgstr "Database backend"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:537
+msgid "Date"
+msgstr "Data"
+
+#: application/forms/IcingaTimePeriodRangeForm.php:21
+#: application/forms/IcingaScheduledDowntimeRangeForm.php:22
+#: library/Director/Web/Table/IcingaScheduledDowntimeRangeTable.php:51
+#: library/Director/Web/Table/IcingaTimePeriodRangeTable.php:45
+msgid "Day(s)"
+msgstr "Giorno(i)"
+
+#: application/forms/SettingsForm.php:118
+msgid ""
+"Default configuration format. Please note that v1.x is for special "
+"transitional projects only and completely unsupported. There are no plans to "
+"make Director a first-class configuration backends for Icinga 1.x"
+msgstr ""
+"Si noti che v1.x è solo per progetti speciali di transizione e completamente "
+"non supportato. Non ci sono piani per rendere Director un backend di configurazione "
+"per Icinga 1.x."
+
+#: application/forms/SettingsForm.php:32
+msgid "Default global zone"
+msgstr "Zona globale predefinita"
+
+#: library/Director/Dashboard/CommandsDashboard.php:23
+msgid ""
+"Define Check-, Notification- or Event-Commands. Command definitions are the "
+"glue between your Host- and Service-Checks and the Check plugins on your "
+"Monitoring (or monitored) systems"
+msgstr ""
+"Definisci i comandi Check, Notification o Event. Le definizioni dei comandi "
+"sono i link tra i tuoi controlli Host e Service e i plugin Check sui tuoi sistemi "
+"di monitoraggio (o monitorati)"
+
+#: library/Director/Dashboard/Dashlet/DatafieldDashlet.php:11
+msgid "Define Data Fields"
+msgstr "Definisci campi dati"
+
+#: library/Director/Dashboard/Dashlet/HostGroupsDashlet.php:17
+msgid ""
+"Define Host Groups to give your configuration more structure. They are "
+"useful for Dashboards, Notifications or Restrictions"
+msgstr ""
+"Definisci i gruppi host per dare più struttura alla tua configurazione. "
+"Sono utili per dashboard, notifiche o restrizioni"
+
+#: application/forms/SelfServiceSettingsForm.php:103
+msgid ""
+"Define a download Url or local directory from which the a specific Icinga 2 "
+"Agent MSI Installer package should be fetched. Please ensure to only define "
+"the base download Url or Directory. The Module will generate the MSI file "
+"name based on your operating system architecture and the version to install. "
+"The Icinga 2 MSI Installer name is internally build as follows: Icinga2-"
+"v[InstallAgentVersion]-[OSArchitecture].msi (full example: Icinga2-v2.6.3-"
+"x86_64.msi)"
+msgstr ""
+"Definire un URL di download o una directory locale da cui prelevare uno specifico "
+"pacchetto di installazione MSI Icinga 2 Agent. Assicurati di definire solo l'URL o "
+"la directory di download di base. Il modulo genererà il nome del file MSI in base "
+"all'architettura del sistema operativo e alla versione da installare. "
+"Il nome del programma di installazione MSI Icinga 2 è costruito internamente come "
+"segue: Icinga2-v [InstallAgentVersion] - [OSArchitecture] .msi "
+"(esempio completo: Icinga2-v2.6.3-x86_64.msi)"
+
+#: library/Director/Dashboard/Dashlet/ImportSourceDashlet.php:29
+msgid "Define and manage imports from various data sources"
+msgstr "Definire e gestire le importazioni da varie sorgenti dati"
+
+#: library/Director/Dashboard/TimeperiodsDashboard.php:14
+msgid "Define custom Time Periods"
+msgstr "Definire periodi di tempo personalizzati"
+
+#: library/Director/Dashboard/Dashlet/SyncDashlet.php:29
+msgid "Define how imported data should be synchronized with Icinga"
+msgstr ""
+"Definire come sincronizzare i dati importati con Icinga"
+
+#: application/forms/SyncRuleForm.php:54
+msgid ""
+"Define what should happen when an object with a matching key already exists. "
+"You could merge its properties (import source wins), replace it completely "
+"with the imported object or ignore it (helpful for one-time imports)"
+msgstr ""
+"Definire cosa dovrebbe accadere quando esiste già un oggetto con una chiave "
+"corrispondente. È possibile unire le sue proprietà (importazione sorgente vince), "
+"sostituirlo completamente con l'oggetto importato o ignorarlo "
+"(utile per le importazioni singole)"
+
+#: library/Director/Dashboard/ObjectsDashboard.php:15
+msgid "Define whatever you want to be monitored"
+msgstr "Definisci qualunque cosa tu voglia monitorare"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1352
+msgid "Defines after how many check attempts a new hard state is reached"
+msgstr ""
+"Definisce dopo quanti tentativi di controllo viene raggiunto un nuovo Hard State"
+
+#: library/Director/Dashboard/Dashlet/UserGroupsDashlet.php:17
+msgid ""
+"Defining Notifications for User Groups instead of single Users gives more "
+"flexibility"
+msgstr ""
+"La definizione di notifiche per gruppi di utenti anziché singoli utenti offre "
+"maggiore flessibilità"
+
+#: library/Director/Dashboard/Dashlet/ServiceGroupsDashlet.php:17
+msgid ""
+"Defining Service Groups get more structure. Great for Dashboards. "
+"Notifications and Permissions might be based on groups."
+msgstr ""
+"La definizione di gruppi di servizi ottiene una maggiore struttura. "
+"Ottimo per i dashboard. Le notifiche e le autorizzazioni potrebbero "
+"essere basate sui gruppi."
+
+#: application/forms/IcingaNotificationForm.php:199
+msgid "Delay unless the first notification should be sent"
+msgstr "Ritarda prima di spedire la prima notifica"
+
+#: application/forms/IcingaObjectFieldForm.php:193
+#: library/Director/Web/Form/DirectorObjectForm.php:902
+msgid "Delete"
+msgstr "Elimina"
+
+#: library/Director/PropertyModifier/PropertyModifierSplit.php:13
+msgid "Delimiter"
+msgstr "Delimitatore"
+
+#: application/forms/BasketForm.php:29
+#: library/Director/Dashboard/Dashlet/DependencyObjectDashlet.php:13
+msgid "Dependencies"
+msgstr "Dipendenze"
+
+#: application/forms/SyncRuleForm.php:24
+msgid "Dependency"
+msgstr "Dipendenza"
+
+#: application/forms/DeploymentLinkForm.php:88
+msgid "Deploy"
+msgstr "Distribuire"
+
+#: application/forms/DeployConfigForm.php:37
+#, php-format
+msgid "Deploy %d pending changes"
+msgstr "Distribuisci %d modifiche in sospeso"
+
+#: library/Director/Dashboard/DeploymentDashboard.php:15
+msgid "Deploy configuration to your Icinga nodes"
+msgstr "Distribuire la configurazione sui nodi Icinga"
+
+#: library/Director/Job/ConfigJob.php:195
+msgid "Deploy modified config"
+msgstr "Distribuire la configurazione modificata"
+
+#: application/controllers/ConfigController.php:251
+#: application/controllers/ConfigController.php:461
+#: library/Director/Web/Widget/DeploymentInfo.php:54
+msgid "Deployment"
+msgstr "Distribuzione"
+
+#: application/forms/SettingsForm.php:153
+msgid "Deployment Path"
+msgstr "Percorso di distribuzione"
+
+#: application/controllers/DeploymentController.php:22
+msgid "Deployment details"
+msgstr "Dettagli di distribuzione"
+
+#: application/forms/SettingsForm.php:138
+msgid "Deployment mode"
+msgstr "Modalità di distribuzione"
+
+#: application/forms/SettingsForm.php:147
+msgid "Deployment mode for Icinga 1 configuration"
+msgstr "Modalità di distribuzione per la configurazione di Icinga 1"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:77
+msgid "Deployment time"
+msgstr "Tempo di distribuzione"
+
+#: configuration.php:143
+#: application/controllers/ConfigController.php:50
+#: library/Director/Web/Tabs/InfraTabs.php:36
+msgid "Deployments"
+msgstr "Distribuzioni"
+
+#: application/forms/IcingaCommandArgumentForm.php:31
+#: application/forms/SyncRuleForm.php:36
+#: application/forms/ImportSourceForm.php:24
+#: application/forms/IcingaTemplateChoiceForm.php:56
+#: application/forms/IcingaObjectFieldForm.php:133
+#: application/forms/IcingaServiceSetForm.php:100
+#: application/forms/ImportRowModifierForm.php:52
+#: application/forms/DirectorDatafieldForm.php:159
+msgid "Description"
+msgstr "Descrizione"
+
+#: application/forms/IcingaCommandArgumentForm.php:32
+msgid "Description of the argument"
+msgstr "Descrizione dell'argomento"
+
+#: library/Director/Web/Table/SyncpropertyTable.php:63
+msgid "Destination"
+msgstr "Destinazione"
+
+#: application/forms/SyncPropertyForm.php:48
+msgid "Destination Field"
+msgstr "Campo di destinazione"
+
+#: application/controllers/HealthController.php:25
+msgid ""
+"Did you know that you can run this entire Health Check (or just some "
+"sections) as an Icinga Check on a regular base?"
+msgstr ""
+"Sapevi che puoi eseguire questo Health Check (o solo alcune sezioni) "
+"come Icinga Check su base regolare?"
+
+#: application/controllers/ConfigController.php:406
+#: library/Director/Web/Widget/ActivityLogInfo.php:368
+msgid "Diff"
+msgstr "Diff"
+
+#: library/Director/Web/Widget/DeployedConfigInfoHeader.php:74
+msgid "Diff with other config"
+msgstr "Differenza con altre configurazioni"
+
+#: library/Director/Web/Table/TemplateUsageTable.php:55
+msgid "Direct"
+msgstr "Diretto"
+
+#: application/controllers/DaemonController.php:19
+#: application/controllers/DaemonController.php:21
+msgid "Director Background Daemon"
+msgstr "Director Background Daemon"
+
+#: application/controllers/HealthController.php:17
+msgid "Director Health"
+msgstr "Director Health"
+
+#: application/controllers/KickstartController.php:13
+msgid "Director Kickstart Wizard"
+msgstr "Director Kickstart Wizard"
+
+#: library/Director/Dashboard/Dashlet/SettingsDashlet.php:11
+msgid "Director Settings"
+msgstr "Impostazioni Director"
+
+#: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:79
+msgid "Director database schema has not been created yet"
+msgstr "Lo schema del database Director non è stato ancora creato"
+
+#: application/forms/IcingaDependencyForm.php:159
+msgid "Disable Checks"
+msgstr "Disattivare i Checks"
+
+#: application/forms/IcingaDependencyForm.php:167
+msgid "Disable Notificiations"
+msgstr "Disattivare le notifiche"
+
+#: application/forms/SettingsForm.php:54
+msgid "Disable all Jobs"
+msgstr "Disattiva tutti i Jobs"
+
+#: application/forms/DirectorJobForm.php:37
+#: library/Director/Web/Form/DirectorObjectForm.php:1255
+msgid "Disabled"
+msgstr "Disabilitato"
+
+#: application/forms/IcingaCommandForm.php:80
+msgid "Disabled by default, and should only be used in rare cases."
+msgstr ""
+"Disabilitato per impostazione predefinita e deve essere utilizzato solo in rari casi."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1256
+msgid "Disabled objects will not be deployed"
+msgstr "Gli oggetti disabilitati non verranno distribuiti"
+
+#: application/forms/IcingaTimePeriodForm.php:20
+#: library/Director/Web/Form/DirectorObjectForm.php:1271
+msgid "Display Name"
+msgstr "Nome da visualizzare"
+
+#: application/forms/IcingaUserForm.php:133
+#: application/forms/IcingaHostForm.php:333
+msgid "Display name"
+msgstr "Nome da visualizzare"
+
+#: library/Director/Web/Table/CustomvarTable.php:42
+msgid "Distinct Commands"
+msgstr "Comandi distinti"
+
+#: library/Director/Dashboard/DataDashboard.php:15
+msgid "Do more with custom data"
+msgstr "Fai di più con i dati personalizzati"
+
+#: application/forms/SelfServiceSettingsForm.php:36
+msgid "Do not transform at all"
+msgstr "Non trasformare affatto"
+
+#: library/Director/Web/SelfService.php:104
+#: library/Director/Web/SelfService.php:157
+msgid "Documentation"
+msgstr "Documentazione"
+
+#: library/Director/IcingaConfig/StateFilterSet.php:21
+msgid "Down"
+msgstr "Giù"
+
+#: application/controllers/BasketController.php:212
+#: application/controllers/SchemaController.php:80
+#: library/Director/Web/SelfService.php:227
+#: library/Director/Web/SelfService.php:240
+msgid "Download"
+msgstr "Scarica"
+
+#: library/Director/Web/Widget/AdditionalTableActions.php:59
+msgid "Download as JSON"
+msgstr "Scarica come JSON"
+
+#: application/forms/SelfServiceSettingsForm.php:70
+msgid "Download from a custom url"
+msgstr "Scarica da un URL personalizzato"
+
+#: application/forms/SelfServiceSettingsForm.php:69
+msgid "Download from packages.icinga.com"
+msgstr "Scarica da packages.icinga.com"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:30
+msgid "Downtime ends"
+msgstr "Fine Downtime"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:21
+msgid "Downtime name"
+msgstr "Nome Downtime"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:31
+msgid "Downtime removed"
+msgstr "Downtime rimosso"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:29
+msgid "Downtime starts"
+msgstr "Downtime partito"
+
+#: application/forms/IcingaForgetApiKeyForm.php:22
+msgid "Drop Self Service API key"
+msgstr "Elimina Self Service API key"
+
+#: library/Director/DataType/DataTypeDatalist.php:143
+msgid "Dropdown (list values only)"
+msgstr "Menu a tendina (solo valori elenco)"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:52
+#: library/Director/Web/Widget/DeploymentInfo.php:83
+#: library/Director/Web/Widget/SyncRunDetails.php:26
+msgid "Duration"
+msgstr "Durata"
+
+#: application/controllers/DatafieldController.php:37
+msgid "Edit a Field"
+msgstr "Modifica un campo"
+
+#: application/controllers/DataController.php:155
+msgid "Edit list"
+msgstr "Modifica elenco"
+
+#: library/Director/DataType/DataTypeDatalist.php:137
+msgid "Element behavior"
+msgstr "Comportamento dell'elemento"
+
+#: application/forms/IcingaUserForm.php:36
+msgid "Email"
+msgstr "E-Mail"
+
+#: application/forms/SettingsForm.php:69
+msgid "Enable audit log"
+msgstr "Abilita audit log"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1405
+msgid "Enable event handler"
+msgstr "Abilita event handler"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1417
+msgid "Enable flap detection"
+msgstr "Abilita flap detection"
+
+#: application/forms/SyncRuleForm.php:25
+#: application/forms/IcingaEndpointForm.php:24
+#: library/Director/Web/Table/ObjectsTableEndpoint.php:19
+msgid "Endpoint"
+msgstr "Endpoint"
+
+#: application/forms/KickstartForm.php:117
+msgid "Endpoint Name"
+msgstr "Nome endpoint"
+
+#: application/forms/IcingaEndpointForm.php:31
+msgid "Endpoint address"
+msgstr "Indirizzo endpoint"
+
+#: application/forms/IcingaEndpointForm.php:18
+msgid "Endpoint template name"
+msgstr "Nome template endpoint"
+
+#: library/Director/Dashboard/Dashlet/EndpointObjectDashlet.php:17
+#: library/Director/Import/ImportSourceCoreApi.php:59
+msgid "Endpoints"
+msgstr "Endpoints"
+
+#: application/controllers/PhperrorController.php:14
+#: application/controllers/PhperrorController.php:53
+msgid "Error"
+msgstr "Errore"
+
+#: application/forms/IcingaHostForm.php:86
+msgid "Establish connection"
+msgstr "Stabilire una connessione"
+
+#: application/forms/IcingaServiceForm.php:613
+msgid ""
+"Evaluates the apply for rule for all objects with the custom attribute "
+"specified. E.g selecting \"host.vars.custom_attr\" will generate \"for "
+"(config in host.vars.array_var)\" where \"config\" will be accessible "
+"through \"$config$\". NOTE: only custom variables of type \"Array\" are "
+"eligible."
+msgstr ""
+"Calcola la regola Apply per tutti gli oggetti con l'attributo personalizzato specificato. "
+"Ad esempio, selezionando \"host.vars.custom_attr\" genererà \"for (config in host.vars.array_var)\" "
+"dove \"config\" é accessibile tramite \"$config$\". NOTA: sono ammesse solo le variabili "
+"personalizzate di tipo \"Array\". "
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1309
+msgid "Event command"
+msgstr "Event command"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1310
+msgid "Event command definition"
+msgstr "Definizione event command"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:37
+msgid "Every related downtime will show this comment"
+msgstr "Ogni downtime correlato mostrerà questo commento"
+
+#: application/forms/IcingaTimePeriodForm.php:70
+msgid "Exclude other time periods from this."
+msgstr "Escludere altri periodi di tempo da questo."
+
+#: application/forms/IcingaTimePeriodForm.php:67
+msgid "Exclude period"
+msgstr "Escludi periodo"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1387
+msgid "Execute active checks"
+msgstr "Esegui checks attivi"
+
+#: application/forms/DirectorJobForm.php:48
+msgid "Execution interval for this job, in seconds"
+msgstr "Intervallo di esecuzione per questo Job, in secondi"
+
+#: application/forms/SyncPropertyForm.php:250
+msgid "Existing Data Lists"
+msgstr "Elenchi di dati esistenti"
+
+#: application/forms/SyncPropertyForm.php:235
+msgid "Existing templates"
+msgstr "Elenchi di template esistenti"
+
+#: application/forms/SyncPropertyForm.php:178
+msgid "Expert mode"
+msgstr "Expert mode"
+
+#: library/Director/DataType/DataTypeDatalist.php:147
+msgid "Extend the list with new values"
+msgstr "Estendi l'elenco con nuovi valori"
+
+#: library/Director/Web/Tabs/ObjectsTabs.php:34
+msgid "External"
+msgstr "Esterno"
+
+#: application/forms/BasketForm.php:18
+msgid "External Command Definitions"
+msgstr "Definizione comandi esterni"
+
+#: library/Director/Dashboard/Dashlet/ExternalCheckCommandsDashlet.php:19
+msgid "External Commands"
+msgstr "Comandi esterni"
+
+#: library/Director/Dashboard/Dashlet/ExternalCheckCommandsDashlet.php:12
+msgid ""
+"External Commands have been defined in your local Icinga 2 Configuration."
+msgstr ""
+"I comandi esterni sono stati definiti nella configurazione Icinga 2 locale."
+
+#: library/Director/Dashboard/Dashlet/ExternalNotificationCommandsDashlet.php:19
+msgid "External Notification Commands"
+msgstr "Comandi di notifica esterni"
+
+#: library/Director/Dashboard/Dashlet/CommandTemplatesDashlet.php:12
+#: library/Director/Dashboard/Dashlet/ExternalNotificationCommandsDashlet.php:12
+msgid ""
+"External Notification Commands have been defined in your local Icinga 2 "
+"Configuration. "
+msgstr ""
+"I comandi di notifica esterni sono stati definiti nella configurazione Icinga2 locale."
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:68
+msgid "FQDN"
+msgstr "FQDN"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:141
+msgid "Failed"
+msgstr "Fallito"
+
+#: application/forms/IcingaImportObjectForm.php:42
+#, php-format
+msgid "Failed to import %s \"%s\""
+msgstr "Importazione di %s \"%s\" fallita"
+
+#: application/forms/IcingaObjectFieldForm.php:196
+msgid "Field has been removed"
+msgstr "Il campo è stato rimosso"
+
+#: application/forms/DirectorDatafieldForm.php:141
+#: library/Director/Web/Table/DatafieldTable.php:48
+#: library/Director/Web/Table/IcingaObjectDatafieldTable.php:50
+msgid "Field name"
+msgstr "Nome del campo"
+
+#: application/forms/DirectorDatafieldForm.php:177
+msgid "Field type"
+msgstr "Tipo di campo"
+
+#: library/Director/Web/Tabs/ObjectTabs.php:103
+msgid "Fields"
+msgstr "Campi"
+
+#: library/Director/Web/Table/ConfigFileDiffTable.php:82
+#: library/Director/Web/Table/GeneratedConfigFileTable.php:84
+msgid "File"
+msgstr "File"
+
+#: application/forms/SyncRuleForm.php:79
+#: application/forms/SyncPropertyForm.php:102
+msgid "Filter Expression"
+msgstr "Espressione filtro"
+
+#: configuration.php:52
+msgid "Filter available notification apply rules"
+msgstr "Filtra le notifiche disponibili per applicare le regole"
+
+#: configuration.php:45
+msgid "Filter available service apply rules"
+msgstr "Filtra i servizi disponibili per applicare le regole"
+
+#: configuration.php:59
+msgid ""
+"Filter available service set templates. Use asterisks (*) as wildcards, like "
+"in DB* or *net*"
+msgstr ""
+"Filtra i template di set di servizi disponibili. Usa gli asterischi (*) come "
+"caratteri wildcards, come in DB* o *net*"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:29
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:27
+msgid "Filter method"
+msgstr "Metodo di filtro"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:33
+msgid "First Element"
+msgstr "Primo elemento"
+
+#: application/forms/IcingaNotificationForm.php:197
+msgid "First notification delay"
+msgstr "Primo ritardo di notifica"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:43
+msgid "Fixed"
+msgstr "Fissato"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:33
+msgid "Flapping"
+msgstr "Flapping"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:35
+msgid "Flapping ends"
+msgstr "Flapping terminato"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1438
+msgid ""
+"Flapping lower bound in percent for a service to be considered not flapping"
+msgstr ""
+"Flapping limite inferiore in percentuale per un servizio da considerare non flapping"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:34
+msgid "Flapping starts"
+msgstr "Flapping iniziato"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1425
+msgid "Flapping threshold (high)"
+msgstr "Flapping soglia (alta)"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1436
+msgid "Flapping threshold (low)"
+msgstr "Flapping soglia (bassa)"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1427
+msgid "Flapping upper bound in percent for a service to be considered flapping"
+msgstr ""
+"Flapping limite superiore in percentuale per un servizio da considerare flapping"
+
+#: application/forms/IcingaCloneObjectForm.php:33
+msgid "Flatten all inherited properties, strip imports"
+msgstr "Appiattire tutte le proprietà ereditate, rimuovere le importazioni"
+
+#: application/forms/SelfServiceSettingsForm.php:87
+msgid "Flush API directory"
+msgstr "Svuota directory API"
+
+#: library/Director/Web/SelfService.php:223
+msgid "For manual configuration"
+msgstr "Per la configurazione manuale"
+
+#: library/Director/Job/ConfigJob.php:181
+msgid "Force rendering"
+msgstr "Forza il rendering"
+
+#: library/Director/Objects/DirectorDatafield.php:160
+#, php-format
+msgid "Form element could not be created, %s is missing"
+msgstr "Impossibile creare l'elemento del modulo,%s mancante"
+
+#: library/Director/Web/Form/QuickForm.php:518
+#: library/Director/Web/Form/QuickForm.php:545
+msgid "Form has successfully been sent"
+msgstr "Il modulo è stato inviato con successo"
+
+#: application/forms/IcingaHostVarForm.php:32
+#: application/forms/IcingaServiceVarForm.php:32
+msgid "Format"
+msgstr "Formato"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:388
+msgid "Former object"
+msgstr "Oggetto precedente"
+
+#: application/forms/SelfServiceSettingsForm.php:24
+msgid "Fully qualified domain name (FQDN)"
+msgstr "Nome di dominio completo (FQDN)"
+
+#: application/forms/IcingaGenerateApiKeyForm.php:24
+msgid "Generate Self Service API key"
+msgstr "Genera Self Service API key"
+
+#: library/Director/Web/SelfService.php:121
+msgid "Generate a new key"
+msgstr "Genera una nuova chiave"
+
+#: application/controllers/ConfigController.php:262
+msgid "Generated config"
+msgstr "Config generata"
+
+#: application/controllers/HostController.php:149
+#: application/controllers/HostController.php:230
+msgid "Generated from host vars"
+msgstr "Generato da host vars"
+
+#: library/Director/Dashboard/AlertsDashboard.php:17
+msgid "Get alerts when something goes wrong"
+msgstr "Ricevi avvisi quando qualcosa va storto"
+
+#: library/Director/Dashboard/Dashlet/CustomvarDashlet.php:17
+msgid "Get an overview of used CustomVars and their variants"
+msgstr "Ottieni una panoramica dei CustomVar usati e delle loro varianti"
+
+#: application/controllers/ConfigController.php:222
+msgid "Global Director Settings"
+msgstr "Impostazioni Director globale"
+
+#: library/Director/Web/SelfService.php:97
+msgid "Global Self Service Setting"
+msgstr "Impostazione Self Service globale"
+
+#: application/forms/SelfServiceSettingsForm.php:44
+msgid "Global Zones"
+msgstr "Zone globali"
+
+#: application/forms/IcingaZoneForm.php:22
+msgid "Global zone"
+msgstr "Zona globale"
+
+#: library/Director/PropertyModifier/PropertyModifierJoin.php:13
+msgid "Glue"
+msgstr "Link"
+
+#: library/Director/Web/ActionBar/DirectorBaseActionBar.php:40
+#, php-format
+msgid "Go back to \"%s\" Dashboard"
+msgstr "Torna a \"%s\" Dashboard"
+
+#: library/Director/Job/ConfigJob.php:207
+msgid "Grace period"
+msgstr "Periodo di grazia"
+
+#: library/Director/Web/Table/GroupMemberTable.php:59
+msgid "Group"
+msgstr "Gruppo"
+
+#: application/forms/IcingaHostForm.php:233
+msgid ""
+"Group has been inherited, but will be overridden by locally assigned group(s)"
+msgstr ""
+"Il gruppo è stato ereditato, ma verrà sostituito dai gruppi assegnati localmente"
+
+#: application/forms/SyncPropertyForm.php:317
+msgid "Group membership"
+msgstr "Membro del gruppo"
+
+#: library/Director/Web/Controller/ObjectController.php:264
+#, php-format
+msgid "Group membership: %s"
+msgstr "Membro del gruppo: %s"
+
+#: library/Director/Dashboard/Dashlet/ServiceSetsDashlet.php:17
+msgid ""
+"Grouping your Services into Sets allow you to quickly assign services often "
+"used together in a single operation all at once"
+msgstr ""
+"Raggruppare i tuoi servizi in set ti consente di assegnare rapidamente i servizi "
+"spesso utilizzati contemporaneamente con un'unica operazione "
+
+
+#: application/forms/IcingaUserForm.php:109
+#: application/forms/IcingaHostForm.php:203
+#: application/forms/IcingaServiceForm.php:635
+#: library/Director/Web/Tabs/ObjectsTabs.php:61
+msgid "Groups"
+msgstr "Gruppi"
+
+#: library/Director/Import/ImportSourceRestApi.php:78
+msgid "HTTP (this is plaintext!)"
+msgstr "HTTP (questo è in chiaro)"
+
+#: library/Director/Import/ImportSourceRestApi.php:173
+msgid "HTTP proxy"
+msgstr "HTTP proxy"
+
+#: library/Director/Import/ImportSourceRestApi.php:77
+msgid "HTTPS (strongly recommended)"
+msgstr "HTTPS (fortemente raccomandato)"
+
+#: library/Director/Web/Tabs/MainTabs.php:31
+msgid "Health"
+msgstr "Health"
+
+#: library/Director/Dashboard/Dashlet/SingleServicesDashlet.php:17
+msgid "Here you can find all single services directly attached to single hosts"
+msgstr ""
+"Qui puoi trovare tutti i singoli servizi direttamente associati ai singoli host "
+
+#: library/Director/Web/Table/CoreApiFieldsTable.php:83
+#: library/Director/DataType/DataTypeString.php:27
+msgid "Hidden"
+msgstr "Nascosto"
+
+#: library/Director/Web/Widget/AdditionalTableActions.php:70
+msgid "Hide SQL"
+msgstr "Nascondi SQL"
+
+#: application/controllers/HealthController.php:23
+msgid "Hint: Check Plugin"
+msgstr "Suggerimento: Check-Plugin"
+
+#: application/forms/IcingaServiceForm.php:154
+msgid "Hints regarding this service"
+msgstr "Suggerimenti riguardanti questo servizio"
+
+#: library/Director/Web/Tabs/ImportsourceTabs.php:45
+#: library/Director/Web/Tabs/ObjectTabs.php:95
+#: library/Director/Web/Tabs/SyncRuleTabs.php:43
+msgid "History"
+msgstr "History"
+
+#: application/controllers/ServiceController.php:53
+#: application/forms/SyncRuleForm.php:12
+#: application/forms/IcingaHostVarForm.php:15
+#: application/forms/IcingaServiceForm.php:583
+#: library/Director/TranslationDummy.php:13
+#: library/Director/Web/Table/ObjectsTableEndpoint.php:20
+msgid "Host"
+msgstr "Host"
+
+#: application/controllers/SuggestController.php:259
+#: library/Director/Objects/IcingaService.php:740
+msgid "Host Custom variables"
+msgstr "Host variabili personalizzate"
+
+#: application/forms/SyncRuleForm.php:13
+#: application/forms/BasketForm.php:20
+msgid "Host Group"
+msgstr "Gruppo Host"
+
+#: library/Director/Dashboard/Dashlet/HostGroupsDashlet.php:11
+msgid "Host Groups"
+msgstr "Gruppi di Host"
+
+#: application/forms/SelfServiceSettingsForm.php:19
+msgid "Host Name"
+msgstr "Nome Host"
+
+#: application/forms/IcingaHostForm.php:157
+#: application/forms/IcingaHostForm.php:174
+msgid "Host Template"
+msgstr "Host Template"
+
+#: application/forms/BasketForm.php:21
+msgid "Host Template Choice"
+msgstr "Scelta del template Host"
+
+#: application/forms/BasketForm.php:22
+#: library/Director/Dashboard/Dashlet/HostTemplatesDashlet.php:11
+msgid "Host Templates"
+msgstr "Host Templates"
+
+#: application/forms/IcingaHostSelfServiceForm.php:35
+#: application/forms/IcingaHostForm.php:308
+msgid "Host address"
+msgstr "Indirizzo Host"
+
+#: application/forms/IcingaHostSelfServiceForm.php:37
+#: application/forms/IcingaHostForm.php:310
+msgid ""
+"Host address. Usually an IPv4 address, but may be any kind of address your "
+"check plugin is able to deal with"
+msgstr ""
+"Indirizzo Host. Di solito un indirizzo IPv4, ma può essere qualsiasi tipo di "
+"indirizzo con cui il plug-in riesce a lavorare"
+
+#: configuration.php:64
+msgid "Host configs"
+msgstr "Configurazioni Host"
+
+#: library/Director/DataType/DataTypeDirectorObject.php:55
+msgid "Host groups"
+msgstr "Gruppi Host"
+
+#: application/forms/IcingaHostSelfServiceForm.php:25
+msgid "Host name"
+msgstr "Nome Host"
+
+#: application/forms/SelfServiceSettingsForm.php:25
+msgid "Host name (local part, without domain)"
+msgstr "Nome Host (parte locale, senza dominio)"
+
+#: library/Director/Dashboard/Dashlet/HostObjectDashlet.php:13
+msgid "Host objects"
+msgstr "Oggetti Hosts"
+
+#: application/controllers/SuggestController.php:249
+#: application/controllers/SuggestController.php:258
+#: library/Director/Objects/IcingaHost.php:156
+#: library/Director/Objects/IcingaService.php:739
+msgid "Host properties"
+msgstr "Proprietà dell'Host"
+
+#: application/controllers/TemplatechoiceController.php:17
+msgid "Host template choice"
+msgstr "Scelta del template Host"
+
+#: application/controllers/TemplatechoicesController.php:19
+msgid "Host template choices"
+msgstr "Scelta del template Host"
+
+#: application/forms/IcingaHostGroupForm.php:14
+msgid "Hostgroup"
+msgstr "Gruppo Host"
+
+#: library/Director/Import/ImportSourceCoreApi.php:61
+msgid "Hostgroups"
+msgstr "Gruppi di Host"
+
+#: application/forms/IcingaHostForm.php:206
+msgid ""
+"Hostgroups that should be directly assigned to this node. Hostgroups can be "
+"useful for various reasons. You might assign service checks based on "
+"assigned hostgroup. They are also often used as an instrument to enforce "
+"restricted views in Icinga Web 2. Hostgroups can be directly assigned to "
+"single hosts or to host templates. You might also want to consider assigning "
+"hostgroups using apply rules"
+msgstr ""
+"Hostgroup che devono essere assegnati direttamente a questo nodo. Gli hostgroup "
+"possono essere utili per vari motivi. È possibile assegnare service checks basati "
+"su hostgroup. Inoltre, vengono spesso utilizzati come strumento per imporre "
+"visualizzazioni limitate in Icinga Web 2. Gli hostgroup possono essere direttamente assegnati "
+"a singoli host o a template host. Potresti anche prendere in considerazione l'assegnazione "
+"di hostgroup utilizzando le regole apply"
+
+#: application/forms/IcingaHostForm.php:39
+#: library/Director/Web/Table/IcingaServiceSetHostTable.php:38
+msgid "Hostname"
+msgstr "Nome Host"
+
+#: library/Director/Import/ImportSourceRestApi.php:185
+msgid "Hostname, IP or <host>:<port>"
+msgstr "Nome Host, IP o <host>:<port>"
+
+#: configuration.php:118
+#: application/forms/IcingaScheduledDowntimeForm.php:85
+#: application/forms/IcingaDependencyForm.php:100
+#: application/forms/IcingaNotificationForm.php:89
+#: application/forms/IcingaServiceForm.php:693
+#: library/Director/Dashboard/Dashlet/HostsDashlet.php:11
+#: library/Director/Web/Table/CustomvarVariantsTable.php:58
+#: library/Director/Web/Table/CustomvarTable.php:43
+#: library/Director/Import/ImportSourceCoreApi.php:60
+#: library/Director/DataType/DataTypeDirectorObject.php:54
+#: library/Director/IcingaConfig/StateFilterSet.php:19
+msgid "Hosts"
+msgstr "Hosts"
+
+#: application/controllers/ServicesetController.php:81
+#, php-format
+msgid "Hosts using this set: %s"
+msgstr "Hosts che usano questo Set: %s"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:54
+msgid ""
+"How long the downtime lasts. Only has an effect for flexible (non-fixed) "
+"downtimes. Time in seconds, supported suffixes include ms (milliseconds), s "
+"(seconds), m (minutes), h (hours) and d (days). To express \"90 minutes\" "
+"you might want to write 1h 30m"
+msgstr ""
+"Quanto dura il tempo di downtime. Ha effetto solo per flexible downtime (non fissi)."
+"Tempo in secondi, i suffissi supportati includono ms (millisecondi), s (secondi), "
+"m (minuti), h (ore) e d (giorni ). Per esprimere \"90 minuti\" potresti voler scrivere 1h 30m"
+
+#: application/forms/DeployFormsBug7530.php:110
+msgid "I know what I'm doing, deploy anyway"
+msgstr "So cosa sto facendo, distribuire comunque"
+
+#: application/forms/DeployFormsBug7530.php:111
+msgid "I know, please don't bother me again"
+msgstr "Lo so, per favore non disturbarmi di nuovo"
+
+#: application/forms/IcingaEndpointForm.php:32
+msgid "IP address / hostname of remote node"
+msgstr "Indirizzo IP / nome Host del nodo remoto"
+
+#: application/forms/KickstartForm.php:129
+msgid ""
+"IP address / hostname of your Icinga node. Please note that this information "
+"will only be used for the very first connection to your Icinga instance. The "
+"Director then relies on a correctly configured Endpoint object. Correctly "
+"configures means that either it's name is resolvable or that it's host "
+"property contains either an IP address or a resolvable host name. Your "
+"Director must be able to reach this endpoint"
+msgstr ""
+"Indirizzo IP / nome host del nodo Icinga. Tenere presente che queste informazioni "
+"verranno utilizzate solo per la prima connessione all'istanza Icinga. Il Director "
+"si basa quindi su un oggetto Endpoint configurato correttamente. Configurazione "
+"corretta significa che il nome è risolvibile o che la sua proprietà Host contiene "
+"un indirizzo IP o un nome Host risolvibile. Il tuo Director deve essere in grado "
+"di raggiungere questo endpoint"
+
+#: application/forms/IcingaHostSelfServiceForm.php:43
+#: application/forms/IcingaHostForm.php:316
+msgid "IPv6 address"
+msgstr "Indirizzo IPv6"
+
+#: library/Director/Web/Controller/ObjectsController.php:330
+#, php-format
+msgid "Icinga %s Sets"
+msgstr "Icinga %s Sets"
+
+#: application/controllers/InspectController.php:39
+#, php-format
+msgid "Icinga 2 - Objects: %s"
+msgstr "Oggetti Icinga 2: %s"
+
+#: application/controllers/InspectController.php:152
+msgid "Icinga 2 API - Status"
+msgstr "Icinga 2 API - Stato"
+
+#: library/Director/Web/SelfService.php:192
+msgid "Icinga 2 Client documentation"
+msgstr "Icinga 2 documentazione client"
+
+#: application/forms/IcingaHostForm.php:135
+#: application/forms/IcingaServiceForm.php:683
+msgid "Icinga Agent and zone settings"
+msgstr "Icinga Agent e proprietá della zona"
+
+#: library/Director/Dashboard/Dashlet/ApiUserObjectDashlet.php:13
+msgid "Icinga Api users"
+msgstr "Utene Icinga API"
+
+#: application/forms/IcingaCommandArgumentForm.php:39
+#: application/forms/IcingaCommandArgumentForm.php:78
+msgid "Icinga DSL"
+msgstr "Icinga DSL"
+
+#: configuration.php:83
+msgid "Icinga Director"
+msgstr "Icinga Director"
+
+#: application/controllers/DashboardController.php:39
+msgid "Icinga Director - Main Dashboard"
+msgstr "Icinga Director - Dashboard principale"
+
+#: application/controllers/DaemonController.php:45
+msgid "Icinga Director Background Daemon"
+msgstr "Icinga Director Background Daemon"
+
+#: library/Director/Dashboard/DirectorDashboard.php:15
+msgid "Icinga Director Configuration"
+msgstr "Configurzione Icinga Director"
+
+#: application/forms/SettingsForm.php:35
+msgid ""
+"Icinga Director decides to deploy objects like CheckCommands to a global "
+"zone. This defaults to \"director-global\" but might be adjusted to a custom "
+"Zone name"
+msgstr ""
+"Icinga Director decide di distribuire oggetti come CheckCommands in una zona globale. "
+"L'impostazione predefinita è \"director-global\" ma potrebbe essere adattata a un nome "
+"di zona personalizzato"
+
+#: application/controllers/PhperrorController.php:57
+msgid ""
+"Icinga Director depends on the following modules, please install/upgrade as "
+"required"
+msgstr ""
+"Icinga Director dipende dai seguenti moduli, si prega di installare / aggiornare"
+"come richiesto"
+
+#: library/Director/Dashboard/Dashlet/SelfServiceDashlet.php:17
+msgid ""
+"Icinga Director offers a Self Service API, allowing new Icinga nodes to "
+"register themselves"
+msgstr ""
+"Icinga Director offre un'API Self Service che consente ai nuovi nodi Icinga "
+"di registrarsi"
+
+#: application/forms/KickstartForm.php:127
+msgid "Icinga Host"
+msgstr "Icinga Host"
+
+#: library/Director/Dashboard/Dashlet/InfrastructureDashlet.php:11
+msgid "Icinga Infrastructure"
+msgstr "Icinga Infrastruttura"
+
+#: application/forms/SettingsForm.php:43
+msgid "Icinga Package Name"
+msgstr "Icinga Package Name"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1139
+msgid ""
+"Icinga cluster zone. Allows to manually override Directors decisions of "
+"where to deploy your config to. You should consider not doing so unless you "
+"gained deep understanding of how an Icinga Cluster stack works"
+msgstr ""
+"Zona cluster Icinga. Consente di sovrascrivere manualmente le decisioni del "
+"Director su dove distribuire la configurazione. Si dovrebbe considerare di non "
+"farlo a meno che non si sia acquisita una profonda conoscenza di come funziona "
+"lo stack Cluster Icinga"
+
+#: application/forms/IcingaHostGroupForm.php:16
+msgid "Icinga object name for this host group"
+msgstr "Nome oggetto Icinga per questo gruppo Host"
+
+#: application/forms/IcingaHostForm.php:46
+msgid ""
+"Icinga object name for this host. This is usually a fully qualified host "
+"name but it could basically be any kind of string. To make things easier for "
+"your users we strongly suggest to use meaningful names for templates. E.g. "
+"\"generic-host\" is ugly, \"Standard Linux Server\" is easier to understand"
+msgstr ""
+"Nome dell'oggetto Icinga per questo Host. Di norma è un fully qualified host "
+"completo ma potrebbe essere praticamente qualsiasi tipo di stringa. Per rendere "
+"le cose più comprensibili per i tuoi utenti ti consigliamo vivamente di usare nomi "
+"significativi per i template. Ad esempio \"generic-host\" è brutto, "
+"\"Standard Linux Server\" è più facile da capire"
+
+#: application/forms/IcingaServiceGroupForm.php:16
+msgid "Icinga object name for this service group"
+msgstr "Nome oggetto Icinga per questo gruppo di servizi"
+
+#: application/forms/IcingaUserGroupForm.php:19
+msgid "Icinga object name for this user group"
+msgstr "Nome oggetto Icinga per questo gruppo di utenti"
+
+#: application/forms/SettingsForm.php:114
+msgid "Icinga v1.x"
+msgstr "Icinga v1.x"
+
+#: application/forms/SettingsForm.php:100
+msgid ""
+"Icinga v2.11.0 breaks some configurations, the Director will warn you before "
+"every deployment in case your config is affected. This setting allows to "
+"hide this warning."
+msgstr ""
+"Icinga v2.11.0 rompe alcune configurazioni, il Director ti avviserà prima di ogni "
+"distribuzione nel caso in cui la tua configurazione ne sia colpita. Questa "
+"impostazione consente di soprimere questo avviso."
+
+#: application/forms/SettingsForm.php:113
+msgid "Icinga v2.x"
+msgstr "Icinga v2.x"
+
+#: application/forms/IcingaHostForm.php:77
+msgid "Icinga2 Agent"
+msgstr "Icinga2 Agent"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1515
+msgid "Icon image"
+msgstr "Immagine Icon"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1524
+msgid "Icon image alt"
+msgstr "Immagine Icon alternativa"
+
+#: library/Director/Web/Table/CoreApiFieldsTable.php:76
+msgid "Id"
+msgstr "Id"
+
+#: application/forms/IcingaCommandForm.php:53
+msgid "Identifier for the Icinga command you are going to create"
+msgstr "Identificatore del comando Icinga che stai per creare"
+
+#: application/forms/IcingaCommandForm.php:79
+msgid "If enabled you can not define arguments."
+msgstr "Se abilitato non è possibile definire argomenti."
+
+#: application/forms/SyncRuleForm.php:63
+#: application/forms/BasketForm.php:51
+msgid "Ignore"
+msgstr "Ignorare"
+
+#: application/forms/SettingsForm.php:91
+msgid "Ignore Bug #7530"
+msgstr "Ignora Bug #7530"
+
+#: application/forms/IcingaDependencyForm.php:175
+msgid "Ignore Soft States"
+msgstr "Ignora Soft States"
+
+#: library/Director/PropertyModifier/PropertyModifierGetPropertyFromOtherImportSource.php:33
+msgid "Import Source"
+msgstr "Sorgente di importazione"
+
+#: application/forms/BasketForm.php:31
+msgid "Import Sources"
+msgstr "Sorgente di importazione"
+
+#: library/Director/Dashboard/Dashlet/ImportSourceDashlet.php:14
+msgid "Import data sources"
+msgstr "Sorgente Import per i dati"
+
+#: application/forms/IcingaImportObjectForm.php:26
+#, php-format
+msgid "Import external \"%s\""
+msgstr "Sorgente import esterno \"%s\""
+
+#: application/controllers/ImportrunController.php:14
+#: application/controllers/ImportrunController.php:15
+msgid "Import run"
+msgstr "Esegui importazione"
+
+#: application/controllers/ImportsourceController.php:184
+#, php-format
+msgid "Import run history: %s"
+msgstr "Cronologia esecuzioni importanzioni: %s"
+
+#: application/controllers/ImportsourcesController.php:46
+#: library/Director/Web/Tabs/ImportTabs.php:20
+#: library/Director/Web/Tabs/ImportsourceTabs.php:37
+#: library/Director/Job/ImportJob.php:80
+msgid "Import source"
+msgstr "Sorgente importazione"
+
+#: application/forms/ImportSourceForm.php:15
+msgid "Import source name"
+msgstr "Nome della sorgente di importazione"
+
+#: application/controllers/ImportsourceController.php:139
+#, php-format
+msgid "Import source preview: %s"
+msgstr "Anteprima della sorgente di importazione: %s"
+
+#: application/controllers/ImportsourceController.php:82
+#: application/controllers/ImportsourceController.php:110
+#, php-format
+msgid "Import source: %s"
+msgstr "Sorgente di importazione: %s"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1229
+msgid ""
+"Importable templates, add as many as you want. Please note that order "
+"matters when importing properties from multiple templates: last one wins"
+msgstr ""
+"Template importabili, aggiungine quanti ne desideri. Tieni presente che "
+"l'ordine é importante quando importi proprietà da più template: l'ultimo vince"
+
+#: application/forms/ImportRunForm.php:33
+msgid "Imported new data from this Import Source"
+msgstr "Nuovi dati importati da questa sorgente di importazione"
+
+#: library/Director/Web/Table/ImportrunTable.php:32
+msgid "Imported rows"
+msgstr "Righe importate"
+
+#: application/forms/IcingaImportObjectForm.php:16
+msgid ""
+"Importing an object means that its type will change from \"external\" to "
+"\"object\". That way it will make part of the next deployment. So in case "
+"you imported this object from your Icinga node make sure to remove it from "
+"your local configuration before issueing the next deployment. In case of a "
+"conflict nothing bad will happen, just your config won't deploy."
+msgstr ""
+"L'importazione di un oggetto significa che il suo tipo cambierà da \"esterno\" a "
+"\"oggetto\". In questo modo farà parte della distribuzione successiva. Quindi, "
+"nel caso in cui tu abbia importato questo oggetto dal tuo nodo Icinga assicurati "
+"di rimuoverlo dalla configurazione locale prima di eseguire la distribuzione "
+"successiva. In caso di conflitto non accadrà nulla di grave, solo la configurazione "
+"non verrà distribuita."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1227
+msgid "Imports"
+msgstr "Imports"
+
+#: application/controllers/SelfServiceController.php:104
+msgid ""
+"In case an Icinga Admin provided you with a self service API token, this is "
+"where you can register new hosts"
+msgstr ""
+"Nel caso in cui un amministratore Icinga ti fornisse un token API self-service, "
+"è qui che puoi registrare nuovi host"
+
+#: application/forms/SelfServiceSettingsForm.php:176
+msgid ""
+"In case the Icinga 2 Agent is already installed on the system, this "
+"parameter will allow you to configure if you wish to upgrade / downgrade to "
+"a specified version with the as well."
+msgstr ""
+"Nel caso in cui Icinga 2 Agent sia già installato sul sistema, questo parametro "
+"ti consentirà di configurare se desideri aggiornare / eseguire il downgrade anche "
+"a una versione specificata."
+
+#: application/forms/SelfServiceSettingsForm.php:143
+msgid ""
+"In case the Icinga 2 Agent should be automatically installed, this has to be "
+"a string value like: 2.6.3"
+msgstr ""
+"Nel caso in cui Icinga 2 Agent venga installato automaticamente, questo deve "
+"essere un valore stringa come: 2.6.3"
+
+#: application/forms/SelfServiceSettingsForm.php:89
+msgid ""
+"In case the Icinga Agent will accept configuration from the parent Icinga 2 "
+"system, it will possibly write data to /var/lib/icinga2/api/*. By setting "
+"this parameter to true, all content inside the api directory will be flushed "
+"before an eventual restart of the Icinga 2 Agent"
+msgstr ""
+"Nel caso in cui Icinga Agent accetti la configurazione dal sistema Icinga 2 padre,"
+"probabilmente scriverà i dati su /var/lib/icinga2/api/*. Impostando questo "
+"parametro su true, tutto il contenuto all'interno della directory api verrà pulita"
+"prima di un eventuale riavvio dell'agente Icinga 2"
+
+#: library/Director/Import/ImportSourceRestApi.php:169
+msgid ""
+"In case your API is only reachable through a proxy, please choose it's "
+"protocol right here"
+msgstr ""
+"Nel caso in cui la tua API sia raggiungibile solo attraverso un proxy, "
+"scegli il suo protocollo proprio qui"
+
+#: library/Director/Import/ImportSourceRestApi.php:193
+msgid "In case your proxy requires authentication, please configure this here"
+msgstr ""
+"Nel caso in cui il proxy richieda l'autenticazione, puoi configurarlo qui"
+
+#: application/forms/IcingaTimePeriodForm.php:62
+msgid "Include other time periods into this."
+msgstr "Includere altri periodi di tempo in questo."
+
+#: application/forms/IcingaTimePeriodForm.php:59
+msgid "Include period"
+msgstr "Includi periodo"
+
+#: library/Director/Web/Table/TemplateUsageTable.php:56
+msgid "Indirect"
+msgstr "Indiretto"
+
+#: application/controllers/HostController.php:140
+#: application/controllers/HostController.php:218
+msgid "Individual Service objects"
+msgstr "Oggetti Service individuali"
+
+#: library/Director/Web/Tabs/InfraTabs.php:43
+msgid "Infrastructure"
+msgstr "Infrastruttura"
+
+#: application/forms/SyncPropertyForm.php:311
+msgid "Inheritance (import)"
+msgstr "Ereditá (Import)"
+
+#: application/forms/IcingaHostForm.php:240
+msgid "Inherited groups"
+msgstr "Gruppi ereditati"
+
+#: application/controllers/HostController.php:387
+#, php-format
+msgid "Inherited service: %s"
+msgstr "Service eriditati: %s"
+
+#: application/controllers/HostController.php:538
+#: library/Director/Web/Tabs/ObjectTabs.php:132
+msgid "Inspect"
+msgstr "Ispezionare"
+
+#: application/controllers/InspectController.php:65
+msgid "Inspect - object list"
+msgstr "Ispeziona - elenco oggetti"
+
+#: application/forms/SelfServiceSettingsForm.php:189
+msgid "Install NSClient++"
+msgstr "Install NSClient++"
+
+#: application/forms/SelfServiceSettingsForm.php:59
+msgid "Installation Source"
+msgstr "Fonte di installazione"
+
+#: application/views/scripts/phperror/dependencies.phtml:18
+msgid "Installed"
+msgstr "Installato"
+
+#: application/forms/SelfServiceSettingsForm.php:152
+msgid "Installer Hashes"
+msgstr "Hash di installazione"
+
+#: application/forms/IcingaCommandForm.php:25
+msgid "Internal commands"
+msgstr "Comandi interni"
+
+#: application/controllers/SyncruleController.php:106
+#, php-format
+msgid "It has been renamed since then, its former name was %s"
+msgstr "Da allora è stato rinominato, il suo nome precedente era %s"
+
+#: library/Director/Web/SelfService.php:68
+msgid ""
+"It is not a good idea to do so as long as your Agent still has a valid Self "
+"Service API key!"
+msgstr ""
+"Non è una buona idea farlo finché il tuo agente ha ancora una chiave "
+"API self-service valida!"
+
+#: application/forms/IcingaTemplateChoiceForm.php:87
+msgid ""
+"It will not be allowed to choose more than this many options. Setting it to "
+"one (1) will result in a drop-down box, a higher number will turn this into "
+"a multi-selection element."
+msgstr ""
+"Non sarà permesso scegliere più opzioni di queste preimpostate. Impostandolo "
+"su uno (1) si otterrà una casella Dropdown, un numero più alto lo trasformerà "
+"in un elemento a selezione multipla."
+
+#: library/Director/Web/Widget/ImportSourceDetails.php:37
+msgid ""
+"It's currently unknown whether we are in sync with this Import Source. You "
+"should either check for changes or trigger a new Import Run."
+msgstr ""
+"Al momento non è noto se siamo sincronizzati con questa sorgente di importazione. "
+"È necessario verificare la presenza di modifiche o eseguire una nuova importazione."
+
+#: application/controllers/SyncruleController.php:66
+msgid ""
+"It's currently unknown whether we are in sync with this rule. You should "
+"either check for changes or trigger a new Sync Run."
+msgstr ""
+"Al momento non è noto se siamo sincronizzati con questa regola. È necessario "
+"verificare la presenza di modifiche o eseguire una nuova sincronizzazione."
+
+#: application/forms/BasketUploadForm.php:130
+#: application/forms/BasketForm.php:122
+msgid "It's not allowed to store an empty basket"
+msgstr "Non è consentito conservare un Basket vuoto"
+
+#: application/controllers/JobController.php:98
+msgid "Job"
+msgstr "Job"
+
+#: application/forms/BasketForm.php:33
+msgid "Job Definitions"
+msgstr "Definizione Job"
+
+#: application/forms/DirectorJobForm.php:17
+msgid "Job Type"
+msgstr "Tipologia Job"
+
+#: application/forms/DirectorJobForm.php:72
+#: library/Director/Web/Table/JobTable.php:60
+msgid "Job name"
+msgstr "Nome Job"
+
+#: application/controllers/JobController.php:23
+#: application/controllers/JobController.php:55
+#, php-format
+msgid "Job: %s"
+msgstr "Job: %s"
+
+#: application/controllers/JobsController.php:13
+#: library/Director/Dashboard/Dashlet/JobDashlet.php:14
+#: library/Director/Web/Tabs/ImportTabs.php:26
+msgid "Jobs"
+msgstr "Jobs"
+
+#: library/Director/Web/Table/ActivityLogTable.php:81
+msgid "Jump to this object"
+msgstr "Vai a questo oggetto"
+
+#: library/Director/Web/SelfService.php:245
+msgid "Just download and run this script on your Linux Client Machine:"
+msgstr ""
+"Scarica ed esegui questo script sul tuo computer client Linux:"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:57
+msgid "Keep matching elements"
+msgstr "Mantieni gli elementi corrispondenti"
+
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:60
+msgid "Keep only matching rows (Whitelist)"
+msgstr "Mantieni solo le righe corrispondenti (Whitelist)"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:31
+msgid "Keep the DN as is"
+msgstr "Mantieni DN"
+
+#: library/Director/PropertyModifier/PropertyModifierJsonDecode.php:26
+msgid "Keep the JSON string as is"
+msgstr "Mantieni la stringa JSON così com'è"
+
+#: library/Director/PropertyModifier/PropertyModifierGetHostByName.php:18
+msgid "Keep the property (hostname) as is"
+msgstr "Mantieni la proprietà (nome Host) così com'è"
+
+#: library/Director/PropertyModifier/PropertyModifierDnsRecords.php:35
+#: library/Director/PropertyModifier/PropertyModifierParseURL.php:40
+msgid "Keep the property as is"
+msgstr "Mantieni la proprietà così com'è"
+
+#: application/forms/DirectorDatalistEntryForm.php:21
+#: library/Director/Web/Table/DatalistEntryTable.php:54
+msgid "Key"
+msgstr "Chiave"
+
+#: application/forms/ImportSourceForm.php:87
+msgid "Key column name"
+msgstr "Nome della colonna chiave"
+
+#: application/controllers/KickstartController.php:12
+#: application/controllers/IndexController.php:42
+msgid "Kickstart"
+msgstr "Kickstart"
+
+#: application/forms/KickstartForm.php:315
+#: library/Director/Dashboard/Dashlet/KickstartDashlet.php:11
+msgid "Kickstart Wizard"
+msgstr "Assistente Kickstart"
+
+#: library/Director/Import/ImportSourceLdap.php:47
+msgid "LDAP Search Base"
+msgstr "LDAP Search Base"
+
+#: application/forms/DirectorDatalistEntryForm.php:30
+#: library/Director/Web/Table/DatalistEntryTable.php:55
+#: library/Director/Web/Table/DatafieldTable.php:47
+#: library/Director/Web/Table/IcingaObjectDatafieldTable.php:49
+msgid "Label"
+msgstr "Etichetta"
+
+#: library/Director/Web/Widget/IcingaObjectInspection.php:58
+msgid "Last Check Result"
+msgstr "Risultato ultimo check"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:34
+msgid "Last Element"
+msgstr "Ultimo elemento"
+
+#: application/forms/IcingaNotificationForm.php:208
+msgid "Last notification"
+msgstr "Ultima notifica"
+
+#: library/Director/Web/Widget/DeployedConfigInfoHeader.php:67
+msgid "Last related activity"
+msgstr "Ultima attività correlata"
+
+#: application/controllers/SyncruleController.php:102
+msgid "Last sync run details"
+msgstr "Dettagli dell'ultima sincronizzazione"
+
+#: application/forms/IcingaCommandArgumentForm.php:69
+msgid ""
+"Leave empty for non-positional arguments. Can be a positive or negative "
+"number and influences argument ordering"
+msgstr ""
+"Lascia vuoto per argomenti non posizionali. Può essere un numero positivo "
+"o negativo e influenza l'ordine degli argomenti"
+
+#: application/forms/DirectorDatafieldForm.php:44
+msgid ""
+"Leaving custom variables in place while removing the related field is "
+"perfectly legal and might be a desired operation. This way you can no longer "
+"modify related custom variables in the Director GUI, but the variables "
+"themselves will stay there and continue to be deployed. When you re-add a "
+"field for the same variable later on, everything will continue to work as "
+"before"
+msgstr ""
+"Lasciare le variabili personalizzate mentre si rimuove il campo correlato è "
+"un'operazione perfettamente valida e potrebbe essere quella desiderata. "
+"In questo modo non è più possibile modificare le variabili personalizzate correlate "
+"nella GUI del Director, ma le variabili stesse rimarranno lì e continueranno a "
+"essere distribuite. Quando riaggiungi nuovamente un campo per la stessa "
+"variabile, tutto continuerà a funzionare come prima"
+
+#: application/forms/DirectorDatafieldForm.php:87
+msgid ""
+"Leaving custom variables in place while renaming the related field is "
+"perfectly legal and might be a desired operation. This way you can no longer "
+"modify related custom variables in the Director GUI, but the variables "
+"themselves will stay there and continue to be deployed. When you re-add a "
+"field for the same variable later on, everything will continue to work as "
+"before"
+msgstr ""
+"Lasciare le variabili personalizzate in atto durante la ridenominazione del campo "
+"correlato è un'operazione perfettamente valida e potrebbe essere quella desiderata. "
+"In questo modo non è più possibile modificare le variabili personalizzate correlate "
+"nella GUI del Director, ma le variabili stesse rimarranno lì e continueranno a essere "
+"distribuite. Quando riaggiungi nuovamente un campo per la stessa variabile, tutto "
+"continuerà a funzionare come prima"
+
+#: library/Director/PropertyModifier/PropertyModifierMap.php:35
+#: library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:45
+msgid "Let the import fail"
+msgstr "Lascia che l'importazione fallisca"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:54
+msgid "Let the whole Import Run fail"
+msgstr "Lascia che l'intera esecuzione dell'importazione fallisca"
+
+#: library/Director/PropertyModifier/PropertyModifierJsonDecode.php:27
+#: library/Director/PropertyModifier/PropertyModifierDnsRecords.php:36
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:32
+#: library/Director/PropertyModifier/PropertyModifierGetHostByName.php:19
+#: library/Director/PropertyModifier/PropertyModifierParseURL.php:41
+msgid "Let the whole import run fail"
+msgstr "Lascia che l'intera esecuzione dell'importazione fallisca"
+
+#: configuration.php:38
+msgid "Limit access to the given comma-separated list of hostgroups"
+msgstr ""
+"Limitare l'accesso all'elenco di hostgroups separato da virgole"
+
+#: library/Director/Web/SelfService.php:238
+msgid "Linux commandline"
+msgstr "Riga di comando di Linux"
+
+#: application/controllers/DataController.php:95
+msgid "List Entries"
+msgstr "Elenca voci"
+
+#: application/controllers/DataController.php:159
+msgid "List entries"
+msgstr "Elenca voci"
+
+#: application/forms/DirectorDatalistForm.php:13
+#: library/Director/Web/Table/DatalistTable.php:31
+msgid "List name"
+msgstr "Nome lista"
+
+#: application/forms/SettingsForm.php:155
+msgid ""
+"Local directory to deploy Icinga 1.x configuration. Must be writable by "
+"icingaweb2. (e.g. /etc/icinga/director)"
+msgstr ""
+"Directory locale per distribuire la configurazione di Icinga 1.x. "
+"Deve essere scrivibile da icingaweb2. (ad es. /etc/icinga/director)"
+
+#: application/forms/IcingaEndpointForm.php:41
+msgid "Log Duration"
+msgstr "Durata del Log"
+
+#: application/forms/IcingaAddServiceForm.php:67
+#: library/Director/Web/Form/DirectorObjectForm.php:574
+msgid "Main properties"
+msgstr "Proprietà principali"
+
+
+#: library/Director/Dashboard/Dashlet/CheckCommandsDashlet.php:12
+msgid ""
+"Manage definitions for your Commands that should be executed as Check "
+"Plugins, Notifications or based on Events"
+msgstr ""
+"Gestisci le definizioni per i tuoi comandi che devono essere "
+"eseguiti come check plugin, notifiche o basati su eventi"
+
+#: library/Director/Dashboard/Dashlet/HostTemplatesDashlet.php:17
+#, fuzzy
+msgid ""
+"Manage your Host Templates. Use Fields to make it easy for your users to get "
+"them customized."
+msgstr ""
+"Gestisci i tuoi Host template. Usa i campi per aggevolarne la "
+"personalizzazione ai tuoi utenti"
+
+#: library/Director/Dashboard/Dashlet/InfrastructureDashlet.php:17
+#, fuzzy
+msgid ""
+"Manage your Icinga 2 infrastructure: Masters, Zones, Satellites and more"
+msgstr ""
+"Gestisci la tua infrastruttura di Icinga2: Master, Zone, Satelliti e altro"
+
+#: library/Director/Dashboard/CommandsDashboard.php:17
+#, fuzzy
+msgid "Manage your Icinga Commands"
+msgstr "Gestisci i tuoi Comandi Icinga"
+
+#: library/Director/Dashboard/HostsDashboard.php:16
+#, fuzzy
+msgid "Manage your Icinga Hosts"
+msgstr "Gestisci i tuoi Icinga Hosts"
+
+#: library/Director/Dashboard/InfrastructureDashboard.php:18
+#, fuzzy
+msgid "Manage your Icinga Infrastructure"
+msgstr "Gestisci Infrastuttura Icinga"
+
+#: library/Director/Dashboard/ServicesDashboard.php:18
+#, fuzzy
+msgid "Manage your Icinga Service Checks"
+msgstr "Gestisci i tuoi Icinga2 Service Checks"
+
+#: library/Director/Dashboard/Dashlet/ServiceTemplatesDashlet.php:17
+#, fuzzy
+msgid ""
+"Manage your Service Templates. Use Fields to make it easy for your users to "
+"get them customized."
+msgstr ""
+"Gestisci i tuoi Templates per i servizi. Usa i Campi per aggevolarne la "
+"personalizzazione ai tuoi utenti"
+
+#: application/forms/IcingaObjectFieldForm.php:142
+#: application/forms/IcingaObjectFieldForm.php:147
+#: library/Director/Web/Table/IcingaObjectDatafieldTable.php:51
+#, fuzzy
+msgid "Mandatory"
+msgstr "Obbligatorio"
+
+#: application/forms/SettingsForm.php:143
+#, fuzzy
+msgid "Master-less"
+msgstr "Senza Master"
+
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:35
+#, fuzzy
+msgid "Match NULL value columns"
+msgstr "Match colonne valore NULL"
+
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:34
+#, fuzzy
+msgid "Match boolean FALSE"
+msgstr "Match boolean FALSE"
+
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:33
+#, fuzzy
+msgid "Match boolean TRUE"
+msgstr "Match boolean TRUE"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1350
+#, fuzzy
+msgid "Max check attempts"
+msgstr "Massimo numero di ripetizioni dei controlli"
+
+#: library/Director/Web/Table/GroupMemberTable.php:60
+#: library/Director/Web/Table/GroupMemberTable.php:65
+#, fuzzy
+msgid "Member"
+msgstr "Membro"
+
+#: library/Director/Web/Tabs/ObjectTabs.php:114
+#, fuzzy
+msgid "Members"
+msgstr "Membri"
+
+#: application/forms/SyncRuleForm.php:61
+#, fuzzy
+msgid "Merge"
+msgstr "Unisci"
+
+#: application/forms/SyncPropertyForm.php:116
+#, fuzzy
+msgid "Merge Policy"
+msgstr "Regole su Unisci"
+
+#: application/forms/IcingaTimePeriodRangeForm.php:23
+#: application/forms/IcingaScheduledDowntimeRangeForm.php:24
+#, fuzzy
+msgid ""
+"Might be monday, tuesday or 2016-01-28 - have a look at the documentation for "
+"more examples"
+msgstr ""
+"Per esempio lunedí, martedí, 2020-01-28 - consulta la documentazione per "
+"ulteriori esempi"
+
+#: application/forms/IcingaTemplateChoiceForm.php:73
+#, fuzzy
+msgid "Minimum required"
+msgstr "Minimo richiesto"
+
+#: application/forms/ImportRowModifierForm.php:69
+#, fuzzy
+msgid "Modifier"
+msgstr "Modificatore"
+
+#: library/Director/Web/Tabs/ImportsourceTabs.php:41
+#, fuzzy
+msgid "Modifiers"
+msgstr "Modificatori"
+
+#: application/controllers/ImportsourceController.php:104
+#: application/controllers/SyncruleController.php:503
+#: library/Director/Web/Controller/TemplateController.php:120
+#: library/Director/Web/ActionBar/AutomationObjectActionBar.php:38
+#: library/Director/Web/Tabs/SyncRuleTabs.php:37
+#: library/Director/ProvidedHook/Monitoring/ServiceActions.php:52
+#, fuzzy
+msgid "Modify"
+msgstr "Modifica"
+
+#: library/Director/ProvidedHook/CubeLinks.php:52
+#, fuzzy, php-format
+msgid "Modify %d hosts"
+msgstr "Modifica %d Hosts"
+
+#: library/Director/Web/Controller/ObjectsController.php:195
+#, fuzzy, php-format
+msgid "Modify %d objects"
+msgstr "Modifica %d Oggetti "
+
+#: application/controllers/DatafieldController.php:34
+#, fuzzy, php-format
+msgid "Modify %s"
+msgstr "Modifica %s"
+
+#: library/Director/ProvidedHook/CubeLinks.php:35
+#, fuzzy
+msgid "Modify a host"
+msgstr "Modifica un Host"
+
+#: application/forms/DirectorDatalistEntryForm.php:61
+#, fuzzy
+msgid "Modify data list entry"
+msgstr "Modifica l'inserimento dell'elenco dei dati"
+
+#: library/Director/Web/Table/ApplyRulesTable.php:154
+#, fuzzy
+msgid "Modify this Apply Rule"
+msgstr "Modifica questa Apply Rule"
+
+#: application/views/scripts/phperror/dependencies.phtml:16
+#, fuzzy
+msgid "Module name"
+msgstr "Nome Modulo"
+
+#: library/Director/Dashboard/Dashlet/ServiceObjectDashlet.php:15
+#, fuzzy
+msgid "Monitored Services"
+msgstr "Servizi monitorati"
+
+#: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:500
+#, fuzzy
+msgid "Move down"
+msgstr "Sposta in basso"
+
+#: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:490
+#, fuzzy
+msgid "Move up"
+msgstr "Sposta in alto"
+
+#: library/Director/Web/Controller/ObjectsController.php:193
+#, fuzzy
+msgid "Multiple objects"
+msgstr "Oggetti multipli"
+
+#: application/controllers/ConfigController.php:162
+#, fuzzy
+msgid "My changes"
+msgstr "Miei cambiamenti"
+
+#: application/controllers/SchemaController.php:16
+#, fuzzy
+msgid "MySQL schema"
+msgstr "MySQL Schema"
+
+#: application/forms/IcingaAddServiceForm.php:146
+#: application/forms/IcingaCommandForm.php:47
+#: application/forms/IcingaApiUserForm.php:14
+#: application/forms/IcingaHostVarForm.php:22
+#: application/forms/IcingaServiceVarForm.php:22
+#: application/forms/IcingaTimePeriodForm.php:15
+#: application/forms/IcingaDependencyForm.php:74
+#: application/forms/IcingaHostForm.php:38
+#: application/forms/IcingaServiceForm.php:561
+#: library/Director/Web/Table/CoreApiObjectsTable.php:57
+#: library/Director/Web/Table/CoreApiPrototypesTable.php:40
+#: library/Director/Web/Table/ChoicesTable.php:41
+#: library/Director/Web/Table/CoreApiFieldsTable.php:74
+#, fuzzy
+msgid "Name"
+msgstr "Nome"
+
+#: application/forms/IcingaDependencyForm.php:76
+#, fuzzy
+msgid "Name for the Icinga dependency you are going to create"
+msgstr "Nome della dipenza Icinga che stai creando"
+
+#: application/forms/IcingaEndpointForm.php:20
+#, fuzzy
+msgid "Name for the Icinga endpoint template you are going to create"
+msgstr "Nome del template endpoint Icinga che stai creando"
+
+#: application/forms/IcingaEndpointForm.php:26
+#, fuzzy
+msgid "Name for the Icinga endpoint you are going to create"
+msgstr "Nome del endpoint Icinga che stai creando"
+
+#: application/forms/IcingaNotificationForm.php:21
+#, fuzzy
+msgid "Name for the Icinga notification template you are going to create"
+msgstr "Nome del template notifica Icinga che stai creando"
+
+#: application/forms/IcingaNotificationForm.php:27
+#, fuzzy
+msgid "Name for the Icinga notification you are going to create"
+msgstr "Nome della notifica Incinga che stai creando"
+
+#: application/forms/IcingaAddServiceForm.php:149
+#: application/forms/IcingaServiceForm.php:564
+#, fuzzy
+msgid "Name for the Icinga service you are going to create"
+msgstr "Nome del servizio Icinga che stai creando"
+
+#: application/forms/IcingaUserForm.php:30
+#, fuzzy
+msgid "Name for the Icinga user object you are going to create"
+msgstr "Nome dell'oggetto User che stai creando"
+
+#: application/forms/IcingaUserForm.php:24
+#, fuzzy
+msgid "Name for the Icinga user template you are going to create"
+msgstr "Nome del template User che stai creando"
+
+#: application/forms/IcingaZoneForm.php:17
+#, fuzzy
+msgid "Name for the Icinga zone you are going to create"
+msgstr "Nome della Zona Icinga che stai creando"
+
+#: application/forms/IcingaCloneObjectForm.php:116
+#, fuzzy
+msgid "Name needs to be changed when cloning a Template"
+msgstr "Il nome deve essere cambiato quando cloni un template"
+
+#: library/Director/Web/Table/CoreApiFieldsTable.php:84
+#, fuzzy
+msgid "Nav"
+msgstr "Nav"
+
+#: application/controllers/DatafieldController.php:40
+#, fuzzy
+msgid "New Field"
+msgstr "Nuovo campo"
+
+#: application/controllers/JobController.php:31
+#, fuzzy
+msgid "New Job"
+msgstr "Nuovo lavoro"
+
+#: library/Director/Web/Tabs/ImportsourceTabs.php:54
+#, fuzzy
+msgid "New import source"
+msgstr "Nuova sorgente di importazione"
+
+#: application/forms/IcingaCloneObjectForm.php:22
+#: library/Director/Web/Form/CloneImportSourceForm.php:30
+#: library/Director/Web/Form/CloneSyncRuleForm.php:30
+#, fuzzy
+msgid "New name"
+msgstr "Nuovo nome"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:377
+#, fuzzy
+msgid "New object"
+msgstr "Nuovo oggetto"
+
+#: application/forms/IcingaAddServiceForm.php:35
+#: application/forms/IcingaHostForm.php:31
+#, fuzzy
+msgid "Next"
+msgstr "Avanti"
+
+#: application/forms/IcingaZoneForm.php:29
+#: application/forms/SelfServiceSettingsForm.php:227
+#: application/forms/SettingsForm.php:58 application/forms/SettingsForm.php:73
+#: application/forms/SettingsForm.php:95
+#: library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:26
+#: library/Director/Job/ImportJob.php:102 library/Director/Job/SyncJob.php:102
+#: library/Director/Job/ConfigJob.php:190
+#: library/Director/Job/ConfigJob.php:202
+#, fuzzy
+msgid "No"
+msgstr "No"
+
+#: library/Director/Util.php:183
+#, fuzzy, php-format
+msgid "No %s resource available"
+msgstr "Nessuna %s risorsa avviabile"
+
+#: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:99
+#, fuzzy
+msgid "No API user configured, you might run the kickstart helper"
+msgstr "Nessun utente API configurato, si potrebbe eseguire l'helper kickstart"
+
+#: application/forms/IcingaHostForm.php:163
+#, fuzzy
+msgid "No Host Template has been provided yet"
+msgstr "Non è stato ancora fornito alcun Host template"
+
+#: application/forms/IcingaHostForm.php:151
+#, fuzzy
+msgid "No Host template has been chosen"
+msgstr "Non è stato selezionato alcun Host template"
+
+#: application/forms/IcingaAddServiceForm.php:95
+#, fuzzy
+msgid "No Service Templates have been provided yet"
+msgstr "Non sono stati ancora forniti template di servizio"
+
+#: application/forms/IcingaCommandArgumentForm.php:175
+#: application/forms/IcingaServiceForm.php:741
+#: application/forms/IcingaTimePeriodRangeForm.php:94
+#: application/forms/IcingaScheduledDowntimeRangeForm.php:99
+#: library/Director/Web/Form/DirectorObjectForm.php:660
+#, fuzzy
+msgid "No action taken, object has not been modified"
+msgstr "Nessun azione effettuata, l'oggetto non é stato modificato"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:223
+#, fuzzy
+msgid "No apply rule has been defined yet"
+msgstr "Non é stata ancora definita nessuna apply rule"
+
+#: library/Director/Web/Widget/SyncRunDetails.php:42
+#, fuzzy
+msgid "No changes have been made"
+msgstr "Non sono state apportate modifiche"
+
+#: application/controllers/DashboardController.php:67
+#, fuzzy
+msgid "No dashboard available, you might have not enough permissions"
+msgstr "Nessuna dashboard disponibile, potreste non avere i permessi necessari"
+
+#: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:68
+#, fuzzy
+msgid "No database has been configured for Icinga Director"
+msgstr "Nessun database é stato configurato per Icinga Director"
+
+#: application/forms/KickstartForm.php:238
+#, fuzzy
+msgid ""
+"No database resource has been configured yet. Please choose a resource to "
+"complete your config"
+msgstr ""
+"Non è stata ancora configurata alcuna risorsa di database. Scegliere una "
+"risorsa per completare la configurazione"
+
+#: application/forms/KickstartForm.php:52
+#, fuzzy
+msgid "No database schema has been created yet"
+msgstr "Non é stato creato ancora nessun schema database"
+
+#: application/forms/AddToBasketForm.php:104
+#, fuzzy
+msgid "No object has been chosen"
+msgstr "Nessun oggetto é stato selezionato"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:241
+#, fuzzy
+msgid "No object has been defined yet"
+msgstr "Nessun oggetto é stato ancora definito"
+
+#: application/forms/IcingaMultiEditForm.php:88
+#, fuzzy
+msgid "No object has been modified"
+msgstr "Nessun oggetto e' stato modificato"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1204
+msgid "No related template has been provided yet"
+msgstr "Nessun template correlato è stato ancora fornito"
+
+#: application/forms/IcingaAddServiceForm.php:83
+msgid "No service has been chosen"
+msgstr "Nessun servizio é stato selezionato"
+
+#: application/controllers/HostController.php:121
+#, php-format
+msgid "No such service: %s"
+msgstr "Nessun servizio del genere: %s"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1199
+msgid "No template has been chosen"
+msgstr "Nessun template é stato selezionato"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:205
+msgid "No template has been defined yet"
+msgstr "Nessun template é stato ancora definito"
+
+#: application/forms/IcingaServiceForm.php:611
+msgid "None"
+msgstr "Nessuno"
+
+#: library/Director/Dashboard/Dashlet/EndpointObjectDashlet.php:57
+msgid "None could be used for deployments right now"
+msgstr ""
+"Nessuno potrebbe essere utilizzato per le distribuzioni in questo momento"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1490
+msgid "Notes"
+msgstr "Note"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1499
+msgid "Notes URL"
+msgstr "Note URL"
+
+#: application/forms/SyncRunForm.php:39
+msgid "Nothing changed, rule is in sync"
+msgstr "Nessuna modifca, regole in sincronizzazione"
+
+#: application/forms/ImportCheckForm.php:38
+#: application/forms/ImportRunForm.php:38
+msgid ""
+"Nothing to do, data provided by this Import Source didn't change since the "
+"last import run"
+msgstr ""
+"Nulla da fare, i dati forniti da questa sorgente di importazione non sono "
+"cambiati dall'ultima esecuzione dell'importazione"
+
+#: application/forms/RestoreObjectForm.php:76
+msgid "Nothing to do, restore would not modify the current object"
+msgstr "Niente da fare, il ripristino non modificherebbe l'oggetto corrente"
+
+#: application/forms/SyncCheckForm.php:58
+msgid "Nothing would change, this rule is still in sync"
+msgstr "Nulla cambierebbe, questa regola è ancora in sincronizzazione"
+
+#: application/forms/SyncRuleForm.php:22
+#: application/forms/IcingaNotificationForm.php:25
+#: library/Director/TranslationDummy.php:18
+msgid "Notification"
+msgstr "Notifica"
+
+#: library/Director/Web/Controller/TemplateController.php:56
+#, php-format
+msgid "Notification Apply Rules based on %s"
+msgstr "Regole di apply rule per notifiche basate su %s"
+
+#: library/Director/Dashboard/Dashlet/NotificationCommandsDashlet.php:19
+#: library/Director/Import/ImportSourceCoreApi.php:58
+msgid "Notification Commands"
+msgstr "Comandi di notifica"
+
+#: library/Director/Dashboard/Dashlet/NotificationCommandsDashlet.php:12
+msgid ""
+"Notification Commands allow you to trigger any action you want when a "
+"notification takes place"
+msgstr ""
+"I comandi di notifica consentono di attivare qualsiasi azione che si "
+"desidera quando avviene una notifica"
+
+#: application/forms/IcingaNotificationForm.php:19
+msgid "Notification Template"
+msgstr "Notifica template"
+
+#: application/forms/IcingaNotificationForm.php:254
+msgid "Notification command"
+msgstr "Comandi di notifica"
+
+#: application/forms/IcingaNotificationForm.php:176
+msgid "Notification interval"
+msgstr "Interfallo di notifica"
+
+#: application/controllers/TemplatechoicesController.php:29
+msgid "Notification template choices"
+msgstr "Scelta notifica template"
+
+#: library/Director/Dashboard/Dashlet/NotificationTemplateDashlet.php:13
+msgid "Notification templates"
+msgstr "Notifica templates"
+
+#: configuration.php:130 application/forms/BasketForm.php:27
+#: library/Director/Dashboard/Dashlet/NotificationApplyDashlet.php:13
+#: library/Director/Dashboard/Dashlet/NotificationsDashlet.php:13
+#: library/Director/Web/Table/CustomvarVariantsTable.php:61
+#: library/Director/Web/Table/CustomvarTable.php:46
+msgid "Notifications"
+msgstr "Notifiche"
+
+#: library/Director/Dashboard/NotificationsDashboard.php:20
+msgid ""
+"Notifications are sent when a host or service reaches a non-ok hard state or "
+"recovers from such. One might also want to send them for special events like "
+"when a Downtime starts, a problem gets acknowledged and much more. You can "
+"send specific notifications only within specific time periods, you can delay "
+"them and of course re-notify at specific intervals.\n"
+"\n"
+" Combine those possibilities in case you need to define escalation levels, "
+"like notifying operators first and your management later on in case the "
+"problem remains unhandled for a certain time.\n"
+"\n"
+" You might send E-Mail or SMS, make phone calls or page on various "
+"channels. You could also delegate notifications to external service "
+"providers. The possibilities are endless, as you are allowed to define as "
+"many custom notification commands as you want"
+msgstr ""
+"Le notifiche vengono inviate quando un host o un servizio raggiunge uno "
+"stato non-ok hard state o si riprende da tale stato. Si potrebbe anche "
+"volerle inviare per eventi speciali come quando inizia un periodo di "
+"inattività, quando un problema viene riconosciuto e molto altro ancora. È "
+"possibile inviare notifiche specifiche solo entro periodi di tempo "
+"specifici, è possibile ritardarle e naturalmente ri-notificare a intervalli "
+"di tempo specifici.\n"
+"\n"
+" Combinate queste possibilità nel caso in cui sia necessario definire "
+"livelli di escalation, come la notifica prima agli operatori e la vostra "
+"gestione in seguito nel caso in cui il problema rimanga non gestito per un "
+"certo periodo di tempo.\n"
+"\n"
+" Potreste inviare e-mail o SMS, fare telefonate o pagine su vari canali. "
+"Potreste anche delegare le notifiche a fornitori di servizi esterni. Le "
+"possibilità sono infinite, poiché è possibile definire tutti i comandi di "
+"notifica personalizzati che si desidera"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:42
+msgid "Numeric position"
+msgstr "Posizione numerica"
+
+#: library/Director/IcingaConfig/StateFilterSet.php:24
+msgid "OK"
+msgstr "Ok"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1089
+#: library/Director/Web/Form/DirectorObjectForm.php:1094
+#: library/Director/Web/Controller/TemplateController.php:148
+#: library/Director/DataType/DataTypeDirectorObject.php:64
+msgid "Object"
+msgstr "Oggetto"
+
+#: application/controllers/InspectController.php:106
+msgid "Object Inspection"
+msgstr "Ispezione dell'oggetto"
+
+#: application/forms/SyncRuleForm.php:45
+msgid "Object Type"
+msgstr "Tipo Oggetto"
+
+#: library/Director/Import/ImportSourceLdap.php:53
+msgid "Object class"
+msgstr "Classe dell'oggetto"
+
+#: library/Director/Dashboard/Dashlet/DependencyObjectDashlet.php:18
+#, fuzzy
+msgid "Object dependency relationships."
+msgstr "Relazioni di dipendenza da oggetti"
+
+#: application/forms/RestoreObjectForm.php:80
+msgid "Object has been re-created"
+msgstr "L'oggetto é stato ri-creato"
+
+#: application/forms/RestoreObjectForm.php:72
+msgid "Object has been restored"
+msgstr "L'oggetto é stato ripristinato"
+
+#: application/forms/SyncPropertyForm.php:358
+msgid "Object properties"
+msgstr "Proprietá dell'oggetto"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1102
+#: library/Director/Web/Table/SyncruleTable.php:46
+msgid "Object type"
+msgstr "Tipo Oggetto"
+
+#: application/controllers/InspectController.php:67
+#, php-format
+msgid "Object type \"%s\""
+msgstr "Tipo Oggetto \"%s\""
+
+#: library/Director/Web/Table/GeneratedConfigFileTable.php:85
+msgid "Object/Tpl/Apply"
+msgstr "Oggetto/Tpl/Applica"
+
+#: library/Director/Web/Table/HostTemplateUsageTable.php:11
+#: library/Director/Web/Table/ServiceTemplateUsageTable.php:11
+#: library/Director/Web/Table/TemplateUsageTable.php:24
+#, fuzzy
+msgid "Objects"
+msgstr "Oggetti"
+
+#: library/Director/Import/ImportSourceRestApi.php:136
+msgid ""
+"Often the expected result is provided in a property like \"objects\". Please "
+"specify this if required"
+msgstr ""
+"Spesso il risultato atteso è fornito in una proprietà come \"oggetti\". Si "
+"prega di specificare questo se richiesto"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:27
+#: library/Director/PropertyModifier/PropertyModifierParseURL.php:34
+msgid "On failure"
+msgstr "In caso di fallimento"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:227
+msgid "One apply rule has been defined"
+msgstr "Una apply rule é stata definita"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:249
+msgid "One external object has been defined, it will not be deployed"
+msgstr "Un oggetto esterno é stato definite, non verrá implementato"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:252
+msgid "One object has been defined"
+msgstr "Un oggetto è stato definito"
+
+#: application/forms/IcingaMultiEditForm.php:90
+#: library/Director/Web/Widget/SyncRunDetails.php:45
+msgid "One object has been modified"
+msgstr "Un oggetto é stato modificato"
+
+#: library/Director/PropertyModifier/PropertyModifierSplit.php:16
+msgid "One or more characters that should be used to split this string"
+msgstr "Uno o più caratteri da utilizzare per separare questa stringa"
+
+#: library/Director/PropertyModifier/PropertyModifierJoin.php:16
+msgid ""
+"One or more characters that will be used to glue an input array to a string. "
+"Can be left empty"
+msgstr ""
+"Uno o più caratteri che saranno usati per incollare un input array ad una "
+"stringa. Può essere lasciato vuoto"
+
+#: application/forms/IcingaTimePeriodRangeForm.php:30
+#: application/forms/IcingaScheduledDowntimeRangeForm.php:31
+msgid "One or more time periods, e.g. 00:00-24:00 or 00:00-09:00,17:00-24:00"
+msgstr ""
+"Uno o più periodi di tempo, ad es. 00:00-24:00 o 00:00-09:00,17:00-24:00"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:209
+#: library/Director/Dashboard/Dashlet/Dashlet.php:246
+msgid "One template has been defined"
+msgstr "Un template é stato definito"
+
+#: application/forms/IcingaCommandArgumentForm.php:100
+msgid ""
+"Only set this parameter if the argument value resolves to a numeric value. "
+"String values are not supported"
+msgstr ""
+"Impostare questo parametro solo se il valore dell'argomento si risolve su un "
+"valore numerico. I valori delle stringhe non sono supportati"
+
+#: application/forms/IcingaObjectFieldForm.php:146
+msgid "Optional"
+msgstr "Opzionale"
+
+#: application/forms/IcingaCommandForm.php:72
+msgid ""
+"Optional command timeout. Allowed values are seconds or durations postfixed "
+"with a specific unit (e.g. 1m or also 3m 30s)."
+msgstr ""
+"Timeout comando opzionale. I valori ammessi sono i secondi o le durate "
+"fissate con una specifica unità (ad esempio 1m o anche 3m 30s)"
+
+#: application/forms/IcingaDependencyForm.php:248
+#, fuzzy
+msgid ""
+"Optional. The child service. If omitted this dependency object is treated as "
+"host dependency."
+msgstr ""
+"Opzionale. Il servizio figlio. Se omesso, questo oggetto di dipendenza viene "
+"trattato come dipendenza dell'host"
+
+#: application/forms/IcingaDependencyForm.php:218
+#, fuzzy
+msgid ""
+"Optional. The parent service. If omitted this dependency object is treated "
+"as host dependency."
+msgstr ""
+"Opzionale. Il servizio parente. Se omesso questo oggetto di dipendenza viene "
+"trattato come dipendenza dell'host"
+
+#: application/forms/IcingaObjectFieldForm.php:103
+msgid "Other available fields"
+msgstr "Altri campi disponibili"
+
+#: application/forms/SyncPropertyForm.php:273
+msgid "Other sources"
+msgstr "Altre risorse"
+
+#: application/forms/IcingaServiceForm.php:148
+#: application/forms/IcingaServiceForm.php:405
+#: application/forms/IcingaServiceForm.php:441
+msgid "Override vars"
+msgstr "Sovrascrivi variabili"
+
+#: library/Director/Web/ActionBar/AutomationObjectActionBar.php:32
+#: library/Director/Web/Tabs/MainTabs.php:26
+msgid "Overview"
+msgstr "Panoramica"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:74
+msgid "PHP Binary"
+msgstr "PHP Binario"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:77
+msgid "PHP Integer"
+msgstr "PHP Intero"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:76
+msgid "PHP Version"
+msgstr "PHP-Versione"
+
+#: application/controllers/PhperrorController.php:18
+#, php-format
+msgid ""
+"PHP version 5.4.x is required for Director >= 1.4.0, you're running %s. "
+"Please either upgrade PHP or downgrade Icinga Director"
+msgstr ""
+"La versione 5.4.x di PHP è richiesta per Director >= 1.4.0, in corso %s. Si "
+"prega di aggiornare PHP o di eseguire il downgrade di Icinga Director"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:66
+msgid "PID"
+msgstr "PID"
+
+#: application/forms/IcingaUserForm.php:41
+msgid "Pager"
+msgstr "Paginazione"
+
+#: application/forms/IcingaDependencyForm.php:200
+msgid "Parent Host"
+msgstr "Host-Parente"
+
+#: application/forms/IcingaDependencyForm.php:216
+msgid "Parent Service"
+msgstr "Sevizio-Parente"
+
+#: application/forms/IcingaZoneForm.php:36
+msgid "Parent Zone"
+msgstr "Zona-Parente"
+
+#: application/forms/IcingaApiUserForm.php:19
+#: application/forms/KickstartForm.php:159
+#: library/Director/Import/ImportSourceRestApi.php:156
+msgid "Password"
+msgstr "Password"
+
+#: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:13
+#: library/Director/PropertyModifier/PropertyModifierCombine.php:14
+msgid "Pattern"
+msgstr "Modello"
+
+#: application/forms/ApplyMigrationsForm.php:39
+msgid "Pending database schema migrations have successfully been applied"
+msgstr ""
+"Sono state applicate con successo le migrazioni degli schemi di database in "
+"sospeso"
+
+#: library/Director/Util.php:185
+msgid "Please ask an administrator to grant you access to resources"
+msgstr ""
+"Si prega di contattare l'amministratore per richiedere l'accesso alle risorse"
+
+#: application/forms/AddToBasketForm.php:118
+#, php-format
+msgid ""
+"Please check your Basket configuration, %s does not support single \"%s\" "
+"configuration objects"
+msgstr ""
+"Si prega di controllare la configurazione del vostro Basket, %s non supporta "
+"singoli oggetti di configurazione \"%s"
+
+#: library/Director/PropertyModifier/PropertyModifierMap.php:19
+msgid "Please choose a data list that can be used for map lookups"
+msgstr ""
+"Si prega di scegliere una lista dati che puo' essere utilizzata per la map "
+"lookups"
+
+#: library/Director/DataType/DataTypeDirectorObject.php:66
+msgid "Please choose a specific Icinga object type"
+msgstr "Scegliere un tipo di Icinga-Oggetto specifico"
+
+#: library/Director/Job/ImportJob.php:82
+#, fuzzy
+msgid ""
+"Please choose your import source that should be executed. You could create "
+"different schedules for different sources or also opt for running all of "
+"them at once."
+msgstr ""
+"Scegliete la sorgente di importazione da eseguire. Potete creare diverse "
+"programmazioni per diverse fonti o anche scegliere di eseguirli tutti in una "
+"volta"
+
+#: library/Director/Job/SyncJob.php:82
+#, fuzzy
+msgid ""
+"Please choose your synchronization rule that should be executed. You could "
+"create different schedules for different rules or also opt for running all "
+"of them at once."
+msgstr ""
+"Si prega di scegliere la regola di sincronizzazione da eseguire. Potete "
+"creare diverse programmazioni per regole diverse o anche scegliere di "
+"eseguirle tutte in una volta"
+
+#: library/Director/Import/ImportSourceSql.php:57
+msgid "Please click \"Store\" once again to determine query columns"
+msgstr ""
+"Si prega di cliccare nuovamente \"Memorizza\" per determinare la colonna di "
+"interrogazione"
+
+#: application/forms/KickstartForm.php:257
+#, php-format
+msgid "Please click %s to create new DB resources"
+msgstr "Si prega di premere %s per creare nuove risorse DB"
+
+#: library/Director/Util.php:175
+#, php-format
+msgid "Please click %s to create new resources"
+msgstr "Si prega di premere %s per creare nuove risorse"
+
+#: application/forms/IcingaAddServiceForm.php:87
+#: application/forms/IcingaHostForm.php:155
+#, php-format
+msgid "Please define a %s first"
+msgstr "Si prega di definire prima un %s"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1202
+msgid "Please define a related template first"
+msgstr "Si prega di definire prima un template correlato"
+
+#: application/forms/KickstartForm.php:219
+msgid ""
+"Please make sure that your database exists and your user has been granted "
+"enough permissions"
+msgstr ""
+"Si prega di assicurarsi che il database esista e che il tuo utente abbia "
+"ottenuto sufficienti autorizzazioni"
+
+#: application/forms/SettingsForm.php:23
+#, fuzzy
+msgid ""
+"Please only change those settings in case you are really sure that you are "
+"required to do so. Usually the defaults chosen by the Icinga Director should "
+"make a good fit for your environment."
+msgstr ""
+"Si prega di modificare queste impostazioni solo nel caso in cui siate "
+"veramente sicuri che sia necessario farlo. Di solito le impostazioni "
+"predefinite scelte dal Director di Icinga dovrebbero essere adatte al "
+"vostro ambiente"
+
+#: application/forms/SyncRuleForm.php:31
+#, fuzzy
+msgid "Please provide a rule name"
+msgstr "Si prega di fornire il nome della regola"
+
+#: library/Director/PropertyModifier/PropertyModifierSubstring.php:17
+#: library/Director/PropertyModifier/PropertyModifierSubstring.php:27
+#, php-format
+msgid "Please see %s for detailled instructions of how start and end work"
+msgstr ""
+"Per istruzioni dettagliate su come iniziare e terminare il lavoro, vedere le "
+"%s"
+
+#: application/forms/ImportRowModifierForm.php:32
+msgid ""
+"Please start typing for a list of suggestions. Dots allow you to access "
+"nested properties: column.some.key. Such nested properties cannot be "
+"modified in-place, but you can store the modified value to a new \"target "
+"property\""
+msgstr ""
+"Si prega di iniziare a digitare per ottenere dei suggerimenti. I punti "
+"consentono di accedere alle proprietà annidate: column.some.key. Tali "
+"proprietà annidate non possono essere modificate in loco, ma è possibile "
+"memorizzare il valore modificato in una nuova \"proprietà di destinazione\"."
+
+#: application/forms/IcingaCommandForm.php:36
+msgid ""
+"Plugin Check commands are what you need when running checks agains your "
+"infrastructure. Notification commands will be used when it comes to notify "
+"your users. Event commands allow you to trigger specific actions when "
+"problems occur. Some people use them for auto-healing mechanisms, like "
+"restarting services or rebooting systems at specific thresholds"
+msgstr ""
+"I comandi Plugin Check sono ciò di cui avete bisogno quando eseguite i "
+"controlli sulla vostra infrastruttura. I comandi di notifica saranno "
+"utilizzati quando si tratta di notificare i vostri utenti. I comandi degli "
+"eventi vi permettono di attivare azioni specifiche quando si verificano "
+"problemi. Alcuni li usano per meccanismi di auto-guarigione, come il riavvio "
+"di servizi o il riavvio di sistemi a soglie specifiche"
+
+#: application/forms/IcingaCommandForm.php:20
+msgid "Plugin commands"
+msgstr "Comandi Plugin"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:50
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:52
+msgid "Policy"
+msgstr "Policy"
+
+#: application/forms/IcingaEndpointForm.php:36
+#: application/forms/KickstartForm.php:141
+msgid "Port"
+msgstr "Porta"
+
+#: application/forms/IcingaCommandArgumentForm.php:67
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:40
+msgid "Position"
+msgstr "Posizione"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:30
+msgid "Position Type"
+msgstr "Tipo posizione"
+
+#: application/controllers/SchemaController.php:17
+msgid "PostgreSQL schema"
+msgstr "PostgreSQL Schema"
+
+#: application/forms/IcingaTimePeriodForm.php:76
+msgid "Prefer includes"
+msgstr "Preferisce include"
+
+#: library/Director/Dashboard/Dashlet/BasketDashlet.php:17
+msgid "Preserve specific configuration objects in a specific state"
+msgstr ""
+"Conservare gli oggetti di configurazione specifici in uno stato specifico"
+
+#: library/Director/Web/Tabs/ImportsourceTabs.php:49
+#: library/Director/Web/Tabs/ObjectTabs.php:86
+#: library/Director/Web/Tabs/SyncRuleTabs.php:33
+msgid "Preview"
+msgstr "Anteprima"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:23
+msgid "Problem"
+msgstr "Problema"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:27
+msgid "Problem handling"
+msgstr "Gestione problema"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:99
+msgid "Process List"
+msgstr "Elenco dei processi"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1411
+msgid "Process performance data"
+msgstr "Dati sulle prestazioni del processo"
+
+#: library/Director/Web/Tabs/SyncRuleTabs.php:39
+#: library/Director/Import/ImportSourceLdap.php:67
+#, fuzzy
+msgid "Properties"
+msgstr "Proprietá "
+
+#: application/forms/ImportRowModifierForm.php:30
+#: library/Director/Web/Table/PropertymodifierTable.php:113
+#: library/Director/PropertyModifier/PropertyModifierGetPropertyFromOtherImportSource.php:61
+#, fuzzy
+msgid "Property"
+msgstr "Proprietá "
+
+#: application/controllers/ImportsourceController.php:169
+#, php-format
+msgid "Property modifiers: %s"
+msgstr "Modificatori di proprietà: %s"
+
+#: library/Director/Web/Table/CoreApiFieldsTable.php:82
+msgid "Protected"
+msgstr "Protetto"
+
+#: library/Director/Import/ImportSourceRestApi.php:72
+msgid "Protocol"
+msgstr "Protocollo"
+
+#: application/controllers/InspectController.php:91
+msgid "Prototypes (methods)"
+msgstr "Prototipi (metodi)"
+
+#: library/Director/Dashboard/Dashlet/DatalistDashlet.php:11
+msgid "Provide Data Lists"
+msgstr "Fornire elenchi dati"
+
+#: library/Director/Dashboard/Dashlet/DatalistDashlet.php:17
+msgid "Provide data lists to make life easier for your users"
+msgstr "Fornire liste di dati per facilitare il lavoro ai vostri utenti"
+
+#: library/Director/Dashboard/Dashlet/TimeperiodTemplateDashlet.php:18
+#, fuzzy
+msgid "Provide templates for your TimePeriod objects."
+msgstr "Fornire templates per gli oggetti TimePeriod"
+
+#: library/Director/Dashboard/Dashlet/UserTemplateDashlet.php:18
+#, fuzzy
+msgid "Provide templates for your User objects."
+msgstr "Fornire templates per i vostri oggetti User"
+
+#: library/Director/Dashboard/Dashlet/NotificationTemplateDashlet.php:18
+#, fuzzy
+msgid "Provide templates for your notifications."
+msgstr "Fornire templates per le vostre notifiche"
+
+#: library/Director/Import/ImportSourceRestApi.php:167
+msgid "Proxy"
+msgstr "Proxy"
+
+#: library/Director/Import/ImportSourceRestApi.php:183
+msgid "Proxy Address"
+msgstr "Indirizzo Proxy"
+
+#: library/Director/Import/ImportSourceRestApi.php:201
+msgid "Proxy Password"
+msgstr "Password Proxy"
+
+#: library/Director/Import/ImportSourceRestApi.php:191
+msgid "Proxy Username"
+msgstr "Username Proxy"
+
+#: application/forms/SyncRuleForm.php:68
+msgid "Purge"
+msgstr "Ripulire"
+
+#: library/Director/Web/Tabs/ObjectTabs.php:122
+msgid "Ranges"
+msgstr "Ranges"
+
+#: application/forms/DeployConfigForm.php:32
+msgid "Re-deploy now"
+msgstr "Ri-distribuisci adesso"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:24
+msgid "Recovery"
+msgstr "Recupera"
+
+#: application/forms/IcingaGenerateApiKeyForm.php:22
+msgid "Regenerate Self Service API key"
+msgstr "Rigenerare la chiave API del Self Service"
+
+#: application/forms/IcingaHostSelfServiceForm.php:56
+msgid "Register"
+msgstr "Registra"
+
+#: library/Director/Web/SelfService.php:59
+msgid "Registered Agent"
+msgstr "Registra Agente"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:34
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:32
+msgid "Regular Expression"
+msgstr "Espressione Regolare"
+
+#: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:16
+msgid "Regular expression pattern to split the string (e.g. /\\s+/ or /[,;]/)"
+msgstr ""
+"Schema di espressione regolare per dividere la stringa (ad esempio /\\s+/ o /"
+"[,;]/)"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:58
+msgid "Reject matching elements"
+msgstr "Rifiuta gli elementi corrispondenti"
+
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:59
+msgid "Reject the whole row (Blacklist)"
+msgstr "Rifiuta l'intera fila (Blacklist)"
+
+#: application/forms/IcingaDependencyForm.php:268
+msgid "Related Objects"
+msgstr "Oggetti correlati"
+
+#: library/Director/Web/Table/IcingaServiceSetServiceTable.php:191
+msgid "Remove"
+msgstr "Rimuovi"
+
+#: library/Director/Web/Table/IcingaServiceSetServiceTable.php:193
+#, php-format
+msgid "Remove \"%s\" from this host"
+msgstr "Rimuovere \"%s\" da questo host"
+
+#: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:480
+msgid "Remove this entry"
+msgstr "Rimuovere questa voce"
+
+#: application/views/helpers/FormDataFilter.php:507
+msgid "Remove this part of your filter"
+msgstr "Rimuovere questa parte del filtro"
+
+#: application/forms/DirectorDatafieldForm.php:96
+msgid "Rename related vars"
+msgstr "Rinomina le variabili correlati"
+
+#: application/forms/IcingaCommandForm.php:87
+msgid "Render as string"
+msgstr "Renderizza come stringa"
+
+#: application/controllers/ConfigController.php:67
+msgid "Render config"
+msgstr "Creare la configurazione"
+
+#: application/forms/IcingaCommandForm.php:78
+#, fuzzy
+msgid "Render the command as a plain string instead of an array."
+msgstr "Renderizza il comando come una stringa semplice invece di un array."
+
+#: application/controllers/ConfigController.php:290
+msgid "Rendered file"
+msgstr "File renderizzato"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:97
+#, php-format
+msgid "Rendered in %0.2fs, deployed in %0.2fs"
+msgstr "Rendered in %0.2fs, distribuito in %0.2fs"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:562
+#: library/Director/Web/Widget/ActivityLogInfo.php:567
+msgid "Rendering"
+msgstr "Rendering"
+
+#: application/forms/IcingaCommandArgumentForm.php:107
+msgid "Repeat key"
+msgstr "Ripeti chiave"
+
+#: application/forms/SyncRuleForm.php:62
+msgid "Replace"
+msgstr "Sostituisci"
+
+#: application/views/scripts/phperror/dependencies.phtml:17
+#: application/forms/IcingaCommandArgumentForm.php:124
+#: library/Director/Web/Table/CoreApiFieldsTable.php:81
+msgid "Required"
+msgstr "Richiesto"
+
+#: application/controllers/BasketController.php:206
+#: application/forms/RestoreBasketForm.php:58
+#: application/forms/IcingaServiceForm.php:139
+msgid "Restore"
+msgstr "Ripristina"
+
+#: application/forms/RestoreObjectForm.php:17
+msgid "Restore former object"
+msgstr "Ripristinare l'oggetto precedente"
+
+#: application/forms/RestoreBasketForm.php:52
+msgid "Restore to this target Director DB"
+msgstr "Ripristinare a questo Director DB"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1339
+msgid "Retry interval"
+msgstr "Intervallo di ripetizione"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1341
+msgid ""
+"Retry interval, will be applied after a state change unless the next hard "
+"state is reached"
+msgstr ""
+"Intervallo di ripetizione, sarà applicato dopo un cambio di stato, a meno "
+"che non venga raggiunto il prossimo stato difficile"
+
+#: library/Director/PropertyModifier/PropertyModifierMap.php:34
+msgid "Return lookup key unmodified"
+msgstr "La chiave di ricerca per la restituzione rimane invariata"
+
+#: application/forms/SyncRuleForm.php:30
+#: library/Director/Web/Table/SyncruleTable.php:45
+msgid "Rule name"
+msgstr "Nome regola"
+
+#: library/Director/Job/ImportJob.php:119
+msgid "Run all imports at once"
+msgstr "Eseguire tutte le importazioni in una sola volta"
+
+#: library/Director/Job/SyncJob.php:125
+#, fuzzy
+msgid "Run all rules at once"
+msgstr "Eseguire tutte le regole in una volta"
+
+#: application/forms/KickstartForm.php:185
+#: library/Director/Job/ImportJob.php:92
+msgid "Run import"
+msgstr "Esegui importazione"
+
+#: application/forms/DirectorJobForm.php:46
+msgid "Run interval"
+msgstr "Intervallo di esecuzione"
+
+#: application/forms/IcingaServiceForm.php:664
+msgid "Run on agent"
+msgstr "Esegui su agent"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:69
+msgid "Running with systemd"
+msgstr "Funzionamento con systemd"
+
+#: library/Director/Import/ImportSourceRestApi.php:174
+msgid "SOCKS5 proxy"
+msgstr "SOCKS5 Proxy"
+
+#: library/Director/Dashboard/Dashlet/JobDashlet.php:29
+msgid ""
+"Schedule and automate Import, Syncronization, Config Deployment, "
+"Housekeeping and more"
+msgstr ""
+"Programmare e automatizzare l'importazione, la sincronizzazione, la "
+"configurazione, l'implementazione, la pulizia e altro ancora"
+
+#: library/Director/Dashboard/NotificationsDashboard.php:14
+#: library/Director/Dashboard/UsersDashboard.php:15
+msgid "Schedule your notifications"
+msgstr "Programmare le notifiche"
+
+#: library/Director/Dashboard/Dashlet/NotificationsDashlet.php:19
+msgid ""
+"Schedule your notifications. Define who should be notified, when, and for "
+"which kind of problem"
+msgstr ""
+"Programmate le vostre notifiche. Definire chi deve essere notificato, quando "
+"e per quale tipo di problema"
+
+#: application/forms/SyncRuleForm.php:23
+msgid "Scheduled Downtime"
+msgstr "Downtime programmato"
+
+#: library/Director/Dashboard/Dashlet/ScheduledDowntimeApplyDashlet.php:13
+msgid "Scheduled Downtimes"
+msgstr "Downtime programmati"
+
+#: application/forms/SettingsForm.php:165
+msgid ""
+"Script or tool to call when activating a new configuration stage. (e.g. "
+"sudo /usr/local/bin/icinga-director-activate) (name of the stage will be the "
+"argument for the script)"
+msgstr ""
+"Script o tool da chiamare quando si attiva una nuova fase di configurazione. "
+"(ad esempio sudo /usr/local/bin/icinga-director-activate) (il nome dello "
+"stage sarà l'argomento per lo script)"
+
+#: application/controllers/SettingsController.php:43
+#: application/controllers/SelfServiceController.php:101
+msgid "Self Service"
+msgstr "Self Service"
+
+#: application/controllers/SelfServiceController.php:102
+msgid "Self Service - Host Registration"
+msgstr "Self Service - Registrazione Host"
+
+#: library/Director/Dashboard/Dashlet/SelfServiceDashlet.php:11
+msgid "Self Service API"
+msgstr "Self Service API"
+
+#: application/controllers/SettingsController.php:44
+msgid "Self Service API - Global Settings"
+msgstr "Self Service API - Impostazioni Globali"
+
+#: application/forms/SelfServiceSettingsForm.php:285
+msgid "Self Service Settings have been stored"
+msgstr "Le impostazioni del Self Service sono state memorizzate"
+
+#: application/forms/IcingaUserForm.php:89
+#: library/Director/Web/Form/DirectorObjectForm.php:1399
+msgid "Send notifications"
+msgstr "Invia notifiche"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:78
+msgid "Sent to"
+msgstr "Invia a"
+
+#: application/forms/IcingaAddServiceForm.php:105
+#: application/forms/SyncRuleForm.php:14
+#: application/forms/IcingaServiceVarForm.php:15
+#: library/Director/TranslationDummy.php:14
+msgid "Service"
+msgstr "Servizio"
+
+#: library/Director/Dashboard/Dashlet/ServiceApplyRulesDashlet.php:11
+msgid "Service Apply Rules"
+msgstr "Apply rules del servizio"
+
+#: application/forms/SyncRuleForm.php:15
+msgid "Service Group"
+msgstr "Gruppo di servizio"
+
+#: application/forms/BasketForm.php:23
+#: library/Director/Dashboard/Dashlet/ServiceGroupsDashlet.php:11
+msgid "Service Groups"
+msgstr "Gruppi di servizio"
+
+#: application/forms/SyncRuleForm.php:16
+#: library/Director/DataType/DataTypeDirectorObject.php:58
+msgid "Service Set"
+msgstr "Set di servizi"
+
+#: application/forms/RemoveLinkForm.php:55
+msgid "Service Set has been removed"
+msgstr "Il set di servizi è stato rimosso"
+
+#: application/forms/BasketForm.php:26
+#: library/Director/Dashboard/Dashlet/ServiceSetsDashlet.php:11
+#: library/Director/Web/Table/CustomvarVariantsTable.php:60
+#: library/Director/Web/Table/CustomvarTable.php:45
+msgid "Service Sets"
+msgstr "Set di servizi"
+
+#: application/forms/IcingaAddServiceForm.php:89
+msgid "Service Template"
+msgstr "Template di servizi"
+
+#: application/forms/BasketForm.php:24
+msgid "Service Template Choice"
+msgstr "Scelta del template di servizio"
+
+#: application/forms/BasketForm.php:25
+#: library/Director/Dashboard/Dashlet/ServiceTemplatesDashlet.php:11
+msgid "Service Templates"
+msgstr "Templates di servizio"
+
+#: application/forms/SelfServiceSettingsForm.php:166
+msgid "Service User"
+msgstr "Utente del servizio"
+
+#: library/Director/DataType/DataTypeDirectorObject.php:57
+msgid "Service groups"
+msgstr "Gruppi di servizio"
+
+#: application/forms/IcingaServiceForm.php:639
+msgid ""
+"Service groups that should be directly assigned to this service. "
+"Servicegroups can be useful for various reasons. They are helpful to "
+"provided service-type specific view in Icinga Web 2, either for custom "
+"dashboards or as an instrument to enforce restrictions. Service groups can "
+"be directly assigned to single services or to service templates."
+msgstr ""
+"Gruppi di servizi che dovrebbero essere assegnati direttamente a questo "
+"servizio. I gruppi di servizio possono essere utili per vari motivi. Sono "
+"utili per fornire una vista specifica del tipo di servizio in Icinga Web 2, "
+"sia dashboard personalizzate che come strumento per far rispettare le "
+"restrizioni. I gruppi di servizi possono essere assegnati direttamente a "
+"singoli servizi o a template di servizio"
+
+#: library/Director/Web/Table/IcingaHostAppliedForServiceTable.php:102
+msgid "Service name"
+msgstr "Nome del servizio"
+
+#: application/controllers/SuggestController.php:257
+#: library/Director/Objects/IcingaService.php:726
+msgid "Service properties"
+msgstr "Proprietà del servizio"
+
+#: application/forms/IcingaAddServiceSetForm.php:86
+#: application/forms/IcingaServiceSetForm.php:85
+msgid "Service set"
+msgstr "Set di servizi"
+
+#: application/forms/IcingaServiceSetForm.php:28
+msgid "Service set name"
+msgstr "Nome del set di servizi"
+
+#: application/controllers/TemplatechoiceController.php:22
+msgid "Service template choice"
+msgstr "Scelta del template di servizio"
+
+#: application/controllers/TemplatechoicesController.php:24
+msgid "Service template choices"
+msgstr "Scelta del template di servizio"
+
+#: application/controllers/ServiceController.php:76
+msgid "ServiceSet"
+msgstr "SetServizi"
+
+#: application/forms/IcingaServiceGroupForm.php:14
+msgid "Servicegroup"
+msgstr "Gruppo di servizio"
+
+#: library/Director/Web/Table/IcingaHostServiceTable.php:140
+#: library/Director/Web/Table/IcingaServiceSetServiceTable.php:154
+#: library/Director/Web/Table/IcingaAppliedServiceTable.php:32
+msgid "Servicename"
+msgstr "Nome del servizio"
+
+#: configuration.php:122 application/controllers/ServiceController.php:57
+#: application/controllers/ServiceController.php:80
+#: application/forms/IcingaScheduledDowntimeForm.php:86
+#: application/forms/IcingaDependencyForm.php:101
+#: application/forms/IcingaNotificationForm.php:90
+#: library/Director/Web/Table/CustomvarVariantsTable.php:59
+#: library/Director/Web/Table/CustomvarTable.php:44
+#: library/Director/Web/Tabs/ObjectTabs.php:75
+#: library/Director/DataType/DataTypeDirectorObject.php:56
+#: library/Director/IcingaConfig/StateFilterSet.php:23
+msgid "Services"
+msgstr "Servizi"
+
+#: application/controllers/ServicesetController.php:62
+#, php-format
+msgid "Services in this set: %s"
+msgstr "Servizi in questo set: %s"
+
+#: application/controllers/HostController.php:213
+#, php-format
+msgid "Services on %s"
+msgstr "Servizi su %s"
+
+#: application/controllers/HostController.php:137
+#, php-format
+msgid "Services: %s"
+msgstr "Servizi: %s"
+
+#: application/forms/SyncPropertyForm.php:84
+msgid "Set based on filter"
+msgstr "Impostazione basata sul filtro"
+
+#: library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:44
+msgid "Set false"
+msgstr "Imposta falso"
+
+#: library/Director/PropertyModifier/PropertyModifierJsonDecode.php:25
+#: library/Director/PropertyModifier/PropertyModifierDnsRecords.php:34
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:30
+#: library/Director/PropertyModifier/PropertyModifierGetHostByName.php:17
+#: library/Director/PropertyModifier/PropertyModifierParseURL.php:39
+msgid "Set no value (null)"
+msgstr "Imposta nessun valore (null)"
+
+#: library/Director/PropertyModifier/PropertyModifierMap.php:33
+#: library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:42
+msgid "Set null"
+msgstr "Imposta null"
+
+#: library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:43
+msgid "Set true"
+msgstr "Importa vero"
+
+#: library/Director/Web/Tabs/ObjectsTabs.php:77
+msgid "Sets"
+msgstr "Set"
+
+#: application/forms/IcingaHostForm.php:105
+msgid ""
+"Setting a command endpoint allows you to force host checks to be executed by "
+"a specific endpoint. Please carefully study the related Icinga documentation "
+"before using this feature"
+msgstr ""
+"L'impostazione di un endpoint di comando consente di forzare l'esecuzione "
+"dei controlli dell'host da parte di uno specifico endpoint. Si prega di "
+"studiare attentamente la relativa documentazione di Icinga prima di "
+"utilizzare questa funzione"
+
+#: application/controllers/ConfigController.php:221
+#: library/Director/Web/SelfService.php:93
+#, fuzzy
+msgid "Settings"
+msgstr "Impostazioni"
+
+#: application/forms/SettingsForm.php:218
+msgid "Settings have been stored"
+msgstr "Le impostazioni sono state memorizzate"
+
+#: library/Director/Web/SelfService.php:86
+msgid "Share this Template for Self Service API"
+msgstr "Condividi questo template di API per il Self Service"
+
+#: library/Director/Web/SelfService.php:84
+msgid "Shared for Self Service API"
+msgstr "API condivisa per il Self Service"
+
+#: library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:21
+msgid "Should all the other characters be lowercased first?"
+msgstr "Tutti gli altri caratteri devono essere in lettere minuscole?"
+
+#: application/controllers/HostController.php:514
+msgid "Show"
+msgstr "Mostra"
+
+#: application/controllers/BasketController.php:200
+msgid "Show Basket"
+msgstr "Mostra Basket"
+
+#: application/forms/DeployFormsBug7530.php:97
+#, php-format
+msgid "Show Issue %s on GitHub"
+msgstr "Mostra Issue %s su GitHub"
+
+#: library/Director/Web/Widget/AdditionalTableActions.php:75
+msgid "Show SQL"
+msgstr "Mostra SQL"
+
+#: library/Director/Web/Table/ApplyRulesTable.php:147
+msgid "Show affected Objects"
+msgstr "Mostra gli oggetti interessati"
+
+#: library/Director/Web/Form/IplElement/ExtensibleSetElement.php:457
+msgid "Show available options"
+msgstr "Mostra le opzioni disponibili"
+
+#: application/forms/IcingaObjectFieldForm.php:183
+msgid "Show based on filter"
+msgstr "Mostra in base al filtro"
+
+#: library/Director/Web/Table/ActivityLogTable.php:91
+msgid "Show details related to this change"
+msgstr "Mostra i dettagli relativi a questo cambiamento"
+
+#: library/Director/Web/ObjectPreview.php:51
+msgid "Show normal"
+msgstr "Mostra normale"
+
+#: library/Director/Web/ObjectPreview.php:60
+msgid "Show resolved"
+msgstr "Mostra risolto"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:33
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:31
+msgid "Simple match with wildcards (*)"
+msgstr "Ricerca semplice con caratteri jolly (*)"
+
+#: application/controllers/BasketController.php:332
+msgid "Single Object Diff"
+msgstr "Diffusione a singolo oggetto"
+
+#: library/Director/Dashboard/Dashlet/SingleServicesDashlet.php:11
+msgid "Single Services"
+msgstr "Servizi singoli"
+
+#: library/Director/Web/Table/GeneratedConfigFileTable.php:86
+msgid "Size"
+msgstr "Dimensione"
+
+#: application/forms/IcingaCommandArgumentForm.php:115
+msgid "Skip key"
+msgstr "Tasto Salta"
+
+#: application/controllers/BasketController.php:247
+#: application/controllers/BasketController.php:364
+msgid "Snapshot"
+msgstr "Snapshot"
+
+#: application/controllers/BasketController.php:36
+#: application/controllers/BasketController.php:141
+#: library/Director/Web/Table/BasketTable.php:32
+msgid "Snapshots"
+msgstr "Snapshots"
+
+#: library/Director/Import/ImportSourceRestApi.php:121
+msgid "Something like https://api.example.com/rest/v2/objects"
+msgstr "Qualcosa come https://api.example.com/rest/v2/objects"
+
+#: application/forms/SyncPropertyForm.php:182
+msgid "Source Column"
+msgstr "Colonna Sorgente"
+
+#: application/forms/SyncPropertyForm.php:212
+msgid "Source Expression"
+msgstr "Espressione Sorgente"
+
+#: application/forms/SyncPropertyForm.php:38
+msgid "Source Name"
+msgstr "Nome sorgente"
+
+#: application/forms/SelfServiceSettingsForm.php:101
+msgid "Source Path"
+msgstr "Percorso Sorgente"
+
+#: application/forms/ImportSourceForm.php:33
+msgid "Source Type"
+msgstr "Tipo Sorgente"
+
+#: application/forms/SyncPropertyForm.php:159
+msgid "Source columns"
+msgstr "Colonne Sorgenti"
+
+#: library/Director/Web/Table/SyncpropertyTable.php:62
+msgid "Source field"
+msgstr "Campo Sorgente"
+
+#: library/Director/Web/Table/ImportrunTable.php:30
+#: library/Director/Web/Table/SyncpropertyTable.php:61
+#: library/Director/Web/Table/ImportsourceTable.php:18
+msgid "Source name"
+msgstr "Nome Sorgente"
+
+#: application/forms/SyncPropertyForm.php:355
+msgid "Special properties"
+msgstr "Proprietá speciali"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:35
+msgid "Specific Element (by position)"
+msgstr "Elementi Specifici (per posizione)"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:87
+msgid "Stage name"
+msgstr "Nome Stage"
+
+#: library/Director/Web/Widget/SyncRunDetails.php:25
+msgid "Start time"
+msgstr "Ora di inizio"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:88
+msgid "Startup"
+msgstr "Avvio"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:162
+msgid "Startup Log"
+msgstr "Avvio Log"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:65
+msgid "Startup Time"
+msgstr "Inizio Tempo"
+
+#: library/Director/Web/Table/CoreApiFieldsTable.php:79
+msgid "State"
+msgstr "Stato"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1647
+msgid "State and transition type filters"
+msgstr "Filtri di stato e di transizione"
+
+#: library/Director/IcingaConfig/TypeFilterSet.php:22
+msgid "State changes"
+msgstr "Cambiamenti di stato"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1622
+msgid "States"
+msgstr "Stati"
+
+#: library/Director/Web/Widget/DeployedConfigInfoHeader.php:81
+msgid "Statistics"
+msgstr "Statistiche"
+
+#: application/controllers/InspectController.php:43
+#: application/controllers/InspectController.php:151
+msgid "Status"
+msgstr "Stati"
+
+#: library/Director/Web/SelfService.php:134
+msgid "Stop sharing this Template"
+msgstr "Sospendi la condivisione del template"
+
+#: application/forms/SettingsForm.php:127
+#: library/Director/Web/Form/DirectorObjectForm.php:507
+msgid "Store"
+msgstr "Salva"
+
+#: application/forms/KickstartForm.php:36
+msgid "Store configuration"
+msgstr "Salva configurazione"
+
+#: library/Director/DataType/DataTypeDatalist.php:145
+msgid "Strict, list values only"
+msgstr "Severo, solo valori di lista"
+
+#: application/forms/IcingaCommandArgumentForm.php:38
+#: application/forms/IcingaCommandArgumentForm.php:77
+#: library/Director/DataType/DataTypeDirectorObject.php:76
+#: library/Director/DataType/DataTypeSqlQuery.php:76
+#: library/Director/DataType/DataTypeDatalist.php:130
+msgid "String"
+msgstr "Stringa"
+
+#: application/views/helpers/FormDataFilter.php:534
+msgid "Strip this operator, preserve child nodes"
+msgstr "Rimuovere questo operatore, preservare i nodi figlio"
+
+#: library/Director/Web/Form/QuickForm.php:215
+msgid "Submit"
+msgstr "Invia a"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:139
+msgid "Succeeded"
+msgstr "Successo"
+
+#: application/forms/IcingaObjectFieldForm.php:94
+msgid "Suggested fields"
+msgstr "Campi suggeriti"
+
+#: library/Director/Web/ActionBar/TemplateActionBar.php:37
+msgid "Switch to Table view"
+msgstr "Passa alla vista Tabella"
+
+#: library/Director/Web/ActionBar/TemplateActionBar.php:36
+msgid "Switch to Tree view"
+msgstr "Passa alla vista ad albero"
+
+#: application/controllers/SyncruleController.php:557
+#, php-format
+msgid "Sync \"%s\": %s"
+msgstr "Sincronizza \"%s\": \"%s\" "
+
+#: application/controllers/SyncruleController.php:121
+msgid "Sync Properties"
+msgstr "Proprietà di sincronizzazione"
+
+#: application/forms/BasketForm.php:32
+msgid "Sync Rules"
+msgstr "Regole di sincronizzazione"
+
+#: application/controllers/SyncruleController.php:592
+msgid "Sync history"
+msgstr "Storia della sincronizzazione"
+
+#: application/forms/SyncRuleForm.php:82
+#, php-format
+msgid ""
+"Sync only part of your imported objects with this rule. Icinga Web 2 filter "
+"syntax is allowed, so this could look as follows: %s"
+msgstr ""
+"Sincronizzare solo una parte degli oggetti importati con questa regola. La "
+"sintassi del filtro Icinga Web 2 è consentita, quindi potrebbe apparire come "
+"segue: %s"
+
+#: application/controllers/SyncruleController.php:529
+msgid "Sync properties"
+msgstr "Proprietà di sincronizzazione"
+
+#: application/controllers/SyncrulesController.php:25
+#: application/controllers/SyncruleController.php:494
+#: library/Director/Web/Tabs/ImportTabs.php:23
+#: library/Director/Web/Tabs/SyncRuleTabs.php:29
+#: library/Director/Web/Tabs/SyncRuleTabs.php:50
+msgid "Sync rule"
+msgstr "Regola di sincronizzazione"
+
+#: application/controllers/SyncruleController.php:41
+#: application/controllers/SyncruleController.php:466
+#, php-format
+msgid "Sync rule: %s"
+msgstr "Regola di sincronizzazione: %s"
+
+#: application/forms/SyncRunForm.php:42
+msgid "Synchronization failed"
+msgstr "Sincronizzazione fallita"
+
+#: library/Director/Job/SyncJob.php:80
+msgid "Synchronization rule"
+msgstr "Regola di sincronizzazione"
+
+#: library/Director/Dashboard/Dashlet/SyncDashlet.php:14
+msgid "Synchronize"
+msgstr "Sincronizzare"
+
+#: library/Director/Web/ActionBar/TemplateActionBar.php:30
+msgid "Table"
+msgstr "Tabella"
+
+#: application/forms/RestoreBasketForm.php:51
+msgid "Target DB"
+msgstr "Destinatario DB"
+
+#: application/forms/IcingaCloneObjectForm.php:70
+msgid "Target Host"
+msgstr "Destinatario Host"
+
+#: application/forms/IcingaCloneObjectForm.php:61
+msgid "Target Service Set"
+msgstr "Target Set Servizio"
+
+#: library/Director/DataType/DataTypeDirectorObject.php:74
+#: library/Director/DataType/DataTypeSqlQuery.php:74
+#: library/Director/DataType/DataTypeDatalist.php:128
+msgid "Target data type"
+msgstr "Tipo di dati di destinazione"
+
+#: application/forms/ImportRowModifierForm.php:42
+msgid "Target property"
+msgstr "Proprietà obiettivo"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1086
+#: library/Director/Web/Form/DirectorObjectForm.php:1090
+#: library/Director/Web/Controller/TemplateController.php:158
+msgid "Template"
+msgstr "Template"
+
+#: library/Director/Web/Table/TemplatesTable.php:51
+msgid "Template Name"
+msgstr "Nome template"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:16
+msgid "Template name"
+msgstr "Nome template"
+
+#: library/Director/Web/Controller/ObjectController.php:283
+#: library/Director/Web/Controller/TemplateController.php:115
+#, php-format
+msgid "Template: %s"
+msgstr "Tempalte: %s"
+
+#: application/forms/IcingaServiceForm.php:692
+#: library/Director/Web/Tree/TemplateTreeRenderer.php:43
+#: library/Director/Web/Table/DependencyTemplateUsageTable.php:10
+#: library/Director/Web/Table/HostTemplateUsageTable.php:10
+#: library/Director/Web/Table/NotificationTemplateUsageTable.php:10
+#: library/Director/Web/Table/ServiceTemplateUsageTable.php:10
+#: library/Director/Web/Table/TemplateUsageTable.php:23
+#: library/Director/Web/Tabs/ObjectsTabs.php:54
+#, fuzzy
+msgid "Templates"
+msgstr "Templates"
+
+#: application/forms/DeployFormsBug7530.php:112
+msgid "Thanks, I'll verify this and come back later"
+msgstr "Grazie, lo verificherò e tornerò più tardi"
+
+#: library/Director/Job/ImportJob.php:67
+msgid "The \"Import\" job allows to run import actions at regular intervals"
+msgstr ""
+"Il lavoro \"Importa\" consente di eseguire azioni di importazione a "
+"intervalli regolari"
+
+#: library/Director/Job/SyncJob.php:65
+msgid "The \"Sync\" job allows to run sync actions at regular intervals"
+msgstr ""
+"Il lavoro \"Sync\" permette di eseguire azioni di sincronizzazione a "
+"intervalli regolari"
+
+#: application/forms/IcingaTimePeriodRangeForm.php:84
+#: application/forms/IcingaScheduledDowntimeRangeForm.php:89
+#: library/Director/Web/Form/DirectorObjectForm.php:651
+#, php-format
+msgid "The %s has successfully been stored"
+msgstr "Il %s è stato memorizzato con successo"
+
+#: library/Director/Job/ConfigJob.php:221
+msgid ""
+"The Config job allows you to generate and eventually deploy your Icinga 2 "
+"configuration"
+msgstr ""
+"Il lavoro \"Configurazione\" permette di creare ed eventualmente di lanciare "
+"la configurazione di Icinga 2"
+
+#: application/forms/IcingaUserForm.php:37
+msgid "The Email address of the user."
+msgstr "L'indirizzo e-mail dell'utente."
+
+#: library/Director/Job/HousekeepingJob.php:21
+msgid ""
+"The Housekeeping job provides various task that keep your Director database "
+"fast and clean"
+msgstr ""
+"Il lavoro di pulizia offre diverse azioni che mantengono il database del "
+"Director veloce e pulito"
+
+#: application/controllers/DaemonController.php:38
+#, php-format
+msgid ""
+"The Icinga Director Background Daemon is not running. Please check our %s in "
+"case you need step by step instructions showing you how to fix this."
+msgstr ""
+"Il demone dell'Icinga Director non è in funzione. Si prega di "
+"controllare le nostre %s nel caso in cui abbiate bisogno di istruzioni passo "
+"dopo passo che vi mostrino come risolvere il problema."
+
+#: application/controllers/SettingsController.php:38
+msgid ""
+"The Icinga Director Self Service API allows your Hosts to register "
+"themselves. This allows them to get their Icinga Agent configured, installed "
+"and upgraded in an automated way."
+msgstr ""
+"L'API Self Service Director di Icinga consente ai vostri Ospiti di "
+"registrarsi. Questo permette loro di configurare, installare e aggiornare il "
+"loro agente Icinga in modo automatico."
+
+#: application/forms/SettingsForm.php:45
+msgid ""
+"The Icinga Package name Director uses to deploy it's configuration. This "
+"defaults to \"director\" and should not be changed unless you really know "
+"what you're doing"
+msgstr ""
+"Il nome del pacchetto Icinga che Director utilizza per distribuire la sua "
+"configurazione. Questo valore predefinito è \"director\" e non dovrebbe "
+"essere cambiato a meno che non si sappia davvero cosa si sta facendo"
+
+#: library/Director/Import/ImportSourceLdap.php:69
+msgid ""
+"The LDAP properties that should be fetched. This is required to be a comma-"
+"separated list like: \"cn, dnshostname, operatingsystem, sAMAccountName\""
+msgstr ""
+"Le proprietà LDAP che dovrebbero essere recuperate. Questo deve essere un "
+"elenco separato da virgole come: \"cn, dnshostname, sistema operativo, "
+"sAMAccountName\""
+
+#: application/forms/IcingaForgetApiKeyForm.php:31
+#, php-format
+msgid "The Self Service API key for %s has been dropped"
+msgstr "La chiave API del Self Service per %s è stata abbandonata"
+
+#: application/forms/IcingaAddServiceSetForm.php:116
+#, php-format
+msgid "The Service Set \"%s\" has been added to %d hosts"
+msgstr "Il set di servizi \"%s\" è stato aggiunto a %d host"
+
+#: application/forms/IcingaCommandArgumentForm.php:167
+#, php-format
+msgid "The argument %s has successfully been stored"
+msgstr "L'argomento %s è stato memorizzato con successo"
+
+#: application/forms/IcingaObjectFieldForm.php:129
+msgid "The caption which should be displayed"
+msgstr "L'etichetta da visualizzare"
+
+#: application/forms/DirectorDatafieldForm.php:153
+msgid ""
+"The caption which should be displayed to your users when this field is shown"
+msgstr ""
+"La didascalia che dovrebbe essere visualizzata agli utenti quando viene "
+"mostrato questo campo"
+
+#: application/forms/IcingaDependencyForm.php:234
+msgid "The child host."
+msgstr "L'Host figlio."
+
+#: application/forms/IcingaCommandForm.php:62
+msgid ""
+"The command Icinga should run. Absolute paths are accepted as provided, "
+"relative paths are prefixed with \"PluginDir + \", similar Constant prefixes "
+"are allowed. Spaces will lead to separation of command path and standalone "
+"arguments. Please note that this means that we do not support spaces in "
+"plugin names and paths right now."
+msgstr ""
+"Il comando che Icinga dovrebbe eseguire. I percorsi assoluti saranno presi "
+"come specificato, i percorsi relativi saranno preceduti dal prefisso "
+"\"PluginDir +\", con costanti simili consentite come prefisso. Gli spazi "
+"possono essere usati per dividere il percorso del comando e gli argomenti a "
+"sé stanti. Ciò significa che attualmente non sono supportati spazi nei nomi "
+"e nei percorsi dei plugin."
+
+#: application/forms/KickstartForm.php:161
+msgid "The corresponding password"
+msgstr "La password corrispondente"
+
+#: library/Director/PropertyModifier/PropertyModifierStripDomain.php:14
+msgid "The domain name you want to be stripped"
+msgstr "Il nome a dominio da rimuovere"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:18
+msgid "The first (leftmost) CN"
+msgstr "La prima NC (più a sinistra)"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:19
+msgid "The first (leftmost) OU"
+msgstr "Il primo (più a sinistra) OU"
+
+#: application/forms/IcingaServiceForm.php:731
+#, php-format
+msgid "The given properties have been stored for \"%s\""
+msgstr "Le proprietà trasferite sono state salvate per \"%s\""
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1625
+msgid "The host/service states you want to get notifications for"
+msgstr "Gli stati host/servizio per i quali devono essere inviate le notifiche"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:21
+msgid "The last (rightmost) OU"
+msgstr "L'ultimo (più a destra) OU"
+
+#: library/Director/Web/Widget/JobDetails.php:59
+#, php-format
+msgid "The last attempt failed %s: %s"
+msgstr "L'ultimo tentativo è fallito %s: %s"
+
+#: library/Director/Web/Widget/JobDetails.php:54
+#, php-format
+msgid "The last attempt succeeded %s"
+msgstr "L'ultimo tentativo è riuscito %s"
+
+#: library/Director/Dashboard/Dashlet/DeploymentDashlet.php:83
+msgid "The last deployment did not succeed"
+msgstr "L'ultimo rollout non ha avuto successo"
+
+#: library/Director/Dashboard/Dashlet/DeploymentDashlet.php:85
+msgid "The last deployment is currently pending"
+msgstr "Il rollout della configurazione è in corso"
+
+#: application/forms/IcingaEndpointForm.php:42
+msgid "The log duration time."
+msgstr "Il tempo di durata del log."
+
+#: application/forms/IcingaUserForm.php:160
+msgid ""
+"The name of a time period which determines when notifications to this User "
+"should be triggered. Not set by default."
+msgstr ""
+"Il nome del periodo di tempo che specifica quando le notifiche devono essere "
+"attivate per questo utente. Nessun valore predefinito."
+
+#: application/forms/IcingaDependencyForm.php:143
+#: application/forms/IcingaNotificationForm.php:234
+msgid ""
+"The name of a time period which determines when this notification should be "
+"triggered. Not set by default."
+msgstr ""
+"Il nome del periodo di tempo che specifica quando questa notifica deve "
+"essere attivata. Nessun valore predefinito."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1377
+msgid ""
+"The name of a time period which determines when this object should be "
+"monitored. Not limited by default."
+msgstr ""
+"Il nome del periodo di tempo che specifica quando questo oggetto viene "
+"monitorato. Non limitato per impostazione predefinita."
+
+#: application/forms/DirectorJobForm.php:62
+msgid ""
+"The name of a time period within this job should be active. Supports only "
+"simple time periods (weekday and multiple time definitions)"
+msgstr ""
+"Il nome del periodo di tempo entro il quale questo lavoro dovrebbe essere "
+"attivo. Permette solo periodi di tempo semplici (giorno della settimana e "
+"registrazioni multiple)"
+
+#: application/forms/IcingaHostVarForm.php:16
+msgid "The name of the host"
+msgstr "Il nome degli hosts"
+
+#: application/forms/IcingaServiceVarForm.php:16
+msgid "The name of the service"
+msgstr "Il nome del servizio"
+
+#: application/forms/IcingaNotificationForm.php:178
+msgid ""
+"The notification interval (in seconds). This interval is used for active "
+"notifications. Defaults to 30 minutes. If set to 0, re-notifications are "
+"disabled."
+msgstr ""
+"L'intervallo di notifica (in secondi). Questo intervallo viene utilizzato "
+"per le notifiche attive. Il valore predefinito è 30 minuti. Se è impostato a "
+"0, le ripetizioni di notifica sono disattivate."
+
+#: library/Director/PropertyModifier/PropertyModifierBitmask.php:16
+msgid ""
+"The numeric bitmask you want to apply. In case you have a hexadecimal or "
+"binary mask please transform it to a decimal number first. The result of "
+"this modifier is a boolean value, telling whether the given mask applies to "
+"the numeric value in your source column"
+msgstr ""
+"La bitmaschera numerica da applicare. Le maschere esadecimali e binarie "
+"devono prima essere convertite in un numero decimale. Il risultato è un "
+"valore booleano che indica se la maschera si applica al valore numerico "
+"nella colonna sorgente"
+
+#: application/forms/IcingaUserForm.php:42
+msgid "The pager address of the user."
+msgstr "L'indirizzo del cercapersone dell'utente."
+
+#: application/forms/IcingaDependencyForm.php:202
+msgid ""
+"The parent host. You might want to refer Host Custom Variables via $host."
+"vars.varname$"
+msgstr ""
+"L'host genitore. Proprietà host personalizzate possono essere referenziate "
+"tramite $host.vars.varname$"
+
+#: library/Director/PropertyModifier/PropertyModifierRegexReplace.php:15
+#, fuzzy
+msgid ""
+"The pattern you want to search for. This can be a regular expression like /"
+"^www\\d+\\./"
+msgstr ""
+"Lo schema che si vuole cercare. Può essere un'espressione regolare come /"
+"^wwwwd++./"
+
+#: application/forms/IcingaEndpointForm.php:37
+#, fuzzy
+msgid "The port of the endpoint."
+msgstr "La Porta di un endpoint."
+
+#: application/forms/KickstartForm.php:144
+msgid ""
+"The port you are going to use. The default port 5665 will be used if none is "
+"set"
+msgstr ""
+" La porta da utilizzare. Se non è impostato alcun valore, si applica il "
+"valore predefinito 5665"
+
+#: library/Director/PropertyModifier/PropertyModifierGetPropertyFromOtherImportSource.php:64
+msgid "The property to get from the row we found in the chosen Import Source"
+msgstr ""
+"La proprietà che vogliamo estrarre dalla linea che abbiamo trovato nella "
+"fonte di importazione selezionata"
+
+#: application/forms/IcingaAddServiceForm.php:174
+#, php-format
+msgid "The service \"%s\" has been added to %d hosts"
+msgstr "Il servizio \"%s\" è stato aggiunto a %d Hosts"
+
+#: application/forms/IcingaAddServiceSetForm.php:88
+msgid "The service Set that should be assigned"
+msgstr "Il set di servizi da assegnare"
+
+#: application/forms/IcingaServiceSetForm.php:87
+msgid "The service set that should be assigned to this host"
+msgstr "Il set di servizi da assegnare a questo host"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1635
+msgid "The state transition types you want to get notifications for"
+msgstr ""
+"I tipi di cambiamenti di stato per i quali devono essere inviate le notifiche"
+
+#: library/Director/PropertyModifier/PropertyModifierRegexReplace.php:23
+msgid "The string that should be used as a preplacement"
+msgstr "La stringa di caratteri da utilizzare in sostituzione"
+
+#: library/Director/PropertyModifier/PropertyModifierReplace.php:14
+msgid "The string you want to search for"
+msgstr "La stringa di caratteri da cercare"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:41
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:43
+msgid ""
+"The string/pattern you want to search for. Depends on the chosen method, use "
+"www.* or *linux* for wildcard matches and expression like /^www\\d+\\./ in "
+"case you opted for a regular expression"
+msgstr ""
+"La stringa / pattern da cercare. A seconda del metodo selezionato, utilizzare "
+"www.* o *linux* per ricerche basate su caratteri jolly ed espressioni come /"
+"^www\\d+\\/ se si preferiscono le espressioni regolari"
+
+#: application/forms/DirectorDatafieldForm.php:143
+msgid ""
+"The unique name of the field. This will be the name of the custom variable "
+"in the rendered Icinga configuration."
+msgstr ""
+"L'identificatore unico di questo campo. Questo è usato come nome della "
+"proprietà personalizzata nella configurazione resa da Icinga."
+
+#: application/forms/SelfServiceSettingsForm.php:168
+msgid "The user that should run the Icinga 2 service on Windows."
+msgstr ""
+"L'account utente sotto il quale il servizio Icinga 2 funzionerà su Windows."
+
+#: application/forms/DirectorDatafieldForm.php:74
+#, php-format
+msgid ""
+"There are %d objects with a related property. Should I also remove the \"%s"
+"\" property from them?"
+msgstr ""
+"Ci sono oggetti %d con una proprietà corrispondente. Il valore di \"%s\" "
+"deve essere rimosso da tutti?"
+
+#: application/forms/DirectorDatafieldForm.php:118
+#, php-format
+msgid ""
+"There are %d objects with a related property. Should I also rename the \"%s"
+"\" property to \"%s\" on them?"
+msgstr ""
+"Ci sono oggetti %d con una proprietà corrispondente. La variabile \"%s\" "
+"deve essere rinominata in \"%s\" su tutti?"
+
+#: application/forms/DeploymentLinkForm.php:66
+#, php-format
+msgid "There are %d pending changes"
+msgstr "Ci sono variazioni %d non ancora attuate"
+
+#: application/forms/DeploymentLinkForm.php:79
+#, php-format
+msgid "There are %d pending changes, %d of them applied to this object"
+msgstr ""
+"Ci sono %d modifiche pendenti, di cui %d sono applicate a questo oggetto"
+
+#: library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:88
+#, php-format
+msgid "There are %d pending database migrations"
+msgstr "Ci sono %d migrazioni di database in sospeso"
+
+#: application/forms/IcingaObjectFieldForm.php:117
+msgid ""
+"There are no data fields available. Please ask an administrator to create "
+"such"
+msgstr "Non sono disponibili campi dati. Un amministratore può crearne alcuni"
+
+#: library/Director/Dashboard/Dashlet/DeploymentDashlet.php:91
+msgid "There are no pending changes"
+msgstr "Non ci sono cambiamenti in sospeso"
+
+#: application/forms/DeployConfigForm.php:34
+msgid "There are no pending changes. Deploy anyway"
+msgstr "Non ci sono cambiamenti in sospeso. Distrubuisci in ogni caso"
+
+#: library/Director/Web/Widget/ImportSourceDetails.php:55
+msgid ""
+"There are pending changes for this Import Source. You should trigger a new "
+"Import Run."
+msgstr ""
+"Ci sono modifiche in sospeso per questa fonte di importazione. Dovrebbe "
+"essere attivata una nuova operazione di importazione."
+
+#: application/controllers/SyncruleController.php:83
+msgid ""
+"There are pending changes for this Sync Rule. You should trigger a new Sync "
+"Run."
+msgstr ""
+"Ci sono modifiche in sospeso per questa regola di sincronizzazione. Dovrebbe "
+"essere attivata una nuova corsa di sincronizzazione."
+
+#: application/forms/KickstartForm.php:62
+msgid "There are pending database migrations"
+msgstr "Le migrazioni del database sono in corso"
+
+#: application/forms/DeploymentLinkForm.php:71
+#, fuzzy
+msgid ""
+"There has been a single change to this object, nothing else has been modified"
+msgstr ""
+"É stata applicata una singola modifica a questo oggetto, nessun'altra "
+"modifica e' stata effettuata"
+
+#: application/forms/DeploymentLinkForm.php:74
+#, php-format
+msgid ""
+"There have been %d changes to this object, nothing else has been modified"
+msgstr ""
+"Ci sono state %d modifiche a questo oggetto, non è stato modificato "
+"nient'altro"
+
+#: application/forms/DeploymentLinkForm.php:63
+msgid "There is a single pending change"
+msgstr "C'è un unico cambiamento in sospeso"
+
+#: application/forms/DirectorJobForm.php:21
+msgid "These are different available job types"
+msgstr "Questi sono diversi tipi di lavoro disponibili"
+
+#: application/forms/ImportSourceForm.php:37
+msgid ""
+"These are different data providers fetching data from various sources. You "
+"didn't find what you're looking for? Import sources are implemented as a "
+"hook in Director, so you might find (or write your own) Icinga Web 2 module "
+"fetching data from wherever you want"
+msgstr ""
+"Si tratta di diversi fornitori di dati che raccolgono dati da varie fonti. "
+"Non avete trovato quello che cercate? Le fonti di importazione sono "
+"implementate come un gancio in Director, quindi potresti trovare (o scrivere "
+"il tuo) modulo Icinga Web 2 che recupera dati da qualsiasi luogo tu voglia"
+
+#: application/controllers/CommandController.php:71
+#, php-format
+msgid "This Command is currently being used by %s"
+msgstr "Questo comando è attualmente utilizzato da %s"
+
+#: application/controllers/CommandController.php:78
+msgid "This Command is currently not in use"
+msgstr "Questo comando non è attualmente utilizzato"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:928
+#, php-format
+msgid "This Command is still in use by %d other objects"
+msgstr "Questo comando è usato da %d altri oggetti"
+
+#: library/Director/Web/Widget/ImportSourceDetails.php:62
+#, php-format
+msgid "This Import Source failed when last checked at %s: %s"
+msgstr ""
+"Questa fonte di importazione non è riuscita in %s durante l'ultimo "
+"controllo: %s"
+
+#: library/Director/Web/Widget/ImportSourceDetails.php:70
+#, php-format
+msgid "This Import Source has an invalid state: %s"
+msgstr "Questa fonte di importazione ha uno stato non valido: %s"
+
+#: application/forms/ImportCheckForm.php:33
+msgid "This Import Source provides modified data"
+msgstr "Questa fonte di importazione fornisce dati modificati"
+
+#: library/Director/Web/Widget/ImportSourceDetails.php:45
+#, php-format
+msgid "This Import Source was last found to be in sync at %s."
+msgstr ""
+"Questa fonte di importazione è stata trovata per l'ultima volta in "
+"sincronizzazione il %s."
+
+#: application/forms/IcingaServiceForm.php:134
+msgid "This Service has been blacklisted on this host"
+msgstr "Questo servizio è stato messo nella lista nera di questo host"
+
+#: application/controllers/SyncruleController.php:90
+#, php-format
+msgid "This Sync Rule failed when last checked at %s: %s"
+msgstr ""
+"Questa regola di sincronizzazione non è riuscita il %s durante l'ultimo "
+"controllo: %s"
+
+#: application/controllers/SyncruleController.php:60
+msgid "This Sync Rule has never been run before."
+msgstr "Questa regola di sincronizzazione non è mai stata eseguita prima."
+
+#: application/controllers/SyncruleController.php:178
+msgid "This Sync Rule is in sync and would currently not apply any changes"
+msgstr ""
+"Questa regola di sincronizzazione è sincronizzata e non causerebbe "
+"attualmente alcun cambiamento"
+
+#: application/controllers/SyncruleController.php:72
+#, php-format
+msgid "This Sync Rule was last found to by in Sync at %s."
+msgstr ""
+"Questa regola di sincronizzazione è stata sincronizzata l'ultima volta il %s."
+
+#: application/forms/SyncPropertyForm.php:104
+msgid ""
+"This allows to filter for specific parts within the given source expression. "
+"You are allowed to refer all imported columns. Examples: host=www* would set "
+"this property only for rows imported with a host property starting with \"www"
+"\". Complex example: host=www*&!(address=127.*|address6=::1)"
+msgstr ""
+"Permette il filtraggio di parti specifiche all'interno dell'espressione "
+"della sorgente specificata. Tutte le colonne importate possono essere "
+"specificate. Esempi: host=wwww* imposterebbe questa proprietà solo per le "
+"linee importate dove la proprietà host inizia con \"www\". Esempio "
+"complesso: host=wwwww*&!(indirizzo=127.*|indirizzo6=::1)"
+
+#: library/Director/DataType/DataTypeDatalist.php:140
+msgid "This allows to show either a drop-down list or an auto-completion"
+msgstr ""
+"Questo permette di visualizzare un menu a tendina o un campo con "
+"completamento automatico"
+
+#: application/forms/DirectorJobForm.php:39
+msgid "This allows to temporarily disable this job"
+msgstr "Consente di disattivare temporaneamente questo lavoro"
+
+#: application/forms/IcingaHostGroupForm.php:30
+#: application/forms/IcingaScheduledDowntimeForm.php:111
+#: application/forms/IcingaDependencyForm.php:115
+#: application/forms/IcingaNotificationForm.php:106
+#: application/forms/IcingaServiceForm.php:450
+#: application/forms/IcingaServiceGroupForm.php:30
+msgid ""
+"This allows you to configure an assignment filter. Please feel free to "
+"combine as many nested operators as you want. The \"contains\" operator is "
+"valid for arrays only. Please use wildcards and the = (equals) operator when "
+"searching for partial string matches, like in *.example.com"
+msgstr ""
+"Questo permette di definire un filtro di assegnazione (assign). Un numero "
+"qualsiasi di operatori può essere annidato a qualsiasi profondità. "
+"L'operatore \"contiene\" è consentito solo per gli array. Per confrontare le "
+"sottostringhe si prega di utilizzare i caratteri jolly, come in *.example.com"
+
+#: application/forms/IcingaServiceSetForm.php:121
+msgid ""
+"This allows you to configure an assignment filter. Please feel free to "
+"combine as many nested operators as you want. You might also want to skip "
+"this, define it later and/or just add this set of services to single hosts. "
+"The \"contains\" operator is valid for arrays only. Please use wildcards and "
+"the = (equals) operator when searching for partial string matches, like in *."
+"example.com"
+msgstr ""
+"Questo permette di definire un filtro di assegnazione (assign). Un numero "
+"qualsiasi di operatori può essere annidato a qualsiasi profondità. Questo "
+"passo può anche essere saltato ed eventualmente implementato in un secondo "
+"momento. In alternativa (o in aggiunta) questo set di servizi può essere "
+"assegnato direttamente ai singoli host. L'operatore \"contiene\" è "
+"consentito solo per gli array. Per confrontare le sottostringhe si prega di "
+"utilizzare i caratteri jolly, come in *.example.com"
+
+#: library/Director/Job/ConfigJob.php:197
+msgid "This allows you to immediately deploy a modified configuration"
+msgstr "Questo permette il rollout immediato di una configurazione modificata"
+
+#: library/Director/ProvidedHook/CubeLinks.php:37
+#, php-format
+msgid "This allows you to modify properties for \"%s\""
+msgstr "Permette di modificare le proprietà di \"%s\""
+
+#: library/Director/ProvidedHook/CubeLinks.php:54
+msgid "This allows you to modify properties for all chosen hosts at once"
+msgstr ""
+"Questo consente di modificare le proprietà per tutti gli host selezionati in "
+"una sola volta"
+
+#: application/controllers/BasketController.php:62
+msgid "This basket is empty"
+msgstr "Questo basket è vuoto"
+
+#: application/forms/KickstartForm.php:253
+msgid "This has to be a MySQL or PostgreSQL database"
+msgstr "Questo deve essere un database MySQL o PostgreSQL"
+
+#: library/Director/Web/SelfService.php:62
+msgid ""
+"This host has been registered via the Icinga Director Self Service API. In "
+"case you re-installed the host or somehow lost it's secret key, you might "
+"want to dismiss the current key. This would allow you to register the same "
+"host again."
+msgstr ""
+"Questo host è stato registrato utilizzando l'API self-service di Icinga "
+"Director. Se l'host è stato reinstallato o la chiave è stata smarrita, è "
+"possibile che si desideri eliminare la chiave corrente. Questo permetterebbe "
+"di ri-registrare lo stesso ospite."
+
+#: application/controllers/InspectController.php:73
+#, fuzzy
+msgid "This is an abstract object type."
+msgstr "Questo é un oggetto ti tipo astratto."
+
+#: library/Director/Web/Controller/TemplateController.php:178
+#, php-format
+msgid "This is the \"%s\" %s Template. Based on this, you might want to:"
+msgstr "Questo è il template \"%s\" %s. Sulla base di questo, è possibile:"
+
+#: application/forms/KickstartForm.php:119
+msgid ""
+"This is the name of the Endpoint object (and certificate name) you created "
+"for your ApiListener object. In case you are unsure what this means please "
+"make sure to read the documentation first"
+msgstr ""
+"Questo è il nome dell'oggetto Endpoint (e il nome del certificato) che avete "
+"creato per il vostro oggetto ApiListener. Nel caso non siate sicuri di cosa "
+"questo significhi, assicuratevi di leggere prima la documentazione"
+
+#: library/Director/Dashboard/Dashlet/HostsDashlet.php:17
+msgid ""
+"This is where you add all your servers, containers, network or sensor "
+"devices - and much more. Every subject worth to be monitored"
+msgstr ""
+"Qui si aggiungono tutti i vostri server, contenitori, dispositivi di rete o "
+"sensori - e molto altro ancora. Ogni soggetto che vale la pena di essere "
+"monitorato"
+
+#: library/Director/Dashboard/HostsDashboard.php:22
+msgid ""
+"This is where you manage your Icinga 2 Host Checks. Host templates are your "
+"main building blocks. You can bundle them to \"choices\", allowing (or "
+"forcing) your users to choose among a given set of preconfigured templates."
+msgstr ""
+"Qui è dove si gestiscono i controlli degli host di Icinga 2. I template di "
+"host sono i vostri principali elementi costitutivi. Puoi raggrupparli in "
+"\"scelte\", permettendo (o obbligando) i tuoi utenti a scegliere tra un dato "
+"set di template preconfigurati."
+
+#: library/Director/Dashboard/ServicesDashboard.php:24
+msgid ""
+"This is where you manage your Icinga 2 Service Checks. Service Templates are "
+"your base building blocks, Service Sets allow you to assign multiple "
+"Services at once. Apply Rules make it possible to assign Services based on "
+"Host properties. And the list of all single Service Objects gives you the "
+"possibility to still modify (or delete) many of them at once."
+msgstr ""
+"Qui è dove si gestiscono i controlli di servizio di Icinga 2. I Service "
+"Template sono i vostri blocchi di base, i Service Set vi permettono di "
+"assegnare più Servizi contemporaneamente. Le Regole di applicazione "
+"consentono di assegnare i Servizi in base alle proprietà Host. E l'elenco di "
+"tutti i singoli Oggetti di Servizio ti dà la possibilità di modificare (o "
+"cancellare) molti di essi contemporaneamente."
+
+#: library/Director/Dashboard/UsersDashboard.php:21
+msgid ""
+"This is where you manage your Icinga 2 User (Contact) objects. Try to keep "
+"your User objects simply by movin complexity to your templates. Bundle your "
+"users in groups and build Notifications based on them. Running MS Active "
+"Directory or another central User inventory? Stay away from fiddling with "
+"manual config, try to automate all the things with Imports and related Sync "
+"Rules!"
+msgstr ""
+"Qui si gestiscono gli oggetti di Icinga 2 User (Contact). Cercate di "
+"mantenere i vostri oggetti User semplici spostando la complessità nei "
+"templates. Raggruppate gli utenti in gruppi e configurate le "
+"Notifiche in base ad essi. Cercate di utilizzare MS Active Directory o un altro "
+"database utente centralizzato? Consigliamo di evitare le "
+"configurazioni manuali, e di utilizzare regole di importazione e sincronizzazione create "
+"per automatizzare la procedura."
+
+#: library/Director/Dashboard/InfrastructureDashboard.php:24
+msgid ""
+"This is where you manage your Icinga 2 infrastructure. When adding a new "
+"Icinga Master or Satellite please re-run the Kickstart Helper once.\n"
+"\n"
+"When you feel the desire to manually create Zone or Endpoint objects please "
+"rethink this twice. Doing so is mostly the wrong way, might lead to a dead "
+"end, requiring quite some effort to clean up the whole mess afterwards."
+msgstr ""
+"Qui è dove si gestisce l'infrastruttura di Icinga 2. Quando si aggiunge un "
+"nuovo Icinga Master o Satellite, si prega di eseguire nuovamente il "
+"Kickstart Helper.\n"
+"\n"
+"Creare Zone o Endpoint manualmente, il più delle volte si rivela la scelta sbagliata "
+"portando ad un vicolo cieco che costringe l'utente a ripulire il sistema "
+"dalle modifiche apportate."
+
+#: library/Director/Web/Table/ObjectsTableEndpoint.php:45
+msgid "This is your Config master and will receive our Deployments"
+msgstr "Questo è il vostro Config master e riceverà le nostre distribuzioni"
+
+#: library/Director/Web/Widget/JobDetails.php:67
+msgid "This job has not been executed yet"
+msgstr "Questo lavoro non è stato ancora eseguito"
+
+#: library/Director/Web/Widget/JobDetails.php:35
+#, php-format
+msgid "This job runs every %ds and is currently pending"
+msgstr "Questo lavoro viene eseguito ogni %ds ed è attualmente in sospeso"
+
+#: library/Director/Web/Widget/JobDetails.php:39
+#, php-format
+msgid "This job runs every %ds."
+msgstr "Questo lavoro viene eseguito ogni %ds."
+
+#: library/Director/Web/Widget/JobDetails.php:26
+#, php-format
+msgid ""
+"This job would run every %ds. It has been disabled and will therefore not be "
+"executed as scheduled"
+msgstr ""
+"Questo lavoro verrebbe eseguito ogni %ds. È stato disattivato e quindi non "
+"verrà eseguito come previsto"
+
+#: library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:33
+msgid ""
+"This modifier transforms 0/\"0\"/false/\"false\"/\"n\"/\"no\" to false and "
+"1, \"1\", true, \"true\", \"y\" and \"yes\" to true, both in a case "
+"insensitive way. What should happen if the given value does not match any of "
+"those? You could return a null value, or default to false or true. You might "
+"also consider interrupting the whole import process as of invalid source data"
+msgstr ""
+"Questo modificatore trasforma 0/\"0\"0\"/falso/\"falso\"/\"n\"/\"no\" in "
+"falso e 1, \"1\", vero, \"vero\", \"y\" e \"sì\" in vero, in entramnbi i casi "
+"senza distinzione tra maiuscole e minuscole. Cosa dovrebbe succedere se il valore dato non "
+"corrispondesse a nessuno di questi? Si potrebbe restituire un valore nullo, o "
+"fissare il valore di default a vero o a falso. Si potrebbe anche considerare di interrompere "
+"l'intero processo di importazione, in quanto i dati della sorgente non sarebbero da considerarsi validi"
+
+#: application/forms/ImportSourceForm.php:89
+msgid ""
+"This must be a column containing unique values like hostnames. Unless "
+"otherwise specified this will then be used as the object_name for the "
+"syncronized Icinga object. Especially when getting started with director "
+"please make sure to strictly follow this rule. Duplicate values for this "
+"column on different rows will trigger a failure, your import run will not "
+"succeed. Please pay attention when synching services, as \"purge\" will only "
+"work correctly with a key_column corresponding to host!name. Check the "
+"\"Combine\" property modifier in case your data source cannot provide such a "
+"field"
+msgstr ""
+"Questa colonna deve contenere valori unici, come gli hostname. "
+"Se non diversamente specificato, questo sarà usato come nome oggetto per "
+"la sincronizzazione dell'oggetto Icinga. Soprattutto quando si inizia a lavorare con "
+"il Director, assicurarsi di seguire rigorosamente questa regola. Creare dei valori duplicati "
+"in righe diverse di questa colonna porterà ad un errore che nel processo "
+"di importazione. Si prega di prestare attenzione quando si "
+"sincronizzano i servizi, poiché \"purge\" funzionerà correttamente solo con "
+"una chiave colonna corrispondente al nome host!name. Controllate il "
+"modificatore di proprietà \"Combine\" nel caso in cui la vostra fonte di "
+"dati non sia in grado di fornire tale campo"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:29
+msgid "This name will show up as the author for ever related downtime comment"
+msgstr ""
+"Questo nome si presenterà come l'autore per il commento sempre relativo ai "
+"tempi di inattività"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:568
+msgid "This object has been disabled"
+msgstr "Questo oggetto è stato disabilitato"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:563
+msgid "This object has been enabled"
+msgstr "Questo oggetto è stato abilitato"
+
+#: library/Director/Web/ObjectPreview.php:76
+msgid "This object will not be deployed as it has been disabled"
+msgstr "Questo oggetto non verrà distribuito in quanto è stato disabilitato"
+
+#: library/Director/PropertyModifier/PropertyModifierCombine.php:17
+msgid ""
+"This pattern will be evaluated, and variables like ${some_column} will be "
+"filled accordingly. A typical use-case is generating unique service "
+"identifiers via ${host}!${service} in case your data source doesn't allow "
+"you to ship such. The chosen \"property\" has no effect here and will be "
+"ignored."
+msgstr ""
+"Questo pattern sarà esaminato e le variabili come ${qualche_colonna} saranno "
+"sostituite di conseguenza. Un tipico caso d'uso è la generazione di "
+"identificatori di servizio unici tramite ${host}!${servizio} nel caso in cui "
+"la vostra fonte di dati non vi permetta di spedirli. La \"proprietà\" scelta "
+"non ha alcun effetto in questo caso e sarà ignorata."
+
+#: library/Director/Web/SelfService.php:234
+msgid ""
+"This requires the Icinga Agent to be installed. It generates and signs it's "
+"certificate and it also generates a minimal icinga2.conf to get your agent "
+"connected to it's parents"
+msgstr ""
+"Questo richiede che l'agente Icinga sia installato. Esso genera e firma il "
+"suo certificato e crea una configurazione minimale icinga2.conf per far sì che "
+"l'agente sia collegato al suo corrispondente elemento padre."
+
+#: application/forms/IcingaServiceForm.php:373
+#, php-format
+msgid ""
+"This service belongs to the %s Service Set. Still, you might want to "
+"override the following properties for this host only."
+msgstr ""
+"Questo servizio appartiene al set di servizi %s. Tuttavia, potreste voler "
+"sovrascrivere le seguenti proprietà solo per questo host."
+
+#: application/forms/IcingaServiceForm.php:417
+#, php-format
+msgid ""
+"This service belongs to the service set \"%s\". Still, you might want to "
+"change the following properties for this host only."
+msgstr ""
+"Questo servizio appartiene al set \"%s\". Tuttavia, le seguenti proprietà "
+"possono essere modificate solo per questo specifico host."
+
+#: application/forms/IcingaServiceForm.php:354
+msgid ""
+"This service has been generated in an automated way, but still allows you to "
+"override the following properties in a safe way."
+msgstr ""
+"Questo servizio è stato creato da un automatismo, ma permette comunque di "
+"sovrascrivere le seguenti proprietà in modo sicuro."
+
+#: application/forms/IcingaServiceForm.php:360
+#, php-format
+msgid ""
+"This service has been generated using the %s apply rule, assigned where %s"
+msgstr ""
+"Questo servizio è stato creato dalla apply rule %s, e viene "
+"assegnato dove %s"
+
+#: application/forms/IcingaServiceForm.php:385
+#, php-format
+msgid ""
+"This service has been inherited from %s. Still, you might want to change the "
+"following properties for this host only."
+msgstr ""
+"Questo servizio è stato ereditato da %s. Tuttavia, potreste voler cambiare "
+"le seguenti proprietà solo per questo host."
+
+#: library/Director/Web/Table/IcingaServiceSetServiceTable.php:184
+#, php-format
+msgid "This set has been inherited from %s"
+msgstr "Questo set è stato ereditato da %s"
+
+#: library/Director/Dashboard/Dashlet/KickstartDashlet.php:17
+msgid ""
+"This synchronizes Icinga Director to your Icinga 2 infrastructure. A new run "
+"should be triggered on infrastructure changes"
+msgstr ""
+"Questo sincronizza il Director Icinga con la vostra infrastruttura di Icinga "
+"2. In caso di modifiche all'infrastruttura, eseguire una nuova sincronizzazione "
+
+
+#: library/Director/Web/Table/TemplateUsageTable.php:103
+msgid "This template is not in use"
+msgstr "Questo template non è in uso"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:918
+#, php-format
+msgid "This template is still in use by %d other objects"
+msgstr "Questo template è ancora in uso da %d altri oggetti"
+
+#: application/forms/IcingaTemplateChoiceForm.php:51
+msgid "This will be shown as a label for the given choice"
+msgstr "Questo sarà mostrato come etichetta per la scelta data"
+
+#: application/forms/DirectorDatalistEntryForm.php:33
+msgid "This will be the visible caption for this entry"
+msgstr "Questa sarà la didascalia visibile per questa voce"
+
+#: library/Director/Web/SelfService.php:123
+#, fuzzy
+msgid "This will invalidate the former key"
+msgstr "Questo invaliderà la chiave precedente"
+
+#: library/Director/Web/SelfService.php:224
+msgid "Ticket"
+msgstr "Ticket"
+
+#: application/forms/SyncRuleForm.php:21
+msgid "Time Period"
+msgstr "Periodo di tempo"
+
+#: application/forms/BasketForm.php:28
+msgid "Time Periods"
+msgstr "Periodi di tempo"
+
+#: application/forms/IcingaUserForm.php:158
+#: application/forms/DirectorJobForm.php:60
+#: application/forms/IcingaDependencyForm.php:141
+#: application/forms/IcingaNotificationForm.php:232
+msgid "Time period"
+msgstr "Periodo temporale"
+
+#: application/controllers/TimeperiodController.php:17
+#: application/controllers/ScheduledDowntimeController.php:17
+msgid "Time period ranges"
+msgstr "Fasce nel periodo temporale"
+
+#: application/forms/IcingaScheduledDowntimeRangeForm.php:56
+#, php-format
+msgid "Time range \"%s\" has been removed from %s"
+msgstr "L'intervallo di tempo \"%s\" è stato eliminato da %s"
+
+#: application/forms/SyncPropertyForm.php:320
+msgid "Time ranges"
+msgstr "Intervalli temporali"
+
+#: application/forms/IcingaCommandForm.php:70
+msgid "Timeout"
+msgstr "Timeout"
+
+#: library/Director/Dashboard/Dashlet/TimeperiodTemplateDashlet.php:13
+msgid "Timeperiod Templates"
+msgstr "Templates per periodo temporale"
+
+#: application/forms/IcingaScheduledDowntimeRangeForm.php:29
+#: library/Director/Dashboard/Dashlet/TimeperiodObjectDashlet.php:16
+#: library/Director/Dashboard/Dashlet/TimeperiodsDashlet.php:13
+#: library/Director/Web/Table/IcingaScheduledDowntimeRangeTable.php:52
+#: library/Director/Web/Table/IcingaTimePeriodRangeTable.php:46
+msgid "Timeperiods"
+msgstr "Periodi di tempo"
+
+#: application/forms/IcingaTimePeriodRangeForm.php:28
+msgid "Timerperiods"
+msgstr "Periodi di tempo"
+
+#: library/Director/Web/Table/ImportrunTable.php:31
+msgid "Timestamp"
+msgstr "Data e ora"
+
+#: application/forms/SelfServiceSettingsForm.php:46
+#: application/forms/SelfServiceSettingsForm.php:154
+msgid ""
+"To ensure downloaded packages are build by the Icinga Team and not "
+"compromised by third parties, you will be able to provide an array of SHA1 "
+"hashes here. In case you have defined any hashses, the module will not "
+"continue with updating / installing the Agent in case the SHA1 hash of the "
+"downloaded MSI package is not matching one of the provided hashes of this "
+"setting"
+msgstr ""
+"Per garantire che i pacchetti scaricati siano compilati dal Team di Icinga e "
+"non siano compromessi da terze parti, si potrà fornire un array di hash SHA1 "
+"qui. Nel caso abbiate definito degli hash, il modulo non continuerà con "
+"l'aggiornamento / installazione dell'agente nel caso in cui l'hash SHA1 del "
+"pacchetto MSI scaricato non corrisponda ad uno degli hash forniti di questa "
+"impostazione"
+
+#: library/Director/Web/SelfService.php:197
+msgid "Top Down"
+msgstr "Top Down"
+
+#: library/Director/Web/Table/TemplateUsageTable.php:57
+msgid "Total"
+msgstr "Totale"
+
+#: application/forms/SelfServiceSettingsForm.php:31
+msgid "Transform Host Name"
+msgstr "Trasformare Nome Host"
+
+#: application/forms/SelfServiceSettingsForm.php:37
+msgid "Transform to lowercase"
+msgstr "Trasformare in minuscola"
+
+#: application/forms/SelfServiceSettingsForm.php:38
+msgid "Transform to uppercase"
+msgstr "Trasformare in maiuscola"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1632
+msgid "Transition types"
+msgstr "Tipi di transizione"
+
+#: library/Director/Web/ActionBar/TemplateActionBar.php:30
+msgid "Tree"
+msgstr "Albero"
+
+#: application/forms/ImportRunForm.php:23
+msgid "Trigger Import Run"
+msgstr "Attivare l'importazione"
+
+#: application/forms/SyncRunForm.php:23
+msgid "Trigger this Sync"
+msgstr "Attivare questa sincronizzazione"
+
+#: application/forms/ImportRunForm.php:45
+msgid "Triggering this Import Source failed"
+msgstr "L'avvio di questa fonte di importazione non è riuscito"
+
+#: library/Director/Dashboard/Dashlet/SettingsDashlet.php:17
+msgid "Tweak some global Director settings"
+msgstr "Modificare alcune impostazioni globali del Director"
+
+#: library/Director/Web/Table/CoreApiFieldsTable.php:75
+msgid "Type"
+msgstr "Tipo"
+
+#: application/controllers/InspectController.php:84
+msgid "Type attributes"
+msgstr "Tipo attributi"
+
+#: library/Director/PropertyModifier/PropertyModifierParseURL.php:27
+#: library/Director/PropertyModifier/PropertyModifierParseURL.php:28
+msgid "URL component"
+msgstr "Componente URL"
+
+#: application/forms/DeployFormsBug7530.php:70
+msgid "Unable to detect your Icinga 2 Core version"
+msgstr "Impossibile rilevare la versione Core di Icinga 2"
+
+#: application/forms/SyncPropertyForm.php:167
+#: library/Director/DataType/DataTypeSqlQuery.php:27
+#, php-format
+msgid "Unable to fetch data: %s"
+msgstr "Impossibile recuperare i dati: %s"
+
+#: application/forms/IcingaHostForm.php:364
+msgid ""
+"Unable to store a host with the given properties because of insufficient "
+"permissions"
+msgstr ""
+"Impossibile memorizzare un host con le proprietà date a causa di "
+"autorizzazioni insufficienti"
+
+#: application/forms/KickstartForm.php:339
+#, php-format
+msgid ""
+"Unable to store the configuration to \"%s\". Please check file permissions "
+"or manually store the content shown below"
+msgstr ""
+"Impossibile memorizzare la configurazione in \"%s\". Si prega di controllare "
+"i permessi dei file o di memorizzare manualmente il contenuto mostrato qui "
+"sotto"
+
+#: library/Director/Db/Housekeeping.php:49
+msgid "Undeployed configurations"
+msgstr "Configurazioni non distribuite"
+
+#: library/Director/IcingaConfig/StateFilterSet.php:27
+msgid "Unknown"
+msgstr "Sconosciuto"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:136
+msgid "Unknown, failed to collect related information"
+msgstr "Sconosciuto, non ha raccolto informazioni correlate"
+
+#: library/Director/Web/Widget/DeploymentInfo.php:134
+msgid "Unknown, still waiting for config check outcome"
+msgstr ""
+"Sconosciuto, ancora in attesa dell'esito del controllo della configurazione"
+
+#: library/Director/Db/Housekeeping.php:53
+msgid "Unlinked imported properties"
+msgstr "Proprietà importate non collegate"
+
+#: library/Director/Db/Housekeeping.php:51
+msgid "Unlinked imported row sets"
+msgstr "Set di file importate non collegate"
+
+#: library/Director/Db/Housekeeping.php:52
+msgid "Unlinked imported rows"
+msgstr "Righe importate non collegate"
+
+#: application/controllers/PhperrorController.php:21
+#: application/controllers/PhperrorController.php:59
+msgid "Unsatisfied dependencies"
+msgstr "Le dipendenze non sono soddisfatte"
+
+#: library/Director/Db/Housekeeping.php:50
+msgid "Unused rendered files"
+msgstr "Alcuni file generati non sono in uso"
+
+#: library/Director/IcingaConfig/StateFilterSet.php:20
+msgid "Up"
+msgstr "Su"
+
+#: application/forms/IcingaTimePeriodForm.php:25
+msgid "Update Method"
+msgstr "Metodo di aggiornamento"
+
+#: application/forms/SyncRuleForm.php:52
+msgid "Update Policy"
+msgstr "Politica di aggiornamento"
+
+#: application/forms/DeployFormsBug7530.php:105
+msgid "Upgrading Icinga 2 - Confic Sync: Zones in Zones"
+msgstr "Aggiornamento di Icinga 2 - Confic Sync: Zone in zone"
+
+#: application/forms/DeployFormsBug7530.php:107
+msgid "Upgrading documentation"
+msgstr "Aggiornamento della documentazione"
+
+#: application/controllers/BasketsController.php:26
+#: application/forms/BasketUploadForm.php:43
+msgid "Upload"
+msgstr "Carica"
+
+#: application/controllers/BasketController.php:120
+msgid "Upload a Basket"
+msgstr "Carica un Basket"
+
+#: application/controllers/BasketController.php:121
+msgid "Upload a Configuration Basket"
+msgstr "Caricare una configurazione Basket "
+
+#: library/Director/Web/Controller/ObjectController.php:302
+msgid "Usage"
+msgstr "Utilizzo"
+
+#: library/Director/Web/Widget/AdditionalTableActions.php:101
+#, php-format
+msgid "Usage (%s)"
+msgstr "Utilizzo (%s)"
+
+#: application/forms/SelfServiceSettingsForm.php:71
+msgid "Use a local file or network share"
+msgstr "Utilizzare una directory locale o una condivisione di rete"
+
+#: library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:18
+msgid "Use lowercase first"
+msgstr "Convertire solo in minuscole"
+
+#: application/forms/SyncPropertyForm.php:272
+msgid "Used sources"
+msgstr "Fonti utilizzate"
+
+#: application/forms/SyncRuleForm.php:17
+#: library/Director/TranslationDummy.php:17
+msgid "User"
+msgstr "Utente"
+
+#: application/forms/SyncRuleForm.php:18
+msgid "User Group"
+msgstr "Gruppo utenti"
+
+#: library/Director/Dashboard/Dashlet/UserGroupsDashlet.php:11
+msgid "User Groups"
+msgstr "Gruppi utenti"
+
+#: library/Director/Dashboard/Dashlet/UserTemplateDashlet.php:13
+msgid "User Templates"
+msgstr "Templates utente"
+
+#: application/forms/IcingaNotificationForm.php:156
+#: library/Director/DataType/DataTypeDirectorObject.php:60
+msgid "User groups"
+msgstr "Gruppi utenti"
+
+#: application/forms/IcingaUserForm.php:113
+msgid ""
+"User groups that should be directly assigned to this user. Groups can be "
+"useful for various reasons. You might prefer to send notifications to groups "
+"instead of single users"
+msgstr ""
+"Gruppi di utenti che dovrebbero essere assegnati direttamente a questo "
+"utente. I gruppi possono essere utilizzati per diversi scopi. Potrebbe "
+"essere utile inviare le notifiche a gruppi invece che a singoli utenti"
+
+#: application/forms/IcingaNotificationForm.php:158
+msgid "User groups that should be notified by this notifications"
+msgstr "Gruppi di utenti che devono essere notificati"
+
+#: application/forms/IcingaUserForm.php:194
+msgid "User properties"
+msgstr "Proprietà dell'utente"
+
+#: application/forms/IcingaUserForm.php:22
+msgid "User template name"
+msgstr "Nome del template utente"
+
+#: application/forms/IcingaUserGroupForm.php:17
+msgid "Usergroup"
+msgstr "Gruppo utente"
+
+#: library/Director/Import/ImportSourceCoreApi.php:63
+msgid "Usergroups"
+msgstr "Gruppi utente"
+
+#: application/forms/IcingaUserForm.php:28
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:67
+#: library/Director/Import/ImportSourceRestApi.php:149
+msgid "Username"
+msgstr "Nome utente"
+
+#: application/forms/IcingaNotificationForm.php:131
+#: library/Director/Web/Table/CustomvarVariantsTable.php:62
+#: library/Director/Web/Table/CustomvarTable.php:47
+#: library/Director/Import/ImportSourceCoreApi.php:62
+#: library/Director/DataType/DataTypeDirectorObject.php:59
+msgid "Users"
+msgstr "Utenti"
+
+#: library/Director/Dashboard/Dashlet/UserObjectDashlet.php:16
+#: library/Director/Dashboard/Dashlet/UsersDashlet.php:13
+msgid "Users / Contacts"
+msgstr "Utenti / Contatti"
+
+#: application/forms/IcingaNotificationForm.php:133
+msgid "Users that should be notified by this notifications"
+msgstr "Utenti che devono essere notificati"
+
+#: library/Director/Dashboard/Dashlet/ServiceApplyRulesDashlet.php:17
+msgid ""
+"Using Apply Rules a Service can be applied to multiple hosts at once, based "
+"on filters dealing with any combination of their properties"
+msgstr ""
+"Utilizzando le Regole di applicazione, un servizio può essere applicato a più "
+"host contemporaneamente sulla base di filtri che trattano qualsiasi "
+"combinazione delle loro proprietà"
+
+#: application/forms/IcingaHostSelfServiceForm.php:44
+#: application/forms/IcingaHostForm.php:317
+msgid "Usually your hosts main IPv6 address"
+msgstr "L'indirizzo IPv6 principale del vostro host"
+
+#: application/forms/IcingaCommandArgumentForm.php:50
+#: application/forms/IcingaCommandArgumentForm.php:59
+#: application/forms/CustomvarForm.php:21
+#: application/forms/IcingaHostVarForm.php:27
+#: application/forms/IcingaServiceVarForm.php:27
+#: library/Director/Web/Table/IcingaCommandArgumentTable.php:46
+msgid "Value"
+msgstr "Valore"
+
+#: application/forms/IcingaCommandArgumentForm.php:36
+msgid "Value type"
+msgstr "Tipo valore"
+
+#: library/Director/Web/Table/CustomvarVariantsTable.php:56
+msgid "Variable Value"
+msgstr "Valore Variabile"
+
+#: application/forms/CustomvarForm.php:16
+#: library/Director/Web/Table/CustomvarTable.php:41
+msgid "Variable name"
+msgstr "Nome Variabile"
+
+#: library/Director/Import/ImportSourceRestApi.php:103
+msgid "Verify Host"
+msgstr "Verifica Host"
+
+#: library/Director/Import/ImportSourceRestApi.php:96
+msgid "Verify Peer"
+msgstr "Verifica Peer"
+
+#: library/Director/DataType/DataTypeString.php:24
+msgid "Visibility"
+msgstr "Visibilità"
+
+#: library/Director/DataType/DataTypeString.php:26
+msgid "Visible"
+msgstr "Visibile"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1445
+msgid "Volatile"
+msgstr "Volatile"
+
+#: application/forms/IcingaCommandForm.php:81
+msgid ""
+"WARNING, this can allow shell script injection via custom variables used in "
+"command."
+msgstr ""
+"ATTENZIONE, questo può consentire l'iniezione di script via shell tramite "
+"variabili personalizzate utilizzate nel commando."
+
+#: library/Director/Dashboard/TimeperiodsDashboard.php:20
+msgid ""
+"Want to define to execute specific checks only withing specific time "
+"periods? Get mobile notifications only out of office hours, but mail "
+"notifications all around the clock? Time Periods allow you to tackle those "
+"and similar requirements."
+msgstr ""
+"Volete impostare l'esecuzione di controlli specifici solo in sepcifici periodi di tempo? "
+"Ricevere notifiche sul cellulare solo fuori dall'orario d'ufficio, ma "
+"notifiche via e-mail 24 ore su 24? I Periodi di temporali consentono di "
+"soddisfare questi e requisiti simili."
+
+#: library/Director/IcingaConfig/StateFilterSet.php:25
+msgid "Warning"
+msgstr "Attenzione"
+
+#: application/forms/DeployFormsBug7530.php:90
+#, php-format
+msgid ""
+"Warning: you're running Icinga v2.11.0 and our configuration looks like you "
+"could face issue %s. We're already working on a solution. The GitHub Issue "
+"and our %s contain related details."
+msgstr ""
+"Attenzione: state utilizzando Icinga v2.11.0 ed è possibile che riscontriate "
+"il problema %s. Stiamo già lavorando ad una soluzione. Per maggiori dettagli"
+"fate riferimento a GitHub e al nostro %s."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1104
+msgid ""
+"What kind of object this should be. Templates allow full access to any "
+"property, they are your building blocks for \"real\" objects. External "
+"objects should usually not be manually created or modified. They allow you "
+"to work with objects locally defined on your Icinga nodes, while not "
+"rendering and deploying them with the Director. Apply rules allow to assign "
+"services, notifications and groups to other objects."
+msgstr ""
+"Che tipo di oggetto dovrebbe essere. I templates consentono l'accesso completo "
+"a qualsiasi proprietà, sono i vostri elementi costitutivi per gli oggetti "
+"\"reali\". Gli oggetti esterni di solito non dovrebbero essere creati o "
+"modificati manualmente. Permettono di lavorare con oggetti definiti "
+"localmente sui nodi di Icinga, senza renderli e distribuirli con il "
+"Direttore. Le regole di applicazione permettono di assegnare servizi, "
+"notifiche e gruppi ad altri oggetti."
+
+#: library/Director/PropertyModifier/PropertyModifierMap.php:28
+msgid ""
+"What should happen if the lookup key does not exist in the data list? You "
+"could return a null value, keep the unmodified imported value or interrupt "
+"the import process"
+msgstr ""
+"Cosa potrebbe succedere se la chiave di ricerca non esistesse nella lista "
+"data? Si potrebbe restituire un valore nullo, mantenere il valore importato "
+"non modificato o interrompere il processo di importazione"
+
+#: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:24
+#: library/Director/PropertyModifier/PropertyModifierSplit.php:24
+msgid "What should happen when the given string is empty?"
+msgstr "Cosa dovrebbe accadere quando la stringa data fosse vuota?"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:66
+msgid "What should happen when the result array is empty?"
+msgstr "Cosa dovrebbe succedere se l'array risultante fosse vuoto?"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:50
+msgid "What should happen when the specified element is not available?"
+msgstr "Cosa deve succedere se l'articolo specificato non fosse disponibile?"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:53
+msgid "What should happen with matching elements?"
+msgstr "Cosa dovrebbe accadere con gli elementi selezionati?"
+
+#: library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:55
+msgid ""
+"What should happen with the row, when this property matches the given "
+"expression?"
+msgstr ""
+"Cosa dovrebbe succedere alla riga se l'espressione data corrispondesse a questa "
+"proprietà?"
+
+#: library/Director/PropertyModifier/PropertyModifierDnsRecords.php:32
+msgid "What should we do if the DNS lookup fails?"
+msgstr "Cosa dovrebbe succedere se la risoluzione (DNS) fallisse?"
+
+#: library/Director/PropertyModifier/PropertyModifierParseURL.php:36
+msgid ""
+"What should we do if the URL could not get parsed or component not found?"
+msgstr ""
+"Cosa si deve fare se l'URL non potesse essere analizzato o se non fosse "
+"possibile trovarne i componenti?"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:28
+msgid "What should we do if the desired part does not exist?"
+msgstr "Cosa dovrebbe succedere se la parte desiderata non esistesse?"
+
+#: library/Director/PropertyModifier/PropertyModifierGetHostByName.php:15
+msgid "What should we do if the host (DNS) lookup fails?"
+msgstr "Cosa dobbiamo fare se la ricerca dell'host (DNS) non riuscisse?"
+
+#: library/Director/PropertyModifier/PropertyModifierJsonDecode.php:22
+msgid "What should we do in case we are unable to decode the given string?"
+msgstr ""
+"Cosa dovrebbe succedere se la stringa passata non potesse essere decodificata?"
+
+#: library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:16
+msgid "What should we extract from the DN?"
+msgstr "Cosa dobbiamo estrarre dal DN?"
+
+#: application/forms/BasketForm.php:57
+msgid ""
+"What should we place into this Basket every time we create new snapshot?"
+msgstr ""
+"Cosa dobbiamo mettere in questo Basket ogni volta che creiamo un nuovo "
+"snapshot?"
+
+#: application/forms/SelfServiceSettingsForm.php:21
+#, fuzzy
+msgid "What to use as your Icinga 2 Agent's Host Name"
+msgstr "Hostname da usare per l'Icinga2-Agent?"
+
+#: library/Director/Job/ConfigJob.php:209
+msgid ""
+"When deploying configuration, wait at least this amount of seconds unless "
+"the next deployment should take place"
+msgstr ""
+"Durante la distribuzione della configurazione, attendere almeno qualche secondo "
+"a meno che non si debba procedere con la successiva distribuzione "
+
+
+#: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:21
+#: library/Director/PropertyModifier/PropertyModifierSplit.php:21
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:63
+#, fuzzy
+msgid "When empty"
+msgstr "Quando é vuoto"
+
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:47
+msgid "When not available"
+msgstr "Quando non disponibile"
+
+#: application/forms/IcingaNotificationForm.php:210
+#, fuzzy
+msgid "When the last notification should be sent"
+msgstr "Quando deve essere inviata l'ultima notifica?"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:100
+msgid ""
+"Whether Downtimes should also explicitly be scheduled for all Services "
+"belonging to affected Hosts"
+msgstr ""
+"Se i tempi di inattività devono essere esplicitamente programmati anche per "
+"tutti i servizi appartenenti agli host interessati"
+
+#: application/forms/SettingsForm.php:63
+msgid "Whether all configured Jobs should be disabled"
+msgstr "Se tutti i lavori configurati devono essere disattivati"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1418
+msgid "Whether flap detection is enabled on this object"
+msgstr "Se il riconoscimento dei flap è abilitato su questo oggetto"
+
+#: library/Director/Job/ConfigJob.php:183
+msgid ""
+"Whether rendering should be forced. If not enforced, this job re-renders the "
+"configuration only when there have been activities since the last rendered "
+"config"
+msgstr ""
+"Se l'attivazione debba essere forzata. Se non è forzata, la configurazione "
+"viene attivata solo se le attività sono state eseguite dopo l'ultima attivazione"
+
+#: application/forms/IcingaHostForm.php:94
+#, fuzzy
+msgid "Whether the agent is configured to accept config"
+msgstr "Abilitare l'agente per ricevere la configurazione?"
+
+#: application/forms/IcingaCommandArgumentForm.php:42
+msgid ""
+"Whether the argument value is a string (allowing macros like $host$) or an "
+"Icinga DSL lambda function (will be enclosed with {{ ... }}"
+msgstr ""
+"Il valore dell'argomento è una stringa (permette macro come $host$) o una "
+"funzione lambda di Icinga DSL? (è scritto in {{ ... }}}"
+
+#: application/forms/IcingaServiceForm.php:666
+#, fuzzy
+msgid ""
+"Whether the check commmand for this service should be executed on the Icinga "
+"agent"
+msgstr "Il comando per questo servizio deve essere eseguito sull'Icinga-Agent?"
+
+#: application/forms/IcingaCommandArgumentForm.php:117
+msgid ""
+"Whether the parameter name should not be passed to the command. Per default, "
+"the parameter name (e.g. -H) will be appended, so no need to explicitly set "
+"this to \"No\"."
+msgstr ""
+"Se il nome del parametro deve essere passato al comando. Non è necessario "
+"impostare questo parametro su \"No\", in quanto per default il nome del parametro "
+"viene aggiunto (ad es. -H)."
+
+#: application/forms/IcingaHostForm.php:88
+#, fuzzy
+msgid ""
+"Whether the parent (master) node should actively try to connect to this agent"
+msgstr ""
+"Il Nodo (Master) deve cercare attivamente di connettersi a questo agente?"
+
+#: application/forms/IcingaCommandArgumentForm.php:81
+msgid ""
+"Whether the set_if parameter is a string (allowing macros like $host$) or an "
+"Icinga DSL lambda function (will be enclosed with {{ ... }}"
+msgstr ""
+"Il parametro set_if è una stringa (permette macro come $host$) o una "
+"funzione lambda di Icinga DSL? (è scritto in {{ ... }}}"
+
+#: application/forms/IcingaCommandArgumentForm.php:126
+#, fuzzy
+msgid "Whether this argument should be required"
+msgstr "É necessario questo argomento?"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1446
+#, fuzzy
+msgid "Whether this check is volatile."
+msgstr "Questo controllo è irregolare (volatile)?"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:80
+#: application/forms/IcingaDependencyForm.php:95
+msgid "Whether this dependency should affect hosts or services"
+msgstr "Se questa dipendenza deve interessare gli host o i servizi"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:45
+msgid ""
+"Whether this downtime is fixed or flexible. If unsure please check the "
+"related documentation: https://icinga.com/docs/icinga2/latest/doc/08-"
+"advanced-topics/#downtimes"
+msgstr ""
+"Sia che si tratti di tempi di fermo macchina fissi o flessibili. In caso di "
+"dubbi si prega di consultare la relativa documentazione: https://icinga.com/"
+"docs/icinga2/latest/doc/08-advanced-topics/#downtimes"
+
+#: application/forms/IcingaObjectFieldForm.php:143
+#, fuzzy
+msgid "Whether this field should be mandatory"
+msgstr "Questo Campo deve essere obbligatorio?"
+
+#: application/forms/IcingaHostForm.php:79
+#, fuzzy
+msgid "Whether this host has the Icinga 2 Agent installed"
+msgstr "Questo Host ha installato Icinga2-Agent?"
+
+#: application/forms/IcingaNotificationForm.php:83
+msgid "Whether this notification should affect hosts or services"
+msgstr "Se questa notifica deve riguardare gli host o i servizi"
+
+#: application/forms/IcingaCommandArgumentForm.php:109
+msgid ""
+"Whether this parameter should be repeated when multiple values (read: array) "
+"are given"
+msgstr ""
+"Se questo parametro deve essere ripetuto se vengono specificati più valori "
+"(in un array)"
+
+#: application/forms/IcingaZoneForm.php:24
+msgid ""
+"Whether this zone should be available everywhere. Please note that it rarely "
+"leads to the desired result when you try to distribute global zones in "
+"distrubuted environments"
+msgstr ""
+"Questa zona deve essere disponibile ovunque? Si noti che questa configurazione "
+"raramente porta il risultato desiderato quando si cerca di "
+"distribuire zone globali in ambienti distribuiti"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1394
+#, fuzzy
+msgid "Whether to accept passive check results for this object"
+msgstr ""
+"I risultati del controllo passivo devono essere accettati per questo Oggetto?"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1388
+#, fuzzy
+msgid "Whether to actively check this object"
+msgstr "Questo Oggetto deve essere controllato attivamente?"
+
+#: application/forms/SelfServiceSettingsForm.php:33
+msgid "Whether to adjust your host name"
+msgstr "Se modificare il nome dell'host"
+
+#: application/forms/IcingaDependencyForm.php:161
+msgid ""
+"Whether to disable checks when this dependency fails. Defaults to false."
+msgstr ""
+"Se disabilitare i controlli quando questa dipendenza fallisce. Le "
+"impostazioni predefinite sono false."
+
+#: application/forms/IcingaDependencyForm.php:169
+msgid ""
+"Whether to disable notifications when this dependency fails. Defaults to "
+"true."
+msgstr ""
+"Se disabilitare le notifiche quando questa dipendenza fallisce. Default é sí."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1406
+#, fuzzy
+msgid "Whether to enable event handlers this object"
+msgstr "Attivare Event-handler per questo Oggetto?"
+
+#: application/forms/IcingaDependencyForm.php:177
+msgid ""
+"Whether to ignore soft states for the reachability calculation. Defaults to "
+"true."
+msgstr ""
+"Se gli stati soft debbano essere considerati per il calcolo "
+"dell'accessibilità. Default é sí."
+
+#: application/forms/IcingaTimePeriodForm.php:77
+msgid "Whether to prefer timeperiods includes or excludes. Default to true."
+msgstr "Se preferire i periodi di tempo include o esclude. Default é sí."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1412
+#, fuzzy
+msgid "Whether to process performance data provided by this object"
+msgstr "I dati sulle prestazioni di questo Oggetto devono essere elaborati?"
+
+#: application/forms/SyncRuleForm.php:70
+msgid ""
+"Whether to purge existing objects. This means that objects of the same type "
+"will be removed from Director in case they no longer exist at your import "
+"source."
+msgstr ""
+"Se eliminare gli oggetti esistenti. Ciò significa che gli oggetti dello "
+"stesso tipo saranno rimossi dal Director nel caso in cui non esistano più "
+"sulla fonte di importazione."
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1400
+#, fuzzy
+msgid "Whether to send notifications for this object"
+msgstr "Le Notifiche devono essere inviate per questo Oggetto?"
+
+#: application/forms/IcingaUserForm.php:90
+#, fuzzy
+msgid "Whether to send notifications for this user"
+msgstr "Le Notifiche devono essere inviate per questo Utente?"
+
+#: library/Director/Import/ImportSourceRestApi.php:74
+msgid "Whether to use encryption when talking to the REST API"
+msgstr "Se utilizzare la crittografia quando si utilizzano le REST API"
+
+#: library/Director/Import/ImportSourceRestApi.php:98
+msgid ""
+"Whether we should check that our peer's certificate has been signed by a "
+"trusted CA. This is strongly recommended."
+msgstr ""
+"Se dobbiamo controllare che il certificato del nostro peer sia stato firmato "
+"da una CA di fiducia. Scelta raccomandato."
+
+#: library/Director/Import/ImportSourceRestApi.php:105
+msgid "Whether we should check that the certificate matches theconfigured host"
+msgstr ""
+"Se dobbiamo controllare che il certificato corrisponda all'host configurato"
+
+#: application/forms/SyncPropertyForm.php:118
+msgid ""
+"Whether you want to merge or replace the destination field. Makes no "
+"difference for strings"
+msgstr ""
+"Il campo di destinazione deve essere unito o sostituito? Non fa differenza "
+"per le stringhe di caratteri"
+
+#: application/forms/DirectorDatalistEntryForm.php:24
+msgid ""
+"Will be stored as a custom variable value when this entry is chosen from the "
+"list"
+msgstr ""
+"Sarà memorizzato come valore di variabile personalizzata quando questa voce "
+"viene scelta dalla lista"
+
+#: library/Director/Import/ImportSourceRestApi.php:151
+msgid "Will be used for SOAP authentication against your vCenter"
+msgstr "Verrà utilizzato per l'autenticazione SOAP contro il vCenter"
+
+#: library/Director/Web/SelfService.php:225
+msgid "Windows Kickstart Script"
+msgstr "Windows Kickstart Script"
+
+#: application/forms/DirectorDatafieldForm.php:53
+msgid "Wipe related vars"
+msgstr "Pulire le variabili correlate"
+
+#: application/forms/IcingaScheduledDowntimeForm.php:98
+msgid "With Services"
+msgstr "Con servizi"
+
+#: library/Director/Dashboard/Dashlet/ActivityLogDashlet.php:17
+msgid "Wondering about what changed why? Track your changes!"
+msgstr ""
+"Qui potete vedere cosa è stato cambiato. Tieni traccia dei tuoi cambiamenti!"
+
+#: application/views/helpers/FormDataFilter.php:525
+msgid "Wrap this expression into an operator"
+msgstr "Inserire questa espressione in un operatore"
+
+#: application/forms/IcingaDeleteObjectForm.php:17
+#, php-format
+msgid "YES, please delete \"%s\""
+msgstr "SÌ, cancellare \"%s\"."
+
+#: application/forms/IcingaZoneForm.php:30
+#: application/forms/SelfServiceSettingsForm.php:226
+#: application/forms/SettingsForm.php:59 application/forms/SettingsForm.php:74
+#: application/forms/SettingsForm.php:96
+#: library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:25
+#: library/Director/Job/ImportJob.php:101 library/Director/Job/SyncJob.php:101
+#: library/Director/Job/ConfigJob.php:189
+#: library/Director/Job/ConfigJob.php:201
+msgid "Yes"
+msgstr "Sí "
+
+#: application/controllers/BasketsController.php:41
+msgid ""
+"You can create Basket snapshots at any time, this will persist a serialized "
+"representation of all involved objects at that moment in time. Snapshots can "
+"be exported, imported, shared and restored - to the very same or another "
+"Director instance."
+msgstr ""
+"È possibile creare Basket snapshot in qualsiasi momento, in questo modo "
+"persisterà una rappresentazione serializzata di tutti gli oggetti coinvolti "
+"in quel momento nel tempo. Gli snapshot possono essere esportati, importati, "
+"condivisi e ripristinati - nella stessa o in un'altra istanza del Director."
+
+#: library/Director/Web/SelfService.php:136
+msgid ""
+"You can stop sharing a Template at any time. This will immediately "
+"invalidate the former key."
+msgstr ""
+"La condivisione di un Template puo' essere sospesa in qualsiasi momento. Questo "
+"invaliderà immediatamente la precedente chiave."
+
+#: library/Director/Job/ImportJob.php:94 library/Director/Job/SyncJob.php:94
+msgid ""
+"You could immediately apply eventual changes or just learn about them. In "
+"case you do not want them to be applied immediately, defining a job still "
+"makes sense. You will be made aware of available changes in your Director "
+"GUI."
+msgstr ""
+"Eventuali modifiche potrebbero venire immediatamente applicate "
+"o l'utente potrebbe essere avvisato dei cambiamenti. "
+"Definire un processo ha senso anche nel caso in cui non si desideri "
+"applicare immediatamente le modifiche. L'utente sarà "
+"informato dei cambiamenti effettuati nella GUI del Director."
+
+#: application/forms/SelfServiceSettingsForm.php:61
+msgid ""
+"You might want to let the generated Powershell script install the Icinga 2 "
+"Agent in an automated way. If so, please choose where your Windows nodes "
+"should fetch the Agent installer"
+msgstr ""
+"Si consiglia di lasciare che lo script Powershell generato installi l'agente "
+"Icinga 2 in modo automatico. Se è così, scegliete dove i vostri nodi di "
+"Windows devono andare a prendere il programma di installazione dell'Agent"
+
+#: application/forms/IcingaObjectFieldForm.php:169
+msgid ""
+"You might want to show this field only when certain conditions are met. "
+"Otherwise it will not be available and values eventually set before will be "
+"cleared once stored"
+msgstr ""
+"Si consiglia di mostrare questo campo solo quando sono soddisfatte "
+"determinate condizioni. Se queste condizioni non sono soddisfatte, il campo "
+"non verrà visualizzato e le proprietà associate verranno rimosse quando il "
+"campo verrà salvato"
+
+#: application/forms/ImportRowModifierForm.php:44
+msgid ""
+"You might want to write the modified value to another (new) property. This "
+"property name can be defined here, the original property would remain "
+"unmodified. Please leave this blank in case you just want to modify the "
+"value of a specific property"
+msgstr ""
+"Potreste voler scrivere il valore modificato su un'altra (nuova) proprietà. "
+"Il nome di questa proprietà può essere definito qui, la proprietà originale "
+"rimane invariata. Si prega di lasciare il campo vuoto nel caso in cui si "
+"voglia modificare il valore di una specifica proprietà"
+
+#: application/controllers/SyncruleController.php:119
+#, php-format
+msgid "You must define some %s before you can run this Sync Rule"
+msgstr ""
+"È necessario definire alcuni %s prima di poter eseguire questa regola di "
+"sincronizzazione"
+
+#: application/forms/KickstartForm.php:153
+msgid "Your Icinga 2 API username"
+msgstr "Icinga 2 API username"
+
+#: library/Director/Import/ImportSourceLdap.php:49
+msgid ""
+"Your LDAP search base. Often something like OU=Users,OU=HQ,DC=your,"
+"DC=company,DC=tld"
+msgstr ""
+"La vostra base di ricerca LDAP. Spesso qualcosa come OU=Utenti,OU=HQ,DC=tuo,"
+"DC=azienda,DC=dettaglio"
+
+#: application/forms/KickstartForm.php:94
+msgid ""
+"Your configuration looks good. Still, you might want to re-run this "
+"kickstart wizard to (re-)import modified or new manually defined Command "
+"definitions or to get fresh new ITL commands after an Icinga 2 Core upgrade."
+msgstr ""
+"La vostra configurazione sembra buona. Tuttavia, si potrebbe voler eseguire "
+"nuovamente questa procedura guidata di kickstart per (re)importare le "
+"definizioni dei comandi modificate o nuove definite manualmente o per "
+"ottenere nuovi comandi ITL dopo un aggiornamento di Icinga 2 Core."
+
+#: application/forms/KickstartForm.php:72
+#, fuzzy, php-format
+msgid "Your database looks good, you are ready to %s"
+msgstr ""
+"Il database sembra buono. Il Director di Icinga dovrebbe essere pronto per "
+"%s "
+
+#: application/forms/KickstartForm.php:106
+#, fuzzy
+msgid ""
+"Your installation of Icinga Director has not yet been prepared for "
+"deployments. This kickstart wizard will assist you with setting up the "
+"connection to your Icinga 2 server."
+msgstr ""
+"Questa installazione di Icinga Director non è stata ancora preparata per il "
+"rollout della configurazione. Questo wizard di kickstart vi aiuterà a "
+"configurare la connessione al server di Icinga 2"
+
+#: library/Director/Web/Form/DirectorObjectForm.php:1331
+msgid "Your regular check interval"
+msgstr "Il vostro regolare intervallo di controllo"
+
+#: library/Director/PropertyModifier/PropertyModifierReplace.php:20
+msgid "Your replacement string"
+msgstr "La stringa da sostituire"
+
+#: application/forms/IcingaTemplateChoiceForm.php:67
+msgid "Your users will be allowed to choose among those templates"
+msgstr "I vostri utenti potranno scegliere tra questi templates"
+
+#: application/forms/SyncRuleForm.php:26
+#: library/Director/TranslationDummy.php:15
+#: library/Director/Web/Table/ObjectsTableEndpoint.php:21
+#, fuzzy
+msgid "Zone"
+msgstr "Zone"
+
+#: application/forms/IcingaZoneForm.php:14
+msgid "Zone name"
+msgstr "Nome della zona"
+
+#: application/forms/IcingaCommandForm.php:111
+#: application/forms/IcingaUserForm.php:76
+#: application/forms/IcingaDependencyForm.php:61
+#: application/forms/IcingaNotificationForm.php:65
+#: application/forms/IcingaUserGroupForm.php:42
+msgid "Zone settings"
+msgstr "Impostazioni Zona"
+
+#: library/Director/Dashboard/Dashlet/ZoneObjectDashlet.php:13
+#: library/Director/Import/ImportSourceCoreApi.php:64
+msgid "Zones"
+msgstr "Zone"
+
+#: application/forms/SyncPropertyForm.php:347
+msgid "a list"
+msgstr "un elenco"
+
+#: library/Director/Web/Widget/AdditionalTableActions.php:87
+msgid "all"
+msgstr "tutto"
+
+#: application/controllers/HostController.php:481
+#: application/controllers/BasketController.php:96
+#: application/controllers/BasketController.php:114
+#: application/controllers/BasketController.php:348
+#: application/controllers/ServiceController.php:137
+#: application/controllers/ServiceController.php:198
+#: application/controllers/DataController.php:108
+#: application/controllers/ImportsourceController.php:277
+#: application/controllers/SyncruleController.php:571
+#: library/Director/Web/Controller/ActionController.php:160
+#: library/Director/Web/Controller/ObjectController.php:214
+#: library/Director/Web/Controller/ObjectController.php:519
+#: library/Director/Web/ActionBar/DirectorBaseActionBar.php:35
+msgid "back"
+msgstr "indietro"
+
+#: application/locale/translateMe.php:11
+msgid "critical"
+msgstr "critico"
+
+#: application/views/scripts/phperror/dependencies.phtml:47
+msgid "disabled"
+msgstr "disattivato"
+
+#: application/controllers/DaemonController.php:42
+msgid "documentation"
+msgstr "documentazione"
+
+#: application/locale/translateMe.php:6
+msgid "down"
+msgstr "giù"
+
+#: application/forms/IcingaCommandArgumentForm.php:27
+msgid "e.g. -H or --hostname, empty means \"skip_key\""
+msgstr "ad es. -H o --hostname, vuoto significa \"skip_key\"."
+
+#: application/forms/IcingaCommandArgumentForm.php:61
+msgid "e.g. 5%, $host.name$, $lower$%:$upper$%"
+msgstr "ad es. 5%, $host.name$, $lower$%:$upper$%"
+
+#: application/forms/SyncPropertyForm.php:164
+msgid "failed to fetch"
+msgstr "Raccolta fallita"
+
+#: application/forms/KickstartForm.php:259 library/Director/Util.php:177
+msgid "here"
+msgstr "qui"
+
+#: application/forms/IcingaHostVarForm.php:23
+msgid "host var name"
+msgstr "host var name"
+
+#: application/forms/IcingaHostVarForm.php:28
+msgid "host var value"
+msgstr "host var value"
+
+#: application/views/scripts/phperror/dependencies.phtml:50
+msgid "missing"
+msgstr "mancante"
+
+#: application/controllers/BasketController.php:298
+msgid "modified"
+msgstr "modificato"
+
+#: application/views/scripts/phperror/dependencies.phtml:56
+msgid "more"
+msgstr "altro"
+
+#: application/controllers/BasketController.php:276
+msgid "new"
+msgstr "nuovo"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:71
+msgid "no"
+msgstr "no"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:283
+msgid "no related group exists"
+msgstr "non esiste un gruppo collegato"
+
+#: application/locale/translateMe.php:9
+msgid "ok"
+msgstr "ok"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:315
+msgid "on host"
+msgstr "su host"
+
+#: library/Director/Web/Widget/ActivityLogInfo.php:297
+msgid "on service set"
+msgstr "sul set di servizio"
+
+#: library/Director/Dashboard/Dashlet/Dashlet.php:285
+msgid "one related group exists"
+msgstr "esiste un gruppo collegato"
+
+#: application/locale/translateMe.php:8
+msgid "pending"
+msgstr "in attesa"
+
+#: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:29
+#: library/Director/PropertyModifier/PropertyModifierSplit.php:29
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:71
+#: library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:55
+msgid "return NULL"
+msgstr "restituisce NULL"
+
+#: library/Director/PropertyModifier/PropertyModifierRegexSplit.php:28
+#: library/Director/PropertyModifier/PropertyModifierSplit.php:28
+#: library/Director/PropertyModifier/PropertyModifierArrayFilter.php:70
+msgid "return an empty array"
+msgstr "restituisce un array vuoto"
+
+#: application/forms/IcingaServiceVarForm.php:23
+msgid "service var name"
+msgstr "service var name"
+
+#: application/forms/IcingaServiceVarForm.php:28
+msgid "service var value"
+msgstr "service var valore"
+
+#: application/controllers/BasketController.php:302
+msgid "unchanged"
+msgstr "invariato"
+
+#: application/locale/translateMe.php:12
+msgid "unknown"
+msgstr "sconoscuto"
+
+#: application/locale/translateMe.php:7
+msgid "unreachable"
+msgstr "irraggiungibile"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:82
+msgid "unsupported"
+msgstr "non supportato"
+
+#: library/Director/Web/Widget/AdditionalTableActions.php:89
+msgid "unused"
+msgstr "inutilizzato"
+
+#: application/locale/translateMe.php:5
+msgid "up"
+msgstr "su"
+
+#: library/Director/Web/Widget/AdditionalTableActions.php:88
+msgid "used"
+msgstr "usato"
+
+#: application/forms/IcingaHostVarForm.php:33
+#: application/forms/IcingaServiceVarForm.php:33
+msgid "value format"
+msgstr "formato valore"
+
+#: library/Director/Web/Table/GroupMemberTable.php:61
+#: library/Director/Web/Table/GroupMemberTable.php:66
+msgid "via"
+msgstr "via"
+
+#: application/locale/translateMe.php:10
+msgid "warning"
+msgstr "Attenzione"
+
+#: library/Director/Web/Widget/BackgroundDaemonDetails.php:70
+msgid "yes"
+msgstr "sí"
+
+msgid "%s (where %s)"
+msgstr "%s (dove %s)"
+
+msgid "Add Service: %s"
+msgstr "Aggiungi servizio: %s"
+
+msgid "The parent host."
+msgstr "L'host parente."
+
+msgid ""
+"This allows you to configure an assignment filter. Please feel free to "
+"combine as many nested operators as you want"
+msgstr ""
+"Questo permette di configurare un filtro di assegnazione. Sentitevi liberi di "
+"combinare tutti gli operatori annidati che volete"
+
+msgid "This must be an import source column (property)"
+msgstr "Questa deve essere una colonna di fonte di importazione (proprietà)"
+
+msgid "Name for the Icinga timeperiod you are going to create"
+msgstr "Nome per il periodo di Icinga che stai per creare"
+
+msgid "Name for the Icinga timperiod template you are going to create"
+msgstr "Nome per il template del periodo di tempo di Icinga che si sta per creare"
+
+msgid "Please define a Service Template first"
+msgstr "Si prega di definire prima un template di servizio"
+
+msgid "Serviceset"
+msgstr "Service-Set"
+
+msgid "Timeperiod"
+msgstr "Periodo"
+
+msgid "Timeperiod object"
+msgstr "Periodo"
+
+msgid "Timeperiod template"
+msgstr "Template del periodo"
+
+msgid "Timeperiod template name"
+msgstr "Nome del template del periodo"
+
+msgid "Whether this should be a template"
+msgstr "È un template?"
+
+msgid "the display name"
+msgstr "Nome sul display"
+
+msgid "the update method"
+msgstr "metodo di aggiornamento"
+
+msgid "Change priority"
+msgstr "Cambia prioritá"
+
+msgid "Count Query"
+msgstr "Count-Query"
+
+msgid "Move down (lower priority)"
+msgstr "Muovi in basso (abbassa prioritá)"
+
+msgid "Move up (raise priority)"
+msgstr "Muovi in alto (aumenta prioritá)"
+
+msgid "Next page"
+msgstr "Prossima pagina"
+
+msgid "Pagination"
+msgstr "Navigazione della pagina"
+
+msgid "Previous page"
+msgstr "Pagina precedente"
+
+msgid "Prio"
+msgstr "Prio"
+
+msgid "SQL Query"
+msgstr "SQL-Query"
+
+msgid "Search is simple! Try to combine multiple words"
+msgstr "La ricerca è facile! Prova a combinare più parole"
+
+msgid "Search..."
+msgstr "Cerca..."
+
+msgid "Show rows %u to %u of %u"
+msgstr "Mostra righe %u da %u a %u"
+
+msgid "This feature is still experimental"
+msgstr "Questa feature è ancora sperimentale"
+
+msgid "Filter available service sets"
+msgstr "Filtro service sets disponibile"
+
+msgid "Set Members"
+msgstr "Imposta Membri"
+
+msgid "s"
+msgstr "s"
+
+msgid "Activity log entry"
+msgstr "Registrazione del registro delle attività"
+
+msgid "Add a job"
+msgstr "Aggiungi un lavoro"
+
+msgid "Add job"
+msgstr "Aggiungi lavoro"
+
+msgid "Add list"
+msgstr "Aggiungi elenco"
+
+msgid "Apply Icinga %s"
+msgstr "Applica Icinga %s"
+
+msgid "Clone Icinga %s"
+msgstr "Clona Icinga %s"
+
+msgid "Configs"
+msgstr "Configurazioni"
+
+msgid "Create immediately"
+msgstr "Crea subito"
+
+msgid "Deploy to master"
+msgstr "Distrubuisci al master"
+
+msgid "Edit import source"
+msgstr "Modifica fonte importazione"
+
+msgid "Edit sync property rule"
+msgstr "Modifica regola di sincronizzazione"
+
+msgid "Entries"
+msgstr "Voci"
+
+msgid "Icinga "
+msgstr "Icinga "
+
+msgid "Icinga %s"
+msgstr "Icinga %s"
+
+msgid "Job %s"
+msgstr "Lavoro %s"
+
+msgid "No object found"
+msgstr "Nessun oggetto trovato"
+
+msgid "Object name"
+msgstr "Nome oggetto"
+
+msgid "Show unfiltered"
+msgstr "Mostra non filtrato"
+
+msgid "Sync run details"
+msgstr "Dettagli di sincronizzazione"
+
+msgid "Template tree"
+msgstr "Albero dei template"
+
+msgid ""
+"This is an external object. It has been imported from Icinga 2 through "
+"the Core API and cannot be managed with the Icinga Director. It is "
+"however perfectly valid to create objects using this or referring to this "
+"object. You might also want to define related Fields to make work based "
+"on this object more enjoyable."
+msgstr ""
+"Questo è un oggetto esterno. È stato creato da Icinga 2 attraverso l'API di base "
+"e non può essere gestito con il Director di Icinga."
+"È comunque perfettamente valido creare oggetti utilizzando o facendo "
+"riferimento a questo oggetto. È anche possibile creare campi correlati "
+"per facilitare il lavoro."
+
+msgid "Time"
+msgstr "Tempo"
+
+msgid "Service sets"
+msgstr "Service-Sets"
+
+msgid "Allow to see template details"
+msgstr "Permetti di vedere i dettagli del template"
+
+msgid "Allow to use only host templates matching this filter"
+msgstr ""
+"Permettete di utilizzare solo template di host che corrispondono "
+"a questo filtro"
+
+msgid "Allow to use only these db resources (comma separated list)"
+msgstr ""
+"Permettete di utilizzare solo queste risorse db (elenco separato da virgole)"
+
+msgid "Command-specific custom vars"
+msgstr "Variabili specifiche del comando definite dall'utente"
+
+msgid "Config history"
+msgstr "Cronologia Configurazione"
+
+msgid ""
+"Data fields allow you to customize input controls your custom variables."
+msgstr ""
+"I campi dati consentono di personalizzare i controlli di "
+"input delle variabili personalizzate."
+
+msgid "Expression"
+msgstr "Espressione"
+
+msgid "Operator"
+msgstr "Operatore"
+
+msgid "Owner"
+msgstr "Proprietario"
+
+msgid "Service configs"
+msgstr "Configurazioni Servizio"
+
+msgid "The unique name of the field"
+msgstr "Il nome unico del campo"
+
+msgid "There are pending database schema migrations"
+msgstr "Le migrazioni del database sono in corso"
+
+msgid "by host group property"
+msgstr "per proprietà del gruppo host"
+
+msgid "check command"
+msgstr "Comando Check"
+
+msgid "to a host group"
+msgstr "ad un gruppo host"
+
+msgid "%s template \"%s\": custom fields"
+msgstr "%s template \"%s\": campo personalizzato"
+
+msgid "Add entry"
+msgstr "Aggiungi voce"
+
+msgid "Deployments / History"
+msgstr "Distrubuzioni / Cronologia"
+
+msgid "Edit entry"
+msgstr "Modifica voce"
+
+msgid "Edit sync rule"
+msgstr "Modifica regola di sincronizzazione"
+
+msgid "Filter string"
+msgstr "Filtro stringa"
+
+msgid "Import / Sync"
+msgstr "Importa / Sincronizza"
+
+msgid "Import runs"
+msgstr "Importa esecuzioni"
+
+msgid "Run"
+msgstr "Esegui"
+
+msgid "Unable to store the configuration to \"%s\""
+msgstr "Impossibile salvare la configuraazione a \"%s\""
+
+msgid "Purge existing values."
+msgstr "Eliminare i valori esistenti."
+
+msgid "Whether the field should be merged, replaced or ignored"
+msgstr "Il campo deve essere unito, sostituito o ignorato?"
+
+msgid "Alert your users"
+msgstr "Avvisa i tuoi utenti"
+
+msgid "Manage deployments, access audit log and history"
+msgstr ""
+"Gestisci distribuzioni, registro di audit degli accessi e la cronologia"
+
+msgid "Name for the Icinga zone (template) you are going to create"
+msgstr "Nome per la zona Icinga (template) che stai per creare"
+
+msgid "Zone (template) name"
+msgstr "Nome (template) Zona"
+
+msgid "click here"
+msgstr "clicca qui"
+
+msgid "database schema"
+msgstr "schema database"
+
+msgid "e.g. "
+msgstr "per es."
+
+msgid "start using"
+msgstr "inizia ad utilizzare"
diff --git a/application/locale/ja_JP/LC_MESSAGES/director.mo b/application/locale/ja_JP/LC_MESSAGES/director.mo
new file mode 100644
index 0000000..ed5b41e
--- /dev/null
+++ b/application/locale/ja_JP/LC_MESSAGES/director.mo
Binary files differ
diff --git a/application/locale/ja_JP/LC_MESSAGES/director.po b/application/locale/ja_JP/LC_MESSAGES/director.po
new file mode 100644
index 0000000..d1bec38
--- /dev/null
+++ b/application/locale/ja_JP/LC_MESSAGES/director.po
@@ -0,0 +1,6186 @@
+# Icinga Web 2 - Head for multiple monitoring backends.
+# Copyright (C) 2019 Icinga Development Team
+# This file is distributed under the same license as Director Module.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Director Module (1.6.2)\n"
+"Report-Msgid-Bugs-To: dev@icinga.com\n"
+"POT-Creation-Date: 2019-03-29 11:34+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language: ja_JP\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Basepath: .\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:602
+#, php-format
+msgid " (inherited from \"%s\")"
+msgstr "(\"%s\" から継承)"
+
+#: ../../../../modules/director/library/Director/Web/Table/TemplatesTable.php:63
+msgid " - not in use -"
+msgstr "- 未使用 -"
+
+#: ../../../../modules/director/library/Director/Web/Table/DatafieldTable.php:49
+msgid "# Used"
+msgstr "# 使用済み"
+
+#: ../../../../modules/director/library/Director/Web/Table/DatafieldTable.php:50
+msgid "# Vars"
+msgstr "# 変数"
+
+#: ../../../../modules/director/library/Director/Web/Table/CustomvarTable.php:29
+#, php-format
+msgid "%d / %d"
+msgstr "%d / %d"
+
+#: ../../../../modules/director/library/Director/Resolver/CommandUsage.php:51
+#, php-format
+msgid "%d Host Template(s)"
+msgstr "%d 個のホストテンプレート。"
+
+#: ../../../../modules/director/library/Director/Resolver/CommandUsage.php:50
+#, php-format
+msgid "%d Host(s)"
+msgstr "%d 個のホスト。"
+
+#: ../../../../modules/director/library/Director/Resolver/CommandUsage.php:61
+#, php-format
+msgid "%d Notification Apply Rule(s)"
+msgstr "%d 個の通知適用ルール。"
+
+#: ../../../../modules/director/library/Director/Resolver/CommandUsage.php:60
+#, php-format
+msgid "%d Notification Template(s)"
+msgstr "%d 個の通知テンプレート。"
+
+#: ../../../../modules/director/library/Director/Resolver/CommandUsage.php:59
+#, php-format
+msgid "%d Notification(s)"
+msgstr "%d 個の通知。"
+
+#: ../../../../modules/director/library/Director/Resolver/CommandUsage.php:56
+#, php-format
+msgid "%d Service Apply Rule(s)"
+msgstr "%d 個の適用ルール。"
+
+#: ../../../../modules/director/library/Director/Resolver/CommandUsage.php:55
+#, php-format
+msgid "%d Service Template(s)"
+msgstr "%d 個のテンプレート。"
+
+#: ../../../../modules/director/library/Director/Resolver/CommandUsage.php:54
+#, php-format
+msgid "%d Service(s)"
+msgstr "%d 個のサービス"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:231
+#, php-format
+msgid "%d apply rules have been defined"
+msgstr "%d個の適用ルールが定義されています"
+
+#: ../../../../modules/director/library/Director/Web/Table/SyncRunTable.php:46
+#, php-format
+msgid "%d created"
+msgstr "%d 個定義されています"
+
+#: ../../../../modules/director/library/Director/Web/Table/SyncRunTable.php:58
+#, php-format
+msgid "%d deleted"
+msgstr "%d 個削除されています。"
+
+#: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:110
+#, php-format
+msgid "%d files"
+msgstr "%d 個のファイル"
+
+#: ../../../../modules/director/library/Director/Web/Widget/DeployedConfigInfoHeader.php:83
+#, php-format
+msgid "%d files rendered in %0.2fs"
+msgstr "%d 個のファイルが%0.2f 秒で生成されました。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:273
+#, php-format
+msgid "%d have been externally defined and will not be deployed"
+msgstr "%d 個は外部で定義されており、設定が反映されません。"
+
+#: ../../../../modules/director/library/Director/Web/Table/SyncRunTable.php:52
+#, php-format
+msgid "%d modified"
+msgstr "%d 個の変更。"
+
+#: ../../../../modules/director/application/controllers/InspectController.php:78
+#, php-format
+msgid "%d objects found"
+msgstr "%d 個のオブジェクトが見つかりました。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:256
+#, php-format
+msgid "%d objects have been defined"
+msgstr "%d 個のオブジェクトが定義されています"
+
+#: ../../../../modules/director/application/forms/IcingaMultiEditForm.php:87
+#, php-format
+msgid "%d objects have been modified"
+msgstr "%d 個のオブジェクトが変更されています。"
+
+#: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:119
+#, php-format
+msgid "%d objects, %d templates, %d apply rules"
+msgstr "%d 個のオブジェクト、%d 個のテンプレート、%d 個の適用ルール。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:265
+#, php-format
+msgid "%d of them are templates"
+msgstr "そのうちの%d 個はテンプレートです"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:213
+#, php-format
+msgid "%d templates have been defined"
+msgstr "%d 個のテンプレートが定義されています。"
+
+#: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:450
+#, php-format
+msgid "%s \"%s\" has been created"
+msgstr "%s \"%s\"が作成されました。"
+
+#: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:453
+#, php-format
+msgid "%s \"%s\" has been deleted"
+msgstr "%s \"%s\"が削除されました。"
+
+#: ../../../../modules/director/application/forms/IcingaImportObjectForm.php:36
+#, php-format
+msgid "%s \"%s\" has been imported\""
+msgstr "%s \"%s\"がインポートされました。"
+
+#: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:456
+#, php-format
+msgid "%s \"%s\" has been modified"
+msgstr "%s \"%s\" が変更されました。"
+
+#: ../../../../modules/director/library/Director/Web/Table/ObjectSetTable.php:57
+#, php-format
+msgid "%s (%d members)"
+msgstr "%s (%d 人のメンバー)"
+
+#: ../../../../modules/director/application/controllers/HostController.php:178
+#: ../../../../modules/director/application/controllers/HostController.php:261
+#, php-format
+msgid "%s (Applied Service set)"
+msgstr "%s (適用されたサービスセット)"
+
+#: ../../../../modules/director/application/controllers/HostController.php:311
+#, php-format
+msgid "%s (Service set)"
+msgstr "%s (サービスセット)"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:243
+#: ../../../../modules/director/application/forms/SettingsForm.php:157
+#, php-format
+msgid "%s (default)"
+msgstr "%s (デフォルト)"
+
+#: ../../../../modules/director/library/Director/Web/Table/IcingaHostAppliedServicesTable.php:100
+#, php-format
+msgid "%s (where %s)"
+msgstr "%s (条件: %s)"
+
+#: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:69
+#, php-format
+msgid "%s Templates"
+msgstr "%s テンプレート"
+
+#: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:36
+#, php-format
+msgid "%s based on %s"
+msgstr "%s (ベース: %s)"
+
+#: ../../../../modules/director/library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:112
+#, php-format
+msgid "%s config changes happend since the last deployed configuration"
+msgstr "最後に反映された設定以降の %s の設定変更"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:256
+#, php-format
+msgid "%s has been blacklisted on %s"
+msgstr "%s は %s のブラックリストに登録されました。"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:292
+#, php-format
+msgid "%s is no longer blacklisted on %s"
+msgstr "%s は %s のブラックリストから除外されました。"
+
+#: ../../../../modules/director/library/Director/Web/Widget/SyncRunDetails.php:48
+#, php-format
+msgid "%s objects have been modified"
+msgstr "%s オブジェクトが編集されました。"
+
+#: ../../../../modules/director/application/controllers/HostController.php:459
+#, php-format
+msgid "%s on %s (from set: %s)"
+msgstr "%s 上の%s(セット: %s から) "
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:288
+#, php-format
+msgid "%s related group objects have been created"
+msgstr "%s 個の関連オブジェクトが作成されました。"
+
+#: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:72
+#, php-format
+msgid "%s templates based on %s"
+msgstr "%s テンプレート(%s をベース)"
+
+#: ../../../../modules/director/library/Director/Web/Widget/HealthCheckPluginOutput.php:46
+#, php-format
+msgid "%s: %d"
+msgstr "%s: %d"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:193
+#, php-format
+msgid "%s: %s (Snapshot)"
+msgstr "%s: %s (スナップショット)"
+
+#: ../../../../modules/director/application/controllers/ImportsourceController.php:223
+#, php-format
+msgid "%s: Property Modifier"
+msgstr "%s: プロパティ変換ルール"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:144
+#, php-format
+msgid "%s: Snapshots"
+msgstr "%s: スナップショット"
+
+#: ../../../../modules/director/application/controllers/ImportsourceController.php:197
+#, php-format
+msgid "%s: add Property Modifier"
+msgstr "%s: プロパティ変換ルールを追加"
+
+#: ../../../../modules/director/library/Director/Db/Housekeeping.php:54
+msgid "(Host) group resolve cache"
+msgstr "(ホスト) グループがキャッシュを解決"
+
+#: ../../../../modules/director/application/controllers/ServiceController.php:169
+#, php-format
+msgid "(on %s)"
+msgstr "(%s について)"
+
+#: ../../../../modules/director/library/Director/Web/Form/IplElement/ExtensibleSetElement.php:234
+msgid "- add more -"
+msgstr "- さらに追加 -"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1032
+msgid "- click to add more -"
+msgstr "- クリックしてさらに追加 -"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:611
+msgid "- inherited -"
+msgstr "- 継承 -"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:66
+msgid "- no automatic installation -"
+msgstr "- 自動インストールなし -"
+
+#: ../../../../modules/director/application/controllers/ConfigController.php:360
+#: ../../../../modules/director/application/controllers/ConfigController.php:371
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:239
+#: ../../../../modules/director/application/forms/SettingsForm.php:161
+#: ../../../../modules/director/application/views/helpers/FormDataFilter.php:465
+#: ../../../../modules/director/library/Director/DataType/DataTypeDatalist.php:22
+#: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:43
+#: ../../../../modules/director/library/Director/DataType/DataTypeSqlQuery.php:37
+#: ../../../../modules/director/library/Director/Job/ImportJob.php:118
+#: ../../../../modules/director/library/Director/Job/SyncJob.php:124
+#: ../../../../modules/director/library/Director/Web/Form/QuickBaseForm.php:119
+msgid "- please choose -"
+msgstr "- 選択してください -"
+
+#: ../../../../modules/director/application/controllers/BasketsController.php:34
+msgid ""
+"A Configuration Basket references specific Configuration Objects or all "
+"objects of a specific type. It has been designed to share Templates, Import/"
+"Sync strategies and other base Configuration Objects. It is not a tool to "
+"operate with single Hosts or Services."
+msgstr "構成バスケットは、特定の構成オブジェクトまたは特定のタイプの"
+"すべてのオブジェクトを参照します。 これはテンプレート、インポート/同期戦略、"
+"その他の基本設定オブジェクトを共有するように設計されています。 単一の"
+"ホストまたはサービスで動作するためのツールではありません。"
+
+#: ../../../../modules/director/library/Director/Import/ImportSourceLdap.php:61
+msgid ""
+"A custom LDAP filter to use in addition to the object class. This allows for "
+"a lot of flexibility but requires LDAP filter skills. Simple filters might "
+"look as follows: operatingsystem=*server*"
+msgstr "オブジェクトクラスに加えて使用するカスタムLDAPフィルタ。"
+"これにより、柔軟性が大幅に向上しますが、LDAPフィルタのスキルが必要です。"
+"単純なフィルタは次のようになります。operatingsystem=*server*"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:214
+msgid ""
+"A custom string. Might contain source columns, please use placeholders of "
+"the form ${columnName} in such case"
+msgstr "カスタム文字列 ソースカラムを含めることができます。その場合は "
+"${columnName} の形式のplaceholderを使用してください。"
+
+#: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:126
+msgid "A description about the field"
+msgstr "フィールドについての説明"
+
+#: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:59
+msgid "A detailled description explaining what this choice is all about"
+msgstr "このチョイスのすべてについて説明する詳細な説明"
+
+#: ../../../../modules/director/application/forms/IcingaServiceSetForm.php:102
+msgid ""
+"A meaningful description explaining your users what to expect when assigning "
+"this set of services"
+msgstr "このサービスセットの説明を記述します"
+
+#: ../../../../modules/director/application/forms/IcingaTimePeriodRangeForm.php:85
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:641
+#, php-format
+msgid "A new %s has successfully been created"
+msgstr "新しい %s が正常に作成されました"
+
+#: ../../../../modules/director/application/forms/IcingaGenerateApiKeyForm.php:39
+#, php-format
+msgid "A new Self Service API key for %s has been generated"
+msgstr "%s の新しいセルフサービスAPIキーが生成されました。"
+
+#: ../../../../modules/director/application/forms/ImportRowModifierForm.php:74
+msgid ""
+"A property modifier allows you to modify a specific property at import time"
+msgstr "プロパティ変換ルールを使用すると、インポート時に特定のプロパティを変更できます。"
+
+#: ../../../../modules/director/application/forms/ImportSourceForm.php:17
+msgid ""
+"A short name identifying this import source. Use something meaningful, like "
+"\"Hosts from Puppet\", \"Users from Active Directory\" or similar"
+msgstr "このインポート元を識別する名前。 わかりやすい意味のある名前を使用してください。"
+
+#: ../../../../modules/director/application/forms/DirectorJobForm.php:74
+msgid ""
+"A short name identifying this job. Use something meaningful, like \"Import "
+"Puppet Hosts\""
+msgstr "このジョブを識別する名前。 わかりやすい意味のある名前を使用してください。"
+
+#: ../../../../modules/director/application/forms/IcingaServiceSetForm.php:30
+msgid "A short name identifying this set of services"
+msgstr "このサービスセットの名前"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:211
+#, php-format
+msgid ""
+"A ticket for this agent could not have been requested from your deployment "
+"endpoint: %s"
+msgstr "このエージェントのチケットは、デプロイメントエンドポイントから要求されていない可能性があります:%s"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/DeploymentDashlet.php:95
+#, php-format
+msgid ""
+"A total of %d config changes happened since your last deployed config has "
+"been rendered"
+msgstr "最後の設定反映から合計 %d 回の設定変更が行われました。"
+
+#: ../../../../modules/director/application/forms/IcingaHostSelfServiceForm.php:49
+msgid "API Key"
+msgstr "APIキー"
+
+#: ../../../../modules/director/application/forms/IcingaEndpointForm.php:46
+#: ../../../../modules/director/application/forms/KickstartForm.php:151
+msgid "API user"
+msgstr "API ユーザ"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1360
+msgid "Accept passive checks"
+msgstr "パッシブ監視を許可する"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:93
+msgid "Accepts config"
+msgstr "設定の同期を受け入れる"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:28
+msgid "Acknowledgement"
+msgstr "Acknowledgement (検知)"
+
+#: ../../../../modules/director/library/Director/Web/Table/ConfigFileDiffTable.php:81
+#: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:391
+#: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:401
+msgid "Action"
+msgstr "アクション"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1473
+msgid "Action URL"
+msgstr "アクションURL"
+
+#: ../../../../modules/director/library/Director/Web/Table/QuickTable.php:280
+#: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:424
+#: ../../../../modules/director/library/Director/Web/Widget/DeployedConfigInfoHeader.php:62
+msgid "Actions"
+msgstr "アクション"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:143
+msgid "Activation Tool"
+msgstr "アクティベーションツール"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:122
+msgid "Active-Passive"
+msgstr "アクティブ-パッシブ"
+
+#: ../../../../modules/director/library/Director/Web/Widget/SyncRunDetails.php:27
+msgid "Activity"
+msgstr "アクティビティ"
+
+#: ../../../../modules/director/application/controllers/ConfigController.php:141
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ActivityLogDashlet.php:11
+#: ../../../../modules/director/library/Director/Web/Tabs/InfraTabs.php:29
+msgid "Activity Log"
+msgstr "アクティビティログ"
+
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:233
+#, php-format
+msgid "Activity Log: %s"
+msgstr "アクティビティログ: %s"
+
+#: ../../../../modules/director/configuration.php:138
+msgid "Activity log"
+msgstr "アクティビティログ"
+
+#: ../../../../modules/director/application/controllers/DataController.php:22
+#: ../../../../modules/director/application/controllers/DataController.php:64
+#: ../../../../modules/director/application/forms/AddToBasketForm.php:72
+#: ../../../../modules/director/library/Director/Web/ActionBar/ChoicesActionBar.php:16
+#: ../../../../modules/director/library/Director/Web/ActionBar/ObjectsActionBar.php:16
+#: ../../../../modules/director/library/Director/Web/ActionBar/TemplateActionBar.php:19
+#: ../../../../modules/director/library/Director/Web/Controller/ActionController.php:134
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:247
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:288
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:492
+msgid "Add"
+msgstr "追加"
+
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:76
+#: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:51
+#, php-format
+msgid "Add %s"
+msgstr "追加: %s"
+
+#: ../../../../modules/director/application/forms/AddToBasketForm.php:68
+#, php-format
+msgid "Add %s objects"
+msgstr "%s 個のオブジェクトを追加"
+
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:366
+#, php-format
+msgid "Add %s: %s"
+msgstr "%sを追加: %s"
+
+#: ../../../../modules/director/application/controllers/HostsController.php:40
+#: ../../../../modules/director/application/controllers/HostsController.php:79
+msgid "Add Service"
+msgstr "サービスを追加"
+
+#: ../../../../modules/director/application/controllers/HostsController.php:45
+#: ../../../../modules/director/application/controllers/HostsController.php:110
+msgid "Add Service Set"
+msgstr "サービスセットを追加"
+
+#: ../../../../modules/director/application/controllers/HostsController.php:127
+#, php-format
+msgid "Add Service Set to %d hosts"
+msgstr "サービスセットを %d 個のホストに追加"
+
+#: ../../../../modules/director/application/controllers/HostController.php:74
+#, php-format
+msgid "Add Service Set: %s"
+msgstr "サービスセット: %s を追加"
+
+#: ../../../../modules/director/application/controllers/HostController.php:61
+#, php-format
+msgid "Add Service: %s"
+msgstr "サービス: %s を追加"
+
+#: ../../../../modules/director/application/controllers/DatafieldController.php:40
+msgid "Add a new Data Field"
+msgstr "新しいデータフィールドを追加"
+
+#: ../../../../modules/director/application/controllers/DataController.php:52
+msgid "Add a new Data List"
+msgstr "データリストを追加"
+
+#: ../../../../modules/director/application/controllers/ImportsourcesController.php:49
+msgid "Add a new Import Source"
+msgstr "新しいインポートソースを追加"
+
+#: ../../../../modules/director/application/controllers/JobController.php:31
+#: ../../../../modules/director/application/controllers/JobsController.php:15
+msgid "Add a new Job"
+msgstr "新しいジョブの追加"
+
+#: ../../../../modules/director/application/controllers/SyncrulesController.php:28
+msgid "Add a new Sync Rule"
+msgstr "新しい同期ルールを追加"
+
+#: ../../../../modules/director/library/Director/Web/Form/IplElement/ExtensibleSetElement.php:470
+msgid "Add a new entry"
+msgstr "新しいエントリを追加"
+
+#: ../../../../modules/director/library/Director/Web/Form/IplElement/ExtensibleSetElement.php:256
+msgid "Add a new one..."
+msgstr "新しいものを追加"
+
+#: ../../../../modules/director/application/controllers/ServicesetController.php:49
+#, php-format
+msgid "Add a service set to \"%s\""
+msgstr "\"%s\"にサービスセットを追加"
+
+#: ../../../../modules/director/application/controllers/ServiceController.php:105
+#, php-format
+msgid "Add a service to \"%s\""
+msgstr "\"%s\"にサービスを追加"
+
+#: ../../../../modules/director/application/views/helpers/FormDataFilter.php:516
+msgid "Add another filter"
+msgstr "別のフィルタを追加"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:83
+msgid "Add chosen objects to a Configuration Basket"
+msgstr "選択したオブジェクトを構成バスケットに追加する"
+
+#: ../../../../modules/director/application/forms/DirectorDatalistEntryForm.php:60
+msgid "Add data list entry"
+msgstr "データリストエントリを追加"
+
+#: ../../../../modules/director/application/controllers/ImportsourceController.php:89
+msgid "Add import source"
+msgstr "インポートソースの追加"
+
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:372
+#, php-format
+msgid "Add new Icinga %s"
+msgstr "新しいIcinga %s の追加"
+
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:355
+#, php-format
+msgid "Add new Icinga %s template"
+msgstr "新しいIcinga %s テンプレートの追加"
+
+#: ../../../../modules/director/application/controllers/ImportsourceController.php:170
+msgid "Add property modifier"
+msgstr "プロパティ変換ルールを追加"
+
+#: ../../../../modules/director/application/controllers/HostController.php:90
+#: ../../../../modules/director/application/controllers/ServicesetController.php:66
+msgid "Add service"
+msgstr "サービスを追加"
+
+#: ../../../../modules/director/application/controllers/HostController.php:95
+msgid "Add service set"
+msgstr "サービスセットを追加"
+
+#: ../../../../modules/director/application/controllers/HostsController.php:96
+#, php-format
+msgid "Add service to %d hosts"
+msgstr "サービスを %d 個のホストに追加"
+
+#: ../../../../modules/director/application/controllers/SyncruleController.php:210
+msgid "Add sync property rule"
+msgstr "同期プロパティルールを追加"
+
+#: ../../../../modules/director/application/controllers/SyncruleController.php:249
+#, php-format
+msgid "Add sync property: %s"
+msgstr "同期プロパティを追加: %s"
+
+#: ../../../../modules/director/application/controllers/SyncruleController.php:161
+msgid "Add sync rule"
+msgstr "同期ルールを追加"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:82
+#: ../../../../modules/director/application/controllers/DataController.php:124
+#: ../../../../modules/director/application/controllers/HostsController.php:70
+#: ../../../../modules/director/application/controllers/ImportsourceController.php:55
+#: ../../../../modules/director/application/controllers/JobController.php:78
+#: ../../../../modules/director/application/controllers/ServicesController.php:36
+#: ../../../../modules/director/application/controllers/SyncruleController.php:295
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:337
+#: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:126
+msgid "Add to Basket"
+msgstr "バスケットに追加"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1459
+msgid "Additional notes for this object"
+msgstr "このオブジェクトに関する注意事項"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1512
+msgid "Additional properties"
+msgstr "任意のプロパティ"
+
+#: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:140
+msgid "Agent"
+msgstr "エージェント"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:141
+msgid "Agent Version"
+msgstr "エージェントのバージョン"
+
+#: ../../../../modules/director/application/forms/IcingaHostSelfServiceForm.php:31
+msgid "Alias"
+msgstr "別名"
+
+#: ../../../../modules/director/application/controllers/ConfigController.php:151
+msgid "All changes"
+msgstr "すべての変更"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:78
+msgid ""
+"All changes are tracked in the Director database. In addition you might also "
+"want to send an audit log through the Icinga Web 2 logging mechanism. That "
+"way all changes would be written to either Syslog or the configured log "
+"file. When enabling this please make sure that you configured Icinga Web 2 "
+"to log at least at \"informational\" level."
+msgstr "すべての変更はDirectorデータベースで追跡されます。 さらに、"
+"Icinga Web 2のログ記録メカニズムを介して監査ログを送信することもできます。"
+"そうすれば、すべての変更はSyslogまたは設定されたログファイルに書き込まれます。"
+"これを有効にするときは、少なくとも \"informational\"レベルでログを"
+"記録するようにIcinga Web 2を設定したことを確認してください。"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:307
+msgid "All custom variables (vars)"
+msgstr "すべてのカスタム変数(vars)"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:50
+msgid "All of them"
+msgstr "それらすべて"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:725
+#, php-format
+msgid "All overrides have been removed from \"%s\""
+msgstr "すべてのオーバーライドは\"%s\"から削除されました"
+
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:240
+#, php-format
+msgid "All your %s Apply Rules"
+msgstr "すべての%s 適用ルール"
+
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:201
+#, php-format
+msgid "All your %s Templates"
+msgstr "すべての %s テンプレート"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:174
+msgid "Allow Updates"
+msgstr "アップデートを許可"
+
+#: ../../../../modules/director/configuration.php:31
+msgid "Allow readonly users to see where a Service came from"
+msgstr "読み取り専用ユーザーに、サービスの出所を確認することを許可"
+
+#: ../../../../modules/director/configuration.php:6
+msgid "Allow to access the director API"
+msgstr "director API へのアクセスを許可"
+
+#: ../../../../modules/director/configuration.php:7
+msgid "Allow to access the full audit log"
+msgstr "完全な audit ログへのアクセスを許可"
+
+#: ../../../../modules/director/configuration.php:17
+msgid "Allow to configure hosts"
+msgstr "ホストの設定を許可"
+
+#: ../../../../modules/director/configuration.php:22
+msgid "Allow to configure notifications"
+msgstr "通知の設定を許可"
+
+#: ../../../../modules/director/configuration.php:19
+msgid "Allow to configure service sets"
+msgstr "サービスセットの設定を許可"
+
+#: ../../../../modules/director/configuration.php:18
+msgid "Allow to configure services"
+msgstr "サービスの設定を許可"
+
+#: ../../../../modules/director/configuration.php:21
+msgid "Allow to configure users"
+msgstr "ユーザの設定を許可"
+
+#: ../../../../modules/director/configuration.php:20
+msgid "Allow to define Service Set Apply Rules"
+msgstr "サービス設定の適用ルールの定義を許可"
+
+#: ../../../../modules/director/configuration.php:16
+msgid "Allow to deploy configuration"
+msgstr "設定反映を許可"
+
+#: ../../../../modules/director/configuration.php:26
+msgid ""
+"Allow to inspect objects through the Icinga 2 API (could contain sensitive "
+"information)"
+msgstr "Icinga 2 APIを介してオブジェクトの検査を許可"
+"(機密情報を含む可能性があります)"
+
+#: ../../../../modules/director/configuration.php:10
+msgid "Allow to show configuration (could contain sensitive information)"
+msgstr "設定の表示を許可(機密情報を含む可能性があります)"
+
+#: ../../../../modules/director/configuration.php:14
+msgid "Allow to show the full executed SQL queries in some places"
+msgstr "いくつかの場所で完全に実行されたSQLクエリを表示することを許可します"
+
+#: ../../../../modules/director/application/forms/DirectorDatalistEntryForm.php:48
+msgid ""
+"Allow to use this entry only to users with one of these Icinga Web 2 roles"
+msgstr "選択したロールのどれかを持つユーザーにのみ"
+"このエントリの使用を許可します"
+
+#: ../../../../modules/director/configuration.php:33
+msgid "Allow unrestricted access to Icinga Director"
+msgstr "Icinga Directorへの無制限アクセスを許可"
+
+#: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:85
+msgid "Allowed maximum"
+msgstr "許可された上限"
+
+#: ../../../../modules/director/application/forms/DirectorDatalistEntryForm.php:44
+msgid "Allowed roles"
+msgstr "許可されたロール"
+
+#: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:73
+msgid "Also clone fields provided by this Template"
+msgstr "このテンプレートに提供されているフィールドも複製します。"
+
+#: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:53
+msgid "Also clone single Service Sets defined for this Host"
+msgstr "このホストに定義されている単一のサービスセットも複製します。"
+
+#: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:44
+msgid "Also clone single Services defined for this Host"
+msgstr "このホストに定義されている単一のサービスも複製します。"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:191
+msgid ""
+"Also install NSClient++. It can be used through the Icinga Agent and comes "
+"with a bunch of additional Check Plugins"
+msgstr "NSClient++ もインストールします。 NSClient++ にはIcingaエージェントを介して使用することができ、監視プラグインが付属しています"
+
+#: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:107
+#, php-format
+msgid "Also rename all \"%s\" custom variables to \"%s\" on %d objects?"
+msgstr "すべての \"%s\" カスタム変数の名前を \"%s\" に変更しますか?(対象:%d個のオブジェクト)"
+
+#: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:64
+#, php-format
+msgid "Also wipe all \"%s\" custom variables from %d objects?"
+msgstr "すべての \"%s\" カスタム変数も消去しますか?(処理対象:%d個のオブジェクト)"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:336
+msgid ""
+"Alternative name for this host. Might be a host alias or and kind of string "
+"helping your users to identify this host"
+msgstr "このホストの別名。 ユーザーがこのホストを識別するのに役立つ"
+"ホストエイリアスまたはそのような文字列"
+
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:135
+msgid ""
+"Alternative name for this user. In case your object name is a username, this "
+"could be the full name of the corresponding person"
+msgstr "このユーザーの別名。 オブジェクト名がユーザー名である場合、"
+"これは対応する人のフルネームを指定したりします。"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1493
+msgid "Alternative text to be shown in case above icon is missing"
+msgstr "上記のアイコンがない場合に表示される代替テキスト"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:86
+msgid ""
+"An Icinga DSL expression that returns a boolean value, e.g.: var cmd = "
+"bool(macro(\"$cmd$\")); return cmd ..."
+msgstr "ブール値を返すIcinga DSL表記。"
+"例)var cmd = bool(macro(\"$cmd$\")); return cmd"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:47
+msgid ""
+"An Icinga DSL expression, e.g.: var cmd = macro(\"$cmd$\"); return "
+"typeof(command) == String ..."
+msgstr "Icinga DSL表記。"
+"例)var cmd = macro(\"$cmd$\"); return typeof(command)== String"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1475
+msgid ""
+"An URL leading to additional actions for this object. Often used with Icinga "
+"Classic, rarely with Icinga Web 2 as it provides far better possibilities to "
+"integrate addons"
+msgstr "このオブジェクトに対するアクションにつながるURL。"
+"Icinga Classicではよく使用されますが、Icinga Web 2では、アドオンを統合"
+"するためのはるかに優れた機能があるため、ほとんど使用されません。"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1468
+msgid "An URL pointing to additional notes for this object"
+msgstr "このオブジェクトに関するURL"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1484
+msgid ""
+"An URL pointing to an icon for this object. Try \"tux.png\" for icons "
+"relative to public/img/icons or \"cloud\" (no extension) for items from the "
+"Icinga icon font"
+msgstr "このオブジェクトのアイコンを指すURL。 public/img/iconsに関連する"
+"アイコンには \"tux.png\"を、Icingaアイコンフォントのアイテムには\"cloud\""
+"(拡張子なし)を試してください。"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1240
+msgid ""
+"An alternative display name for this group. If you wonder how this could be "
+"helpful just leave it blank"
+msgstr "このグループの別名で、表示に使われます。"
+"別名を設定する必要がなければ、空白のままでも問題ありません。"
+
+#: ../../../../modules/director/application/forms/ImportRowModifierForm.php:56
+msgid ""
+"An extended description for this Import Row Modifier. This should explain "
+"it's purpose and why it has been put in place at all."
+msgstr "このインポート行プロパティ変換ルールの詳細な説明。 目的と、なぜ必要なのかの説明を書きます。"
+
+#: ../../../../modules/director/application/forms/ImportSourceForm.php:26
+msgid ""
+"An extended description for this Import Source. This should explain what "
+"kind of data you're going to import from this source."
+msgstr "このインポートソースの詳細な説明。 このソースからどのような種類の"
+"データをインポートしようとしているのかを説明する必要があります。"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:35
+msgid ""
+"An extended description for this Sync Rule. This should explain what this "
+"Rule is going to accomplish."
+msgstr "この同期ルールの詳細な説明を記載します。"
+
+#: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:159
+msgid ""
+"An extended description for this field. Will be shown as soon as a user puts "
+"the focus on this field"
+msgstr "このフィールドの詳細な説明。 ユーザーがこのフィールドにフォーカスすると表示されます。"
+
+#: ../../../../modules/director/library/Director/Import/ImportSourceLdap.php:55
+msgid ""
+"An object class to search for. Might be \"user\", \"group\", \"computer\" or "
+"similar"
+msgstr "検索するオブジェクトクラス \"user\"、\"group\"、\"computer\"などの"
+"可能性があります"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:20
+msgid "Any first (leftmost) component"
+msgstr "最初の(一番左の)コンポーネントすべて"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:115
+msgid "Api Key:"
+msgstr "APIキー: "
+
+#: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:52
+#, php-format
+msgid "Applied %s"
+msgstr "%s を適用しました"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:217
+msgid "Applied groups"
+msgstr "グループを適用しました"
+
+#: ../../../../modules/director/application/controllers/HostController.php:343
+#, php-format
+msgid "Applied service: %s"
+msgstr "サービスを適用しました: %s"
+
+#: ../../../../modules/director/application/controllers/HostController.php:189
+#: ../../../../modules/director/application/controllers/HostController.php:276
+msgid "Applied services"
+msgstr "サービスを適用しました"
+
+#: ../../../../modules/director/library/Director/Web/Tabs/ObjectsTabs.php:44
+msgid "Apply"
+msgstr "適用"
+
+#: ../../../../modules/director/application/controllers/ServiceController.php:110
+#, php-format
+msgid "Apply \"%s\""
+msgstr "\"%s\"を適用"
+
+#: ../../../../modules/director/application/forms/ApplyMigrationsForm.php:25
+#, php-format
+msgid "Apply %d pending schema migrations"
+msgstr "%d 個の保留中のスキーマ移行を適用"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:604
+msgid "Apply For"
+msgstr "適用対象"
+
+#: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:166
+msgid "Apply Rule"
+msgstr "ルールを適用"
+
+#: ../../../../modules/director/library/Director/Web/Table/ApplyRulesTable.php:122
+msgid "Apply Rule rendering preview"
+msgstr "ルールを適用してプレビューを行う"
+
+#: ../../../../modules/director/library/Director/Web/Table/DependencyTemplateUsageTable.php:11
+#: ../../../../modules/director/library/Director/Web/Table/NotificationTemplateUsageTable.php:11
+#: ../../../../modules/director/library/Director/Web/Table/ServiceTemplateUsageTable.php:12
+msgid "Apply Rules"
+msgstr "ルールを適用"
+
+#: ../../../../modules/director/application/forms/ApplyMigrationsForm.php:20
+msgid "Apply a pending schema migration"
+msgstr "保留中のスキーマ移行を適用する"
+
+#: ../../../../modules/director/library/Director/Job/SyncJob.php:92
+msgid "Apply changes"
+msgstr "変更を適用する"
+
+# bug! cannot translate
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/NotificationApplyDashlet.php:19
+msgid "Apply notifications with specific properties according to given rules."
+msgstr "指定されたルールに従って特定のプロパティで通知を適用します。"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1065
+msgid "Apply rule"
+msgstr "ルールを適用する"
+
+#: ../../../../modules/director/library/Director/Web/Table/ApplyRulesTable.php:129
+msgid "Apply rule history"
+msgstr "ルールの適用履歴"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:38
+msgid "Apply schema migrations"
+msgstr "スキーマの移行を適用"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:92
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:81
+msgid "Apply to"
+msgstr "適用先"
+
+#: ../../../../modules/director/application/controllers/ServiceController.php:206
+#, php-format
+msgid "Apply: %s"
+msgstr "適用: %s"
+
+#: ../../../../modules/director/library/Director/Web/Table/IcingaCommandArgumentTable.php:45
+msgid "Argument"
+msgstr "引数"
+
+#: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:91
+msgid "Argument macros"
+msgstr "引数マクロ"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:25
+msgid "Argument name"
+msgstr "引数名"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:313
+msgid "Arguments"
+msgstr "引数"
+
+#: ../../../../modules/director/library/Director/DataType/DataTypeDatalist.php:66
+#: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:77
+#: ../../../../modules/director/library/Director/DataType/DataTypeSqlQuery.php:77
+msgid "Array"
+msgstr "配列"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1545
+msgid "Assign where"
+msgstr "条件式の指定"
+
+#: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:383
+msgid "Author"
+msgstr "作成者"
+
+#: ../../../../modules/director/library/Director/Dashboard/AutomationDashboard.php:15
+msgid "Automate all tasks"
+msgstr "すべてのタスクの自動化"
+
+#: ../../../../modules/director/configuration.php:134
+msgid "Automation"
+msgstr "自動化"
+
+#: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:64
+msgid "Available choices"
+msgstr "利用可能なチョイス"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:50
+#: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:92
+msgid "Back"
+msgstr "戻る"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:32
+#: ../../../../modules/director/application/forms/AddToBasketForm.php:60
+#: ../../../../modules/director/library/Director/Web/Table/BasketTable.php:31
+msgid "Basket"
+msgstr "バスケット"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:32
+msgid "Basket Definitions"
+msgstr "バスケットの定義"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:42
+#: ../../../../modules/director/application/forms/BasketUploadForm.php:29
+msgid "Basket Name"
+msgstr "バスケット名"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:140
+msgid "Basket Snapshots"
+msgstr "バスケットのスナップショット"
+
+#: ../../../../modules/director/application/forms/BasketUploadForm.php:145
+msgid "Basket has been uploaded"
+msgstr "バスケットがアップロードされました"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:76
+#: ../../../../modules/director/application/controllers/BasketsController.php:17
+msgid "Baskets"
+msgstr "バスケット"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:160
+msgid "Blacklist"
+msgstr "ブラックリスト"
+
+#: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:148
+#: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:117
+msgid "Caption"
+msgstr "キャプション"
+
+#: ../../../../modules/director/application/forms/IcingaMultiEditForm.php:261
+#, php-format
+msgid "Changing this value affects %d object(s): %s"
+msgstr "この値を変更すると、%d個のオブジェクトに影響します: %s"
+
+#: ../../../../modules/director/library/Director/Import/ImportSourceCoreApi.php:57
+msgid "Check Commands"
+msgstr "監視コマンド"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1261
+msgid "Check command"
+msgstr "監視コマンド"
+
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:252
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1262
+msgid "Check command definition"
+msgstr "監視コマンドの定義"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1330
+msgid ""
+"Check command timeout in seconds. Overrides the CheckCommand's timeout "
+"attribute"
+msgstr "コマンドのタイムアウト時間を秒単位で指定します"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:322
+msgid "Check execution"
+msgstr "監視の実行"
+
+#: ../../../../modules/director/application/forms/ImportCheckForm.php:23
+#: ../../../../modules/director/application/forms/SyncCheckForm.php:23
+msgid "Check for changes"
+msgstr "変更の確認"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1297
+msgid "Check interval"
+msgstr "監視インターバル"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1342
+msgid "Check period"
+msgstr "監視スケジュール"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1328
+msgid "Check timeout"
+msgstr "監視タイムアウト"
+
+#: ../../../../modules/director/application/forms/ImportCheckForm.php:45
+msgid "Checking this Import Source failed"
+msgstr "このインポートソースの検査が失敗しました"
+
+#: ../../../../modules/director/application/forms/SyncCheckForm.php:61
+msgid "Checking this sync rule failed"
+msgstr "この同期ルールの検査に失敗しました"
+
+#: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:419
+msgid "Checksum"
+msgstr "チェックサム"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:231
+msgid "Child Host"
+msgstr "子ホスト"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:247
+msgid "Child Service"
+msgstr "子サービス"
+
+#: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:48
+msgid "Choice name"
+msgstr "チョイス名"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ChoicesDashlet.php:11
+#: ../../../../modules/director/library/Director/Web/Tabs/ObjectsTabs.php:69
+msgid "Choices"
+msgstr "チョイス"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:76
+msgid ""
+"Choose \"All\" to always add all of them, \"Ignore\" to not care about a "
+"specific Type at all and opt for \"Custom Selection\" in case you want to "
+"choose just some specific Objects."
+msgstr "常にすべてを追加するには「すべて」を、特定のタイプをまったく気に"
+"しないようにするには「無視」を選択し、特定のオブジェクトだけを選択する場合は"
+"「カスタム選択」を選択します。"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:176
+msgid "Choose a Host Template"
+msgstr "ホストテンプレートを選択"
+
+#: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:106
+msgid "Choose a service template"
+msgstr "サービステンプレートを選択"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:43
+msgid "Choose an object type"
+msgstr "オブジェクトタイプを選択"
+
+#: ../../../../modules/director/application/forms/BasketUploadForm.php:35
+msgid "Choose file"
+msgstr "ファイルを選択"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:582
+msgid "Choose the host this single service should be assigned to"
+msgstr "この単一サービスが割り当てられるべきホストを選択"
+
+#: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:75
+msgid ""
+"Choosing this many options will be mandatory for this Choice. Setting this "
+"to zero will leave this Choice optional, setting it to one results in a "
+"\"required\" Choice. You can use higher numbers to enforce multiple options, "
+"this Choice will then turn into a multi-selection element."
+msgstr "この設定はこのチョイスに必須です。 これをゼロに設定すると、"
+"このチョイスはオプションのままになり、1に設定すると「必須」のチョイスになります。"
+"複数のオプションを強制するためにより高い数を使うことができます、"
+"そしてこのチョイスはそれから複数選択要素に変わります。"
+
+#: ../../../../modules/director/application/forms/IcingaZoneForm.php:37
+msgid "Chose an (optional) parent zone"
+msgstr "(オプションの)親ゾーンを選択"
+
+#: ../../../../modules/director/application/controllers/ImportsourceController.php:122
+#: ../../../../modules/director/application/controllers/SyncruleController.php:184
+#: ../../../../modules/director/library/Director/Web/ActionBar/AutomationObjectActionBar.php:44
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:309
+#: ../../../../modules/director/library/Director/Web/Form/CloneImportSourceForm.php:34
+#: ../../../../modules/director/library/Director/Web/Form/CloneSyncRuleForm.php:34
+msgid "Clone"
+msgstr "複製"
+
+#: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:79
+#, php-format
+msgid "Clone \"%s\""
+msgstr "\"%s\"を複製"
+
+#: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:51
+msgid "Clone Service Sets"
+msgstr "サービスセットを複製"
+
+#: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:42
+msgid "Clone Services"
+msgstr "サービスを複製"
+
+#: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:71
+msgid "Clone Template Fields"
+msgstr "テンプレートフィールドを複製"
+
+#: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:32
+msgid "Clone the object as is, preserving imports"
+msgstr "インポートを保持しながら、オブジェクトをそのまま複製する"
+
+#: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:62
+msgid "Clone this service to the very same or to another Service Set"
+msgstr "このサービスをまったく同じまたは別のサービスセットに複製します。"
+
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:167
+#, php-format
+msgid "Clone: %s"
+msgstr "複製: %s"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1104
+msgid "Cluster Zone"
+msgstr "クラスタゾーン"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ChoicesDashlet.php:17
+msgid ""
+"Combine multiple templates into meaningful Choices, making life easier for "
+"your users"
+msgstr "チョイスを利用することで、細分化されたテンプレートを、用途毎に"
+"まとめることができます。この機能を利用することで、ホストに複数のテンプレート"
+"を何度もインポートする手間を省くことができます。"
+
+#: ../../../../modules/director/application/forms/IcingaCommandForm.php:59
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:20
+#: ../../../../modules/director/library/Director/TranslationDummy.php:16
+msgid "Command"
+msgstr "コマンド"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:17
+msgid "Command Definitions"
+msgstr "コマンド定義"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/CommandTemplatesDashlet.php:19
+msgid "Command Templates"
+msgstr "コマンドテンプレート"
+
+#: ../../../../modules/director/application/controllers/CommandController.php:89
+#, php-format
+msgid "Command arguments: %s"
+msgstr "コマンド引数: %s"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:103
+msgid "Command endpoint"
+msgstr "コマンドエンドポイント"
+
+#: ../../../../modules/director/application/forms/IcingaCommandForm.php:48
+msgid "Command name"
+msgstr "コマンド名"
+
+#: ../../../../modules/director/application/forms/IcingaCommandForm.php:17
+msgid "Command type"
+msgstr "コマンドタイプ"
+
+#: ../../../../modules/director/configuration.php:126
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/CheckCommandsDashlet.php:19
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/CommandObjectDashlet.php:13
+#: ../../../../modules/director/library/Director/Web/Table/CustomvarVariantsTable.php:57
+msgid "Commands"
+msgstr "コマンド"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:336
+#, php-format
+msgid "Comparing %s \"%s\" from Snapshot \"%s\" to current config"
+msgstr "%s を\"%s\"と比較します。スナップショット\"%s\"から現在の設定との比較です。"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:84
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:93
+msgid "Condition (set_if)"
+msgstr "条件(set_if)"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:70
+msgid "Condition format"
+msgstr "条件フォーマット"
+
+#: ../../../../modules/director/application/controllers/ConfigController.php:255
+#: ../../../../modules/director/application/controllers/ConfigController.php:466
+#: ../../../../modules/director/application/controllers/JobController.php:101
+#: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:78
+#: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:60
+msgid "Config"
+msgstr "設定"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/DeploymentDashlet.php:18
+msgid "Config Deployment"
+msgstr "設定反映"
+
+#: ../../../../modules/director/application/controllers/ConfigController.php:441
+#: ../../../../modules/director/application/forms/DeployConfigForm.php:99
+#: ../../../../modules/director/application/forms/DeploymentLinkForm.php:149
+msgid "Config deployment failed"
+msgstr "設定反映に失敗しました。"
+
+#: ../../../../modules/director/application/controllers/ConfigController.php:341
+#: ../../../../modules/director/application/controllers/ConfigController.php:342
+msgid "Config diff"
+msgstr "設定差分"
+
+#: ../../../../modules/director/application/controllers/ConfigController.php:300
+#: ../../../../modules/director/application/controllers/ConfigController.php:402
+#, php-format
+msgid "Config file \"%s\""
+msgstr "設定ファイル \"%s\""
+
+#: ../../../../modules/director/application/controllers/ConfigController.php:421
+#: ../../../../modules/director/application/forms/DeployConfigForm.php:75
+#: ../../../../modules/director/application/forms/DeployConfigForm.php:94
+#: ../../../../modules/director/application/forms/DeploymentLinkForm.php:136
+msgid "Config has been submitted, validation is going on"
+msgstr "設定が送信され、検証が行われています。"
+
+#: ../../../../modules/director/library/Director/Web/ObjectPreview.php:40
+#, php-format
+msgid "Config preview: %s"
+msgstr "設定ファイルプレビュー: %s"
+
+#: ../../../../modules/director/library/Director/ProvidedHook/Monitoring/ServiceActions.php:54
+#: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:82
+msgid "Configuration"
+msgstr "設定"
+
+#: ../../../../modules/director/application/controllers/HostController.php:212
+msgid "Configuration (read-only)"
+msgstr "設定(読み込み専用)"
+
+#: ../../../../modules/director/application/controllers/BasketsController.php:32
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/BasketDashlet.php:11
+msgid "Configuration Baskets"
+msgstr "構成バスケット"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:89
+msgid "Configuration format"
+msgstr "設定フォーマット"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:332
+msgid "Configuration has been stored"
+msgstr "設定が保存されました"
+
+#: ../../../../modules/director/application/forms/AddToBasketForm.php:111
+#, php-format
+msgid "Configuration objects have been added to the chosen basket \"%s\""
+msgstr "選択したバスケット \"%s\" に構成オブジェクトが追加されました。"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:152
+msgid "Configure this Agent via Self Service API"
+msgstr "このエージェントをセルフサービスAPIで設定。"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:229
+msgid "Content Checksum"
+msgstr "コンテンツチェックサム"
+
+#: ../../../../modules/director/application/controllers/BasketsController.php:20
+msgid "Create"
+msgstr "作成"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:102
+msgid "Create Basket"
+msgstr "バスケットを作成"
+
+#: ../../../../modules/director/application/forms/BasketCreateSnapshotForm.php:23
+msgid "Create Snapshot"
+msgstr "スナップショットを作成"
+
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:252
+#, php-format
+msgid "Create a new %s Apply Rule"
+msgstr "新しい %s 適用ルールを作成"
+
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:293
+#, php-format
+msgid "Create a new %s Set"
+msgstr "新しい %s セットを作成"
+
+#: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:154
+#, php-format
+msgid "Create a new %s inheriting from this one"
+msgstr "これを継承して新しい%s を作成する"
+
+#: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:144
+#: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:164
+#, php-format
+msgid "Create a new %s inheriting from this template"
+msgstr "このテンプレートを継承して新しい %s を作成する"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:103
+msgid "Create a new Configuration Basket"
+msgstr "新しい構成バスケットを作成"
+
+#: ../../../../modules/director/library/Director/Web/ActionBar/TemplateActionBar.php:23
+msgid "Create a new Template"
+msgstr "新しいテンプレートを作成"
+
+#: ../../../../modules/director/library/Director/Web/ActionBar/ObjectsActionBar.php:20
+msgid "Create a new object"
+msgstr "新しいオブジェクトを作成"
+
+#: ../../../../modules/director/library/Director/Web/ActionBar/ChoicesActionBar.php:20
+msgid "Create a new template choice"
+msgstr "新しいテンプレートチョイスを作成"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:37
+msgid "Create database schema"
+msgstr "データベーススキーマを作成"
+
+#: ../../../../modules/director/application/forms/ApplyMigrationsForm.php:31
+msgid "Create schema"
+msgstr "スキーマの作成"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:228
+msgid "Created"
+msgstr "作成"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/StateFilterSet.php:26
+msgid "Critical"
+msgstr "Critical (危険)"
+
+#: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:183
+msgid "Current Template Usage"
+msgstr "現在のテンプレートの利用状況"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:51
+msgid "Custom Selection"
+msgstr "カスタム選択"
+
+#: ../../../../modules/director/application/controllers/CustomvarController.php:13
+msgid "Custom Variable"
+msgstr "カスタム変数"
+
+#: ../../../../modules/director/application/controllers/CustomvarController.php:14
+#, php-format
+msgid "Custom Variable variants: %s"
+msgstr "カスタム変数の亜種:%s"
+
+#: ../../../../modules/director/library/Director/Web/Tabs/DataTabs.php:27
+msgid "Custom Variables"
+msgstr "カスタム変数"
+
+#: ../../../../modules/director/application/controllers/DataController.php:76
+msgid "Custom Vars - Overview"
+msgstr "カスタム変数 - 概要"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:179
+msgid "Custom expression"
+msgstr "カスタム表現"
+
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:183
+#, php-format
+msgid "Custom fields: %s"
+msgstr "カスタムフィールド: %s"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:25
+msgid "Custom notification"
+msgstr "Custom (カスタム通知)"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:436
+#: ../../../../modules/director/library/Director/Web/Form/IcingaObjectFieldLoader.php:227
+msgid "Custom properties"
+msgstr "カスタムプロパティ"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:67
+msgid "Custom variable"
+msgstr "カスタム変数"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:306
+msgid "Custom variable (vars.)"
+msgstr "カスタム変数(vars)"
+
+#: ../../../../modules/director/application/controllers/SuggestController.php:231
+#: ../../../../modules/director/application/controllers/SuggestController.php:241
+#: ../../../../modules/director/library/Director/Objects/IcingaHost.php:157
+#: ../../../../modules/director/library/Director/Objects/IcingaService.php:710
+msgid "Custom variables"
+msgstr "カスタム変数"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/CustomvarDashlet.php:11
+msgid "CustomVar Overview"
+msgstr "カスタム変数概要"
+
+#: ../../../../modules/director/library/Director/Import/ImportSourceSql.php:40
+msgid "DB Query"
+msgstr "DB クエリ"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:245
+msgid "DB Resource"
+msgstr "DBリソース"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:15
+msgid "DN component"
+msgstr "DN コンポーネント"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierDnsRecords.php:25
+msgid "DNS record type"
+msgstr "DNSレコードタイプ"
+
+#: ../../../../modules/director/application/controllers/DataController.php:62
+msgid "Data Fields"
+msgstr "データフィールド"
+
+#: ../../../../modules/director/application/controllers/DataController.php:53
+msgid "Data List"
+msgstr "データリスト"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:19
+msgid "Data List Entry"
+msgstr "データリストエントリ"
+
+#: ../../../../modules/director/application/controllers/DataController.php:47
+#, php-format
+msgid "Data List: %s"
+msgstr "データリスト: %s"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:28
+msgid "Data Lists"
+msgstr "データリスト"
+
+#: ../../../../modules/director/library/Director/Web/Tabs/DataTabs.php:21
+msgid "Data fields"
+msgstr "データフィールド"
+
+#: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:131
+msgid ""
+"Data fields allow you to customize input controls for Icinga custom "
+"variables. Once you defined them here, you can provide them through your "
+"defined templates. This gives you a granular control over what properties "
+"your users should be allowed to configure in which way."
+msgstr "データフィールドを使用すると、カスタム変数に入力する値を"
+"カスタマイズできます。"
+"具体的にはタイプを数値に限定したり、データのリストを選択させるような入力を"
+"ユーザに強制することができるようになります。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/DatafieldDashlet.php:17
+msgid "Data fields make sure that configuration fits your rules"
+msgstr "データフィールドを使用すると、Icingaカスタム変数の入力制限をカスタマイズすることができます。これにより、設定がルールに従うことを確認できます"
+
+#: ../../../../modules/director/application/forms/DirectorDatalistForm.php:24
+msgid "Data list"
+msgstr "データリスト"
+
+#: ../../../../modules/director/application/controllers/DataController.php:20
+#: ../../../../modules/director/library/Director/Web/Tabs/DataTabs.php:24
+msgid "Data lists"
+msgstr "データリスト"
+
+#: ../../../../modules/director/application/forms/DirectorDatalistForm.php:15
+msgid ""
+"Data lists are mainly used as data providers for custom variables presented "
+"as dropdown boxes boxes. You can manually manage their entries here in "
+"place, but you could also create dedicated sync rules after creating a new "
+"empty list. This would allow you to keep your available choices in sync with "
+"external data providers"
+msgstr "データリストは、ドロップダウンボックスボックスとして表示される"
+"カスタム変数のデータプロバイダとして主に使用されます。 ここで手動で"
+"エントリを管理できますが、新しい空のリストを作成した後に専用の同期ルールを"
+"作成することもできます。 これにより、利用可能な選択肢を外部の"
+"データプロバイダと同期させることができます。"
+
+#: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:174
+msgid "Data type"
+msgstr "データタイプ"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:295
+msgid "Database backend"
+msgstr "データベースバックエンド"
+
+#: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:384
+msgid "Date"
+msgstr "日付"
+
+#: ../../../../modules/director/application/forms/IcingaTimePeriodRangeForm.php:21
+#: ../../../../modules/director/library/Director/Web/Table/IcingaTimePeriodRangeTable.php:45
+msgid "Day(s)"
+msgstr "日付・曜日"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:98
+msgid ""
+"Default configuration format. Please note that v1.x is for special "
+"transitional projects only and completely unsupported. There are no plans to "
+"make Director a first-class configuration backends for Icinga 1.x"
+msgstr "デフォルトの設定フォーマット。 バージョン 1.x は特別な移行プロジェクト"
+"専用で、完全にはサポートされていません。 Icinga 1.xでは、Directorを"
+"もっとも推奨する設定バックエンドにする計画はありません。"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:32
+msgid "Default global zone"
+msgstr "デフォルトのグローバルゾーン"
+
+#: ../../../../modules/director/library/Director/Dashboard/CommandsDashboard.php:23
+msgid ""
+"Define Check-, Notification- or Event-Commands. Command definitions are the "
+"glue between your Host- and Service-Checks and the Check plugins on your "
+"Monitoring (or monitored) systems"
+msgstr "監視、通知、またはイベントコマンドを定義します。 コマンド定義は、"
+"Host-CheckとService-Check、およびMonitoring(または監視対象)システムのCheckプラグインを結びつけます。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/DatafieldDashlet.php:11
+msgid "Define Data Fields"
+msgstr "データフィールドの定義"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/HostGroupsDashlet.php:17
+msgid ""
+"Define Host Groups to give your configuration more structure. They are "
+"useful for Dashboards, Notifications or Restrictions"
+msgstr "設定をより構造化するためにホストグループを定義します。ダッシュボード、"
+"通知、制限に活用できます。"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:103
+msgid ""
+"Define a download Url or local directory from which the a specific Icinga 2 "
+"Agent MSI Installer package should be fetched. Please ensure to only define "
+"the base download Url or Directory. The Module will generate the MSI file "
+"name based on your operating system architecture and the version to install. "
+"The Icinga 2 MSI Installer name is internally build as follows: Icinga2-"
+"v[InstallAgentVersion]-[OSArchitecture].msi (full example: Icinga2-v2.6.3-"
+"x86_64.msi)"
+msgstr "特定のIcinga 2 Agent MSIインストーラパッケージを取得するダウンロード"
+"URLまたはローカルディレクトリを定義します。 基本ダウンロードURLまたは"
+"ディレクトリのみを定義してください。 モジュールは、オペレーティングシステムの"
+"アーキテクチャとインストールするバージョンに基づいてMSIファイル名を生成"
+"します。 Icinga 2 MSIインストーラー名は、内部的に次のように構築されています。"
+"Icinga2-v [InstallAgentVersion] - [OSArchitecture] .msi"
+"(完全な例:Icinga2-v2.6.3-x86_64.msi)"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ImportSourceDashlet.php:29
+msgid "Define and manage imports from various data sources"
+msgstr "さまざまなデータソースからのインポートを定義および管理します"
+
+#: ../../../../modules/director/library/Director/Dashboard/TimeperiodsDashboard.php:14
+msgid "Define custom Time Periods"
+msgstr "カスタムスケジュールの定義"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/SyncDashlet.php:29
+msgid "Define how imported data should be synchronized with Icinga"
+msgstr "インポートしたデータをIcingaと同期させる方法を定義します"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:51
+msgid ""
+"Define what should happen when an object with a matching key already exists. "
+"You could merge its properties (import source wins), replace it completely "
+"with the imported object or ignore it (helpful for one-time imports)"
+msgstr "一致するキーを持つオブジェクトがすでに存在するときに何が起こるかを"
+"定義します。 プロパティはマージすることができ(インポート元が優先)、"
+"それをインポートされたオブジェクトと完全に置き換えるか、"
+"あるいは無視することができます(一回限りのインポートに役立ちます)"
+
+#: ../../../../modules/director/library/Director/Dashboard/ObjectsDashboard.php:17
+msgid "Define whatever you want to be monitored"
+msgstr "監視対象を定義"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1319
+msgid "Defines after how many check attempts a new hard state is reached"
+msgstr "異常(hard state)と判定するまでの監視の最大試行回数"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/UserGroupsDashlet.php:17
+msgid ""
+"Defining Notifications for User Groups instead of single Users gives more "
+"flexibility"
+msgstr "単一のユーザーではなくユーザーグループの通知を定義すると、"
+"柔軟性が向上します。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceGroupsDashlet.php:17
+msgid ""
+"Defining Service Groups get more structure. Great for Dashboards. "
+"Notifications and Permissions might be based on groups."
+msgstr "サービスグループを定義すると、より構造がわかります。 ダッシュボードに"
+"最適です。 通知と許可はグループに基づいている場合があります。"
+
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:196
+msgid "Delay unless the first notification should be sent"
+msgstr "最初の通知時間"
+
+#: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:185
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:869
+msgid "Delete"
+msgstr "削除"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierSplit.php:13
+msgid "Delimiter"
+msgstr "分割子"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:27
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/DependencyObjectDashlet.php:13
+msgid "Dependency"
+msgstr "依存関係オブジェクト"
+
+#: ../../../../modules/director/application/forms/DeploymentLinkForm.php:85
+msgid "Deploy"
+msgstr "設定反映"
+
+#: ../../../../modules/director/application/forms/DeployConfigForm.php:39
+#, php-format
+msgid "Deploy %d pending changes"
+msgstr "%d 個の保留された変更を反映"
+
+#: ../../../../modules/director/library/Director/Dashboard/DeploymentDashboard.php:15
+msgid "Deploy configuration to your Icinga nodes"
+msgstr "Icingaノードへの設定の反映"
+
+#: ../../../../modules/director/library/Director/Job/ConfigJob.php:195
+msgid "Deploy modified config"
+msgstr "変更された設定を反映"
+
+#: ../../../../modules/director/application/controllers/ConfigController.php:248
+#: ../../../../modules/director/application/controllers/ConfigController.php:458
+#: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:54
+msgid "Deployment"
+msgstr "設定反映"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:133
+msgid "Deployment Path"
+msgstr "反映パス"
+#smori
+
+#: ../../../../modules/director/application/controllers/DeploymentController.php:22
+msgid "Deployment details"
+msgstr "設定反映結果の詳細"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:118
+msgid "Deployment mode"
+msgstr "設定反映モード"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:127
+msgid "Deployment mode for Icinga 1 configuration"
+msgstr "Icinga1の設定反映モード"
+
+#: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:77
+msgid "Deployment time"
+msgstr "設定反映時刻"
+
+#: ../../../../modules/director/configuration.php:143
+#: ../../../../modules/director/application/controllers/ConfigController.php:50
+#: ../../../../modules/director/library/Director/Web/Tabs/InfraTabs.php:36
+msgid "Deployments"
+msgstr "設定反映"
+
+#: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:157
+#: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:125
+#: ../../../../modules/director/application/forms/IcingaServiceSetForm.php:100
+#: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:56
+#: ../../../../modules/director/application/forms/ImportRowModifierForm.php:54
+#: ../../../../modules/director/application/forms/ImportSourceForm.php:24
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:33
+msgid "Description"
+msgstr "説明"
+
+#: ../../../../modules/director/library/Director/Web/Table/SyncpropertyTable.php:63
+msgid "Destination"
+msgstr "宛先"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:48
+msgid "Destination Field"
+msgstr "宛先フィールド"
+
+#: ../../../../modules/director/application/controllers/HealthController.php:31
+msgid ""
+"Did you know that you can run this entire Health Check (or just some "
+"sections) as an Icinga Check on a regular base?"
+msgstr "この設定状況の確認を定期的にIcingaの監視として実行できます"
+
+#: ../../../../modules/director/application/controllers/ConfigController.php:403
+#: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:249
+msgid "Diff"
+msgstr "差分"
+
+#: ../../../../modules/director/library/Director/Web/Widget/DeployedConfigInfoHeader.php:74
+msgid "Diff with other config"
+msgstr "ほかの設定との差分"
+
+#: ../../../../modules/director/library/Director/Web/Table/TemplateUsageTable.php:55
+msgid "Direct"
+msgstr "直接"
+
+#: ../../../../modules/director/application/controllers/HealthController.php:23
+msgid "Director Health"
+msgstr "Director 正常性"
+
+#: ../../../../modules/director/application/controllers/KickstartController.php:13
+msgid "Director Kickstart Wizard"
+msgstr "Director キックスタートウィザード"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/SettingsDashlet.php:11
+msgid "Director Settings"
+msgstr "director設定"
+
+#: ../../../../modules/director/library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:79
+msgid "Director database schema has not been created yet"
+msgstr "Director データベーススキーマがまだ作成されていません"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:156
+msgid "Disable Checks"
+msgstr "監視を無効化"
+# smori
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:164
+msgid "Disable Notificiations"
+msgstr "通知を無効化"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:54
+msgid "Disable all Jobs"
+msgstr "すべてのジョブを無効化"
+
+#: ../../../../modules/director/application/forms/DirectorJobForm.php:37
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1222
+msgid "Disabled"
+msgstr "無効"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1223
+msgid "Disabled objects will not be deployed"
+msgstr "無効化されたオブジェクトは設定の反映がされません。"
+
+#: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:20
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1238
+msgid "Display Name"
+msgstr "表示名"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:333
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:133
+msgid "Display name"
+msgstr "表示名"
+
+#: ../../../../modules/director/library/Director/Web/Table/CustomvarTable.php:42
+msgid "Distinct Commands"
+msgstr "個別のコマンド"
+
+#: ../../../../modules/director/library/Director/Dashboard/DataDashboard.php:15
+msgid "Do more with custom data"
+msgstr "カスタムデータで高度に設定"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:36
+msgid "Do not transform at all"
+msgstr "全く変換しない"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:104
+#: ../../../../modules/director/library/Director/Web/SelfService.php:157
+msgid "Documentation"
+msgstr "ドキュメント"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/StateFilterSet.php:21
+msgid "Down"
+msgstr "Down (停止)"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:212
+#: ../../../../modules/director/application/controllers/SchemaController.php:80
+#: ../../../../modules/director/library/Director/Web/SelfService.php:227
+#: ../../../../modules/director/library/Director/Web/SelfService.php:240
+msgid "Download"
+msgstr "ダウンロード"
+
+#: ../../../../modules/director/library/Director/Web/Widget/AdditionalTableActions.php:59
+msgid "Download as JSON"
+msgstr "JSON形式でダウンロード"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:70
+msgid "Download from a custom url"
+msgstr "カスタムURLからダウンロード"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:69
+msgid "Download from packages.icinga.com"
+msgstr "packages.icinga.com からダウンロード"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:30
+msgid "Downtime ends"
+msgstr "DowntimeEnd (ダウンタイムの終了)"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:31
+msgid "Downtime removed"
+msgstr "DowntimeRemoved (ダウンタイムの削除)"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:29
+msgid "Downtime starts"
+msgstr "DowntimeStart (ダウンタイムの開始)"
+
+#: ../../../../modules/director/application/forms/IcingaForgetApiKeyForm.php:22
+msgid "Drop Self Service API key"
+msgstr "セルフサービスAPIキーを削除"
+
+#: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:83
+#: ../../../../modules/director/library/Director/Web/Widget/SyncRunDetails.php:26
+msgid "Duration"
+msgstr "継続"
+
+#: ../../../../modules/director/application/controllers/DatafieldController.php:38
+msgid "Edit a Field"
+msgstr "フィールドを編集"
+
+#: ../../../../modules/director/application/controllers/DataController.php:151
+msgid "Edit list"
+msgstr "リストを編集"
+
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:36
+msgid "Email"
+msgstr "Eメール"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:69
+msgid "Enable audit log"
+msgstr "audit ログを有効にする"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1372
+msgid "Enable event handler"
+msgstr "イベントハンドラを有効にする"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1384
+msgid "Enable flap detection"
+msgstr "フラップ検知を有効にする"
+
+#: ../../../../modules/director/application/forms/IcingaEndpointForm.php:24
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:22
+#: ../../../../modules/director/library/Director/Web/Table/ObjectsTableEndpoint.php:19
+msgid "Endpoint"
+msgstr "エンドポイント"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:117
+msgid "Endpoint Name"
+msgstr "エンドポイント名"
+
+#: ../../../../modules/director/application/forms/IcingaEndpointForm.php:31
+msgid "Endpoint address"
+msgstr "エンドポイントアドレス"
+
+#: ../../../../modules/director/application/forms/IcingaEndpointForm.php:18
+msgid "Endpoint template name"
+msgstr "エンドポイントテンプレート名"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/EndpointObjectDashlet.php:17
+#: ../../../../modules/director/library/Director/Import/ImportSourceCoreApi.php:59
+msgid "Endpoints"
+msgstr "エンドポイント"
+
+#: ../../../../modules/director/application/controllers/PhperrorController.php:12
+msgid "Error"
+msgstr "エラー"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:86
+msgid "Establish connection"
+msgstr "親ノードからの接続"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:608
+msgid ""
+"Evaluates the apply for rule for all objects with the custom attribute "
+"specified. E.g selecting \"host.vars.custom_attr\" will generate \"for "
+"(config in host.vars.array_var)\" where \"config\" will be accessible "
+"through \"$config$\". NOTE: only custom variables of type \"Array\" are "
+"eligible."
+msgstr "カスタム属性が指定されているすべてのオブジェクトのルール適用を"
+"評価します。 例えば\"host.vars.custom_attr\"を選択すると "
+"\"for(config.host.vars.array_var)\"が生成されます。ここで "
+"\"config\"は \"$config$\"を通してアクセス可能です。 "
+"注:タイプ \"配列\"のカスタム変数のみが対象です。"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1276
+msgid "Event command"
+msgstr "イベントコマンド"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1277
+msgid "Event command definition"
+msgstr "イベントコマンドの定義"
+
+#: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:70
+msgid "Exclude other time periods from this."
+msgstr "指定したスケジュール設定の期間を除外します。"
+
+#: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:67
+msgid "Exclude period"
+msgstr "除外スケジュールのインクルード"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1354
+msgid "Execute active checks"
+msgstr "アクティブ監視を実行する"
+
+#: ../../../../modules/director/application/forms/DirectorJobForm.php:48
+msgid "Execution interval for this job, in seconds"
+msgstr "このジョブの実行間隔。秒単位"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:249
+msgid "Existing Data Lists"
+msgstr "存在するデータリスト"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:234
+msgid "Existing templates"
+msgstr "存在するテンプレート"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:178
+msgid "Expert mode"
+msgstr "エキスパートモード"
+
+#: ../../../../modules/director/library/Director/Web/Tabs/ObjectsTabs.php:33
+msgid "External"
+msgstr "外部"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ExternalCheckCommandsDashlet.php:19
+msgid "External Commands"
+msgstr "外部コマンド"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ExternalCheckCommandsDashlet.php:12
+msgid ""
+"External Commands have been defined in your local Icinga 2 Configuration."
+msgstr "外部コマンドはローカルのIcinga 2 設定にて定義されています。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ExternalNotificationCommandsDashlet.php:19
+msgid "External Notification Commands"
+msgstr "外部通知コマンド"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/CommandTemplatesDashlet.php:12
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ExternalNotificationCommandsDashlet.php:12
+msgid ""
+"External Notification Commands have been defined in your local Icinga 2 "
+"Configuration. "
+msgstr "外部通知コマンドはローカルのIcinga 2 設定にて定義されています。"
+
+#: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:141
+msgid "Failed"
+msgstr "失敗"
+
+#: ../../../../modules/director/application/forms/IcingaImportObjectForm.php:42
+#, php-format
+msgid "Failed to import %s \"%s\""
+msgstr "%s の \"%s\"へのインポートが失敗しました。"
+
+#: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:188
+msgid "Field has been removed"
+msgstr "フィールドが削除されました"
+
+#: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:139
+#: ../../../../modules/director/library/Director/Web/Table/DatafieldTable.php:48
+#: ../../../../modules/director/library/Director/Web/Table/IcingaObjectDatafieldTable.php:50
+msgid "Field name"
+msgstr "フィールド名"
+
+#: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:175
+msgid "Field type"
+msgstr "フィールドタイプ"
+
+#: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:103
+msgid "Fields"
+msgstr "フィールド"
+
+#: ../../../../modules/director/library/Director/Web/Table/ConfigFileDiffTable.php:82
+#: ../../../../modules/director/library/Director/Web/Table/GeneratedConfigFileTable.php:84
+msgid "File"
+msgstr "ファイル"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:102
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:79
+msgid "Filter Expression"
+msgstr "フィルタ表現"
+
+#: ../../../../modules/director/configuration.php:52
+msgid "Filter available notification apply rules"
+msgstr "利用可能な通知適用ルールをフィルタリング"
+
+#: ../../../../modules/director/configuration.php:45
+msgid "Filter available service apply rules"
+msgstr "利用可能なサービス適用ルールをフィルタリング"
+
+#: ../../../../modules/director/configuration.php:59
+msgid ""
+"Filter available service set templates. Use asterisks (*) as wildcards, like "
+"in DB* or *net*"
+msgstr "利用可能なサービスセットテンプレートをフィルタリング。"
+"「DB*」、「*net*」のように、アスタリスク(*)をワイルドカードとして使う。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:29
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:27
+msgid "Filter method"
+msgstr "フィルタメソッド"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:33
+msgid "First Element"
+msgstr "第一要素"
+
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:194
+msgid "First notification delay"
+msgstr "最初の通知の遅延"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:33
+msgid "Flapping"
+msgstr "フラッピング"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:35
+msgid "Flapping ends"
+msgstr "FlappingEnd (フラッピング終了)"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1405
+msgid ""
+"Flapping lower bound in percent for a service to be considered not flapping"
+msgstr "サービスをフラッピング状態とみなすための下限値(%単位)"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:34
+msgid "Flapping starts"
+msgstr "FlappingStart (フラッピング開始)"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1392
+msgid "Flapping threshold (high)"
+msgstr "フラッピング閾値(上限)"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1403
+msgid "Flapping threshold (low)"
+msgstr "フラッピング閾値(下限)"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1394
+msgid "Flapping upper bound in percent for a service to be considered flapping"
+msgstr "サービスをフラッピング状態とみなすための上限値(%単位)"
+
+#: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:33
+msgid "Flatten all inherited properties, strip imports"
+msgstr "継承されたすべてのプロパティを統合し、インポートを削除します"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:87
+msgid "Flush API directory"
+msgstr "APIディレクトリをフラッシュする"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:223
+msgid "For manual configuration"
+msgstr "手動設定用"
+
+#: ../../../../modules/director/library/Director/Job/ConfigJob.php:181
+msgid "Force rendering"
+msgstr "強制的に設定を生成する"
+
+#: ../../../../modules/director/library/Director/Objects/DirectorDatafield.php:160
+#, php-format
+msgid "Form element could not be created, %s is missing"
+msgstr "フォーム要素が作成できません。%s がありません"
+
+#: ../../../../modules/director/library/Director/Web/Form/QuickForm.php:456
+#: ../../../../modules/director/library/Director/Web/Form/QuickForm.php:481
+msgid "Form has successfully been sent"
+msgstr "フォームは正常に送信されました"
+
+#: ../../../../modules/director/application/forms/IcingaHostVarForm.php:32
+#: ../../../../modules/director/application/forms/IcingaServiceVarForm.php:32
+msgid "Format"
+msgstr "フォーマット"
+
+#: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:269
+msgid "Former object"
+msgstr "以前のオブジェクト"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:24
+msgid "Fully qualified domain name (FQDN)"
+msgstr "完全修飾ドメイン名(FQDN)"
+
+#: ../../../../modules/director/application/forms/IcingaGenerateApiKeyForm.php:24
+msgid "Generate Self Service API key"
+msgstr "セルフサービスAPIキーを生成"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:121
+msgid "Generate a new key"
+msgstr "新しい鍵を生成"
+
+#: ../../../../modules/director/application/controllers/ConfigController.php:259
+msgid "Generated config"
+msgstr "設定を生成しました"
+
+#: ../../../../modules/director/application/controllers/HostController.php:149
+#: ../../../../modules/director/application/controllers/HostController.php:229
+msgid "Generated from host vars"
+msgstr "ホスト変数から生成しました"
+
+#: ../../../../modules/director/library/Director/Dashboard/AlertsDashboard.php:15
+msgid "Get alerts when something goes wrong"
+msgstr "障害発生時のアラート通知"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/CustomvarDashlet.php:17
+msgid "Get an overview of used CustomVars and their variants"
+msgstr "使用されているカスタム変数とその状況の概要です"
+
+#: ../../../../modules/director/application/controllers/ConfigController.php:219
+msgid "Global Director Settings"
+msgstr "グローバルDirector設定"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:97
+msgid "Global Self Service Setting"
+msgstr "グローバルセルフサービス設定"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:44
+msgid "Global Zones"
+msgstr "グローバルゾーン"
+
+#: ../../../../modules/director/application/forms/IcingaZoneForm.php:22
+msgid "Global zone"
+msgstr "グローバルゾーン"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierJoin.php:13
+msgid "Glue"
+msgstr "接着剤"
+
+#: ../../../../modules/director/library/Director/Web/ActionBar/DirectorBaseActionBar.php:40
+#, php-format
+msgid "Go back to \"%s\" Dashboard"
+msgstr "\"%s\" ダッシュボードに戻る"
+
+#: ../../../../modules/director/library/Director/Job/ConfigJob.php:207
+msgid "Grace period"
+msgstr "猶予期間"
+
+#: ../../../../modules/director/library/Director/Web/Table/GroupMemberTable.php:59
+msgid "Group"
+msgstr "グループ"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:233
+msgid ""
+"Group has been inherited, but will be overridden by locally assigned group(s)"
+msgstr "グループは継承されましたが、ローカルに割り当てられたグループによって上書きされます"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:316
+msgid "Group membership"
+msgstr "グループのメンバーシップ"
+
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:257
+#, php-format
+msgid "Group membership: %s"
+msgstr "グループのメンバーシップ: %s"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceSetsDashlet.php:17
+msgid ""
+"Grouping your Services into Sets allow you to quickly assign services often "
+"used together in a single operation all at once"
+msgstr "サービスをセットにグループ化すると、一度に1つの操作で一緒に使用される"
+"ことが多いサービスを一度に素早く割り当てることができます。"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:203
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:630
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:109
+#: ../../../../modules/director/library/Director/Web/Tabs/ObjectsTabs.php:60
+msgid "Groups"
+msgstr "グループ"
+
+#: ../../../../modules/director/application/controllers/DashboardController.php:51
+#: ../../../../modules/director/application/controllers/HealthController.php:19
+msgid "Health"
+msgstr "director の設定状況"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/SingleServicesDashlet.php:17
+msgid "Here you can find all single services directly attached to single hosts"
+msgstr "単一のホストに直接接続されているすべての単一のサービスを"
+"見つけることができます。"
+
+#: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:81
+msgid "Hidden"
+msgstr "隠されています"
+
+#: ../../../../modules/director/library/Director/Web/Widget/AdditionalTableActions.php:70
+msgid "Hide SQL"
+msgstr "SQLを隠す"
+
+#: ../../../../modules/director/application/controllers/HealthController.php:29
+msgid "Hint: Check Plugin"
+msgstr "ヒント:監視プラグイン"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:154
+msgid "Hints regarding this service"
+msgstr "このサービスに関するヒント"
+
+#: ../../../../modules/director/library/Director/Web/Tabs/ImportsourceTabs.php:45
+#: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:95
+#: ../../../../modules/director/library/Director/Web/Tabs/SyncRuleTabs.php:39
+msgid "History"
+msgstr "履歴"
+
+#: ../../../../modules/director/application/controllers/ServiceController.php:53
+#: ../../../../modules/director/application/forms/IcingaHostVarForm.php:15
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:578
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:12
+#: ../../../../modules/director/library/Director/TranslationDummy.php:13
+#: ../../../../modules/director/library/Director/Web/Table/ObjectsTableEndpoint.php:20
+msgid "Host"
+msgstr "ホスト"
+
+#: ../../../../modules/director/application/controllers/SuggestController.php:240
+#: ../../../../modules/director/library/Director/Objects/IcingaService.php:723
+msgid "Host Custom variables"
+msgstr "ホストカスタム変数"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:18
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:13
+msgid "Host Group"
+msgstr "ホストグループ"
+
+msgid "HostGroup"
+msgstr "ホストグループ"
+
+msgid "HostGroups"
+msgstr "ホストグループ"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/HostGroupsDashlet.php:11
+msgid "Host Groups"
+msgstr "ホストグループ"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:19
+msgid "Host Name"
+msgstr "ホスト名"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:157
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:174
+msgid "Host Template"
+msgstr "ホストテンプレート"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:19
+msgid "Host Template Choice"
+msgstr "ホストテンプレートチョイス"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:20
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/HostTemplatesDashlet.php:11
+msgid "Host Templates"
+msgstr "ホストテンプレート"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:308
+#: ../../../../modules/director/application/forms/IcingaHostSelfServiceForm.php:35
+msgid "Host address"
+msgstr "ホストアドレス"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:310
+#: ../../../../modules/director/application/forms/IcingaHostSelfServiceForm.php:37
+msgid ""
+"Host address. Usually an IPv4 address, but may be any kind of address your "
+"check plugin is able to deal with"
+msgstr "ホストアドレス。 通常はIPv4アドレスですが、監視プラグインが扱う全てのアドレスを利用できます。"
+
+#: ../../../../modules/director/configuration.php:64
+msgid "Host configs"
+msgstr "ホスト設定"
+
+#: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:55
+msgid "Host groups"
+msgstr "ホストグループ"
+
+#: ../../../../modules/director/application/forms/IcingaHostSelfServiceForm.php:25
+msgid "Host name"
+msgstr "ホスト名"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:25
+msgid "Host name (local part, without domain)"
+msgstr "ホスト名(ドメインなしのローカルパート)"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/HostObjectDashlet.php:13
+msgid "Host objects"
+msgstr "ホストオブジェクト"
+
+#: ../../../../modules/director/application/controllers/SuggestController.php:230
+#: ../../../../modules/director/application/controllers/SuggestController.php:239
+#: ../../../../modules/director/library/Director/Objects/IcingaHost.php:156
+#: ../../../../modules/director/library/Director/Objects/IcingaService.php:722
+msgid "Host properties"
+msgstr "ホストプロパティ"
+
+#: ../../../../modules/director/application/controllers/TemplatechoiceController.php:17
+msgid "Host template choice"
+msgstr "ホストテンプレートの選択"
+
+#: ../../../../modules/director/application/controllers/TemplatechoicesController.php:19
+msgid "Host template choices"
+msgstr "ホストテンプレートの選択"
+
+#: ../../../../modules/director/application/forms/IcingaHostGroupForm.php:14
+msgid "Hostgroup"
+msgstr "ホストグループ"
+
+#: ../../../../modules/director/library/Director/Import/ImportSourceCoreApi.php:61
+msgid "Hostgroups"
+msgstr "ホストグループ"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:206
+msgid ""
+"Hostgroups that should be directly assigned to this node. Hostgroups can be "
+"useful for various reasons. You might assign service checks based on "
+"assigned hostgroup. They are also often used as an instrument to enforce "
+"restricted views in Icinga Web 2. Hostgroups can be directly assigned to "
+"single hosts or to host templates. You might also want to consider assigning "
+"hostgroups using apply rules"
+msgstr "このノードに直接割り当てる必要があるホストグループ。 "
+"ホストグループはさまざまな理由で役に立ちます。 割り当てられた"
+"ホストグループに基づいてサービス監視を割り当てることができます。"
+" それらは、Icinga Web 2で制限付きビューを強制する手段としてもよく"
+"使用されます。ホストグループは、単一のホストまたはホストテンプレートに"
+"直接割り当てることができます。 適用ルールを使用してホストグループを"
+"割り当てることもできます。"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:39
+#: ../../../../modules/director/library/Director/Web/Table/IcingaServiceSetHostTable.php:38
+msgid "Hostname"
+msgstr "ホスト名"
+
+#: ../../../../modules/director/configuration.php:118
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:99
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:89
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:688
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/HostsDashlet.php:11
+#: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:54
+#: ../../../../modules/director/library/Director/IcingaConfig/StateFilterSet.php:19
+#: ../../../../modules/director/library/Director/Import/ImportSourceCoreApi.php:60
+#: ../../../../modules/director/library/Director/Web/Table/CustomvarTable.php:43
+#: ../../../../modules/director/library/Director/Web/Table/CustomvarVariantsTable.php:58
+msgid "Hosts"
+msgstr "ホスト"
+
+#: ../../../../modules/director/application/controllers/ServicesetController.php:81
+#, php-format
+msgid "Hosts using this set: %s"
+msgstr "このセットを利用しているホスト: %s"
+
+#: ../../../../modules/director/application/forms/IcingaEndpointForm.php:32
+msgid "IP address / hostname of remote node"
+msgstr "リモートノードのIP アドレス / ホスト名"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:129
+msgid ""
+"IP address / hostname of your Icinga node. Please note that this information "
+"will only be used for the very first connection to your Icinga instance. The "
+"Director then relies on a correctly configured Endpoint object. Correctly "
+"configures means that either it's name is resolvable or that it's host "
+"property contains either an IP address or a resolvable host name. Your "
+"Director must be able to reach this endpoint"
+msgstr "IcingaノードのIPアドレス/ホスト名。 この情報は、"
+"Icingaインスタンスへの最初の接続にのみ使用されることに注意してください。"
+"その後、directorは正しく設定されたエンドポイントオブジェクトに依存します。"
+"正しく構成されているということは、その名前が解決可能であるか、または"
+"ホストプロパティにIPアドレスまたは解決可能なホスト名が含まれていることを"
+"意味します。 directorはこのエンドポイントに到達できなければなりません"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:316
+#: ../../../../modules/director/application/forms/IcingaHostSelfServiceForm.php:43
+msgid "IPv6 address"
+msgstr "IPv6 アドレス"
+
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:282
+#, php-format
+msgid "Icinga %s Sets"
+msgstr "Icinga %s セット"
+
+#: ../../../../modules/director/application/controllers/InspectController.php:39
+#, php-format
+msgid "Icinga 2 - Objects: %s"
+msgstr "Icinga 2 API - オブジェクト: %s"
+
+#: ../../../../modules/director/application/controllers/InspectController.php:152
+msgid "Icinga 2 API - Status"
+msgstr "Icinga 2 API - ステータス"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:192
+msgid "Icinga 2 Client documentation"
+msgstr "Icinga 2 Client のドキュメント"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:135
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:678
+msgid "Icinga Agent and zone settings"
+msgstr "Icingaエージェントとゾーンの設定"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ApiUserObjectDashlet.php:13
+msgid "Icinga Api users"
+msgstr "Icinga APIユーザ"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:34
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:73
+msgid "Icinga DSL"
+msgstr "Icinga DSL"
+
+#: ../../../../modules/director/configuration.php:83
+msgid "Icinga Director"
+msgstr "Icinga director"
+
+#: ../../../../modules/director/application/controllers/DashboardController.php:35
+msgid "Icinga Director - Main Dashboard"
+msgstr "Icinga Director - メインダッシュボード"
+
+#: ../../../../modules/director/library/Director/Dashboard/DirectorDashboard.php:15
+msgid "Icinga Director Configuration"
+msgstr "Icinga directorの設定"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:35
+msgid ""
+"Icinga Director decides to deploy objects like CheckCommands to a global "
+"zone. This defaults to \"director-global\" but might be adjusted to a custom "
+"Zone name"
+msgstr "Icinga Directorは、監視コマンドなどのオブジェクト設定をグローバル"
+"ゾーンに反映するようにしました。 デフォルトでは「director-global」です。"
+"任意のゾーン名が指定されている場合は、そのゾーンに反映されます。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/SelfServiceDashlet.php:17
+msgid ""
+"Icinga Director offers a Self Service API, allowing new Icinga nodes to "
+"register themselves"
+msgstr "Icinga directorはセルフサービスAPIを提供し、新しいIcingaノードが"
+"自分自身を登録できるようにします。"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:127
+msgid "Icinga Host"
+msgstr "Icinga ホスト"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/InfrastructureDashlet.php:11
+msgid "Icinga Infrastructure"
+msgstr "Icinga インフラストラクチャ"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:43
+msgid "Icinga Package Name"
+msgstr "Icingaパッケージ名"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1106
+msgid ""
+"Icinga cluster zone. Allows to manually override Directors decisions of "
+"where to deploy your config to. You should consider not doing so unless you "
+"gained deep understanding of how an Icinga Cluster stack works"
+msgstr "設定を反映するクラスタゾーンを設定します。Icingaクラスタが"
+"どのように機能しているか理解していない場合は、設定しないでください。"
+
+#: ../../../../modules/director/application/forms/IcingaHostGroupForm.php:16
+msgid "Icinga object name for this host group"
+msgstr "このホストグループのIcingaオブジェクト名"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:46
+msgid ""
+"Icinga object name for this host. This is usually a fully qualified host "
+"name but it could basically be any kind of string. To make things easier for "
+"your users we strongly suggest to use meaningful names for templates. E.g. "
+"\"generic-host\" is ugly, \"Standard Linux Server\" is easier to understand"
+msgstr "このホストのIcingaオブジェクト名。これは通常完全修飾ホスト名ですが、"
+"基本的にはあらゆる種類の文字列にすることができます。 ユーザーの作業を"
+"容易にするために、テンプレートにはわかりやすい名前を使用することを"
+"強くお勧めします。 例えば、\"generic-host\"はわかりにくいですが、"
+"\"Standard Linux Server\"は理解しやすいです"
+
+#: ../../../../modules/director/application/forms/IcingaServiceGroupForm.php:16
+msgid "Icinga object name for this service group"
+msgstr "このサービスグループのIcingaオブジェクト名"
+
+#: ../../../../modules/director/application/forms/IcingaUserGroupForm.php:19
+msgid "Icinga object name for this user group"
+msgstr "このユーザグループのIcingaオブジェクト名"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:94
+msgid "Icinga v1.x"
+msgstr "Icinga v1.x"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:93
+msgid "Icinga v2.x"
+msgstr "Icinga v2.x"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:77
+msgid "Icinga2 Agent"
+msgstr "Icinga2 エージェント"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1482
+msgid "Icon image"
+msgstr "アイコン画像"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1491
+msgid "Icon image alt"
+msgstr "アイコン画像の代替テキスト"
+
+#: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:74
+msgid "Id"
+msgstr "ID"
+
+#: ../../../../modules/director/application/forms/IcingaCommandForm.php:53
+msgid "Identifier for the Icinga command you are going to create"
+msgstr "作成しようとしているIcingaコマンドのID"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:49
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:60
+msgid "Ignore"
+msgstr "無視"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:172
+msgid "Ignore Soft States"
+msgstr "一時的な異常(soft state)を無視"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:29
+msgid "Import Sources"
+msgstr "インポートソース"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ImportSourceDashlet.php:14
+msgid "Import data sources"
+msgstr "データソースのインポート"
+
+#: ../../../../modules/director/application/forms/IcingaImportObjectForm.php:26
+#, php-format
+msgid "Import external \"%s\""
+msgstr "外部\"%s\"をインポート"
+
+#: ../../../../modules/director/application/controllers/ImportrunController.php:14
+#: ../../../../modules/director/application/controllers/ImportrunController.php:15
+msgid "Import run"
+msgstr "処理をインポート"
+
+#: ../../../../modules/director/application/controllers/ImportsourceController.php:183
+#, php-format
+msgid "Import run history: %s"
+msgstr "実行履歴をインポート: %s "
+
+#: ../../../../modules/director/application/controllers/ImportsourcesController.php:46
+#: ../../../../modules/director/library/Director/Job/ImportJob.php:80
+#: ../../../../modules/director/library/Director/Web/Tabs/ImportTabs.php:20
+#: ../../../../modules/director/library/Director/Web/Tabs/ImportsourceTabs.php:37
+msgid "Import source"
+msgstr "インポートソース"
+
+#: ../../../../modules/director/application/forms/ImportSourceForm.php:15
+msgid "Import source name"
+msgstr "インポートソース名"
+
+#: ../../../../modules/director/application/controllers/ImportsourceController.php:138
+#, php-format
+msgid "Import source preview: %s"
+msgstr "インポートソースのプレビュー: %s"
+
+#: ../../../../modules/director/application/controllers/ImportsourceController.php:81
+#: ../../../../modules/director/application/controllers/ImportsourceController.php:109
+#, php-format
+msgid "Import source: %s"
+msgstr "インポートソース: %s"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1196
+msgid ""
+"Importable templates, add as many as you want. Please note that order "
+"matters when importing properties from multiple templates: last one wins"
+msgstr "必要なテンプレートを追加してください。複数のテンプレートを"
+"インポートする場合、最後にインポートされたテンプレートのプロパティが"
+"優先されます。"
+
+#: ../../../../modules/director/application/forms/ImportRunForm.php:33
+msgid "Imported new data from this Import Source"
+msgstr "このインポートソースからインポートされた新しいデータ"
+
+#: ../../../../modules/director/library/Director/Web/Table/ImportrunTable.php:32
+msgid "Imported rows"
+msgstr "インポートされた行"
+
+#: ../../../../modules/director/application/forms/IcingaImportObjectForm.php:16
+msgid ""
+"Importing an object means that its type will change from \"external\" to "
+"\"object\". That way it will make part of the next deployment. So in case "
+"you imported this object from your Icinga node make sure to remove it from "
+"your local configuration before issueing the next deployment. In case of a "
+"conflict nothing bad will happen, just your config won't deploy."
+msgstr "オブジェクトをインポートすると、そのタイプは「外部」から"
+"「オブジェクト」に変わります。 それは次の設定反映の対象になります。そのため、"
+"Icingaノードからこのオブジェクトをインポートした場合は、次の設定反映を行う前に"
+"必ずローカル設定から削除してください。設定の衝突が発生した場合、ほかへの"
+"悪影響はありませんが、衝突した設定が反映されません。"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1194
+msgid "Imports"
+msgstr "インポート"
+
+#: ../../../../modules/director/application/controllers/SelfServiceController.php:104
+msgid ""
+"In case an Icinga Admin provided you with a self service API token, this is "
+"where you can register new hosts"
+msgstr "Icinga管理者からセルフサービスAPIトークンが提供された場合は、"
+"ここで新しいホストを登録できます。"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:176
+msgid ""
+"In case the Icinga 2 Agent is already installed on the system, this "
+"parameter will allow you to configure if you wish to upgrade / downgrade to "
+"a specified version with the as well."
+msgstr "Icinga 2 Agent がすでにシステムにインストールされている場合は、"
+"このパラメータを使用して指定したバージョンにアップグレードまたは"
+"ダウングレードするかも設定できます。"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:143
+msgid ""
+"In case the Icinga 2 Agent should be automatically installed, this has to be "
+"a string value like: 2.6.3"
+msgstr "Icinga 2 Agent を自動的にインストールする必要がある場合、そのバージョ"
+"ンを指定します。これは「2.6.3」のような文字列値にする必要があります"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:89
+msgid ""
+"In case the Icinga Agent will accept configuration from the parent Icinga 2 "
+"system, it will possibly write data to /var/lib/icinga2/api/*. By setting "
+"this parameter to true, all content inside the api directory will be flushed "
+"before an eventual restart of the Icinga 2 Agent"
+msgstr "Icinga Agentが親のIcinga 2システムから設定を受け入れる場合、おそらく"
+" /var/lib/icinga2/api/* にデータを書き込みます。 このパラメータを「はい」"
+"に設定すると、apiディレクトリ内のすべてのコンテンツは、最終的に"
+"Icinga 2 Agentを再起動する前にフラッシュされます。"
+
+#: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:62
+msgid "Include other time periods into this."
+msgstr "選択した他のスケジュール設定を適用します"
+
+#: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:59
+msgid "Include period"
+msgstr "スケジュールのインクルード"
+
+#: ../../../../modules/director/library/Director/Web/Table/TemplateUsageTable.php:56
+msgid "Indirect"
+msgstr "間接"
+
+#: ../../../../modules/director/application/controllers/HostController.php:140
+#: ../../../../modules/director/application/controllers/HostController.php:218
+msgid "Individual Service objects"
+msgstr "個々のサービスオブジェクト"
+
+#: ../../../../modules/director/library/Director/Web/Tabs/InfraTabs.php:43
+msgid "Infrastructure"
+msgstr "インフラストラクチャ"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:310
+msgid "Inheritance (import)"
+msgstr "継承(インポート)"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:240
+msgid "Inherited groups"
+msgstr "継承されたグループ"
+
+#: ../../../../modules/director/application/controllers/HostController.php:386
+#, php-format
+msgid "Inherited service: %s"
+msgstr "継承されたサービス: %s"
+
+#: ../../../../modules/director/application/controllers/HostController.php:537
+#: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:132
+msgid "Inspect"
+msgstr "検査"
+
+#: ../../../../modules/director/application/controllers/InspectController.php:65
+msgid "Inspect - object list"
+msgstr "検査 - オブジェクトリスト"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:189
+msgid "Install NSClient++"
+msgstr "NSClient++ をインストール"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:59
+msgid "Installation Source"
+msgstr "インストールソース"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:152
+msgid "Installer Hashes"
+msgstr "インストーラのハッシュ"
+
+#: ../../../../modules/director/application/forms/IcingaCommandForm.php:25
+msgid "Internal commands"
+msgstr "内部コマンド"
+
+#: ../../../../modules/director/application/controllers/SyncruleController.php:97
+#, php-format
+msgid "It has been renamed since then, its former name was %s"
+msgstr "名前が変更されました(以前の名前: %s)"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:68
+msgid ""
+"It is not a good idea to do so as long as your Agent still has a valid Self "
+"Service API key!"
+msgstr "エージェントが有効なセルフサービスAPIキーをまだ持っている場合は、"
+"その操作はお勧めできません。"
+
+#: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:87
+msgid ""
+"It will not be allowed to choose more than this many options. Setting it to "
+"one (1) will result in a drop-down box, a higher number will turn this into "
+"a multi-selection element."
+msgstr "これ以上の選択肢を選択することは許可されません。 これを1に設定するとドロップダウンボックスが表示され、数値が大きいほど複数選択要素になります。"
+
+#: ../../../../modules/director/library/Director/Web/Widget/ImportSourceDetails.php:40
+msgid ""
+"It's currently unknown whether we are in sync with this Import Source. You "
+"should either check for changes or trigger a new Import Run."
+msgstr "このインポートソースと同期しているかどうかは現在不明です。"
+"変更を確認するか、新しいインポート実行をトリガする必要があります。"
+
+#: ../../../../modules/director/application/controllers/SyncruleController.php:57
+msgid ""
+"It's currently unknown whether we are in sync with this rule. You should "
+"either check for changes or trigger a new Sync Run."
+msgstr "このルールで同期しているかどうかは現在不明です。 変更を確認するか、"
+"新しい同期実行をトリガする必要があります。"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:120
+#: ../../../../modules/director/application/forms/BasketUploadForm.php:130
+msgid "It's not allowed to store an empty basket"
+msgstr "空のバスケットは保存できません"
+
+#: ../../../../modules/director/application/controllers/JobController.php:97
+msgid "Job"
+msgstr "ジョブ"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:31
+msgid "Job Definitions"
+msgstr "ジョブの定義"
+
+#: ../../../../modules/director/application/forms/DirectorJobForm.php:17
+msgid "Job Type"
+msgstr "ジョブタイプ"
+
+#: ../../../../modules/director/application/forms/DirectorJobForm.php:72
+#: ../../../../modules/director/library/Director/Web/Table/JobTable.php:60
+msgid "Job name"
+msgstr "ジョブ名"
+
+#: ../../../../modules/director/application/controllers/JobController.php:22
+#: ../../../../modules/director/application/controllers/JobController.php:54
+#, php-format
+msgid "Job: %s"
+msgstr "ジョブ: %s"
+
+#: ../../../../modules/director/application/controllers/JobsController.php:13
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/JobDashlet.php:14
+#: ../../../../modules/director/library/Director/Web/Tabs/ImportTabs.php:26
+msgid "Jobs"
+msgstr "ジョブ"
+
+#: ../../../../modules/director/library/Director/Web/Table/ActivityLogTable.php:81
+msgid "Jump to this object"
+msgstr "このオブジェクトに飛ぶ"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:245
+msgid "Just download and run this script on your Linux Client Machine:"
+msgstr "このスクリプトをLinuxクライアントマシンにダウンロードして実行するだけです。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:57
+msgid "Keep matching elements"
+msgstr "一致する要素を保持します"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:60
+msgid "Keep only matching rows (Whitelist)"
+msgstr "一致する行(ホワイトリスト)のみを保持します"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:31
+msgid "Keep the DN as is"
+msgstr "DNが次であるように保持します:"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierJsonDecode.php:26
+msgid "Keep the JSON string as is"
+msgstr "JSON文字列が次であるように保持します:"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierGetHostByName.php:18
+msgid "Keep the property (hostname) as is"
+msgstr "プロパティ(ホスト名)が次であるように保持します:"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierDnsRecords.php:35
+msgid "Keep the property as is"
+msgstr "プロパティが次であるように保持します:"
+
+#: ../../../../modules/director/application/forms/DirectorDatalistEntryForm.php:21
+#: ../../../../modules/director/library/Director/Web/Table/DatalistEntryTable.php:54
+msgid "Key"
+msgstr "キー"
+
+#: ../../../../modules/director/application/forms/ImportSourceForm.php:87
+msgid "Key column name"
+msgstr "キーとなるカラム名"
+
+#: ../../../../modules/director/application/controllers/IndexController.php:42
+#: ../../../../modules/director/application/controllers/KickstartController.php:12
+msgid "Kickstart"
+msgstr "キックスタート"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:315
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/KickstartDashlet.php:11
+msgid "Kickstart Wizard"
+msgstr "キックスタートウィザード"
+
+#: ../../../../modules/director/library/Director/Import/ImportSourceLdap.php:47
+msgid "LDAP Search Base"
+msgstr "LDAP検索ベースDN"
+
+#: ../../../../modules/director/application/forms/DirectorDatalistEntryForm.php:30
+#: ../../../../modules/director/library/Director/Web/Table/DatafieldTable.php:47
+#: ../../../../modules/director/library/Director/Web/Table/DatalistEntryTable.php:55
+#: ../../../../modules/director/library/Director/Web/Table/IcingaObjectDatafieldTable.php:49
+msgid "Label"
+msgstr "ラベル"
+
+#: ../../../../modules/director/library/Director/Web/Widget/IcingaObjectInspection.php:58
+msgid "Last Check Result"
+msgstr "最終監視結果"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:34
+msgid "Last Element"
+msgstr "最後の要素"
+
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:205
+msgid "Last notification"
+msgstr "最終通知までの時間"
+
+#: ../../../../modules/director/library/Director/Web/Widget/DeployedConfigInfoHeader.php:67
+msgid "Last related activity"
+msgstr "最後の関連アクティビティ"
+
+#: ../../../../modules/director/application/controllers/SyncruleController.php:93
+msgid "Last sync run details"
+msgstr "最終同期の処理の詳細"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:64
+msgid ""
+"Leave empty for non-positional arguments. Can be a positive or negative "
+"number and influences argument ordering"
+msgstr "位置に関する引数でない場合は空のままにしてください。"
+" 正数または負数にすることができ、引数の順序に影響を与えます"
+
+#: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:42
+msgid ""
+"Leaving custom variables in place while removing the related field is "
+"perfectly legal and might be a desired operation. This way you can no longer "
+"modify related custom variables in the Director GUI, but the variables "
+"themselves will stay there and continue to be deployed. When you re-add a "
+"field for the same variable later on, everything will continue to work as "
+"before"
+msgstr "関連フィールドを削除し、カスタム変数をそのままにしておくことも"
+"可能です。 このような状態では、Directorで"
+"関連するカスタム変数を変更することはできなくなりますが、変数自体はそのまま"
+"利用できます。 後で同じ変数のフィールドを追加し直しても、"
+"以前と同じように機能し続けます。"
+
+#: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:85
+msgid ""
+"Leaving custom variables in place while renaming the related field is "
+"perfectly legal and might be a desired operation. This way you can no longer "
+"modify related custom variables in the Director GUI, but the variables "
+"themselves will stay there and continue to be deployed. When you re-add a "
+"field for the same variable later on, everything will continue to work as "
+"before"
+msgstr "関連フィールドを削除し、カスタム変数をそのままにしておくことも"
+"可能です。 このような状態では、Directorで"
+"関連するカスタム変数を変更することはできなくなりますが、変数自体はそのまま"
+"利用できます。 後で同じ変数のフィールドを追加し直しても、"
+"以前と同じように機能し続けます。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:45
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMap.php:35
+msgid "Let the import fail"
+msgstr "インポートを失敗にする"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:54
+msgid "Let the whole Import Run fail"
+msgstr "インポート実行全体を失敗にする"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierDnsRecords.php:36
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:32
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierGetHostByName.php:19
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierJsonDecode.php:27
+msgid "Let the whole import run fail"
+msgstr "インポート実行全体を失敗にする"
+
+#: ../../../../modules/director/configuration.php:38
+msgid "Limit access to the given comma-separated list of hostgroups"
+msgstr "指定したホストグループのカンマ区切りリストへのアクセスを制限します"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:238
+msgid "Linux commandline"
+msgstr "Linux コマンドライン"
+
+#: ../../../../modules/director/application/controllers/DataController.php:91
+msgid "List Entries"
+msgstr "リストエントリ"
+
+#: ../../../../modules/director/application/controllers/DataController.php:155
+msgid "List entries"
+msgstr "リストエントリ"
+
+#: ../../../../modules/director/application/forms/DirectorDatalistForm.php:13
+#: ../../../../modules/director/library/Director/Web/Table/DatalistTable.php:31
+msgid "List name"
+msgstr "リスト名"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:135
+msgid ""
+"Local directory to deploy Icinga 1.x configuration. Must be writable by "
+"icingaweb2. (e.g. /etc/icinga/director)"
+msgstr "Icinga 1.x構成を反映するためのローカルディレクトリ。 "
+"icingaweb2によって書き込み可能でなければなりません。"
+" (例:/etc/icinga/director)"
+
+#: ../../../../modules/director/application/forms/IcingaEndpointForm.php:41
+msgid "Log Duration"
+msgstr "ログ保存期間"
+
+#: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:66
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:563
+msgid "Main properties"
+msgstr "プロパティ"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/CheckCommandsDashlet.php:12
+msgid ""
+"Manage definitions for your Commands that should be executed as Check "
+"Plugins, Notifications or based on Events"
+msgstr "監視、通知、またはイベントに基づいて実行されるコマンド"
+"の定義を管理します。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/HostTemplatesDashlet.php:17
+msgid ""
+"Manage your Host Templates. Use Fields to make it easy for your users to get "
+"them customized."
+msgstr "ホストテンプレートを管理します。 ユーザーが簡単にカスタマイズできるようにするためには、フィールドを使用してください。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/InfrastructureDashlet.php:17
+msgid ""
+"Manage your Icinga 2 infrastructure: Masters, Zones, Satellites and more"
+msgstr "マスター/ゾーン/サテライトなど、Icinga 2 の基盤となる設定を管理します"
+
+#: ../../../../modules/director/library/Director/Dashboard/CommandsDashboard.php:17
+msgid "Manage your Icinga Commands"
+msgstr "Icinga コマンドを管理"
+
+#: ../../../../modules/director/library/Director/Dashboard/HostsDashboard.php:16
+msgid "Manage your Icinga Hosts"
+msgstr "Icinga のホストの管理"
+
+#: ../../../../modules/director/library/Director/Dashboard/InfrastructureDashboard.php:18
+msgid "Manage your Icinga Infrastructure"
+msgstr "Icinga インフラストラクチャの管理"
+
+#: ../../../../modules/director/library/Director/Dashboard/ServicesDashboard.php:18
+msgid "Manage your Icinga Service Checks"
+msgstr "Icinga サービス監視を管理"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceTemplatesDashlet.php:17
+msgid ""
+"Manage your Service Templates. Use Fields to make it easy for your users to "
+"get them customized."
+msgstr "サービステンプレートを管理します。 ユーザーがフィールドを"
+"カスタマイズしやすくするには、フィールドを使用します。"
+
+#: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:134
+#: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:139
+#: ../../../../modules/director/library/Director/Web/Table/IcingaObjectDatafieldTable.php:51
+msgid "Mandatory"
+msgstr "必須"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:123
+msgid "Master-less"
+msgstr "マスター無し"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:35
+msgid "Match NULL value columns"
+msgstr "NULL値のカラムと一致"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:34
+msgid "Match boolean FALSE"
+msgstr "真偽値FALSEに一致"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:33
+msgid "Match boolean TRUE"
+msgstr "真偽値TRUEに一致"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1317
+msgid "Max check attempts"
+msgstr "最大監視試行回数"
+
+#: ../../../../modules/director/library/Director/Web/Table/GroupMemberTable.php:60
+#: ../../../../modules/director/library/Director/Web/Table/GroupMemberTable.php:65
+msgid "Member"
+msgstr "メンバー"
+
+#: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:114
+msgid "Members"
+msgstr "メンバー"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:58
+msgid "Merge"
+msgstr "マージ"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:116
+msgid "Merge Policy"
+msgstr "マージポリシー"
+
+#: ../../../../modules/director/application/forms/IcingaTimePeriodRangeForm.php:23
+msgid ""
+"Might be monday, tuesday or 2016-01-28 - have a look at the documentation for "
+"more examples"
+msgstr "monday, tuesday, 2016-01-28といった書式で指定します。"
+"より多くの例についてはドキュメントを見てください"
+
+#: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:73
+msgid "Minimum required"
+msgstr "最低要件"
+
+#: ../../../../modules/director/application/forms/ImportRowModifierForm.php:71
+msgid "Modifier"
+msgstr "プロパティ変換ルール"
+
+#: ../../../../modules/director/library/Director/Web/Tabs/ImportsourceTabs.php:41
+msgid "Modifiers"
+msgstr "プロパティ変換ルール"
+
+#: ../../../../modules/director/application/controllers/ImportsourceController.php:103
+#: ../../../../modules/director/application/controllers/SyncruleController.php:189
+#: ../../../../modules/director/library/Director/ProvidedHook/Monitoring/ServiceActions.php:52
+#: ../../../../modules/director/library/Director/Web/ActionBar/AutomationObjectActionBar.php:38
+#: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:118
+#: ../../../../modules/director/library/Director/Web/Tabs/SyncRuleTabs.php:33
+msgid "Modify"
+msgstr "編集"
+
+#: ../../../../modules/director/library/Director/ProvidedHook/CubeLinks.php:52
+#, php-format
+msgid "Modify %d hosts"
+msgstr "%d 個のホストを編集"
+
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:175
+#, php-format
+msgid "Modify %d objects"
+msgstr "%d 個のホストを編集"
+
+#: ../../../../modules/director/application/controllers/DatafieldController.php:35
+#, php-format
+msgid "Modify %s"
+msgstr "%s を編集"
+
+#: ../../../../modules/director/library/Director/ProvidedHook/CubeLinks.php:35
+msgid "Modify a host"
+msgstr "ホストを編集"
+
+#: ../../../../modules/director/application/forms/DirectorDatalistEntryForm.php:61
+msgid "Modify data list entry"
+msgstr "データリストエントリの編集"
+
+#: ../../../../modules/director/library/Director/Web/Table/ApplyRulesTable.php:115
+msgid "Modify this Apply Rule"
+msgstr "この適用ルールを編集"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceObjectDashlet.php:15
+msgid "Monitored Services"
+msgstr "監視対象サービス"
+
+#: ../../../../modules/director/library/Director/Web/Form/IplElement/ExtensibleSetElement.php:500
+msgid "Move down"
+msgstr "下へ移動"
+
+#: ../../../../modules/director/library/Director/Web/Form/IplElement/ExtensibleSetElement.php:490
+msgid "Move up"
+msgstr "上に移動"
+
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectsController.php:173
+msgid "Multiple objects"
+msgstr "複数のオブジェクト"
+
+#: ../../../../modules/director/application/controllers/ConfigController.php:159
+msgid "My changes"
+msgstr "自身による変更"
+
+#: ../../../../modules/director/application/controllers/SchemaController.php:16
+msgid "MySQL schema"
+msgstr "MySQL スキーマ"
+
+#: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:145
+#: ../../../../modules/director/application/forms/IcingaApiUserForm.php:14
+#: ../../../../modules/director/application/forms/IcingaCommandForm.php:47
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:73
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:38
+#: ../../../../modules/director/application/forms/IcingaHostVarForm.php:22
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:556
+#: ../../../../modules/director/application/forms/IcingaServiceVarForm.php:22
+#: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:15
+#: ../../../../modules/director/library/Director/Web/Table/ChoicesTable.php:41
+#: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:72
+#: ../../../../modules/director/library/Director/Web/Table/CoreApiObjectsTable.php:54
+#: ../../../../modules/director/library/Director/Web/Table/CoreApiPrototypesTable.php:37
+msgid "Name"
+msgstr "名前"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:75
+msgid "Name for the Icinga dependency you are going to create"
+msgstr "Icinga依存関係オブジェクトの名前"
+
+#: ../../../../modules/director/application/forms/IcingaEndpointForm.php:20
+msgid "Name for the Icinga endpoint template you are going to create"
+msgstr "Icingaエンドポイントテンプレートの名前"
+
+#: ../../../../modules/director/application/forms/IcingaEndpointForm.php:26
+msgid "Name for the Icinga endpoint you are going to create"
+msgstr "Icingaエンドポイントの名前"
+
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:21
+msgid "Name for the Icinga notification template you are going to create"
+msgstr "Icinga通知テンプレートの名前"
+
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:27
+msgid "Name for the Icinga notification you are going to create"
+msgstr "Icinga通知の名前"
+
+#: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:148
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:559
+msgid "Name for the Icinga service you are going to create"
+msgstr "Icingaサービスの名前"
+
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:30
+msgid "Name for the Icinga user object you are going to create"
+msgstr "作成しようとしているIcingaユーザオブジェクトの名前"
+
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:24
+msgid "Name for the Icinga user template you are going to create"
+msgstr "作成しようとしているIcingaユーザテンプレートの名前"
+
+#: ../../../../modules/director/application/forms/IcingaZoneForm.php:17
+msgid "Name for the Icinga zone you are going to create"
+msgstr "作成しようとしているIcingaゾーンの名前"
+
+#: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:104
+msgid "Name needs to be changed when cloning a Template"
+msgstr "テンプレートを複製するときに名前を変更する必要があります"
+
+#: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:82
+msgid "Nav"
+msgstr "Nav"
+
+#: ../../../../modules/director/application/controllers/DatafieldController.php:41
+msgid "New Field"
+msgstr "新しいフィールド"
+
+#: ../../../../modules/director/application/controllers/JobController.php:30
+msgid "New Job"
+msgstr "新しいジョブ"
+
+#: ../../../../modules/director/library/Director/Web/Tabs/ImportsourceTabs.php:54
+msgid "New import source"
+msgstr "新しいインポートソース"
+
+#: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:22
+#: ../../../../modules/director/library/Director/Web/Form/CloneImportSourceForm.php:30
+#: ../../../../modules/director/library/Director/Web/Form/CloneSyncRuleForm.php:30
+msgid "New name"
+msgstr "新しい名前"
+
+#: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:258
+msgid "New object"
+msgstr "新しいオブジェクト"
+
+#: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:34
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:31
+msgid "Next"
+msgstr "次へ"
+
+#: ../../../../modules/director/application/forms/IcingaZoneForm.php:29
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:227
+#: ../../../../modules/director/application/forms/SettingsForm.php:58
+#: ../../../../modules/director/application/forms/SettingsForm.php:73
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:74
+#: ../../../../modules/director/library/Director/Job/ConfigJob.php:190
+#: ../../../../modules/director/library/Director/Job/ConfigJob.php:202
+#: ../../../../modules/director/library/Director/Job/ImportJob.php:102
+#: ../../../../modules/director/library/Director/Job/SyncJob.php:102
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:26
+msgid "No"
+msgstr "いいえ"
+
+#: ../../../../modules/director/library/Director/Util.php:183
+#, php-format
+msgid "No %s resource available"
+msgstr "利用可能な%s リソースはありません"
+
+#: ../../../../modules/director/library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:99
+msgid "No API user configured, you might run the kickstart helper"
+msgstr "APIユーザーが設定されていません。キックスタートウィザードを"
+"実行する可能性があります。"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:163
+msgid "No Host Template has been provided yet"
+msgstr "ホストテンプレートがまだ提供されていません"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:151
+msgid "No Host template has been chosen"
+msgstr "ホストテンプレートが選択されていません"
+
+#: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:94
+msgid "No Service Templates have been provided yet"
+msgstr "サービステンプレートがまだ提供されていません"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:170
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:736
+#: ../../../../modules/director/application/forms/IcingaTimePeriodRangeForm.php:94
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:649
+msgid "No action taken, object has not been modified"
+msgstr "アクションは行われず、オブジェクトは変更されていません"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:223
+msgid "No apply rule has been defined yet"
+msgstr "適用ルールがまだ一つも定義されていません"
+
+#: ../../../../modules/director/library/Director/Web/Widget/SyncRunDetails.php:42
+msgid "No changes have been made"
+msgstr "何も変更されていません"
+
+#: ../../../../modules/director/application/controllers/DashboardController.php:78
+msgid "No dashboard available, you might have not enough permissions"
+msgstr "利用可能なダッシュボードがありません。十分な権限がない可能性があります"
+
+#: ../../../../modules/director/library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:68
+msgid "No database has been configured for Icinga Director"
+msgstr "Icinga Director用にデータベースが構成されていません"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:238
+msgid ""
+"No database resource has been configured yet. Please choose a resource to "
+"complete your config"
+msgstr "データベースリソースはまだ設定されていません。 設定を完了する"
+"リソースを選択してください"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:52
+msgid "No database schema has been created yet"
+msgstr "データベーススキーマがまだ作成されていません"
+
+#: ../../../../modules/director/application/forms/AddToBasketForm.php:104
+msgid "No object has been chosen"
+msgstr "オブジェクトが選択されていません"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:241
+msgid "No object has been defined yet"
+msgstr "オブジェクトはまだ定義されていません"
+
+#: ../../../../modules/director/application/forms/IcingaMultiEditForm.php:82
+msgid "No object has been modified"
+msgstr "オブジェクトが変更されていません。"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1171
+msgid "No related template has been provided yet"
+msgstr "関連するテンプレートが用意されていません。"
+
+#: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:82
+msgid "No service has been chosen"
+msgstr "サービスが選択されていません。"
+
+#: ../../../../modules/director/application/controllers/HostController.php:121
+#, php-format
+msgid "No such service: %s"
+msgstr "そのようなサービスはありません: %s"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1166
+msgid "No template has been chosen"
+msgstr "テンプレートが選択されていません。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:205
+msgid "No template has been defined yet"
+msgstr "テンプレートが定義されていません。"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:606
+msgid "None"
+msgstr "なし"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/EndpointObjectDashlet.php:57
+msgid "None could be used for deployments right now"
+msgstr "現在、反映できる設定はありません"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1457
+msgid "Notes"
+msgstr "メモ"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1466
+msgid "Notes URL"
+msgstr "関連URL"
+
+#: ../../../../modules/director/application/forms/SyncRunForm.php:39
+msgid "Nothing changed, rule is in sync"
+msgstr "変更はありません。ルールは同期されています。"
+
+#: ../../../../modules/director/application/forms/ImportCheckForm.php:38
+#: ../../../../modules/director/application/forms/ImportRunForm.php:38
+msgid ""
+"Nothing to do, data provided by this Import Source didn't change since the "
+"last import run"
+msgstr "何もしません。このインポートソースによって提供されたデータは"
+"最後のインポート実行以来、変更されていません"
+
+#: ../../../../modules/director/application/forms/RestoreObjectForm.php:76
+msgid "Nothing to do, restore would not modify the current object"
+msgstr "何もしません。復元しても現在のオブジェクトは変更されません"
+
+#: ../../../../modules/director/application/forms/SyncCheckForm.php:58
+msgid "Nothing would change, this rule is still in sync"
+msgstr "変更は起きません。このルールはまだ同期されています。"
+
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:25
+#: ../../../../modules/director/library/Director/TranslationDummy.php:18
+msgid "Notification"
+msgstr "通知"
+
+#: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:55
+#, php-format
+msgid "Notification Apply Rules based on %s"
+msgstr "%s に基づく通知適用ルール"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/NotificationCommandsDashlet.php:19
+#: ../../../../modules/director/library/Director/Import/ImportSourceCoreApi.php:58
+msgid "Notification Commands"
+msgstr "通知コマンド"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/NotificationCommandsDashlet.php:12
+msgid ""
+"Notification Commands allow you to trigger any action you want when a "
+"notification takes place"
+msgstr "通知コマンドを使用すると、通知が発生したときに必要な操作を実行できます。"
+
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:19
+msgid "Notification Template"
+msgstr "通知テンプレート"
+
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:251
+msgid "Notification command"
+msgstr "通知コマンド"
+
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:173
+msgid "Notification interval"
+msgstr "通知インターバル"
+
+#: ../../../../modules/director/application/controllers/TemplatechoicesController.php:29
+msgid "Notification template choices"
+msgstr "通知テンプレートチョイス"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/NotificationTemplateDashlet.php:13
+msgid "Notification templates"
+msgstr "通知テンプレート"
+
+#: ../../../../modules/director/configuration.php:130
+#: ../../../../modules/director/application/forms/BasketForm.php:25
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/NotificationApplyDashlet.php:13
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/NotificationsDashlet.php:13
+#: ../../../../modules/director/library/Director/Web/Table/CustomvarTable.php:46
+#: ../../../../modules/director/library/Director/Web/Table/CustomvarVariantsTable.php:61
+msgid "Notifications"
+msgstr "通知"
+
+#: ../../../../modules/director/library/Director/Dashboard/NotificationsDashboard.php:20
+msgid ""
+"Notifications are sent when a host or service reaches a non-ok hard state or "
+"recovers from such. One might also want to send them for special events like "
+"when a Downtime starts, a problem gets acknowledged and much more. You can "
+"send specific notifications only within specific time periods, you can delay "
+"them and of course re-notify at specific intervals.\n"
+"\n"
+" Combine those possibilities in case you need to define escalation levels, "
+"like notifying operators first and your management later on in case the "
+"problem remains unhandled for a certain time.\n"
+"\n"
+" You might send E-Mail or SMS, make phone calls or page on various "
+"channels. You could also delegate notifications to external service "
+"providers. The possibilities are endless, as you are allowed to define as "
+"many custom notification commands as you want"
+msgstr "ホストまたはサービスが異常な状態になったときや、"
+"そこから復旧したときに通知が送信されます。 また、ダウンタイムの"
+"開始時、障害の発見時など、特別なイベントのために通知を送信することも"
+"できます。 特定の期間内にのみ特定の通知を送ることや、"
+"通知を遅らせること、特定の間隔で再通知することもできます。\n\n"
+"エスカレーションレベルを定義することもできます。"
+"たとえば、障害が一定時間解決されない場合に備えて、最初に"
+"オペレータに通知し、後で管理者に通知するという設定をすることもできます。\n\n"
+"なお通知は、メール以外の方法で行うこともできます。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:42
+msgid "Numeric position"
+msgstr "数字位置"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/StateFilterSet.php:24
+msgid "OK"
+msgstr "OK (正常)"
+
+#: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:64
+#: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:146
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1056
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1061
+msgid "Object"
+msgstr "オブジェクト"
+
+#: ../../../../modules/director/application/controllers/InspectController.php:106
+msgid "Object Inspection"
+msgstr "オブジェクトの検査"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:42
+msgid "Object Type"
+msgstr "オブジェクトタイプ"
+
+#: ../../../../modules/director/library/Director/Import/ImportSourceLdap.php:53
+msgid "Object class"
+msgstr "オブジェクトクラス"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/DependencyObjectDashlet.php:18
+msgid "Object dependency relationships."
+msgstr "依存関係オブジェクト"
+
+#: ../../../../modules/director/application/forms/RestoreObjectForm.php:80
+msgid "Object has been re-created"
+msgstr "オブジェクトが再作成されました"
+
+#: ../../../../modules/director/application/forms/RestoreObjectForm.php:72
+msgid "Object has been restored"
+msgstr "オブジェクトがリストアされました"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:357
+msgid "Object properties"
+msgstr "オブジェクトプロパティ"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1069
+#: ../../../../modules/director/library/Director/Web/Table/SyncruleTable.php:46
+msgid "Object type"
+msgstr "オブジェクトタイプ"
+
+#: ../../../../modules/director/application/controllers/InspectController.php:67
+#, php-format
+msgid "Object type \"%s\""
+msgstr "オブジェクトタイプ \"%s\""
+
+#: ../../../../modules/director/library/Director/Web/Table/GeneratedConfigFileTable.php:85
+msgid "Object/Tpl/Apply"
+msgstr "オブジェクト/TPL/適用"
+
+#: ../../../../modules/director/library/Director/Web/Table/HostTemplateUsageTable.php:11
+#: ../../../../modules/director/library/Director/Web/Table/ServiceTemplateUsageTable.php:11
+#: ../../../../modules/director/library/Director/Web/Table/TemplateUsageTable.php:24
+msgid "Objects"
+msgstr "オブジェクト"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:27
+msgid "On failure"
+msgstr "失敗時"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:227
+msgid "One apply rule has been defined"
+msgstr "一つの適用ルールが定義されています。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:249
+msgid "One external object has been defined, it will not be deployed"
+msgstr "1つの外部オブジェクトが定義されています。設定の反映が行われません。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:252
+msgid "One object has been defined"
+msgstr "一つのオブジェクトが定義されています。"
+
+#: ../../../../modules/director/application/forms/IcingaMultiEditForm.php:84
+#: ../../../../modules/director/library/Director/Web/Widget/SyncRunDetails.php:45
+msgid "One object has been modified"
+msgstr "一つのオブジェクトが変更されています。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierSplit.php:16
+msgid "One or more characters that should be used to split this string"
+msgstr "この文字列を分割するために使用される1つ以上の文字"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierJoin.php:16
+msgid ""
+"One or more characters that will be used to glue an input array to a string. "
+"Can be left empty"
+msgstr "入力配列を文字列に結合するために使用される1つ以上の文字。 空のままにできます"
+
+#: ../../../../modules/director/application/forms/IcingaTimePeriodRangeForm.php:30
+msgid "One or more time periods, e.g. 00:00-24:00 or 00:00-09:00,17:00-24:00"
+msgstr "一つまたは複数のスケジュール。(例)00:00-24:00 or 00:00-09:00,17:00-24:00"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:209
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:246
+msgid "One template has been defined"
+msgstr "1つのテンプレートが定義されています。"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:95
+msgid ""
+"Only set this parameter if the argument value resolves to a numeric value. "
+"String values are not supported"
+msgstr "引数値が数値に解決される場合にのみ、このパラメータを設定してください。"
+"文字列値はサポートされていません"
+
+#: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:138
+msgid "Optional"
+msgstr "オプション"
+
+#: ../../../../modules/director/application/forms/IcingaCommandForm.php:72
+msgid ""
+"Optional command timeout. Allowed values are seconds or durations postfixed "
+"with a specific unit (e.g. 1m or also 3m 30s)."
+msgstr "オプションのコマンドタイムアウト。書式は、"
+"秒数または期間のあとに特定の単位を付けたもの(たとえば、1分または3分30秒)。"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:249
+msgid ""
+"Optional. The child service. If omitted this dependency object is treated as "
+"host dependency."
+msgstr "オプションです。 子サービスです。省略した場合、"
+"この依存関係オブジェクトはホストの依存関係として扱われます。"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:213
+msgid ""
+"Optional. The parent service. If omitted this dependency object is treated "
+"as host dependency."
+msgstr "オプション。親サービス。省略した場合、この依存関係オブジェクトは"
+"ホストの依存関係として扱われます。"
+
+#: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:95
+msgid "Other available fields"
+msgstr "ほかの利用可能なフィールド"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:272
+msgid "Other sources"
+msgstr "ほかのソース"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:148
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:403
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:439
+msgid "Override vars"
+msgstr "変数のオーバーライド"
+
+#: ../../../../modules/director/application/controllers/DashboardController.php:46
+#: ../../../../modules/director/application/controllers/HealthController.php:16
+#: ../../../../modules/director/library/Director/Web/ActionBar/AutomationObjectActionBar.php:32
+msgid "Overview"
+msgstr "概要"
+
+#: ../../../../modules/director/application/controllers/PhperrorController.php:16
+#, php-format
+msgid ""
+"PHP version 5.4.x is required for Director >= 1.4.0, you're running %s. "
+"Please either upgrade PHP or downgrade Icinga Director"
+msgstr "PHPバージョン5.4.xはDirector> = 1.4.0に必要です。あなたは%sを"
+"実行しています。 PHPをアップグレードするか、"
+"Icinga Directorをダウングレードしてください。"
+
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:41
+msgid "Pager"
+msgstr "ページャー"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:192
+msgid "Parent Host"
+msgstr "親ホスト"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:211
+msgid "Parent Service"
+msgstr "親サービス"
+
+#: ../../../../modules/director/application/forms/IcingaZoneForm.php:36
+msgid "Parent Zone"
+msgstr "親ゾーン"
+
+#: ../../../../modules/director/application/forms/IcingaApiUserForm.php:19
+#: ../../../../modules/director/application/forms/KickstartForm.php:159
+msgid "Password"
+msgstr "パスワード"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierCombine.php:14
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRegexSplit.php:13
+msgid "Pattern"
+msgstr "パターン"
+
+#: ../../../../modules/director/application/forms/ApplyMigrationsForm.php:39
+msgid "Pending database schema migrations have successfully been applied"
+msgstr "保留中のデータベーススキーマの移行は正常に適用されました"
+
+#: ../../../../modules/director/library/Director/Util.php:185
+msgid "Please ask an administrator to grant you access to resources"
+msgstr "リソースへのアクセスを許可するように管理者に依頼してください"
+
+#: ../../../../modules/director/application/forms/AddToBasketForm.php:118
+#, php-format
+msgid ""
+"Please check your Basket configuration, %s does not support single \"%s\" "
+"configuration objects"
+msgstr "バスケットの設定を確認してください。%sは単一の\"%s\"設定オブジェクト"
+"をサポートしていません"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMap.php:19
+msgid "Please choose a data list that can be used for map lookups"
+msgstr "地図検索に使用できるデータリストを選択してください"
+
+#: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:66
+msgid "Please choose a specific Icinga object type"
+msgstr "特定のIcingaオブジェクトタイプを選択してください"
+
+#: ../../../../modules/director/library/Director/Job/ImportJob.php:82
+msgid ""
+"Please choose your import source that should be executed. You could create "
+"different schedules for different sources or also opt for running all of "
+"them at once."
+msgstr "実行する必要があるインポート元を選択してください。 ソースごとに"
+"異なるスケジュールを作成したり、それらすべてを一度に実行することもできます。"
+
+#: ../../../../modules/director/library/Director/Job/SyncJob.php:82
+msgid ""
+"Please choose your synchronization rule that should be executed. You could "
+"create different schedules for different rules or also opt for running all "
+"of them at once."
+msgstr "実行する同期ルールを選択してください。 異なるルールに対して異なる"
+"スケジュールを作成したり、それらすべてを一度に実行することもできます。"
+
+#: ../../../../modules/director/library/Director/Import/ImportSourceSql.php:57
+msgid "Please click \"Store\" once again to determine query columns"
+msgstr "クエリ欄を決定するには、もう一度「保存」をクリックしてください。"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:257
+#, php-format
+msgid "Please click %s to create new DB resources"
+msgstr "新しいDBリソースを作成するには、%sをクリックしてください"
+
+#: ../../../../modules/director/library/Director/Util.php:175
+#, php-format
+msgid "Please click %s to create new resources"
+msgstr "新しいリソースを作成するには、%sをクリックしてください"
+
+#: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:86
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:155
+#, php-format
+msgid "Please define a %s first"
+msgstr "%sを先に定義してください"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1169
+msgid "Please define a related template first"
+msgstr "関連するテンプレートを先に定義してください"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:219
+msgid ""
+"Please make sure that your database exists and your user has been granted "
+"enough permissions"
+msgstr "データベースが存在し、ユーザーに十分な権限が付与されていることを確認してください。"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:23
+msgid ""
+"Please only change those settings in case you are really sure that you are "
+"required to do so. Usually the defaults chosen by the Icinga Director should "
+"make a good fit for your environment."
+msgstr "本当にこれらの設定変更が必要だと確信している場合だけこれらの設定を変えてください。 通常、Icinga Directorによって選択されたデフォルトは、環境に適したものになるはずです。"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:28
+msgid "Please provide a rule name"
+msgstr "ルール名を入力してください"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierSubstring.php:17
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierSubstring.php:27
+#, php-format
+msgid "Please see %s for detailled instructions of how start and end work"
+msgstr "作業の開始と終了の詳細な手順については%sを参照してください。"
+
+#: ../../../../modules/director/application/forms/IcingaCommandForm.php:36
+msgid ""
+"Plugin Check commands are what you need when running checks agains your "
+"infrastructure. Notification commands will be used when it comes to notify "
+"your users. Event commands allow you to trigger specific actions when "
+"problems occur. Some people use them for auto-healing mechanisms, like "
+"restarting services or rebooting systems at specific thresholds"
+msgstr "プラグイン監視は、インフラストラクチャに対して再度"
+"監視を実行するときに必要なものです。通知コマンドは、ユーザーに通知を行う"
+"際に使われます。イベントコマンドは、障害が発生したときに特定のアクションを"
+"起こせます。 また、これらのコマンドを用いて、サービスを再起動したり、"
+"特定のしきい値でシステムを再起動するなど、自動修復メカニズムに利用することも"
+"できます。"
+
+#: ../../../../modules/director/application/forms/IcingaCommandForm.php:20
+msgid "Plugin commands"
+msgstr "プラグインコマンド"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:50
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:52
+msgid "Policy"
+msgstr "ポリシー"
+
+#: ../../../../modules/director/application/forms/IcingaEndpointForm.php:36
+#: ../../../../modules/director/application/forms/KickstartForm.php:141
+msgid "Port"
+msgstr "ポート"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:62
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:40
+msgid "Position"
+msgstr "位置"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:30
+msgid "Position Type"
+msgstr "位置タイプ"
+
+#: ../../../../modules/director/application/controllers/SchemaController.php:17
+msgid "PostgreSQL schema"
+msgstr "PostgreSQLスキーマ"
+
+#: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:76
+msgid "Prefer includes"
+msgstr "インクルードの優先"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/BasketDashlet.php:17
+msgid "Preserve specific configuration objects in a specific state"
+msgstr "特定の構成オブジェクトを決まった状態に維持します"
+
+#: ../../../../modules/director/library/Director/Web/Tabs/ImportsourceTabs.php:49
+#: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:86
+msgid "Preview"
+msgstr "プレビュー"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:23
+msgid "Problem"
+msgstr "Problem (障害)"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:27
+msgid "Problem handling"
+msgstr "障害対応"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1378
+msgid "Process performance data"
+msgstr "プロセスパフォーマンスデータ"
+
+#: ../../../../modules/director/library/Director/Import/ImportSourceLdap.php:67
+#: ../../../../modules/director/library/Director/Web/Tabs/SyncRuleTabs.php:35
+msgid "Properties"
+msgstr "プロパティ"
+
+#: ../../../../modules/director/application/forms/ImportRowModifierForm.php:30
+#: ../../../../modules/director/library/Director/Web/Table/PropertymodifierTable.php:113
+msgid "Property"
+msgstr "プロパティ"
+
+#: ../../../../modules/director/application/controllers/ImportsourceController.php:168
+#, php-format
+msgid "Property modifiers: %s"
+msgstr "プロパティ変換ルール: %s"
+
+#: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:80
+msgid "Protected"
+msgstr "保護されています"
+
+#: ../../../../modules/director/application/controllers/InspectController.php:91
+msgid "Prototypes (methods)"
+msgstr "プロトタイプ(方法)"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/DatalistDashlet.php:11
+msgid "Provide Data Lists"
+msgstr "データリスト"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/DatalistDashlet.php:17
+msgid "Provide data lists to make life easier for your users"
+msgstr "カスタム変数に利用する、データのリストを設定します。"
+"例えば、サービスタイプというデータリストに、「WEB」「DB」等の値を設定することができます。"
+"このリストを使うことで、変数の値を手で入力するのではなく、ユーザに選択させることができる"
+"ようになります。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/TimeperiodTemplateDashlet.php:18
+msgid "Provide templates for your TimePeriod objects."
+msgstr "スケジュールオブジェクト用のテンプレートを提供します。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/UserTemplateDashlet.php:18
+msgid "Provide templates for your User objects."
+msgstr "ユーザーオブジェクト用のテンプレートを提供します。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/NotificationTemplateDashlet.php:18
+msgid "Provide templates for your notifications."
+msgstr "通知用のテンプレートを提供します。"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:65
+msgid "Purge"
+msgstr "削除"
+
+#: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:122
+msgid "Ranges"
+msgstr "期間"
+
+#: ../../../../modules/director/application/forms/DeployConfigForm.php:34
+msgid "Re-deploy now"
+msgstr "再反映"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:24
+msgid "Recovery"
+msgstr "Recovery (復旧)"
+
+#: ../../../../modules/director/application/forms/IcingaGenerateApiKeyForm.php:22
+msgid "Regenerate Self Service API key"
+msgstr "セルフサービスAPIキーを再生成"
+
+#: ../../../../modules/director/application/forms/IcingaHostSelfServiceForm.php:56
+msgid "Register"
+msgstr "登録"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:59
+msgid "Registered Agent"
+msgstr "登録されたエージェント"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:34
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:32
+msgid "Regular Expression"
+msgstr "正規表現"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRegexSplit.php:16
+msgid "Regular expression pattern to split the string (e.g. /\\s+/ or /[,;]/)"
+msgstr "文字列を分割する正規表現パターン(例: /\\s+/ または /[,;]/)"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:58
+msgid "Reject matching elements"
+msgstr "マッチした要素を拒否"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:59
+msgid "Reject the whole row (Blacklist)"
+msgstr "行全体を拒否(ブラックリスト)"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:269
+msgid "Related Objects"
+msgstr "関連オブジェクト"
+
+#: ../../../../modules/director/library/Director/Web/Table/IcingaServiceSetServiceTable.php:203
+msgid "Remove"
+msgstr "削除"
+
+#: ../../../../modules/director/library/Director/Web/Table/IcingaServiceSetServiceTable.php:205
+#, php-format
+msgid "Remove \"%s\" from this host"
+msgstr "このホストから「%s」を削除"
+
+#: ../../../../modules/director/library/Director/Web/Form/IplElement/ExtensibleSetElement.php:480
+msgid "Remove this entry"
+msgstr "このエントリを削除"
+
+#: ../../../../modules/director/application/views/helpers/FormDataFilter.php:507
+msgid "Remove this part of your filter"
+msgstr "フィルタからこの部分を除去"
+
+#: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:94
+msgid "Rename related vars"
+msgstr "関連する変数の名前を変更"
+
+#: ../../../../modules/director/application/controllers/ConfigController.php:67
+msgid "Render config"
+msgstr "設定を生成"
+
+#: ../../../../modules/director/application/controllers/ConfigController.php:287
+msgid "Rendered file"
+msgstr "ファイルを生成"
+
+#: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:97
+#, php-format
+msgid "Rendered in %0.2fs, deployed in %0.2fs"
+msgstr "設定生成時間:%0.2f 秒, 設定反映時間: %0.2f 秒"
+
+#: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:408
+#: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:413
+msgid "Rendering"
+msgstr "設定生成中"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:102
+msgid "Repeat key"
+msgstr "キーを反復"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:59
+msgid "Replace"
+msgstr "置換"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:119
+#: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:79
+msgid "Required"
+msgstr "要求"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:206
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:139
+#: ../../../../modules/director/application/forms/RestoreBasketForm.php:58
+msgid "Restore"
+msgstr "リストア"
+
+#: ../../../../modules/director/application/forms/RestoreObjectForm.php:17
+msgid "Restore former object"
+msgstr "以前のオブジェクトをリストア"
+
+#: ../../../../modules/director/application/forms/RestoreBasketForm.php:52
+msgid "Restore to this target Director DB"
+msgstr "対象のDirector DBをリストア"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1306
+msgid "Retry interval"
+msgstr "リトライ間隔"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1308
+msgid ""
+"Retry interval, will be applied after a state change unless the next hard "
+"state is reached"
+msgstr "最大監視試行回数に達するまでの試行間隔"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMap.php:34
+msgid "Return lookup key unmodified"
+msgstr "変更されていない参照キーを返す"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:27
+#: ../../../../modules/director/library/Director/Web/Table/SyncruleTable.php:45
+msgid "Rule name"
+msgstr "ルール名"
+
+#: ../../../../modules/director/library/Director/Job/ImportJob.php:119
+msgid "Run all imports at once"
+msgstr "すべてのインポートをまとめて実行"
+
+#: ../../../../modules/director/library/Director/Job/SyncJob.php:125
+msgid "Run all rules at once"
+msgstr "すべてのルールをまとめて実行"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:185
+#: ../../../../modules/director/library/Director/Job/ImportJob.php:92
+msgid "Run import"
+msgstr "インポートを実行"
+
+#: ../../../../modules/director/application/forms/DirectorJobForm.php:46
+msgid "Run interval"
+msgstr "実行インターバル"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:659
+msgid "Run on agent"
+msgstr "エージェント側で実行"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/JobDashlet.php:29
+msgid ""
+"Schedule and automate Import, Syncronization, Config Deployment, "
+"Housekeeping and more"
+msgstr "インポート、同期、設定反映、ハウスキーピングなどのスケジュールと自動化"
+
+#: ../../../../modules/director/library/Director/Dashboard/NotificationsDashboard.php:14
+#: ../../../../modules/director/library/Director/Dashboard/UsersDashboard.php:15
+msgid "Schedule your notifications"
+msgstr "通知をスケジュール"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/NotificationsDashlet.php:19
+msgid ""
+"Schedule your notifications. Define who should be notified, when, and for "
+"which kind of problem"
+msgstr "通知をスケジュールします。 誰にいつ、どんな種類の"
+"障害に対して通知するかを定義します。"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:145
+msgid ""
+"Script or tool to call when activating a new configuration stage. (e.g. "
+"sudo /usr/local/bin/icinga-director-activate) (name of the stage will be the "
+"argument for the script)"
+msgstr "新しい設定ステージをアクティブにするときに呼び出すスクリプトまたは"
+"ツール。 (例:sudo /usr/local/bin/icinga-director-activate)"
+"(ステージの名前がスクリプトの引数になります)"
+
+#: ../../../../modules/director/application/controllers/SelfServiceController.php:101
+#: ../../../../modules/director/application/controllers/SettingsController.php:43
+msgid "Self Service"
+msgstr "セルフサービス"
+
+#: ../../../../modules/director/application/controllers/SelfServiceController.php:102
+msgid "Self Service - Host Registration"
+msgstr "セルフサービス - ホストの登録"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/SelfServiceDashlet.php:11
+msgid "Self Service API"
+msgstr "セルフサービス API"
+
+#: ../../../../modules/director/application/controllers/SettingsController.php:44
+msgid "Self Service API - Global Settings"
+msgstr "セルフサービス API - グローバル設定"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:285
+msgid "Self Service Settings have been stored"
+msgstr "セルフサービス設定は保存されました。"
+
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:89
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1366
+msgid "Send notifications"
+msgstr "通知を送信する"
+
+#: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:78
+msgid "Sent to"
+msgstr "へ送る"
+
+#: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:104
+#: ../../../../modules/director/application/forms/IcingaServiceVarForm.php:15
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:14
+#: ../../../../modules/director/library/Director/TranslationDummy.php:14
+msgid "Service"
+msgstr "サービス"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceApplyRulesDashlet.php:11
+msgid "Service Apply Rules"
+msgstr "サービス適用ルール"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:15
+msgid "Service Group"
+msgstr "サービスグループ"
+
+msgid "ServiceGroup"
+msgstr "サービスグループ"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:21
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceGroupsDashlet.php:11
+msgid "Service Groups"
+msgstr "サービスグループ"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:16
+#: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:58
+msgid "Service Set"
+msgstr "サービスセット"
+
+#: ../../../../modules/director/application/forms/RemoveLinkForm.php:55
+msgid "Service Set has been removed"
+msgstr "サービスセットが削除されました"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:24
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceSetsDashlet.php:11
+#: ../../../../modules/director/library/Director/Web/Table/CustomvarTable.php:45
+#: ../../../../modules/director/library/Director/Web/Table/CustomvarVariantsTable.php:60
+msgid "Service Sets"
+msgstr "サービスセット"
+
+#: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:88
+msgid "Service Template"
+msgstr "サービステンプレート"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:22
+msgid "Service Template Choice"
+msgstr "サービステンプレートチョイス"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:23
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceTemplatesDashlet.php:11
+msgid "Service Templates"
+msgstr "サービステンプレート"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:166
+msgid "Service User"
+msgstr "サービスユーザ"
+
+#: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:57
+msgid "Service groups"
+msgstr "サービスグループ"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:634
+msgid ""
+"Service groups that should be directly assigned to this service. "
+"Servicegroups can be useful for various reasons. They are helpful to "
+"provided service-type specific view in Icinga Web 2, either for custom "
+"dashboards or as an instrument to enforce restrictions. Service groups can "
+"be directly assigned to single services or to service templates."
+msgstr "このサービスに直接割り当てる必要があるサービスグループ。 "
+"サービスグループはさまざまな理由で役に立ちます。 カスタムダッシュボード"
+"または制限を適用する手段として、Icinga Web 2でサービスタイプ固有の"
+"ビューを提供するのに役立ちます。 サービスグループは、単一のサービスまたは"
+"サービステンプレートに直接割り当てることができます。"
+
+#: ../../../../modules/director/library/Director/Web/Table/IcingaHostAppliedForServiceTable.php:102
+msgid "Service name"
+msgstr "サービス名"
+
+#: ../../../../modules/director/application/controllers/SuggestController.php:238
+#: ../../../../modules/director/library/Director/Objects/IcingaService.php:709
+msgid "Service properties"
+msgstr "サービスプロパティ"
+
+#: ../../../../modules/director/application/forms/IcingaAddServiceSetForm.php:86
+#: ../../../../modules/director/application/forms/IcingaServiceSetForm.php:85
+msgid "Service set"
+msgstr "サービスセット"
+
+#: ../../../../modules/director/application/forms/IcingaServiceSetForm.php:28
+msgid "Service set name"
+msgstr "サービスセット名"
+
+#: ../../../../modules/director/application/controllers/TemplatechoiceController.php:22
+msgid "Service template choice"
+msgstr "サービステンプレートチョイス"
+
+#: ../../../../modules/director/application/controllers/TemplatechoicesController.php:24
+msgid "Service template choices"
+msgstr "サービステンプレートチョイス"
+
+#: ../../../../modules/director/application/controllers/ServiceController.php:76
+msgid "ServiceSet"
+msgstr "サービスセット"
+
+#: ../../../../modules/director/application/forms/IcingaServiceGroupForm.php:14
+msgid "Servicegroup"
+msgstr "サービスグループ"
+
+#: ../../../../modules/director/library/Director/Web/Table/IcingaAppliedServiceTable.php:32
+#: ../../../../modules/director/library/Director/Web/Table/IcingaHostServiceTable.php:140
+#: ../../../../modules/director/library/Director/Web/Table/IcingaServiceSetServiceTable.php:170
+msgid "Servicename"
+msgstr "サービス名"
+
+#: ../../../../modules/director/configuration.php:122
+#: ../../../../modules/director/application/controllers/ServiceController.php:57
+#: ../../../../modules/director/application/controllers/ServiceController.php:80
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:100
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:90
+#: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:56
+#: ../../../../modules/director/library/Director/IcingaConfig/StateFilterSet.php:23
+#: ../../../../modules/director/library/Director/Web/Table/CustomvarTable.php:44
+#: ../../../../modules/director/library/Director/Web/Table/CustomvarVariantsTable.php:59
+#: ../../../../modules/director/library/Director/Web/Tabs/ObjectTabs.php:75
+msgid "Services"
+msgstr "サービス"
+
+#: ../../../../modules/director/application/controllers/ServicesetController.php:62
+#, php-format
+msgid "Services in this set: %s"
+msgstr "このセット中のサービス: %s"
+
+#: ../../../../modules/director/application/controllers/HostController.php:213
+#, php-format
+msgid "Services on %s"
+msgstr "%sのサービス"
+
+#: ../../../../modules/director/application/controllers/HostController.php:137
+#, php-format
+msgid "Services: %s"
+msgstr "%sのサービス"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:84
+msgid "Set based on filter"
+msgstr "フィルタに基づいて設定"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:44
+msgid "Set false"
+msgstr "FALSEを設定する"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierDnsRecords.php:34
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:30
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierGetHostByName.php:17
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierJsonDecode.php:25
+msgid "Set no value (null)"
+msgstr "値が設定されていません(null)"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:42
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMap.php:33
+msgid "Set null"
+msgstr "NULLを設定"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:43
+msgid "Set true"
+msgstr "TRUEを設定"
+
+#: ../../../../modules/director/library/Director/Web/Tabs/ObjectsTabs.php:76
+msgid "Sets"
+msgstr "セット"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:105
+msgid ""
+"Setting a command endpoint allows you to force host checks to be executed by "
+"a specific endpoint. Please carefully study the related Icinga documentation "
+"before using this feature"
+msgstr "コマンドエンドポイントを設定すると、特定のエンドポイントで"
+"ホスト監視を強制的に実行できます。 この機能を使用する前に、関連する"
+"Icingaのドキュメントをよく調べてください。"
+
+#: ../../../../modules/director/application/controllers/ConfigController.php:218
+#: ../../../../modules/director/library/Director/Web/SelfService.php:93
+msgid "Settings"
+msgstr "設定"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:198
+msgid "Settings have been stored"
+msgstr "設定は保存されました"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:86
+msgid "Share this Template for Self Service API"
+msgstr "セルフサービスAPIにこのテンプレートを共有"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:84
+msgid "Shared for Self Service API"
+msgstr "セルフサービスAPIのために共有されています"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:21
+msgid "Should all the other characters be lowercased first?"
+msgstr "他のすべての文字を先頭小文字にしますか?"
+
+#: ../../../../modules/director/application/controllers/HostController.php:513
+msgid "Show"
+msgstr "表示"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:200
+msgid "Show Basket"
+msgstr "バスケットを表示"
+
+#: ../../../../modules/director/library/Director/Web/Widget/AdditionalTableActions.php:75
+msgid "Show SQL"
+msgstr "SQLを表示"
+
+#: ../../../../modules/director/library/Director/Web/Table/ApplyRulesTable.php:108
+msgid "Show affected Objects"
+msgstr "影響を受けるオブジェクトを表示"
+
+#: ../../../../modules/director/library/Director/Web/Form/IplElement/ExtensibleSetElement.php:457
+msgid "Show available options"
+msgstr "利用可能なオプションを表示"
+
+#: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:175
+msgid "Show based on filter"
+msgstr "フィルタに基づいて表示"
+
+#: ../../../../modules/director/library/Director/Web/Table/ActivityLogTable.php:91
+msgid "Show details related to this change"
+msgstr "この変更に関連する詳細を表示"
+
+#: ../../../../modules/director/library/Director/Web/ObjectPreview.php:51
+msgid "Show normal"
+msgstr "通常表示"
+
+#: ../../../../modules/director/library/Director/Web/ObjectPreview.php:60
+msgid "Show resolved"
+msgstr "インポート内容を展開して表示"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:33
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:31
+msgid "Simple match with wildcards (*)"
+msgstr "ワイルドカードとの単純一致(*)"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:332
+msgid "Single Object Diff"
+msgstr "単一オブジェクト差分"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/SingleServicesDashlet.php:11
+msgid "Single Services"
+msgstr "単一のサービス"
+
+#: ../../../../modules/director/library/Director/Web/Table/GeneratedConfigFileTable.php:86
+msgid "Size"
+msgstr "サイズ"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:110
+msgid "Skip key"
+msgstr "キーをスキップ"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:247
+#: ../../../../modules/director/application/controllers/BasketController.php:364
+msgid "Snapshot"
+msgstr "スナップショット"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:36
+#: ../../../../modules/director/application/controllers/BasketController.php:141
+#: ../../../../modules/director/library/Director/Web/Table/BasketTable.php:32
+msgid "Snapshots"
+msgstr "スナップショット"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:182
+msgid "Source Column"
+msgstr "ソースカラム"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:212
+msgid "Source Expression"
+msgstr "ソース表現"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:38
+msgid "Source Name"
+msgstr "ソース名"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:101
+msgid "Source Path"
+msgstr "ソースパス"
+
+#: ../../../../modules/director/application/forms/ImportSourceForm.php:33
+msgid "Source Type"
+msgstr "ソースタイプ"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:159
+msgid "Source columns"
+msgstr "ソースカラム"
+
+#: ../../../../modules/director/library/Director/Web/Table/SyncpropertyTable.php:62
+msgid "Source field"
+msgstr "ソースフィールド"
+
+#: ../../../../modules/director/library/Director/Web/Table/ImportrunTable.php:30
+#: ../../../../modules/director/library/Director/Web/Table/ImportsourceTable.php:18
+#: ../../../../modules/director/library/Director/Web/Table/SyncpropertyTable.php:61
+msgid "Source name"
+msgstr "ソース名"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:354
+msgid "Special properties"
+msgstr "特殊プロパティ"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:35
+msgid "Specific Element (by position)"
+msgstr "特定の要素(位置指定)"
+
+#: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:87
+msgid "Stage name"
+msgstr "ステージ名"
+
+#: ../../../../modules/director/library/Director/Web/Widget/SyncRunDetails.php:25
+msgid "Start time"
+msgstr "開始時間"
+
+#: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:88
+msgid "Startup"
+msgstr "スタートアップ"
+
+#: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:162
+msgid "Startup Log"
+msgstr "スタートアップログ"
+
+#: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:77
+msgid "State"
+msgstr "状態"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1614
+msgid "State and transition type filters"
+msgstr "状態フィルターと遷移タイプフィルター"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/TypeFilterSet.php:22
+msgid "State changes"
+msgstr "状態変化"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1589
+msgid "States"
+msgstr "状態"
+
+#: ../../../../modules/director/library/Director/Web/Widget/DeployedConfigInfoHeader.php:81
+msgid "Statistics"
+msgstr "統計"
+
+#: ../../../../modules/director/application/controllers/InspectController.php:43
+#: ../../../../modules/director/application/controllers/InspectController.php:151
+msgid "Status"
+msgstr "ステータス"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:134
+msgid "Stop sharing this Template"
+msgstr "このテンプレートの共有をやめる"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:107
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:496
+msgid "Store"
+msgstr "保存"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:36
+msgid "Store configuration"
+msgstr "設定を保存"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:33
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:72
+#: ../../../../modules/director/library/Director/DataType/DataTypeDatalist.php:65
+#: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:76
+#: ../../../../modules/director/library/Director/DataType/DataTypeSqlQuery.php:76
+msgid "String"
+msgstr "文字"
+
+#: ../../../../modules/director/application/views/helpers/FormDataFilter.php:534
+msgid "Strip this operator, preserve child nodes"
+msgstr "この演算子を取り除き、子ノードを保存します"
+
+#: ../../../../modules/director/library/Director/Web/Form/QuickForm.php:206
+msgid "Submit"
+msgstr "送信"
+
+#: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:139
+msgid "Succeeded"
+msgstr "成功しました"
+
+#: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:86
+msgid "Suggested fields"
+msgstr "サジェストされたフィールド"
+
+#: ../../../../modules/director/library/Director/Web/ActionBar/TemplateActionBar.php:37
+msgid "Switch to Table view"
+msgstr "テーブル表示に切り替え"
+
+#: ../../../../modules/director/library/Director/Web/ActionBar/TemplateActionBar.php:36
+msgid "Switch to Tree view"
+msgstr "ツリー表示に切り替え"
+
+#: ../../../../modules/director/application/controllers/SyncruleController.php:243
+#, php-format
+msgid "Sync \"%s\": %s"
+msgstr "同期 \"%s\": %s"
+
+#: ../../../../modules/director/application/controllers/SyncruleController.php:112
+msgid "Sync Properties"
+msgstr "同期プロパティ"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:30
+msgid "Sync Rules"
+msgstr "同期ルール"
+
+#: ../../../../modules/director/application/controllers/SyncruleController.php:278
+msgid "Sync history"
+msgstr "同期履歴"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:82
+#, php-format
+msgid ""
+"Sync only part of your imported objects with this rule. Icinga Web 2 filter "
+"syntax is allowed, so this could look as follows: %s"
+msgstr "インポートしたオブジェクトの一部だけをこのルールと同期します。 "
+"IcingaWeb2フィルタの構文が利用できます。例: %s"
+
+#: ../../../../modules/director/application/controllers/SyncruleController.php:215
+msgid "Sync properties"
+msgstr "同期プロパティ"
+
+#: ../../../../modules/director/application/controllers/SyncruleController.php:180
+#: ../../../../modules/director/application/controllers/SyncrulesController.php:25
+#: ../../../../modules/director/library/Director/Web/Tabs/ImportTabs.php:23
+#: ../../../../modules/director/library/Director/Web/Tabs/SyncRuleTabs.php:29
+#: ../../../../modules/director/library/Director/Web/Tabs/SyncRuleTabs.php:46
+msgid "Sync rule"
+msgstr "同期ルール"
+
+#: ../../../../modules/director/application/controllers/SyncruleController.php:32
+#: ../../../../modules/director/application/controllers/SyncruleController.php:152
+#, php-format
+msgid "Sync rule: %s"
+msgstr "同期ルール: %s"
+
+#: ../../../../modules/director/application/forms/SyncRunForm.php:42
+msgid "Synchronization failed"
+msgstr "同期が失敗しました。"
+
+#: ../../../../modules/director/library/Director/Job/SyncJob.php:80
+msgid "Synchronization rule"
+msgstr "同期ルール"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/SyncDashlet.php:14
+msgid "Synchronize"
+msgstr "同期"
+
+#: ../../../../modules/director/library/Director/Web/ActionBar/TemplateActionBar.php:30
+msgid "Table"
+msgstr "表"
+
+#: ../../../../modules/director/application/forms/RestoreBasketForm.php:51
+msgid "Target DB"
+msgstr "対象DB"
+
+#: ../../../../modules/director/application/forms/IcingaCloneObjectForm.php:60
+msgid "Target Service Set"
+msgstr "対象サービスセット"
+
+#: ../../../../modules/director/library/Director/DataType/DataTypeDatalist.php:63
+#: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:74
+#: ../../../../modules/director/library/Director/DataType/DataTypeSqlQuery.php:74
+msgid "Target data type"
+msgstr "対象データタイプ"
+
+#: ../../../../modules/director/application/forms/ImportRowModifierForm.php:44
+msgid "Target property"
+msgstr "対象プロパティ"
+
+#: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:156
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1053
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1057
+msgid "Template"
+msgstr "テンプレート"
+
+#: ../../../../modules/director/library/Director/Web/Table/TemplatesTable.php:51
+msgid "Template Name"
+msgstr "テンプレート名"
+
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:276
+#: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:113
+#, php-format
+msgid "Template: %s"
+msgstr "テンプレート: %s"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:687
+#: ../../../../modules/director/library/Director/Web/Table/DependencyTemplateUsageTable.php:10
+#: ../../../../modules/director/library/Director/Web/Table/HostTemplateUsageTable.php:10
+#: ../../../../modules/director/library/Director/Web/Table/NotificationTemplateUsageTable.php:10
+#: ../../../../modules/director/library/Director/Web/Table/ServiceTemplateUsageTable.php:10
+#: ../../../../modules/director/library/Director/Web/Table/TemplateUsageTable.php:23
+#: ../../../../modules/director/library/Director/Web/Tabs/ObjectsTabs.php:53
+#: ../../../../modules/director/library/Director/Web/Tree/TemplateTreeRenderer.php:43
+msgid "Templates"
+msgstr "テンプレート"
+
+#: ../../../../modules/director/library/Director/Job/ImportJob.php:67
+msgid "The \"Import\" job allows to run import actions at regular intervals"
+msgstr "「インポート」ジョブは定期的にインポートアクションを実行することを"
+"可能にします"
+
+#: ../../../../modules/director/library/Director/Job/SyncJob.php:65
+msgid "The \"Sync\" job allows to run sync actions at regular intervals"
+msgstr "「同期」ジョブを使用すると、定期的に同期アクションを実行できます。"
+
+#: ../../../../modules/director/application/forms/IcingaTimePeriodRangeForm.php:84
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:640
+#, php-format
+msgid "The %s has successfully been stored"
+msgstr "%s は正常に保存されました"
+
+#: ../../../../modules/director/library/Director/Job/ConfigJob.php:221
+msgid ""
+"The Config job allows you to generate and eventually deploy your Icinga 2 "
+"configuration"
+msgstr "構成ジョブを使用すると、Icinga 2構成を生成して設定の反映を"
+"することができます。"
+
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:37
+msgid "The Email address of the user."
+msgstr "ユーザーのEメールアドレス。"
+
+#: ../../../../modules/director/library/Director/Job/HousekeepingJob.php:21
+msgid ""
+"The Housekeeping job provides various task that keep your Director database "
+"fast and clean"
+msgstr "ハウスキーピングジョブは、Directorデータベースを高速かつクリーンに"
+"保つためのさまざまなタスクを提供します。"
+
+#: ../../../../modules/director/application/controllers/SettingsController.php:38
+msgid ""
+"The Icinga Director Self Service API allows your Hosts to register "
+"themselves. This allows them to get their Icinga Agent configured, installed "
+"and upgraded in an automated way."
+msgstr "Icinga Director セルフサービス APIを使用すると、ホストは自分自身を"
+"登録できます。 これにより、Icinga Agentを自動化された方法で設定、"
+"インストール、アップグレードすることができます。"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:45
+msgid ""
+"The Icinga Package name Director uses to deploy it's configuration. This "
+"defaults to \"director\" and should not be changed unless you really know "
+"what you're doing"
+msgstr "Directorがその設定を反映するために使用するIcingaパッケージ名。"
+" これはデフォルトで \"director\"に設定されているので、"
+"分からなければ変更しないでください。"
+
+#: ../../../../modules/director/library/Director/Import/ImportSourceLdap.php:69
+msgid ""
+"The LDAP properties that should be fetched. This is required to be a comma-"
+"separated list like: \"cn, dnshostname, operatingsystem, sAMAccountName\""
+msgstr "取得する必要があるLDAPプロパティ。これは、\"cn, dnshostname, "
+"operatingsystem, sAMAccountName\"のようにコンマ区切りのリストにする"
+"必要があります。"
+
+#: ../../../../modules/director/application/forms/IcingaForgetApiKeyForm.php:31
+#, php-format
+msgid "The Self Service API key for %s has been dropped"
+msgstr "%sのセルフサービスAPIキーを削除しました。"
+
+#: ../../../../modules/director/application/forms/IcingaAddServiceSetForm.php:116
+#, php-format
+msgid "The Service Set \"%s\" has been added to %d hosts"
+msgstr "サービスセット\"%s\"を%d 個のホストに追加しました。"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:162
+#, php-format
+msgid "The argument %s has successfully been stored"
+msgstr "引数%sは正常に保存されました"
+
+#: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:121
+msgid "The caption which should be displayed"
+msgstr "表示されるキャプション"
+
+#: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:151
+msgid ""
+"The caption which should be displayed to your users when this field is shown"
+msgstr "このフィールドが表示されたときにユーザーに表示されるキャプション"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:233
+msgid "The child host."
+msgstr "子ホスト"
+
+#: ../../../../modules/director/application/forms/IcingaCommandForm.php:62
+msgid ""
+"The command Icinga should run. Absolute paths are accepted as provided, "
+"relative paths are prefixed with \"PluginDir + \", similar Constant prefixes "
+"are allowed. Spaces will lead to separation of command path and standalone "
+"arguments. Please note that this means that we do not support spaces in "
+"plugin names and paths right now."
+msgstr "Icingaが実行するコマンドです。 絶対パスは指定どおりに受け入れられ、"
+"相対パスの先頭には \"PluginDir +\"が付きます。同様の定数プレフィックスが"
+"許可されます。 スペースは、コマンドパスとスタンドアロン引数の分離に"
+"つながります。 これは、現時点ではプラグイン名とパスでスペースをサポート"
+"していないことを意味します。"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:161
+msgid "The corresponding password"
+msgstr "対応するパスワード"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierStripDomain.php:14
+msgid "The domain name you want to be stripped"
+msgstr "削除したいドメイン名"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:18
+msgid "The first (leftmost) CN"
+msgstr "最初(一番左)のCN"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:19
+msgid "The first (leftmost) OU"
+msgstr "最初(一番左)のOU"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:726
+#, php-format
+msgid "The given properties have been stored for \"%s\""
+msgstr "プロパティが\"%s\" に保存されました。"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1592
+msgid "The host/service states you want to get notifications for"
+msgstr "通知を受け取るホスト/サービスの状態"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:21
+msgid "The last (rightmost) OU"
+msgstr "最後(一番右)のOU"
+
+#: ../../../../modules/director/library/Director/Web/Widget/JobDetails.php:51
+#, php-format
+msgid "The last attempt failed at %s: %s"
+msgstr "最後の試行は%sで失敗しました:%s"
+
+#: ../../../../modules/director/library/Director/Web/Widget/JobDetails.php:46
+#, php-format
+msgid "The last attempt succeeded at %s"
+msgstr "最後の試行は%sで成功しました"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/DeploymentDashlet.php:83
+msgid "The last deployment did not succeed"
+msgstr "最後の設定反映は成功しませんでした"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/DeploymentDashlet.php:85
+msgid "The last deployment is currently pending"
+msgstr "最後の設定反映は保留になっています。"
+
+#: ../../../../modules/director/application/forms/IcingaEndpointForm.php:42
+msgid "The log duration time."
+msgstr "接続が失われた場合の、監視ログの保存秒数"
+
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:160
+msgid ""
+"The name of a time period which determines when notifications to this User "
+"should be triggered. Not set by default."
+msgstr "このユーザーへの通知をいつトリガーするかを決定する期間の名前。"
+"デフォルトでは設定されていません。"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:140
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:231
+msgid ""
+"The name of a time period which determines when this notification should be "
+"triggered. Not set by default."
+msgstr "この通知をいつトリガーするかを決定する期間の名前。"
+" デフォルトでは設定されていません。"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1344
+msgid ""
+"The name of a time period which determines when this object should be "
+"monitored. Not limited by default."
+msgstr "監視を実行する期間の設定。デフォルトでは期間は無制限です。"
+
+#: ../../../../modules/director/application/forms/DirectorJobForm.php:62
+msgid ""
+"The name of a time period within this job should be active. Supports only "
+"simple time periods (weekday and multiple time definitions)"
+msgstr "有効なスケジュール設定を指定してください。"
+"曜日と複数の実行時間定義のみをサポートしています。"
+
+#: ../../../../modules/director/application/forms/IcingaHostVarForm.php:16
+msgid "The name of the host"
+msgstr "ホストの名称"
+
+#: ../../../../modules/director/application/forms/IcingaServiceVarForm.php:16
+msgid "The name of the service"
+msgstr "サービスの名称"
+
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:175
+msgid ""
+"The notification interval (in seconds). This interval is used for active "
+"notifications. Defaults to 30 minutes. If set to 0, re-notifications are "
+"disabled."
+msgstr "通知間隔(秒)。この間隔はアクティブ通知に使用されます。 デフォルトは30分です。 0に設定すると、再通知は無効になります。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierBitmask.php:16
+msgid ""
+"The numeric bitmask you want to apply. In case you have a hexadecimal or "
+"binary mask please transform it to a decimal number first. The result of "
+"this modifier is a boolean value, telling whether the given mask applies to "
+"the numeric value in your source column"
+msgstr "適用したい数値ビットマスク。 16進数または2進数のマスクがある場合は、"
+"まずそれを10進数に変換してください。 このプロパティ変換ルールの結果はブール値で、"
+"与えられたマスクがソースカラムの数値に適用されるかどうかを示します。"
+
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:42
+msgid "The pager address of the user."
+msgstr "ユーザの小型無線機のアドレス"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:194
+msgid "The parent host."
+msgstr "親ホスト"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRegexReplace.php:15
+msgid ""
+"The pattern you want to search for. This can be a regular expression like /"
+"^www\\d+\\./"
+msgstr "検索したいパターン。これは/^www\\d+\\./のような正規表現になります。"
+
+#: ../../../../modules/director/application/forms/IcingaEndpointForm.php:37
+msgid "The port of the endpoint."
+msgstr "エンドポイントのポート"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:144
+msgid ""
+"The port you are going to use. The default port 5665 will be used if none is "
+"set"
+msgstr "使用しようとしているポート。 何も設定されていない場合は、"
+"デフォルトのポート5665が使用されます。"
+
+#: ../../../../modules/director/application/forms/IcingaAddServiceForm.php:173
+#, php-format
+msgid "The service \"%s\" has been added to %d hosts"
+msgstr "サービス \"%s\" が %d 個のホストに追加されました"
+
+#: ../../../../modules/director/application/forms/IcingaAddServiceSetForm.php:88
+msgid "The service Set that should be assigned"
+msgstr "割り当てるべきサービスセット"
+
+#: ../../../../modules/director/application/forms/IcingaServiceSetForm.php:87
+msgid "The service set that should be assigned to this host"
+msgstr "このホストに割り当てるべきサービスセット"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1602
+msgid "The state transition types you want to get notifications for"
+msgstr "通知を受け取る状態遷移の種類"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRegexReplace.php:23
+msgid "The string that should be used as a preplacement"
+msgstr "置き換えに使用される文字列"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierReplace.php:14
+msgid "The string you want to search for"
+msgstr "検索したい文字列"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:41
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:43
+msgid ""
+"The string/pattern you want to search for. Depends on the chosen method, use "
+"www.* or *linux* for wildcard matches and expression like /^www\\d+\\./ in "
+"case you opted for a regular expression"
+msgstr "検索したい文字列/パターン。 選択した方法によって異なりますが、"
+"ワイルドカードの一致には www.* または *linux* を使用し、正規表現を"
+"選択した場合は/^www\\d+\\./のような表現を使用してください。"
+
+#: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:141
+msgid ""
+"The unique name of the field. This will be the name of the custom variable "
+"in the rendered Icinga configuration."
+msgstr "フィールドの名前。一意である必要があります。"
+"この名前はホストやサービス等のicingaの設定で定義するカスタム変数の"
+"名前になります。"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:168
+msgid "The user that should run the Icinga 2 service on Windows."
+msgstr "Windows上でIcinga 2サービスを実行する必要があるユーザー。"
+
+#: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:72
+#, php-format
+msgid ""
+"There are %d objects with a related property. Should I also remove the \"%s"
+"\" property from them?"
+msgstr "%d個のオブジェクトが関連プロパティを持っています。"
+"それらのオブジェクトからも\"%s\"プロパティを削除しますか? "
+
+#: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:116
+#, php-format
+msgid ""
+"There are %d objects with a related property. Should I also rename the \"%s"
+"\" property to \"%s\" on them?"
+msgstr "%d個のオブジェクトが関連プロパティを持っています。 "
+"それらのオブジェクトの\"%s\"プロパティの名前も\"%s \"に変更しますか?"
+
+#: ../../../../modules/director/application/forms/DeploymentLinkForm.php:64
+#, php-format
+msgid "There are %d pending changes"
+msgstr "%d 個の保留された変更があります。"
+
+#: ../../../../modules/director/application/forms/DeploymentLinkForm.php:77
+#, php-format
+msgid "There are %d pending changes, %d of them applied to this object"
+msgstr "%d 個の保留された変更があります。それらのうち、%d 個が"
+"このオブジェクトに適用されます。"
+
+#: ../../../../modules/director/library/Director/Web/Navigation/Renderer/ConfigHealthItemRenderer.php:88
+#, php-format
+msgid "There are %d pending database migrations"
+msgstr "%d 個の保留されたデータベース移行があります。"
+
+#: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:109
+msgid ""
+"There are no data fields available. Please ask an administrator to create "
+"such"
+msgstr "利用可能なデータフィールドがありません。"
+"作成するように管理者に依頼してください。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/DeploymentDashlet.php:91
+msgid "There are no pending changes"
+msgstr "保留中の変更はありません"
+
+#: ../../../../modules/director/application/forms/DeployConfigForm.php:36
+msgid "There are no pending changes. Deploy anyways"
+msgstr "設定を反映する(保留中の変更はありません。)"
+
+#: ../../../../modules/director/library/Director/Web/Widget/ImportSourceDetails.php:58
+msgid ""
+"There are pending changes for this Import Source. You should trigger a new "
+"Import Run."
+msgstr "このインポートソースには保留中の変更があります。"
+"新しいインポート処理をトリガする必要があります。"
+
+#: ../../../../modules/director/application/controllers/SyncruleController.php:74
+msgid ""
+"There are pending changes for this Sync Rule. You should trigger a new Sync "
+"Run."
+msgstr "この同期ルールには保留中の変更があります。 新しい同期処理をトリガする必要があります。"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:62
+msgid "There are pending database migrations"
+msgstr "保留中のデータベース移行があります。"
+
+#: ../../../../modules/director/application/forms/DeploymentLinkForm.php:69
+msgid ""
+"There has been a single change to this object, nothing else has been modified"
+msgstr "このオブジェクトには1つの変更があり、他の変更はありません。"
+
+#: ../../../../modules/director/application/forms/DeploymentLinkForm.php:72
+#, php-format
+msgid ""
+"There have been %d changes to this object, nothing else has been modified"
+msgstr "このオブジェクトには%d個の変更があり、他の変更はありません。"
+
+#: ../../../../modules/director/application/forms/DeploymentLinkForm.php:61
+msgid "There is a single pending change"
+msgstr "保留中の変更が1つあります。"
+
+#: ../../../../modules/director/application/forms/DirectorJobForm.php:21
+msgid "These are different available job types"
+msgstr "様々な利用可能なジョブタイプがあります。"
+
+#: ../../../../modules/director/application/forms/ImportSourceForm.php:37
+msgid ""
+"These are different data providers fetching data from various sources. You "
+"didn't find what you're looking for? Import sources are implemented as a "
+"hook in Director, so you might find (or write your own) Icinga Web 2 module "
+"fetching data from wherever you want"
+msgstr "さまざまなソースからデータを取得するさまざまなデータプロバイダ。"
+"なお、インポートソースはDirectorのフックとして"
+"実装されているので、Icinga Web 2モジュールが必要な場所からデータを取得"
+"している(または自分で作成した)可能性があります。"
+
+#: ../../../../modules/director/application/controllers/CommandController.php:71
+#, php-format
+msgid "This Command is currently being used by %s"
+msgstr "このコマンドは現在%s によって使用されています"
+
+#: ../../../../modules/director/application/controllers/CommandController.php:78
+msgid "This Command is currently not in use"
+msgstr "このコマンドは現在使用されていません"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:895
+#, php-format
+msgid "This Command is still in use by %d other objects"
+msgstr "このコマンドはまだほかの %d 個のオブジェクトに使用されています"
+
+#: ../../../../modules/director/library/Director/Web/Widget/ImportSourceDetails.php:65
+#, php-format
+msgid "This Import Source failed when last checked at %s: %s"
+msgstr "このインポートソースは %s に行われた監視で失敗しました: %s "
+
+#: ../../../../modules/director/library/Director/Web/Widget/ImportSourceDetails.php:73
+#, php-format
+msgid "This Import Source has an invalid state: %s"
+msgstr "このインポートソースは無効な状態です: %s"
+
+#: ../../../../modules/director/application/forms/ImportCheckForm.php:33
+msgid "This Import Source provides modified data"
+msgstr "このインポートソースは変更されたデータを提供します"
+
+#: ../../../../modules/director/library/Director/Web/Widget/ImportSourceDetails.php:48
+#, php-format
+msgid "This Import Source was last found to be in sync at %s."
+msgstr "このインポートソースは最後に%sに同期していることがわかりました"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:134
+msgid "This Service has been blacklisted on this host"
+msgstr "このサービスはこのホストでブラックリストに登録されています"
+
+#: ../../../../modules/director/application/controllers/SyncruleController.php:81
+#, php-format
+msgid "This Sync Rule failed when last checked at %s: %s"
+msgstr "この同期ルールは、最後に %s に監視されたときに失敗しました: %s"
+
+#: ../../../../modules/director/application/controllers/SyncruleController.php:51
+msgid "This Sync Rule has never been run before."
+msgstr "この同期ルールは一度も実行されたことがありません。"
+
+#: ../../../../modules/director/application/controllers/SyncruleController.php:63
+#, php-format
+msgid "This Sync Rule was last found to by in Sync at %s."
+msgstr "この同期ルールは、%sの同期で最後に見つかったものです。"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:104
+msgid ""
+"This allows to filter for specific parts within the given source expression. "
+"You are allowed to refer all imported columns. Examples: host=www* would set "
+"this property only for rows imported with a host property starting with \"www"
+"\". Complex example: host=www*&!(address=127.*|address6=::1)"
+msgstr "指定された元の表現内の特定の部分をフィルタリングできます。 "
+"インポートされたすべてのカラムを参照することが許可されています。 "
+"例)「host=www*」 は、\"www\"で始まるホストプロパティでインポートされた行に"
+"対してのみこのプロパティを設定します。 "
+"複雑な例:host=www*&!(address=127.*|address6=::1)"
+
+#: ../../../../modules/director/application/forms/DirectorJobForm.php:39
+msgid "This allows to temporarily disable this job"
+msgstr "これにより、このジョブを一時的に無効にすることができます"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:115
+#: ../../../../modules/director/application/forms/IcingaHostGroupForm.php:30
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:106
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:448
+#: ../../../../modules/director/application/forms/IcingaServiceGroupForm.php:30
+msgid ""
+"This allows you to configure an assignment filter. Please feel free to "
+"combine as many nested operators as you want"
+msgstr "これにより、条件フィルタを設定できます。 入れ子にした演算子を"
+"自由に組み合わせることも可能です。"
+
+#: ../../../../modules/director/application/forms/IcingaServiceSetForm.php:121
+msgid ""
+"This allows you to configure an assignment filter. Please feel free to "
+"combine as many nested operators as you want. You might also want to skip "
+"this, define it later and/or just add this set of services to single hosts"
+msgstr "これにより、条件フィルタを設定できます。 入れ子にした演算子を"
+"自由に組み合わせることも可能です。これをスキップして後で定義したり、"
+"このサービスセットを単一のホストに追加したりすることもできます。"
+
+#: ../../../../modules/director/library/Director/Job/ConfigJob.php:197
+msgid "This allows you to immediately deploy a modified configuration"
+msgstr "これにより、変更した設定をすぐに反映できます。"
+
+#: ../../../../modules/director/library/Director/ProvidedHook/CubeLinks.php:37
+#, php-format
+msgid "This allows you to modify properties for \"%s\""
+msgstr "これにより、\"%s\" のプロパティを編集できます"
+
+#: ../../../../modules/director/library/Director/ProvidedHook/CubeLinks.php:54
+msgid "This allows you to modify properties for all chosen hosts at once"
+msgstr "これにより、選択したすべてのホストのプロパティを一括で編集できます"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:62
+msgid "This basket is empty"
+msgstr "このバスケットは空です"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:253
+msgid "This has to be a MySQL or PostgreSQL database"
+msgstr "MySQLまたはPostgreSQLデータベースでなければなりません"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:62
+msgid ""
+"This host has been registered via the Icinga Director Self Service API. In "
+"case you re-installed the host or somehow lost it's secret key, you might "
+"want to dismiss the current key. This would allow you to register the same "
+"host again."
+msgstr "このホストはIcinga Director セルフサービス APIを介して登録されてい"
+"ます。ホストを再インストールした場合や、何らかの理由でその秘密鍵を"
+"失った場合、現在の鍵を消すことができます。"
+"これにより、同じホストを再度登録することができます。"
+
+#: ../../../../modules/director/application/controllers/InspectController.php:73
+msgid "This is an abstract object type."
+msgstr "これは抽象オブジェクト型です。"
+
+#: ../../../../modules/director/library/Director/Web/Controller/TemplateController.php:176
+#, php-format
+msgid "This is the \"%s\" %s Template. Based on this, you might want to:"
+msgstr "これは%sの「%s」テンプレートです。テンプレートを利用して次のことができます。"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:119
+msgid ""
+"This is the name of the Endpoint object (and certificate name) you created "
+"for your ApiListener object. In case you are unsure what this means please "
+"make sure to read the documentation first"
+msgstr "これは、ApiListenerオブジェクト用に作成したエンドポイントオブジェクト"
+"の名前(および証明書の名前)です。 これが何を意味するのかよくわからない場合"
+"は、必ず最初にドキュメントを読むようにしてください。"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/HostsDashlet.php:17
+msgid ""
+"This is where you add all your servers, containers, network or sensor "
+"devices - and much more. Every subject worth to be monitored"
+msgstr "監視対象にするすべてのサーバー、コンテナー、ネットワーク、またはセンサーデバイスなどを追加できます"
+
+#: ../../../../modules/director/library/Director/Dashboard/HostsDashboard.php:22
+msgid ""
+"This is where you manage your Icinga 2 Host Checks. Host templates are your "
+"main building blocks. You can bundle them to \"choices\", allowing (or "
+"forcing) your users to choose among a given set of preconfigured templates."
+msgstr "Icinga 2ホスト監視を管理します。"
+"ホストテンプレートは主な構成要素です。 事前に設定した複数のテンプレートを組み合わせて「チョイス」を作成し、ユーザーがチョイスにに従って設定でできるようにする(または強制する)ことができます。"
+
+#: ../../../../modules/director/library/Director/Dashboard/ServicesDashboard.php:24
+msgid ""
+"This is where you manage your Icinga 2 Service Checks. Service Templates are "
+"your base building blocks, Service Sets allow you to assign multiple "
+"Services at once. Apply Rules make it possible to assign Services based on "
+"Host properties. And the list of all single Service Objects gives you the "
+"possibility to still modify (or delete) many of them at once."
+msgstr "Icinga 2 サービス監視設定を管理します。 サービステンプレートは、"
+"サービス監視設定の基本的な構成要素です。サービスセットを使用すると、一度に"
+"複数のサービス監視設定をまとめることができます。適用ルールを使用すると、"
+"ホスト設定を条件にして、サービス監視設定を動的に割り当てることができます。"
+" そして、すべての複数のサービスオブジェクを一度に変更(または削除)できます。"
+
+#: ../../../../modules/director/library/Director/Dashboard/UsersDashboard.php:21
+msgid ""
+"This is where you manage your Icinga 2 User (Contact) objects. Try to keep "
+"your User objects simply by movin complexity to your templates. Bundle your "
+"users in groups and build Notifications based on them. Running MS Active "
+"Directory or another central User inventory? Stay away from fiddling with "
+"manual config, try to automate all the things with Imports and related Sync "
+"Rules!"
+msgstr "Icinga 2 User(コンタクト)オブジェクトを管理します。 テンプレートに"
+"複雑さを加えるだけで、ユーザーオブジェクトを維持するようにしてください。 "
+"ユーザーをグループにまとめ、それらに基づいて通知を作成します。 MS Active "
+"DirectoryまたはLDAPなどの他の中央ユーザーインベントリを実行していますか?"
+"設定を手動でいじるのを避け、インポートや関連する同期ルールを使ってすべて"
+"のことを自動化してみてください。"
+
+#: ../../../../modules/director/library/Director/Dashboard/InfrastructureDashboard.php:24
+msgid ""
+"This is where you manage your Icinga 2 infrastructure. When adding a new "
+"Icinga Master or Satellite please re-run the Kickstart Helper once.\n"
+"\n"
+"When you feel the desire to manually create Zone or Endpoint objects please "
+"rethink this twice. Doing so is mostly the wrong way, might lead to a dead "
+"end, requiring quite some effort to clean up the whole mess afterwards."
+msgstr "Icinga 2インフラストラクチャを管理します。 新しいIcinga Masterまたは"
+"サテライトを追加するときは、キックスタートウィザードをもう一度実行してください。\n"
+"\n"
+"手動でZoneまたはEndpointオブジェクトを作成したいときは、よく考えて"
+"ください。 手動での作成は間違った方法であり、その後の混乱を招く恐れがあります。"
+
+#: ../../../../modules/director/library/Director/Web/Table/ObjectsTableEndpoint.php:45
+msgid "This is your Config master and will receive our Deployments"
+msgstr "これは設定マスタで、設定情報を受信します。"
+# smori
+
+#: ../../../../modules/director/library/Director/Web/Widget/JobDetails.php:57
+msgid "This job has not been executed yet"
+msgstr "このジョブは一度も実行されていません"
+
+#: ../../../../modules/director/library/Director/Web/Widget/JobDetails.php:33
+#, php-format
+msgid "This job runs every %ds and is currently pending"
+msgstr "このジョブは %d 秒ごとに実行され、現在は保留されています。"
+
+#: ../../../../modules/director/library/Director/Web/Widget/JobDetails.php:37
+#, php-format
+msgid "This job runs every %ds."
+msgstr "このジョブは %d 秒ごとに実行されます"
+
+#: ../../../../modules/director/library/Director/Web/Widget/JobDetails.php:24
+#, php-format
+msgid ""
+"This job would run every %ds. It has been disabled and will therefore not be "
+"executed as scheduled"
+msgstr "このジョブは %d 秒ごとに実行されます。無効になっているため、スケジュールどおりに実行されません"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMakeBoolean.php:33
+msgid ""
+"This modifier transforms 0/\"0\"/false/\"false\"/\"n\"/\"no\" to false and "
+"1, \"1\", true, \"true\", \"y\" and \"yes\" to true, both in a case "
+"insensitive way. What should happen if the given value does not match any of "
+"those? You could return a null value, or default to false or true. You might "
+"also consider interrupting the whole import process as of invalid source data"
+msgstr "このプロパティ変換ルールは、0、\"0\"、false、\"false\"、\"n\"、\"no\"を false"
+" に、1、\"1\"、true、\"true\"、\"y\"、\"yes\"をtrueに変換します。 大文字と"
+"小文字を区別しません。 与えられた値がそれらのどれとも一致しない場合に、どう"
+"処理させるかを、このセレクトボックスで指定します。 null値を返すことも、"
+"デフォルトをfalseまたはtrueにすることも可能です。 また、無効なソースデータ"
+"としてインポートプロセス全体を中断することもできます。"
+
+#: ../../../../modules/director/application/forms/ImportSourceForm.php:89
+msgid ""
+"This must be a column containing unique values like hostnames. Unless "
+"otherwise specified this will then be used as the object_name for the "
+"syncronized Icinga object. Especially when getting started with director "
+"please make sure to strictly follow this rule. Duplicate values for this "
+"column on different rows will trigger a failure, your import run will not "
+"succeed. Please pay attention when synching services, as \"purge\" will only "
+"work correctly with a key_column corresponding to host!name. Check the "
+"\"Combine\" property modifier in case your data source cannot provide such a "
+"field"
+msgstr "これは、ホスト名などの一意の値を含む列である必要があります。"
+"特に指定のない限り、これは同期化されたIcingaオブジェクトのobject_nameとして"
+"使用されます。 特にdirectorを始めるときは、必ずこの規則に厳密に従って"
+"ください。この列の値が異なる行に重複していると失敗し、インポートは成功"
+"しません。 \"purge\"はhost!nameに対応するkey_columnでのみ正しく機能するので、"
+"サービスを同期するときは注意してください。 データソースがそのような"
+"フィールドを提供できない場合は、\"Combine\"プロパティ変換ルールを確認してください。"
+
+#: ../../../../modules/director/application/forms/ImportRowModifierForm.php:31
+msgid "This must be an import source column (property)"
+msgstr "これはインポートソースのカラム(プロパティ)である必要があります"
+
+#: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:414
+msgid "This object has been disabled"
+msgstr "このオブジェクトは無効化されています。"
+
+#: ../../../../modules/director/library/Director/Web/Widget/ActivityLogInfo.php:409
+msgid "This object has been enabled"
+msgstr "このオブジェクトは有効化されています。"
+
+#: ../../../../modules/director/library/Director/Web/ObjectPreview.php:76
+msgid "This object will not be deployed as it has been disabled"
+msgstr "このオブジェクトは無効化されているため設定が反映されません。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierCombine.php:17
+msgid ""
+"This pattern will be evaluated, and variables like ${some_column} will be "
+"filled accordingly. A typical use-case is generating unique service "
+"identifiers via ${host}!${service} in case your data source doesn't allow "
+"you to ship such. The chosen \"property\" has no effect here and will be "
+"ignored."
+msgstr "このパターンが評価され、それに応じて ${some_column} のような変数が"
+"埋められます。 典型的なユースケースは ${host}!${service}でユニークな"
+"サービス識別子を生成することです。 選択された「プロパティ」はここでは"
+"効果がなく、無視されます。"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:234
+msgid ""
+"This requires the Icinga Agent to be installed. It generates and signs it's "
+"certificate and it also generates a minimal icinga2.conf to get your agent "
+"connected to it's parents"
+msgstr "これには、Icinga Agentをインストールする必要があります。 証明書を"
+"生成して署名し、エージェントをその親に接続するための最小限のicinga2.confも"
+"生成します。"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:371
+#, php-format
+msgid ""
+"This service belongs to the %s Service Set. Still, you might want to "
+"override the following properties for this host only."
+msgstr "このサービスは %s サービスセットに属しています。それでも、"
+"このホストに対してのみ次のプロパティを上書きすることをお勧めします。"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:415
+#, php-format
+msgid ""
+"This service belongs to the service set \"%s\". Still, you might want to "
+"change the following properties for this host only."
+msgstr "このサービスはサービスセット \"%s\" に属しています。 それでも、"
+"このホストに対してのみ次のプロパティを変更することをお勧めします。"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:352
+msgid ""
+"This service has been generated in an automated way, but still allows you to "
+"override the following properties in a safe way."
+msgstr "このサービスは自動化された方法で生成されていますが、それでも"
+"次のプロパティを安全な方法に上書きすることができます。"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:358
+#, php-format
+msgid ""
+"This service has been generated using the %s apply rule, assigned where %s"
+msgstr "このサービスは%s適用ルールを使用して生成されました。"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:383
+#, php-format
+msgid ""
+"This service has been inherited from %s. Still, you might want to change the "
+"following properties for this host only."
+msgstr "このサービスは%sから継承されました。 それでも、このホストに対してのみ"
+"次のプロパティを変更することをお勧めします。"
+
+#: ../../../../modules/director/library/Director/Web/Table/IcingaServiceSetServiceTable.php:196
+#, php-format
+msgid "This set has been inherited from %s"
+msgstr "このセットは%sから継承されました"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/KickstartDashlet.php:17
+msgid ""
+"This synchronizes Icinga Director to your Icinga 2 infrastructure. A new run "
+"should be triggered on infrastructure changes"
+msgstr "Icinga Director を Icinga 2 インフラストラクチャに同期します。"
+"インフラストラクチャの変更時に新しい実行がトリガされるはずです"
+
+#: ../../../../modules/director/library/Director/Web/Table/TemplateUsageTable.php:104
+msgid "This template is not in use"
+msgstr "このテンプレートは使用されていません"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:885
+#, php-format
+msgid "This template is still in use by %d other objects"
+msgstr "このテンプレートは %d 個のほかのオブジェクトに利用されています。"
+
+#: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:51
+msgid "This will be shown as a label for the given choice"
+msgstr "与えられた選択肢に対するラベルを示します"
+
+#: ../../../../modules/director/application/forms/DirectorDatalistEntryForm.php:33
+msgid "This will be the visible caption for this entry"
+msgstr "この項目に入力した名前がユーザに見えるラベルになります"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:123
+msgid "This will invalidate the former key"
+msgstr "これは以前のキーを無効にします"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:224
+msgid "Ticket"
+msgstr "チケット"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:21
+msgid "Time Period"
+msgstr "スケジュール"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:26
+msgid "Time Periods"
+msgstr "スケジュール"
+
+#: ../../../../modules/director/application/forms/DirectorJobForm.php:60
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:138
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:229
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:158
+msgid "Time period"
+msgstr "スケジュール"
+
+#: ../../../../modules/director/application/controllers/TimeperiodController.php:17
+msgid "Time period ranges"
+msgstr "スケジュールの期間"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:319
+msgid "Time ranges"
+msgstr "スケジュール"
+
+#: ../../../../modules/director/application/forms/IcingaCommandForm.php:70
+msgid "Timeout"
+msgstr "タイムアウト"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/TimeperiodTemplateDashlet.php:13
+msgid "Timeperiod Templates"
+msgstr "スケジュールテンプレート"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/TimeperiodObjectDashlet.php:16
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/TimeperiodsDashlet.php:13
+#: ../../../../modules/director/library/Director/Web/Table/IcingaTimePeriodRangeTable.php:46
+msgid "Timeperiods"
+msgstr "スケジュール"
+
+msgid "Timeperiod"
+msgstr "スケジュール"
+
+msgid "TimePeriod"
+msgstr "スケジュール"
+
+msgid "TimePeriods"
+msgstr "スケジュール"
+
+#: ../../../../modules/director/application/forms/IcingaTimePeriodRangeForm.php:28
+msgid "Timerperiods"
+msgstr "スケジュール"
+
+#: ../../../../modules/director/library/Director/Web/Table/ImportrunTable.php:31
+msgid "Timestamp"
+msgstr "タイムスタンプ"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:46
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:154
+msgid ""
+"To ensure downloaded packages are build by the Icinga Team and not "
+"compromised by third parties, you will be able to provide an array of SHA1 "
+"hashes here. In case you have defined any hashses, the module will not "
+"continue with updating / installing the Agent in case the SHA1 hash of the "
+"downloaded MSI package is not matching one of the provided hashes of this "
+"setting"
+msgstr "ダウンロードしたパッケージがIcingaチームによって構築され、"
+"第三者によって侵害されないようにするために、ここでSHA1ハッシュの配列を"
+"提供することができます。 ハッシュを定義した場合、ダウンロードしたMSI"
+"パッケージのSHA1ハッシュがこの設定で提供されているハッシュの1つと一致"
+"しない場合、モジュールはエージェントの更新/インストールを続行しません。"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:197
+msgid "Top Down"
+msgstr "トップダウン"
+
+#: ../../../../modules/director/library/Director/Web/Table/TemplateUsageTable.php:57
+msgid "Total"
+msgstr "合計"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:31
+msgid "Transform Host Name"
+msgstr "ホスト名を変換"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:37
+msgid "Transform to lowercase"
+msgstr "小文字に変換"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:38
+msgid "Transform to uppercase"
+msgstr "大文字に変換"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1599
+msgid "Transition types"
+msgstr "状態遷移タイプ"
+
+#: ../../../../modules/director/library/Director/Web/ActionBar/TemplateActionBar.php:30
+msgid "Tree"
+msgstr "ツリー"
+
+#: ../../../../modules/director/application/forms/ImportRunForm.php:23
+msgid "Trigger Import Run"
+msgstr "インポート実行をトリガ"
+
+#: ../../../../modules/director/application/forms/SyncRunForm.php:23
+msgid "Trigger this Sync"
+msgstr "この同期をトリガ"
+
+#: ../../../../modules/director/application/forms/ImportRunForm.php:45
+msgid "Triggering this Import Source failed"
+msgstr "このインポートソースのトリガに失敗しました"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/SettingsDashlet.php:17
+msgid "Tweak some global Director settings"
+msgstr "グローバルなdirector設定を調整します"
+
+#: ../../../../modules/director/library/Director/Web/Table/CoreApiFieldsTable.php:73
+msgid "Type"
+msgstr "タイプ"
+
+#: ../../../../modules/director/application/controllers/InspectController.php:84
+msgid "Type attributes"
+msgstr "タイプ属性"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:167
+#: ../../../../modules/director/library/Director/DataType/DataTypeSqlQuery.php:27
+#, php-format
+msgid "Unable to fetch data: %s"
+msgstr "データを取得できません: %s"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:364
+msgid ""
+"Unable to store a host with the given properties because of insufficient "
+"permissions"
+msgstr "権限が不十分なため、指定されたプロパティでホストを保存できません"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:339
+#, php-format
+msgid ""
+"Unable to store the configuration to \"%s\". Please check file permissions "
+"or manually store the content shown below"
+msgstr "設定を\"%s\"に保存できません。 ファイルのアクセス権を確認するか、"
+"以下に示す内容を手動で保存してください。"
+
+#: ../../../../modules/director/library/Director/Db/Housekeeping.php:49
+msgid "Undeployed configurations"
+msgstr "未反映の設定"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/StateFilterSet.php:27
+msgid "Unknown"
+msgstr "Unknown (不明)"
+
+#: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:136
+msgid "Unknown, failed to collect related information"
+msgstr "不明、関連情報の収集に失敗しました"
+
+#: ../../../../modules/director/library/Director/Web/Widget/DeploymentInfo.php:134
+msgid "Unknown, still waiting for config check outcome"
+msgstr "不明、まだ設定の検査の結果を待っています"
+
+#: ../../../../modules/director/library/Director/Db/Housekeeping.php:53
+msgid "Unlinked imported properties"
+msgstr "インポートされたプロパティをリンク解除しました"
+
+#: ../../../../modules/director/library/Director/Db/Housekeeping.php:51
+msgid "Unlinked imported row sets"
+msgstr "インポートされた行セットをリンク解除しました"
+
+#: ../../../../modules/director/library/Director/Db/Housekeeping.php:52
+msgid "Unlinked imported rows"
+msgstr "インポートされた行をリンク解除しました"
+
+#: ../../../../modules/director/application/controllers/PhperrorController.php:19
+msgid "Unsatisfied dependencies"
+msgstr "未解決の依存関係"
+
+#: ../../../../modules/director/library/Director/Db/Housekeeping.php:50
+msgid "Unused rendered files"
+msgstr "使用されていない設定ファイル"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/StateFilterSet.php:20
+msgid "Up"
+msgstr "Up (起動)"
+
+#: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:25
+msgid "Update Method"
+msgstr "アップデート方法"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:49
+msgid "Update Policy"
+msgstr "アップデートポリシー"
+
+#: ../../../../modules/director/application/controllers/BasketsController.php:26
+#: ../../../../modules/director/application/forms/BasketUploadForm.php:43
+msgid "Upload"
+msgstr "アップロード"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:120
+msgid "Upload a Basket"
+msgstr "バスケットをアップロード"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:121
+msgid "Upload a Configuration Basket"
+msgstr "構成バスケットをアップロード"
+
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:295
+msgid "Usage"
+msgstr "使用状況"
+
+#: ../../../../modules/director/library/Director/Web/Widget/AdditionalTableActions.php:101
+#, php-format
+msgid "Usage (%s)"
+msgstr "使用状況(%s)"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:71
+msgid "Use a local file or network share"
+msgstr "ローカルファイルまたはネットワーク共有を使用"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:18
+msgid "Use lowercase first"
+msgstr "最初に小文字を使用"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:271
+msgid "Used sources"
+msgstr "ソースを使用"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:17
+#: ../../../../modules/director/library/Director/TranslationDummy.php:17
+msgid "User"
+msgstr "ユーザ"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:18
+msgid "User Group"
+msgstr "ユーザグループ"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/UserGroupsDashlet.php:11
+msgid "UserGroups"
+msgstr "ユーザグループ"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/UserTemplateDashlet.php:13
+msgid "User Templates"
+msgstr "ユーザテンプレート"
+
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:153
+#: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:60
+msgid "User groups"
+msgstr "ユーザグループ"
+
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:113
+msgid ""
+"User groups that should be directly assigned to this user. Groups can be "
+"useful for various reasons. You might prefer to send notifications to groups "
+"instead of single users"
+msgstr "このユーザーに直接割り当てる必要があるユーザーグループ。 "
+"グループはさまざまな理由で役に立ちます。 単一のユーザーではなくグループに"
+"通知を送信することをお勧めします。"
+
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:155
+msgid "User groups that should be notified by this notifications"
+msgstr "通知先のユーザグループ"
+
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:194
+msgid "User properties"
+msgstr "ユーザプロパティ"
+
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:22
+msgid "User template name"
+msgstr "ユーザテンプレート名"
+
+#: ../../../../modules/director/application/forms/IcingaUserGroupForm.php:17
+msgid "Usergroup"
+msgstr "ユーザグループ"
+
+#: ../../../../modules/director/library/Director/Import/ImportSourceCoreApi.php:63
+msgid "Usergroups"
+msgstr "ユーザグループ"
+
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:28
+msgid "Username"
+msgstr "ユーザ名"
+
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:128
+#: ../../../../modules/director/library/Director/DataType/DataTypeDirectorObject.php:59
+#: ../../../../modules/director/library/Director/Import/ImportSourceCoreApi.php:62
+#: ../../../../modules/director/library/Director/Web/Table/CustomvarTable.php:47
+#: ../../../../modules/director/library/Director/Web/Table/CustomvarVariantsTable.php:62
+msgid "Users"
+msgstr "ユーザ"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/UserObjectDashlet.php:16
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/UsersDashlet.php:13
+msgid "Users / Contacts"
+msgstr "ユーザ / コンタクト"
+
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:130
+msgid "Users that should be notified by this notifications"
+msgstr "この通知によって通知されるべきユーザ"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ServiceApplyRulesDashlet.php:17
+msgid ""
+"Using Apply Rules a Service can be applied to multiple hosts at once, based "
+"on filters dealing with any combination of their properties"
+msgstr "適用ルールを使用すると、サービスは、それらのプロパティの任意の"
+"組み合わせを処理するフィルタに基づいて、一度に複数のホストに適用できます。"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:317
+#: ../../../../modules/director/application/forms/IcingaHostSelfServiceForm.php:44
+msgid "Usually your hosts main IPv6 address"
+msgstr "通常はホストのメインのIPv6アドレス"
+
+#: ../../../../modules/director/application/forms/CustomvarForm.php:21
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:45
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:54
+#: ../../../../modules/director/application/forms/IcingaHostVarForm.php:27
+#: ../../../../modules/director/application/forms/IcingaServiceVarForm.php:27
+#: ../../../../modules/director/library/Director/Web/Table/IcingaCommandArgumentTable.php:46
+msgid "Value"
+msgstr "値"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:31
+msgid "Value type"
+msgstr "値のタイプ"
+
+#: ../../../../modules/director/library/Director/Web/Table/CustomvarVariantsTable.php:56
+msgid "Variable Value"
+msgstr "変数値"
+
+#: ../../../../modules/director/application/forms/CustomvarForm.php:16
+#: ../../../../modules/director/library/Director/Web/Table/CustomvarTable.php:41
+msgid "Variable name"
+msgstr "変数名"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1412
+msgid "Volatile"
+msgstr "揮発性"
+
+#: ../../../../modules/director/library/Director/Dashboard/TimeperiodsDashboard.php:20
+msgid ""
+"Want to define to execute specific checks only withing specific time "
+"periods? Get mobile notifications only out of office hours, but mail "
+"notifications all around the clock? Time Periods allow you to tackle those "
+"and similar requirements."
+msgstr "スケジュールでは、監視や通知を実施するスケジュールを定義できます。"
+"例えば、通知の設定と組み合わせて、営業時間内と営業時間外で通知する先を変更する"
+"というように定義することもできます。"
+
+#: ../../../../modules/director/library/Director/IcingaConfig/StateFilterSet.php:25
+msgid "Warning"
+msgstr "Warning (警告)"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1071
+msgid ""
+"What kind of object this should be. Templates allow full access to any "
+"property, they are your building blocks for \"real\" objects. External "
+"objects should usually not be manually created or modified. They allow you "
+"to work with objects locally defined on your Icinga nodes, while not "
+"rendering and deploying them with the Director. Apply rules allow to assign "
+"services, notifications and groups to other objects."
+msgstr "テンプレートはあらゆるプロパティの設定を可能にします。"
+"テンプレートは、最終的な作られる設定情報のためのパーツです。 "
+"外部オブジェクト(Directorの管轄外の設定)は、最低限にとどめて、追加・変更しないでください。 "
+"外部オブジェクトとDirectorでの設定を併用することはできません。"
+"適用ルールにより、サービス、通知、およびグループを他の"
+"オブジェクトに割り当てることができます。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierMap.php:28
+msgid ""
+"What should happen if the lookup key does not exist in the data list? You "
+"could return a null value, keep the unmodified imported value or interrupt "
+"the import process"
+msgstr "参照キーがデータリストに存在しない場合の処理を選択します。"
+"null値を返す、変更されていないインポート値を保持する、または"
+"インポートプロセスを中断することができます。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRegexSplit.php:24
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierSplit.php:24
+msgid "What should happen when the given string is empty?"
+msgstr "与えられた文字列が空の場合の処理を選択します。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:66
+msgid "What should happen when the result array is empty?"
+msgstr "結果の配列が空の場合の処理を選択します。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:50
+msgid "What should happen when the specified element is not available?"
+msgstr "指定された要素が利用できないときの処理を選択します。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:53
+msgid "What should happen with matching elements?"
+msgstr "一致する要素の処理を選択します。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRejectOrSelect.php:55
+msgid ""
+"What should happen with the row, when this property matches the given "
+"expression?"
+msgstr "このプロパティが、フィルタ表現が行にマッチしたときの処理を選択します。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierDnsRecords.php:32
+msgid "What should we do if the DNS lookup fails?"
+msgstr "DNS参照が失敗した場合の処理を選択します。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:28
+msgid "What should we do if the desired part does not exist?"
+msgstr "目的の部分が存在しない場合の処理を選択します。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierGetHostByName.php:15
+msgid "What should we do if the host (DNS) lookup fails?"
+msgstr "ホスト(DNS)参照が失敗した場合の処理を選択します。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierJsonDecode.php:22
+msgid "What should we do in case we are unable to decode the given string?"
+msgstr "与えられた文字列をデコードできない場合の処理を選択します。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierExtractFromDN.php:16
+msgid "What should we extract from the DN?"
+msgstr "DNから抜き出す値を選択します。"
+
+#: ../../../../modules/director/application/forms/BasketForm.php:55
+msgid ""
+"What should we place into this Basket every time we create new snapshot?"
+msgstr "新しいスナップショットを作成するたびに、このバスケットに何を"
+"配置すればよいですか?"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:21
+msgid "What to use as your Icinga 2 Agent's Host Name"
+msgstr "Icinga 2 Agentのホスト名に何を使うか"
+
+#: ../../../../modules/director/library/Director/Job/ConfigJob.php:209
+msgid ""
+"When deploying configuration, wait at least this amount of seconds unless "
+"the next deployment should take place"
+msgstr "設定を反映するときは、次の設定反映を実行する必要がある場合を除き、"
+"少なくとも指定した秒数だけ待機します。"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:63
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRegexSplit.php:21
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierSplit.php:21
+msgid "When empty"
+msgstr "空のとき"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:47
+msgid "When not available"
+msgstr "利用できないとき"
+
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:207
+msgid "When the last notification should be sent"
+msgstr "最後の通知を何分あるいは何時間後に送信するかを時間で設定します。"
+
+#: ../../../../modules/director/application/forms/SettingsForm.php:63
+msgid "Whether all configured Jobs should be disabled"
+msgstr "設定したすべてのジョブを無効にするか選択します。"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1385
+msgid "Whether flap detection is enabled on this object"
+msgstr "このオブジェクトでフラップ検出が有効になっているか"
+
+#: ../../../../modules/director/library/Director/Job/ConfigJob.php:183
+msgid ""
+"Whether rendering should be forced. If not enforced, this job re-renders the "
+"configuration only when there have been activities since the last rendered "
+"config"
+msgstr "生成を強制するべきかを選択します。 適用されていない場合、このジョブは"
+"最後に整形された設定以降にアクティビティがあった場合にのみ設定を再整形します。"
+# smori
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:94
+msgid "Whether the agent is configured to accept config"
+msgstr "エージェントが設定の同期を受け入れるように構成されているかを選択します。"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:37
+msgid ""
+"Whether the argument value is a string (allowing macros like $host$) or an "
+"Icinga DSL lambda function (will be enclosed with {{ ... }}"
+msgstr "引数値が文字列($host$のようなマクロを許す)か、あるいはIcinga DSLラムダ関数({{...}}で囲まれる)かを選択します。"
+
+#: ../../../../modules/director/application/forms/IcingaServiceForm.php:661
+msgid ""
+"Whether the check commmand for this service should be executed on the Icinga "
+"agent"
+msgstr "このサービスのcheckコマンドをIcingaエージェントで実行するか選択します。"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:112
+msgid ""
+"Whether the parameter name should not be passed to the command. Per default, "
+"the parameter name (e.g. -H) will be appended, so no need to explicitly set "
+"this to \"No\"."
+msgstr "パラメータ名をコマンドに渡さないようにするか選択します。 デフォルトでは、"
+"パラメータ名(たとえば-H)が追加されるので、これを明示的に「いいえ」に"
+"設定する必要はありません。"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:88
+msgid ""
+"Whether the parent (master) node should actively try to connect to this agent"
+msgstr "親(マスター)ノードがこのエージェントへの接続をアクティブに試行する"
+"必要があるか選択します。"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:76
+msgid ""
+"Whether the set_if parameter is a string (allowing macros like $host$) or an "
+"Icinga DSL lambda function (will be enclosed with {{ ... }}"
+msgstr "set_if パラメータが文字列($host$のようなマクロを許可する)か、あるいは"
+"Icinga DSLラムダ関数({{...}}で囲まれる)か選択します。"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:121
+msgid "Whether this argument should be required"
+msgstr "この引数が必要か選択します。"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1413
+msgid "Whether this check is volatile."
+msgstr "「はい」を選択すると監視の一時的な状態を保持しません。つまり最大監視試行回数=1と同等の動きをします。"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:94
+msgid "Whether this dependency should affect hosts or services"
+msgstr "この依存関係オブジェクトがホストまたはサービスに影響を与えるか選択します。"
+
+#: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:135
+msgid "Whether this field should be mandatory"
+msgstr "このフィールドが必須か選択します。"
+
+#: ../../../../modules/director/application/forms/IcingaHostForm.php:79
+msgid "Whether this host has the Icinga 2 Agent installed"
+msgstr "このホストにIcinga 2 Agentがインストールされているか選択します。"
+
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:83
+msgid "Whether this notification should affect hosts or services"
+msgstr "この通知がホストまたはサービスに影響を与えるか選択します。"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:104
+msgid ""
+"Whether this parameter should be repeated when multiple values (read: array) "
+"are given"
+msgstr "複数の値(read:array)が与えられたときにこのパラメータを繰り返すべきか選択します。"
+
+#: ../../../../modules/director/application/forms/IcingaZoneForm.php:24
+msgid ""
+"Whether this zone should be available everywhere. Please note that it rarely "
+"leads to the desired result when you try to distribute global zones in "
+"distrubuted environments"
+msgstr "このゾーンのスコープをグローバルにするか選択します。グローバル"
+"ゾーンの分散構成は推奨されていません。"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1361
+msgid "Whether to accept passive check results for this object"
+msgstr "このオブジェクトのパッシブ監視結果を受け入れるか"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1355
+msgid "Whether to actively check this object"
+msgstr "このオブジェクトをアクティブに監視するか選択します。"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:33
+msgid "Whether to adjust your host name"
+msgstr "ホスト名を調整するか選択します。"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:158
+msgid ""
+"Whether to disable checks when this dependency fails. Defaults to false."
+msgstr "この依存関係オブジェクトが失敗したときに監視を無効にするか選択します。 デフォルトは「いいえ」です。"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:166
+msgid ""
+"Whether to disable notifications when this dependency fails. Defaults to "
+"true."
+msgstr "この依存関係オブジェクトが失敗したときに通知を無効にするか選択します。デフォルトは「はい」です。"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1373
+msgid "Whether to enable event handlers this object"
+msgstr "このオブジェクトのイベントハンドラを有効にするか選択します。"
+
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:174
+msgid ""
+"Whether to ignore soft states for the reachability calculation. Defaults to "
+"true."
+msgstr "到達可能性の計算で一時的な異常(soft state)を無視するか選択します。デフォルトは「はい」です。"
+
+#: ../../../../modules/director/application/forms/IcingaTimePeriodForm.php:77
+msgid "Whether to prefer timeperiods includes or excludes. Default to true."
+msgstr "「はい」を指定した場合、スケジュールのインクルードを優先します。デフォルト値は「はい」です。"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1379
+msgid "Whether to process performance data provided by this object"
+msgstr "このオブジェクトによって提供されるパフォーマンスデータを処理するか選択します。"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:67
+msgid ""
+"Whether to purge existing objects. This means that objects of the same type "
+"will be removed from Director in case they no longer exist at your import "
+"source."
+msgstr "「はい」の場合、インポートソースに存在しないオブジェクトを"
+"Directorから削除します。"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1367
+msgid "Whether to send notifications for this object"
+msgstr "このオブジェクトに関する通知を送信するか選択します。"
+
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:90
+msgid "Whether to send notifications for this user"
+msgstr "ユーザに通知を送信するか選択します。"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:118
+msgid ""
+"Whether you want to merge or replace the destination field. Makes no "
+"difference for strings"
+msgstr "宛先フィールドを結合するか置き換えるか。 文字列に差異はありません"
+
+#: ../../../../modules/director/application/forms/DirectorDatalistEntryForm.php:24
+msgid ""
+"Will be stored as a custom variable value when this entry is chosen from the "
+"list"
+msgstr "カスタム変数の値の入力時に、このキーが選択されると、変数の値になります。"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:225
+msgid "Windows Kickstart Script"
+msgstr "Windowsキックスタートスクリプト"
+
+#: ../../../../modules/director/application/forms/DirectorDatafieldForm.php:51
+msgid "Wipe related vars"
+msgstr "関連する変数を掃除する"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ActivityLogDashlet.php:17
+msgid "Wondering about what changed why? Track your changes!"
+msgstr "設定変更が行われた履歴を記録します。"
+"どんな設定がだれによってどのように変更されたのか、追跡することができます。"
+
+#: ../../../../modules/director/application/views/helpers/FormDataFilter.php:525
+msgid "Wrap this expression into an operator"
+msgstr "この式を演算子にラップする"
+
+#: ../../../../modules/director/application/forms/IcingaDeleteObjectForm.php:17
+#, php-format
+msgid "YES, please delete \"%s\""
+msgstr "はい、\"%s\"を削除してください"
+
+#: ../../../../modules/director/application/forms/IcingaZoneForm.php:30
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:226
+#: ../../../../modules/director/application/forms/SettingsForm.php:59
+#: ../../../../modules/director/application/forms/SettingsForm.php:74
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:73
+#: ../../../../modules/director/library/Director/Job/ConfigJob.php:189
+#: ../../../../modules/director/library/Director/Job/ConfigJob.php:201
+#: ../../../../modules/director/library/Director/Job/ImportJob.php:101
+#: ../../../../modules/director/library/Director/Job/SyncJob.php:101
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierUpperCaseFirst.php:25
+msgid "Yes"
+msgstr "はい"
+
+#: ../../../../modules/director/application/controllers/BasketsController.php:41
+msgid ""
+"You can create Basket snapshots at any time, this will persist a serialized "
+"representation of all involved objects at that moment in time. Snapshots can "
+"be exported, imported, shared and restored - to the very same or another "
+"Director instance."
+msgstr "Basketスナップショットはいつでも作成できます。これにより、その時点"
+"での関連するすべてのオブジェクトのシリアル化された表現が保持されます。"
+"スナップショットは、まったく同じまたは別のDirectorインスタンスに"
+"エクスポート、インポート、共有、および復元できます。"
+
+#: ../../../../modules/director/library/Director/Web/SelfService.php:136
+msgid ""
+"You can stop sharing a Template at any time. This will immediately "
+"invalidate the former key."
+msgstr "テンプレートの共有はいつでも中止できます。 これはすぐに以前のキーを"
+"無効にします。"
+
+#: ../../../../modules/director/library/Director/Job/ImportJob.php:94
+#: ../../../../modules/director/library/Director/Job/SyncJob.php:94
+msgid ""
+"You could immediately apply eventual changes or just learn about them. In "
+"case you do not want them to be applied immediately, defining a job still "
+"makes sense. You will be made aware of available changes in your Director "
+"GUI."
+msgstr "すぐに最終的な変更を適用するか、あるいはそれらについて知ることができます。"
+" すぐに適用したくない場合は、ジョブを定義することにも意味があります。"
+" Director GUIで利用可能な変更点がわかります。"
+
+#: ../../../../modules/director/application/forms/SelfServiceSettingsForm.php:61
+msgid ""
+"You might want to let the generated Powershell script install the Icinga 2 "
+"Agent in an automated way. If so, please choose where your Windows nodes "
+"should fetch the Agent installer"
+msgstr "自動生成で生成されたPowershellスクリプトを使ってIcinga 2 Agentを"
+"インストールすることができます。その場合、Windowsノードが"
+"Agentインストーラーを取得する場所を選択してください。"
+
+#: ../../../../modules/director/application/forms/IcingaObjectFieldForm.php:161
+msgid ""
+"You might want to show this field only when certain conditions are met. "
+"Otherwise it will not be available and values eventually set before will be "
+"cleared once stored"
+msgstr "特定の条件が満たされた場合にのみこのフィールドを表示することを"
+"お勧めします。 そうしなければ利用できないでしょう。また、以前に設定された値は"
+"いったん格納されると消去されます"
+
+#: ../../../../modules/director/application/forms/ImportRowModifierForm.php:46
+msgid ""
+"You might want to write the modified value to another (new) property. This "
+"property name can be defined here, the original property would remain "
+"unmodified. Please leave this blank in case you just want to modify the "
+"value of a specific property"
+msgstr "変更した値を別の(新しい)プロパティに書き込むことができます。 この"
+"プロパティ名はここで定義でき、元のプロパティは変更されないままになります。"
+" 特定のプロパティの値を変更するだけの場合は、空白のままにしてください。"
+
+#: ../../../../modules/director/application/controllers/SyncruleController.php:110
+#, php-format
+msgid "You must define some %s before you can run this Sync Rule"
+msgstr "この同期ルールを実行する前に、いくつかの %s を定義する必要があります。"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:153
+msgid "Your Icinga 2 API username"
+msgstr "Icinga 2 APIユーザ名"
+
+#: ../../../../modules/director/library/Director/Import/ImportSourceLdap.php:49
+msgid ""
+"Your LDAP search base. Often something like OU=Users,OU=HQ,DC=your,"
+"DC=company,DC=tld"
+msgstr "LDAP検索ベース。 多くの場合、OU=Users,OU=HQ,DC=your,DC=company,DC=tld"
+"のようなものです。"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:94
+msgid ""
+"Your configuration looks good. Still, you might want to re-run this "
+"kickstart wizard to (re-)import modified or new manually defined Command "
+"definitions or to get fresh new ITL commands after an Icinga 2 Core upgrade."
+msgstr "設定は良好です。それでも、このキックスタートウィザードを"
+"再実行して、変更したコマンド定義または新しい手動で定義したコマンド定義を"
+"(再)インポートするか、またはIcinga 2 Coreアップグレード後に新しい新しい"
+"ITLコマンドを取得することができます。"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:72
+#, php-format
+msgid "Your database looks good, you are ready to %s"
+msgstr "データベースの設定は良好です。%sへの準備ができています"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:106
+msgid ""
+"Your installation of Icinga Director has not yet been prepared for "
+"deployments. This kickstart wizard will assist you with setting up the "
+"connection to your Icinga 2 server."
+msgstr "Icinga Directorのインストールはまだ設定反映の準備が"
+"できていません。 このキックスタートウィザードは、Icinga 2サーバー"
+"への接続設定を手助けします。"
+
+#: ../../../../modules/director/library/Director/Web/Form/DirectorObjectForm.php:1298
+msgid "Your regular check interval"
+msgstr "通常の監視間隔"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierReplace.php:20
+msgid "Your replacement string"
+msgstr "置換用の文字列"
+
+#: ../../../../modules/director/application/forms/IcingaTemplateChoiceForm.php:67
+msgid "Your users will be allowed to choose among those templates"
+msgstr "ユーザーはそれらのテンプレートの中から選択することが許される"
+
+#: ../../../../modules/director/application/forms/SyncRuleForm.php:23
+#: ../../../../modules/director/library/Director/TranslationDummy.php:15
+#: ../../../../modules/director/library/Director/Web/Table/ObjectsTableEndpoint.php:21
+msgid "Zone"
+msgstr "ゾーン"
+
+#: ../../../../modules/director/application/forms/IcingaZoneForm.php:14
+msgid "Zone name"
+msgstr "ゾーン名"
+
+#: ../../../../modules/director/application/forms/IcingaCommandForm.php:95
+#: ../../../../modules/director/application/forms/IcingaDependencyForm.php:60
+#: ../../../../modules/director/application/forms/IcingaNotificationForm.php:65
+#: ../../../../modules/director/application/forms/IcingaUserForm.php:76
+#: ../../../../modules/director/application/forms/IcingaUserGroupForm.php:42
+msgid "Zone settings"
+msgstr "ゾーン設定"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/ZoneObjectDashlet.php:13
+#: ../../../../modules/director/library/Director/Import/ImportSourceCoreApi.php:64
+msgid "Zones"
+msgstr "ゾーン"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:346
+msgid "a list"
+msgstr "リスト"
+
+#: ../../../../modules/director/library/Director/Web/Widget/AdditionalTableActions.php:87
+msgid "all"
+msgstr "すべて"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:96
+#: ../../../../modules/director/application/controllers/BasketController.php:114
+#: ../../../../modules/director/application/controllers/BasketController.php:348
+#: ../../../../modules/director/application/controllers/DataController.php:104
+#: ../../../../modules/director/application/controllers/HostController.php:480
+#: ../../../../modules/director/application/controllers/ImportsourceController.php:276
+#: ../../../../modules/director/application/controllers/ServiceController.php:137
+#: ../../../../modules/director/application/controllers/ServiceController.php:198
+#: ../../../../modules/director/application/controllers/SyncruleController.php:257
+#: ../../../../modules/director/library/Director/Web/ActionBar/DirectorBaseActionBar.php:35
+#: ../../../../modules/director/library/Director/Web/Controller/ActionController.php:150
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:207
+#: ../../../../modules/director/library/Director/Web/Controller/ObjectController.php:492
+msgid "back"
+msgstr "戻る"
+
+#: ../../../../modules/director/application/locale/translateMe.php:11
+msgid "critical"
+msgstr "危険"
+
+#: ../../../../modules/director/application/locale/translateMe.php:6
+msgid "down"
+msgstr "停止"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:27
+msgid "e.g. -H or --hostname, empty means \"skip_key\""
+msgstr "(例) -H、--hostname。空は\"skip_key\"を意味する"
+
+#: ../../../../modules/director/application/forms/IcingaCommandArgumentForm.php:56
+msgid "e.g. 5%, $host.name$, $lower$%:$upper$%"
+msgstr "(例)5%、$host.name$、$lower$%:$upper$%"
+
+#: ../../../../modules/director/application/forms/SyncPropertyForm.php:164
+msgid "failed to fetch"
+msgstr "取得に失敗しました"
+
+#: ../../../../modules/director/application/forms/KickstartForm.php:259
+#: ../../../../modules/director/library/Director/Util.php:177
+msgid "here"
+msgstr "ここ"
+
+#: ../../../../modules/director/application/forms/IcingaHostVarForm.php:23
+msgid "host var name"
+msgstr "ホスト変数名"
+
+#: ../../../../modules/director/application/forms/IcingaHostVarForm.php:28
+msgid "host var value"
+msgstr "ホスト変数値"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:298
+msgid "modified"
+msgstr "修正された"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:276
+msgid "new"
+msgstr "new"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:283
+msgid "no related group exists"
+msgstr "関連グループが存在しません。"
+
+#: ../../../../modules/director/application/locale/translateMe.php:9
+msgid "ok"
+msgstr "ok"
+
+#: ../../../../modules/director/library/Director/Dashboard/Dashlet/Dashlet.php:285
+msgid "one related group exists"
+msgstr "一つの関連グループが存在します。"
+
+#: ../../../../modules/director/application/locale/translateMe.php:8
+msgid "pending"
+msgstr "保留中"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayElementByPosition.php:55
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:71
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRegexSplit.php:29
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierSplit.php:29
+msgid "return NULL"
+msgstr "NULLを返す"
+
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierArrayFilter.php:70
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierRegexSplit.php:28
+#: ../../../../modules/director/library/Director/PropertyModifier/PropertyModifierSplit.php:28
+msgid "return an empty array"
+msgstr "空配列を返す"
+
+#: ../../../../modules/director/application/forms/IcingaServiceVarForm.php:23
+msgid "service var name"
+msgstr "サービス変数名"
+
+#: ../../../../modules/director/application/forms/IcingaServiceVarForm.php:28
+msgid "service var value"
+msgstr "サービス変数値"
+
+#: ../../../../modules/director/application/controllers/BasketController.php:302
+msgid "unchanged"
+msgstr "変更なし"
+
+#: ../../../../modules/director/application/locale/translateMe.php:12
+msgid "unknown"
+msgstr "未知"
+
+#: ../../../../modules/director/application/locale/translateMe.php:7
+msgid "unreachable"
+msgstr "到達不能"
+
+#: ../../../../modules/director/library/Director/Web/Widget/AdditionalTableActions.php:89
+msgid "unused"
+msgstr "不使用"
+
+#: ../../../../modules/director/application/locale/translateMe.php:5
+msgid "up"
+msgstr "起動"
+
+#: ../../../../modules/director/library/Director/Web/Widget/AdditionalTableActions.php:88
+msgid "used"
+msgstr "使用中"
+
+#: ../../../../modules/director/application/forms/IcingaHostVarForm.php:33
+#: ../../../../modules/director/application/forms/IcingaServiceVarForm.php:33
+msgid "value format"
+msgstr "値のフォーマット"
+
+#: ../../../../modules/director/library/Director/Web/Table/GroupMemberTable.php:61
+#: ../../../../modules/director/library/Director/Web/Table/GroupMemberTable.php:66
+msgid "via"
+msgstr "経由"
+
+#: ../../../../modules/director/application/locale/translateMe.php:10
+msgid "warning"
+msgstr "警告"
+
diff --git a/application/locale/translateMe.php b/application/locale/translateMe.php
new file mode 100644
index 0000000..d746a67
--- /dev/null
+++ b/application/locale/translateMe.php
@@ -0,0 +1,12 @@
+<?php
+
+// Dummy strings helping the translation module
+
+translate('up');
+translate('down');
+translate('unreachable');
+translate('pending');
+translate('ok');
+translate('warning');
+translate('critical');
+translate('unknown');
diff --git a/application/views/helpers/FormDataFilter.php b/application/views/helpers/FormDataFilter.php
new file mode 100644
index 0000000..d8bc508
--- /dev/null
+++ b/application/views/helpers/FormDataFilter.php
@@ -0,0 +1,564 @@
+<?php
+
+use Icinga\Data\Filter\Filter;
+use Icinga\Data\Filter\FilterChain;
+use Icinga\Data\Filter\FilterExpression;
+use Icinga\Data\FilterColumns;
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Web\Form\Element\Boolean;
+use Icinga\Module\Director\Web\Form\IconHelper;
+
+/**
+ * View helper for extensible sets
+ *
+ * Avoid complaints about class names:
+ * @codingStandardsIgnoreStart
+ */
+class Zend_View_Helper_FormDataFilter extends Zend_View_Helper_FormElement
+{
+ private $fieldName;
+
+ private $cachedColumnSelect;
+
+ private $query;
+
+ private $suggestionContext;
+
+ /**
+ * Generates an 'extensible set' element.
+ *
+ * @codingStandardsIgnoreEnd
+ *
+ * @param string|array $name If a string, the element name. If an
+ * array, all other parameters are ignored, and the array elements
+ * are used in place of added parameters.
+ *
+ * @param mixed $value The element value.
+ *
+ * @param array $attribs Attributes for the element tag.
+ *
+ * @return string The element XHTML.
+ * @throws Zend_Form_Exception
+ */
+ public function formDataFilter($name, $value = null, $attribs = null)
+ {
+ $info = $this->_getInfo($name, $value, $attribs);
+ extract($info); // id, name, value, attribs, options, listsep, disable
+ if (array_key_exists('columns', $attribs)) {
+ $this->setColumns($attribs['columns']);
+ unset($attribs['columns']);
+ }
+
+ if (array_key_exists('suggestionContext', $attribs)) {
+ $this->setSuggestionContext($attribs['suggestionContext']);
+ unset($attribs['suggestionContext']);
+ }
+
+ // TODO: check for columns in attribs, preserve & remove them from the
+ // array use attribs? class etc? disabled?
+ // override _getInfo?
+ $this->fieldName = $name;
+
+ if ($value === null) {
+ $value = $this->emptyExpression();
+ } elseif (is_string($value)) {
+ $value = Filter::fromQueryString($value);
+ }
+
+ return $this->beginRoot()
+ . $this->renderFilter($value)
+ . $this->endRoot();
+ }
+
+ /**
+ * @param Filter $filter
+ * @return string
+ * @throws Zend_Form_Exception
+ */
+ protected function renderFilter(Filter $filter)
+ {
+ if ($filter instanceof FilterChain) {
+ return $this->renderFilterChain($filter);
+ } elseif ($filter instanceof FilterExpression) {
+ return $this->renderFilterExpression($filter);
+ } else {
+ throw new InvalidArgumentException('Got a Filter being neither expression nor chain');
+ }
+ }
+
+ protected function beginRoot()
+ {
+ return '<ul class="filter-root">';
+ }
+
+ protected function endRoot()
+ {
+ return '</ul>';
+ }
+
+ /**
+ * @param FilterChain $filter
+ * @return string
+ * @throws Zend_Form_Exception
+ */
+ protected function renderFilterChain(FilterChain $filter)
+ {
+ $parts = array();
+ foreach ($filter->filters() as $f) {
+ $parts[] = $this->renderFilter($f);
+ }
+
+ return $this->beginChain($filter)
+ . implode('', $parts)
+ . $this->endChain($filter);
+ }
+
+ protected function beginChain(FilterChain $filter)
+ {
+ $list = $filter->isEmpty() ? '' : '<ul>' . "\n";
+
+ return '<li class="filter-chain"><span class="handle"> </span>'
+ . $this->selectOperator($filter)
+ . $this->removeLink($filter)
+ . $this->addLink($filter)
+ . ($filter->count() === 1 ? $this->stripLink($filter) : '')
+ . $list;
+ }
+
+ protected function endChain(FilterChain $filter)
+ {
+ $list = $filter->isEmpty() ? '' : "</ul>\n";
+ return $list . "</li>\n";
+ }
+
+ protected function beginExpression(FilterExpression $filter)
+ {
+ return '<div class="filter-expression">' . "\n";
+ }
+
+ protected function endExpression(FilterExpression $filter)
+ {
+ return "</div>\n";
+ }
+
+ protected function beginElement(FilterExpression $filter)
+ {
+ return '<div class="expression-wrapper">' . "\n";
+ }
+
+ protected function endElement(FilterExpression $filter)
+ {
+ return "</div>\n";
+ }
+
+ /**
+ * @param FilterExpression $filter
+ * @return string
+ * @throws Zend_Form_Exception
+ */
+ protected function filterExpressionHtml(FilterExpression $filter)
+ {
+ return $this->selectColumn($filter)
+ . $this->selectSign($filter)
+ . $this->beginElement($filter)
+ . $this->element($filter)
+ . $this->endElement($filter)
+ . $this->removeLink($filter)
+ . $this->expandLink($filter);
+ }
+
+ /**
+ * @param FilterExpression $filter
+ * @return string
+ * @throws Zend_Form_Exception
+ */
+ protected function renderFilterExpression(FilterExpression $filter)
+ {
+ return $this->beginExpression($filter)
+ . $this->filterExpressionHtml($filter)
+ . $this->endExpression($filter);
+ }
+
+ /**
+ * @param FilterExpression|null $filter
+ * @return Boolean|string
+ * @throws Zend_Form_Exception
+ */
+ protected function element(FilterExpression $filter = null)
+ {
+ if ($filter) {
+ // TODO: Make this configurable
+ $type = 'host';
+ $prefixLen = strlen($type) + 1;
+ $filter = clone($filter);
+ $col = $filter->getColumn();
+
+ if ($this->columnIsJson($filter)) {
+ $col = $filter->getExpression();
+ $filter->setExpression(json_decode($filter->getColumn()));
+ } else {
+ $filter->setExpression(json_decode($filter->getExpression()));
+ }
+
+ if (($filter->getExpression() === true) || ($filter->getExpression() === false)) {
+ return '';
+ }
+ $dummy = IcingaObject::createByType($type);
+ if ($dummy->hasProperty($col)) {
+ if ($dummy->propertyIsBoolean($col)) {
+ return $this->boolean($filter);
+ }
+ }
+
+ if (substr($col, -7) === '.groups' && $dummy->supportsGroups()) {
+ $type = substr($col, 0, -7);
+
+ return $this->selectGroup($type, $filter);
+ } elseif (substr($col, $prefixLen, 5) === 'vars.') {
+ $var = substr($col, $prefixLen + 5);
+
+ return $this->text($filter, "DataListValues!${var}");
+ }
+ }
+
+ return $this->text($filter);
+ }
+
+ /**
+ * @param $type
+ * @param FilterExpression $filter
+ * @return Zend_Form_Element
+ */
+ protected function selectGroup($type, FilterExpression $filter)
+ {
+ return $this->view->formText(
+ $this->elementId('value', $filter),
+ $filter->getExpression(),
+ [
+ 'class' => 'director-suggest',
+ 'data-suggestion-context' => "${type}groupnames",
+ ]
+ );
+ }
+
+ /**
+ * @param FilterExpression|null $filter
+ * @return Boolean
+ * @throws Zend_Form_Exception
+ */
+ protected function boolean(FilterExpression $filter = null)
+ {
+ $value = $filter === null ? '' : $filter->getExpression();
+
+ $el = new Boolean(
+ $this->elementId('value', $filter),
+ array(
+ 'value' => $value,
+ 'decorators' => array('ViewHelper'),
+ )
+ );
+
+ return $el;
+ }
+
+ protected function columnIsJson(FilterExpression $filter)
+ {
+ $col = $filter->getColumn();
+ return strlen($col) && $col[0] === '"';
+ }
+
+ /**
+ * @param FilterExpression|null $filter
+ * @param string $suggestionContext
+ *
+ * @return mixed
+ */
+ protected function text(FilterExpression $filter = null, $suggestionContext = null)
+ {
+ $attr = null;
+ if ($suggestionContext !== null) {
+ $attr = [
+ 'class' => 'director-suggest',
+ 'data-suggestion-context' => $suggestionContext,
+ ];
+ }
+
+ $value = $filter === null ? '' : $filter->getExpression();
+ if (is_array($value)) {
+ return $this->view->formIplExtensibleSet(
+ $this->elementId('value', $filter),
+ $value,
+ $attr
+ );
+ }
+
+ return $this->view->formText(
+ $this->elementId('value', $filter),
+ $value,
+ $attr
+ );
+ }
+
+ /**
+ * @return \Icinga\Data\Filter\FilterExpression
+ */
+ protected function emptyExpression()
+ {
+ return Filter::expression('', '=', '');
+ }
+
+ protected function arrayForSelect($array, $flip = false)
+ {
+ $res = array();
+ foreach ($array as $k => $v) {
+ if (is_int($k)) {
+ $res[$v] = ucwords(str_replace('_', ' ', $v));
+ } elseif ($flip) {
+ $res[$v] = $k;
+ } else {
+ $res[$k] = $v;
+ }
+ }
+
+ // sort($res);
+ return $res;
+ }
+
+ protected function elementId($field, Filter $filter = null)
+ {
+ $prefix = $this->fieldName . '[id_';
+ $suffix = '][' . $field . ']';
+
+ return $prefix . $filter->getId() . $suffix;
+ }
+
+ /**
+ * @param FilterChain|null $filter
+ * @return mixed
+ */
+ protected function selectOperator(FilterChain $filter = null)
+ {
+ $ops = [
+ 'AND' => 'AND',
+ 'OR' => 'OR',
+ 'NOT' => 'NOT'
+ ];
+
+ return $this->select(
+ $this->elementId('operator', $filter),
+ $ops,
+ $filter === null ? null : $filter->getOperatorName(),
+ ['class' => 'operator autosubmit']
+ );
+ }
+
+ protected function selectSign(FilterExpression $filter = null)
+ {
+ $signs = [
+ '=' => '=',
+ '!=' => '!=',
+ '>' => '>',
+ '<' => '<',
+ '>=' => '>=',
+ '<=' => '<=',
+ 'in' => 'in',
+ 'contains' => 'contains',
+ 'true' => 'is true (or set)',
+ 'false' => 'is false (or not set)',
+ ];
+
+ if ($filter === null) {
+ $sign = null;
+ } else {
+ if ($this->columnIsJson($filter)) {
+ $sign = 'contains';
+ } else {
+ $expression = json_decode($filter->getExpression());
+ if ($expression === true) {
+ $sign = 'true';
+ } elseif ($expression === false) {
+ $sign = 'false';
+ } elseif (is_array($expression)) {
+ $sign = 'in';
+ } else {
+ $sign = $filter->getSign();
+ }
+ }
+ }
+
+ $class = 'sign autosubmit';
+ if (strlen($sign) > 3) {
+ $class .= ' wide';
+ }
+
+ return $this->select(
+ $this->elementId('sign', $filter),
+ $signs,
+ $sign,
+ array('class' => $class)
+ );
+ }
+
+ public function setColumns(array $columns = null)
+ {
+ $this->cachedColumnSelect = $columns ? $this->arrayForSelect($columns) : null;
+ return $this;
+ }
+
+ protected function getSuggestionContext()
+ {
+ return $this->suggestionContext;
+ }
+
+ protected function setSuggestionContext($context)
+ {
+ $this->suggestionContext = $context;
+ }
+
+ protected function selectColumn(FilterExpression $filter = null)
+ {
+ $active = $filter === null ? null : $filter->getColumn();
+ if ($filter && $this->columnIsJson($filter)) {
+ $active = $filter->getExpression();
+ }
+
+ if ($context = $this->getSuggestionContext()) {
+ return $this->view->formText(
+ $this->elementId('column', $filter),
+ $active,
+ [
+ 'class' => 'column autosubmit director-suggest',
+ 'data-suggestion-context' => $context,
+ ]
+ );
+ }
+ if ($this->hasColumnList()) {
+ $cols = $this->getColumnList();
+ if ($active && !isset($cols[$active])) {
+ $cols[$active] = str_replace(
+ '_',
+ ' ',
+ ucfirst(ltrim($active, '_'))
+ ); // ??
+ }
+
+ $cols = $this->optionalEnum($cols);
+
+ return $this->select(
+ $this->elementId('column', $filter),
+ $cols,
+ $active,
+ ['class' => 'column autosubmit']
+ );
+ } else {
+ return $this->view->formText(
+ $this->elementId('column', $filter),
+ $active,
+ ['class' => 'column autosubmit']
+ );
+ }
+ }
+
+ protected function optionalEnum($enum)
+ {
+ return array_merge(
+ array(null => $this->view->translate('- please choose -')),
+ $enum
+ );
+ }
+
+ protected function hasColumnList()
+ {
+ return $this->cachedColumnSelect !== null || $this->query !== null;
+ }
+
+ protected function getColumnList()
+ {
+ if ($this->cachedColumnSelect === null) {
+ $this->fetchColumnList();
+ }
+
+ return $this->cachedColumnSelect;
+ }
+
+ protected function fetchColumnList()
+ {
+ if ($this->query instanceof FilterColumns) {
+ $this->cachedColumnSelect = $this->arrayForSelect(
+ $this->query->getFilterColumns(),
+ true
+ );
+ asort($this->cachedColumnSelect);
+ } elseif ($this->cachedColumnSelect === null) {
+ throw new RuntimeException('No columns set nor does the query provide any');
+ }
+ }
+
+ protected function select($name, $list, $selected, $attributes = null)
+ {
+ return $this->view->formSelect($name, $selected, $attributes, $list);
+ }
+
+ protected function removeLink(Filter $filter)
+ {
+ return $this->filterActionButton(
+ $filter,
+ 'cancel',
+ t('Remove this part of your filter')
+ );
+ }
+
+ protected function addLink(Filter $filter)
+ {
+ return $this->filterActionButton(
+ $filter,
+ 'plus',
+ t('Add another filter')
+ );
+ }
+
+ protected function expandLink(Filter $filter)
+ {
+ return $this->filterActionButton(
+ $filter,
+ 'angle-double-right',
+ t('Wrap this expression into an operator')
+ );
+ }
+
+ protected function stripLink(Filter $filter)
+ {
+ return $this->filterActionButton(
+ $filter,
+ 'minus',
+ t('Strip this operator, preserve child nodes')
+ );
+ }
+
+ protected function filterActionButton(Filter $filter, $action, $title)
+ {
+ return $this->iconButton(
+ $this->getActionButtonName($filter),
+ $action,
+ $title
+ );
+ }
+
+ protected function getActionButtonName(Filter $filter)
+ {
+ return sprintf(
+ '%s[id_%s][action]',
+ $this->fieldName,
+ $filter->getId()
+ );
+ }
+
+ protected function iconButton($name, $icon, $title)
+ {
+ return $this->view->formSubmit(
+ $name,
+ IconHelper::instance()->iconCharacter($icon),
+ array('class' => 'icon-button', 'title' => $title)
+ );
+ }
+}
diff --git a/application/views/helpers/FormIplExtensibleSet.php b/application/views/helpers/FormIplExtensibleSet.php
new file mode 100644
index 0000000..c782016
--- /dev/null
+++ b/application/views/helpers/FormIplExtensibleSet.php
@@ -0,0 +1,23 @@
+<?php
+
+use Icinga\Module\Director\Web\Form\IplElement\ExtensibleSetElement;
+
+/**
+ * View helper for extensible sets
+ *
+ * @codingStandardsIgnoreStart
+ */
+class Zend_View_Helper_FormIplExtensibleSet extends Zend_View_Helper_FormElement
+{
+ private $currentId;
+
+ /**
+ * @codingStandardsIgnoreEnd
+
+ * @return string The element HTML.
+ */
+ public function formIplExtensibleSet($name, $value = null, $attribs = null)
+ {
+ return ExtensibleSetElement::fromZfDingens($name, $value, $attribs);
+ }
+}
diff --git a/application/views/helpers/FormSimpleNote.php b/application/views/helpers/FormSimpleNote.php
new file mode 100644
index 0000000..d8315f4
--- /dev/null
+++ b/application/views/helpers/FormSimpleNote.php
@@ -0,0 +1,15 @@
+<?php
+
+// Avoid complaints about missing namespace and invalid class name
+// @codingStandardsIgnoreStart
+class Zend_View_Helper_FormSimpleNote extends Zend_View_Helper_FormElement
+{
+ // @codingStandardsIgnoreEnd
+
+ public function formSimpleNote($name, $value = null)
+ {
+ $info = $this->_getInfo($name, $value);
+ extract($info); // name, value, attribs, options, listsep, disable
+ return $value;
+ }
+}
diff --git a/application/views/helpers/FormStoredPassword.php b/application/views/helpers/FormStoredPassword.php
new file mode 100644
index 0000000..e25a1dc
--- /dev/null
+++ b/application/views/helpers/FormStoredPassword.php
@@ -0,0 +1,60 @@
+<?php
+
+use ipl\Html\Html;
+use ipl\Html\HtmlDocument;
+
+/**
+ * Please see StoredPassword (the Form Element) for related documentation
+ *
+ * We're rendering the following fields:
+ *
+ * - ${name}[_value]:
+ * - ${name}[_sent]:
+ *
+ * Avoid complaints about class names:
+ * @codingStandardsIgnoreStart
+ */
+class Zend_View_Helper_FormStoredPassword extends Zend_View_Helper_FormElement
+{
+ public function formStoredPassword($name, $value = null, $attribs = null)
+ {
+ // @codingStandardsIgnoreEnd
+ $info = $this->_getInfo($name, $value, $attribs);
+ \extract($info); // name, value, attribs, options, listsep, disable
+ $sentValue = $this->stripAttribute($attribs, 'sentValue');
+
+ $res = new HtmlDocument();
+ $el = Html::tag('input', [
+ 'type' => 'password',
+ 'name' => "${name}[_value]",
+ 'id' => $id,
+ ]);
+ $res->add($el);
+
+ $res->add(Html::tag('input', [
+ 'type' => 'hidden',
+ 'name' => "${name}[_sent]",
+ 'value' => 'y'
+ ]));
+
+ if ($sentValue !== null && \strlen($sentValue)) {
+ $el->getAttributes()->set('value', $sentValue);
+ } elseif ($value !== null && \strlen($value) > 0) {
+ $el->getAttributes()->set('value', '__UNCHANGED_VALUE__');
+ }
+
+ return $res;
+ }
+
+ protected function stripAttribute(&$attribs, $name, $default = null)
+ {
+ if (\array_key_exists($name, $attribs)) {
+ if (\strlen($attribs[$name])) {
+ return $attribs[$name];
+ }
+ unset($attribs[$name]);
+ }
+
+ return $default;
+ }
+}
diff --git a/application/views/helpers/RenderPlainObject.php b/application/views/helpers/RenderPlainObject.php
new file mode 100644
index 0000000..8486611
--- /dev/null
+++ b/application/views/helpers/RenderPlainObject.php
@@ -0,0 +1,14 @@
+<?php
+// Avoid complaints about missing namespace and invalid class name
+// @codingStandardsIgnoreStart
+
+use Icinga\Module\Director\PlainObjectRenderer;
+
+class Zend_View_Helper_RenderPlainObject extends Zend_View_Helper_Abstract
+// @codingStandardsIgnoreEnd
+{
+ public function renderPlainObject($object)
+ {
+ return PlainObjectRenderer::render($object);
+ }
+}
diff --git a/application/views/scripts/phperror/dependencies.phtml b/application/views/scripts/phperror/dependencies.phtml
new file mode 100644
index 0000000..1cbf31e
--- /dev/null
+++ b/application/views/scripts/phperror/dependencies.phtml
@@ -0,0 +1,9 @@
+<div class="controls">
+<?= $this->tabs ?>
+<h1><?= $this->escape($this->title) ?></h1>
+</div>
+
+<div class="content">
+<p class="legacy-error"><?= $this->escape($this->message) ?></p>
+<?= $this->table ?>
+</div>
diff --git a/application/views/scripts/phperror/error.phtml b/application/views/scripts/phperror/error.phtml
new file mode 100644
index 0000000..260bf72
--- /dev/null
+++ b/application/views/scripts/phperror/error.phtml
@@ -0,0 +1,8 @@
+<div class="controls">
+<?= $this->tabs ?>
+<h1><?= $this->escape($this->title) ?></h1>
+</div>
+
+<div class="content">
+<p class="legacy-error"><?= $this->escape($this->message) ?></p>
+</div>
diff --git a/application/views/scripts/settings/index.phtml b/application/views/scripts/settings/index.phtml
new file mode 100644
index 0000000..9120812
--- /dev/null
+++ b/application/views/scripts/settings/index.phtml
@@ -0,0 +1,7 @@
+<div class="controls">
+<?= $this->tabs ?>
+</div>
+
+<div class="content">
+ <?= $form ?>
+</div>
diff --git a/application/views/scripts/suggest/index.phtml b/application/views/scripts/suggest/index.phtml
new file mode 100644
index 0000000..5f804e1
--- /dev/null
+++ b/application/views/scripts/suggest/index.phtml
@@ -0,0 +1,3 @@
+<?php foreach ($suggestions as $suggest): ?>
+<li><?= $suggest ?></li>
+<?php endforeach ?>