' . sprintf(
$view->escape(
$this->translate('Unsure? Show business impact of "%s"')
),
$biLink
) . '
'
);
if ($this->parentNode) {
$yesMsg = sprintf(
$this->translate('Delete from %s'),
$this->parentNode->getAlias()
);
} else {
$yesMsg = sprintf(
$this->translate('Delete root node "%s"'),
$nodeName
);
}
$this->addElement('select', 'confirm', array(
'label' => $this->translate('Are you sure?'),
'required' => true,
'description' => $this->translate(
'Do you really want to delete this node?'
),
'multiOptions' => $this->optionalEnum(array(
'no' => $this->translate('No'),
'yes' => $yesMsg,
'all' => sprintf($this->translate('Delete all occurrences of %s'), $nodeName),
))
));
}
/**
* @param Node $node
* @return $this
*/
public function setNode(Node $node)
{
$this->node = $node;
return $this;
}
/**
* @param BpNode|null $node
* @return $this
*/
public function setParentNode(?BpNode $node = null)
{
$this->parentNode = $node;
return $this;
}
public function onSuccess()
{
$changes = ProcessChanges::construct($this->bp, $this->session);
$confirm = $this->getValue('confirm');
switch ($confirm) {
case 'yes':
$changes->deleteNode($this->node, $this->parentNode === null ? null : $this->parentNode->getName());
$this->setSuccessMessage(sprintf(
$this->translate('Node %s has been deleted'),
$this->node->getAlias()
));
break;
case 'all':
$changes->deleteNode($this->node);
$this->setSuccessMessage(sprintf(
$this->translate('All occurrences of node %s have been deleted'),
$this->node->getAlias()
));
break;
case 'no':
$this->setSuccessMessage($this->translate('Well, maybe next time'));
}
switch ($confirm) {
case 'yes':
case 'all':
if ($this->successUrl === null) {
$this->successUrl = clone $this->getRequest()->getUrl();
}
$this->successUrl->getParams()->remove(array('action', 'deletenode'));
}
// Trigger session desctruction to make sure it get's stored.
// TODO: figure out why this is necessary, might be an unclean shutdown on redirect
unset($changes);
parent::onSuccess();
}
}
icingaweb2-module-businessprocess-2.6.0/application/forms/EditNodeForm.php 0000664 0000000 0000000 00000023411 15163210572 0026730 0 ustar 00root root 0000000 0000000
// SPDX-License-Identifier: GPL-3.0-or-later
namespace Icinga\Module\Businessprocess\Forms;
use Icinga\Module\Businessprocess\BpConfig;
use Icinga\Module\Businessprocess\BpNode;
use Icinga\Module\Businessprocess\Modification\ProcessChanges;
use Icinga\Module\Businessprocess\Node;
use Icinga\Module\Businessprocess\ServiceNode;
use Icinga\Module\Businessprocess\Web\Form\Element\IplStateOverrides;
use Icinga\Module\Businessprocess\Web\Form\Validator\HostServiceTermValidator;
use Icinga\Module\Monitoring\Backend\MonitoringBackend;
use Icinga\Web\Session\SessionNamespace;
use ipl\Html\Attributes;
use ipl\Html\FormattedString;
use ipl\Html\HtmlElement;
use ipl\Html\ValidHtml;
use ipl\I18n\Translation;
use ipl\Web\Compat\CompatForm;
use ipl\Web\FormElement\TermInput\ValidatedTerm;
use ipl\Web\Url;
class EditNodeForm extends CompatForm
{
use Translation;
/** @var ?BpConfig */
protected $bp;
/** @var ?Node */
protected $node;
/** @var ?BpNode */
protected $parent;
/** @var SessionNamespace */
protected $session;
/**
* Set the affected configuration
*
* @param BpConfig $bp
*
* @return $this
*/
public function setProcess(BpConfig $bp): self
{
$this->bp = $bp;
return $this;
}
/**
* Set the affected node
*
* @param Node $node
*
* @return $this
*/
public function setNode(Node $node): self
{
$this->node = $node;
$this->populate([
'node-search' => $node->getName(),
'node-label' => $node->getAlias()
]);
return $this;
}
/**
* Set the affected sub-process
*
* @param ?BpNode $node
*
* @return $this
*/
public function setParentNode(?BpNode $node = null): self
{
$this->parent = $node;
if ($this->node !== null) {
$stateOverrides = $this->parent->getStateOverrides($this->node->getName());
if (! empty($stateOverrides)) {
$this->populate([
'overrideStates' => 'y',
'stateOverrides' => $stateOverrides
]);
}
}
return $this;
}
/**
* Set the user's session
*
* @param SessionNamespace $session
*
* @return $this
*/
public function setSession(SessionNamespace $session): self
{
$this->session = $session;
return $this;
}
/**
* Identify and return the node the user has chosen
*
* @return Node
*/
protected function identifyChosenNode(): Node
{
$userInput = $this->getPopulatedValue('node');
$nodeName = $this->getPopulatedValue('node-search');
$nodeLabel = $this->getPopulatedValue('node-label');
if ($nodeName && $userInput === $nodeLabel) {
// User accepted a suggestion and didn't change it manually
$node = $this->bp->getNode($nodeName);
} elseif ($userInput && (! $nodeLabel || $userInput !== $nodeLabel)) {
// User didn't choose a suggestion or changed it manually
if ($this->node instanceof ServiceNode) {
[$service, $host] = explode(' on ', $userInput, 2);
$node = $this->bp->createService($host, $service);
} else {
$node = $this->bp->createHost($userInput);
}
} else {
// If the search and user input are both empty, it can only be the initial value
$node = $this->node;
}
return $node;
}
protected function assemble()
{
$this->addHtml(new HtmlElement('h2', null, FormattedString::create(
$this->translate('Modify "%s"'),
$this->node->getAlias() ?? $this->node->getName()
)));
if ($this->node instanceof ServiceNode) {
$this->assembleServiceElements();
} else {
$this->assembleHostElements();
}
$this->addElement('submit', 'btn_submit', [
'label' => $this->translate('Save Changes')
]);
}
protected function assembleServiceElements(): void
{
if ($this->bp->getBackend() instanceof MonitoringBackend) {
$suggestionsPath = 'businessprocess/suggestions/monitoring-service';
} else {
$suggestionsPath = 'businessprocess/suggestions/icingadb-service';
}
$node = $this->identifyChosenNode();
$this->addHtml($this->createSearchInput(
$this->translate('Service'),
$node->getAlias() ?? $node->getName(),
$suggestionsPath
));
$this->addElement('checkbox', 'overrideStates', [
'ignore' => true,
'class' => 'autosubmit',
'label' => $this->translate('Override Service State')
]);
if ($this->getPopulatedValue('overrideStates') === 'y') {
$this->addElement(new IplStateOverrides('stateOverrides', [
'label' => $this->translate('State Overrides'),
'options' => [
0 => $this->translate('OK'),
1 => $this->translate('WARNING'),
2 => $this->translate('CRITICAL'),
3 => $this->translate('UNKNOWN'),
99 => $this->translate('PENDING'),
]
]));
}
}
protected function assembleHostElements(): void
{
if ($this->bp->getBackend() instanceof MonitoringBackend) {
$suggestionsPath = 'businessprocess/suggestions/monitoring-host';
} else {
$suggestionsPath = 'businessprocess/suggestions/icingadb-host';
}
$node = $this->identifyChosenNode();
$this->addHtml($this->createSearchInput(
$this->translate('Host'),
$node->getAlias() ?? $node->getName(),
$suggestionsPath
));
$this->addElement('checkbox', 'overrideStates', [
'ignore' => true,
'class' => 'autosubmit',
'label' => $this->translate('Override Host State')
]);
if ($this->getPopulatedValue('overrideStates') === 'y') {
$this->addElement(new IplStateOverrides('stateOverrides', [
'label' => $this->translate('State Overrides'),
'options' => [
0 => $this->translate('UP'),
1 => $this->translate('DOWN'),
99 => $this->translate('PENDING')
]
]));
}
}
protected function createSearchInput(string $label, string $value, string $suggestionsPath): ValidHtml
{
$userInput = $this->createElement('text', 'node', [
'ignore' => true,
'required' => true,
'autocomplete' => 'off',
'label' => $label,
'value' => $value,
'data-enrichment-type' => 'completion',
'data-term-suggestions' => '#node-suggestions',
'data-suggest-url' => Url::fromPath($suggestionsPath, [
'node' => isset($this->parent) ? $this->parent->getName() : null,
'config' => $this->bp->getName(),
'showCompact' => true,
'_disableLayout' => true
]),
'validators' => ['callback' => function ($_, $validator) {
$newName = $this->identifyChosenNode()->getName();
if ($newName === $this->node->getName()) {
return true;
}
$term = new ValidatedTerm($newName);
(new HostServiceTermValidator())
->setParent($this->parent)
->isValid($term);
if (! $term->isValid()) {
$validator->addMessage($term->getMessage());
return false;
}
return true;
}]
]);
$fieldset = new HtmlElement('fieldset');
$searchInput = $this->createElement('hidden', 'node-search', ['ignore' => true]);
$this->registerElement($searchInput);
$fieldset->addHtml($searchInput);
$labelInput = $this->createElement('hidden', 'node-label', ['ignore' => true]);
$this->registerElement($labelInput);
$fieldset->addHtml($labelInput);
$this->registerElement($userInput);
$this->decorate($userInput);
$fieldset->addHtml(
$userInput,
new HtmlElement('div', Attributes::create([
'id' => 'node-suggestions',
'class' => 'search-suggestions'
]))
);
return $fieldset;
}
protected function onSuccess()
{
$changes = ProcessChanges::construct($this->bp, $this->session);
$children = $this->parent->getChildNames();
$previousPos = array_search($this->node->getName(), $children, true);
$node = $this->identifyChosenNode();
$nodeName = $node->getName();
$changes->deleteNode($this->node, $this->parent->getName());
$changes->addChildrenToNode([$nodeName], $this->parent);
$stateOverrides = $this->getValue('stateOverrides');
if (! empty($stateOverrides)) {
$changes->modifyNode($this->parent, [
'stateOverrides' => array_merge($this->parent->getStateOverrides(), [
$nodeName => $stateOverrides
])
]);
}
if ($this->bp->getMetadata()->isManuallyOrdered() && ($newPos = count($children) - 1) > $previousPos) {
$changes->moveNode(
$node,
$newPos,
$previousPos,
$this->parent->getName(),
$this->parent->getName()
);
}
unset($changes);
}
}
icingaweb2-module-businessprocess-2.6.0/application/forms/GeneralConfigForm.php 0000664 0000000 0000000 00000002036 15163210572 0027740 0 ustar 00root root 0000000 0000000
// SPDX-License-Identifier: GPL-3.0-or-later
namespace Icinga\Module\Businessprocess\Forms;
use ipl\Validator\GreaterThanValidator;
use ipl\Web\Compat\CompatForm;
class GeneralConfigForm extends CompatForm
{
/** @var int Default number of maximum allowed processes in the sidebar menu */
public const MAX_MENU_PROCESSES = 5;
protected function assemble(): void
{
$this->addElement(
'number',
'max_menu_processes',
[
'label' => $this->translate('Max Menu Processes'),
'description' => $this->translate('Max allowed processes in sidebar menu'),
'placeholder' => '5',
'value' => static::MAX_MENU_PROCESSES,
'min' => 0,
'validators' => [new GreaterThanValidator(['min' => 0])]
]
);
$this->addElement('submit', 'submit', ['label' => $this->translate('Save Changes')]);
}
}
icingaweb2-module-businessprocess-2.6.0/application/forms/MoveNodeForm.php 0000664 0000000 0000000 00000012013 15163210572 0026745 0 ustar 00root root 0000000 0000000
// SPDX-License-Identifier: GPL-3.0-or-later
namespace Icinga\Module\Businessprocess\Forms;
use Icinga\Application\Icinga;
use Icinga\Application\Web;
use Icinga\Exception\Http\HttpException;
use Icinga\Module\Businessprocess\BpConfig;
use Icinga\Module\Businessprocess\BpNode;
use Icinga\Module\Businessprocess\Exception\ModificationError;
use Icinga\Module\Businessprocess\Modification\ProcessChanges;
use Icinga\Module\Businessprocess\Node;
use Icinga\Module\Businessprocess\Web\Form\BpConfigBaseForm;
use Icinga\Module\Businessprocess\Web\Form\CsrfToken;
use Icinga\Web\Session;
use Icinga\Web\Session\SessionNamespace;
class MoveNodeForm extends BpConfigBaseForm
{
/** @var BpConfig */
protected $bp;
/** @var Node */
protected $node;
/** @var BpNode */
protected $parentNode;
/** @var SessionNamespace */
protected $session;
public function __construct($options = null)
{
parent::__construct($options);
// Zend's plugin loader reverses the order of added prefix paths thus trying our paths first before trying
// Zend paths
$this->addPrefixPaths(array(
array(
'prefix' => 'Icinga\\Web\\Form\\Element\\',
'path' => Icinga::app()->getLibraryDir('Icinga/Web/Form/Element'),
'type' => static::ELEMENT
),
array(
'prefix' => 'Icinga\\Web\\Form\\Decorator\\',
'path' => Icinga::app()->getLibraryDir('Icinga/Web/Form/Decorator'),
'type' => static::DECORATOR
)
));
}
public function setup()
{
$this->addElement(
'text',
'parent',
[
'allowEmpty' => true,
'filters' => ['Null'],
'validators' => [
['Callback', true, [
'callback' => function ($name) {
return empty($name) || $this->bp->hasBpNode($name);
},
'messages' => [
'callbackValue' => $this->translate('No process found with name %value%')
]
]]
]
]
);
$this->addElement(
'number',
'from',
[
'required' => true,
'min' => 0
]
);
$this->addElement(
'number',
'to',
[
'required' => true,
'min' => 0
]
);
$this->addElement(
'hidden',
'csrfToken',
[
'required' => true
]
);
$this->setSubmitLabel('movenode');
}
/**
* @param Node $node
* @return $this
*/
public function setNode(Node $node)
{
$this->node = $node;
return $this;
}
/**
* @param BpNode|null $node
* @return $this
*/
public function setParentNode(?BpNode $node = null)
{
$this->parentNode = $node;
return $this;
}
public function onSuccess()
{
if (! CsrfToken::isValid($this->getValue('csrfToken'))) {
throw new HttpException(403, 'nope');
}
$changes = ProcessChanges::construct($this->bp, $this->session);
if (! $this->bp->getMetadata()->isManuallyOrdered()) {
$changes->applyManualOrder();
}
try {
$changes->moveNode(
$this->node,
$this->getValue('from'),
$this->getValue('to'),
$this->getValue('parent'),
$this->parentNode !== null ? $this->parentNode->getName() : null
);
} catch (ModificationError $e) {
$this->notifyError($e->getMessage());
/** @var Web $app */
$app = Icinga::app();
$app->getResponse()
// Web 2's JS forces a content update for non-200s. Our own JS
// can't prevent this, hence we're not making this a 400 :(
//->setHttpResponseCode(400)
->setHeader('X-Icinga-Container', 'ignore')
->sendResponse();
exit;
}
// Trigger session destruction to make sure it get's stored.
unset($changes);
$this->notifySuccess($this->translate('Node order updated'));
$response = $this->getRequest()->getResponse()
->setHeader('X-Icinga-Container', 'ignore')
->setHeader('X-Icinga-Extra-Updates', implode(';', [
$this->getRequest()->getHeader('X-Icinga-Container'),
$this->getSuccessUrl()->getAbsoluteUrl()
]));
Session::getSession()->write();
$response->sendResponse();
exit;
}
public function hasBeenSent()
{
return true; // This form has no id
}
}
icingaweb2-module-businessprocess-2.6.0/application/forms/ProcessForm.php 0000664 0000000 0000000 00000012016 15163210572 0026652 0 ustar 00root root 0000000 0000000
// SPDX-License-Identifier: GPL-3.0-or-later
namespace Icinga\Module\Businessprocess\Forms;
use Icinga\Module\Businessprocess\BpNode;
use Icinga\Module\Businessprocess\Modification\ProcessChanges;
use Icinga\Module\Businessprocess\Node;
use Icinga\Module\Businessprocess\Web\Form\BpConfigBaseForm;
use Icinga\Web\Notification;
use Icinga\Web\View;
class ProcessForm extends BpConfigBaseForm
{
/** @var BpNode */
protected $node;
public function setup()
{
if ($this->node !== null) {
/** @var View $view */
$view = $this->getView();
$this->addHtml(
'' . $html . '
';
}
return $html;
}
}
icingaweb2-module-businessprocess-2.6.0/application/views/scripts/ 0000775 0000000 0000000 00000000000 15163210572 0025375 5 ustar 00root root 0000000 0000000 icingaweb2-module-businessprocess-2.6.0/application/views/scripts/default.phtml 0000664 0000000 0000000 00000000101 15163210572 0030057 0 ustar 00root root 0000000 0000000 = $this->controls->render() ?>
= $this->content->render() ?>
icingaweb2-module-businessprocess-2.6.0/application/views/scripts/ido-host/ 0000775 0000000 0000000 00000000000 15163210572 0027123 5 ustar 00root root 0000000 0000000 icingaweb2-module-businessprocess-2.6.0/application/views/scripts/ido-host/show.phtml 0000664 0000000 0000000 00000001065 15163210572 0031153 0 ustar 00root root 0000000 0000000
= $this->translate('Access Denied') ?>
= sprintf($this->translate('You are lacking permission to access host "%s".'), $this->escape($host)) ?>
= $this->icon('cancel') ?>= $this->translate('Hide this message') ?>
icingaweb2-module-businessprocess-2.6.0/application/views/scripts/ido-service/ 0000775 0000000 0000000 00000000000 15163210572 0027606 5 ustar 00root root 0000000 0000000 icingaweb2-module-businessprocess-2.6.0/application/views/scripts/ido-service/show.phtml 0000664 0000000 0000000 00000001171 15163210572 0031634 0 ustar 00root root 0000000 0000000
= $this->escape($this->translate('Access Denied')) ?>
= $this->escape(sprintf($this->translate('You are lacking permission to access service "%s" on host "%s"'), $service, $host)) ?>
= $this->icon('cancel') ?>= $this->translate('Hide this message') ?>
icingaweb2-module-businessprocess-2.6.0/application/views/scripts/process/ 0000775 0000000 0000000 00000000000 15163210572 0027053 5 ustar 00root root 0000000 0000000 icingaweb2-module-businessprocess-2.6.0/application/views/scripts/process/source.phtml 0000664 0000000 0000000 00000000745 15163210572 0031427 0 ustar 00root root 0000000 0000000 = $this->controls->render() ?>
showDiff): ?>
= $this->diff->render() ?>
source);
$len = ceil(log(count($lines), 10));
$rowhtml = sprintf('| %%0%dd: | %%s
|
', $len);
foreach ($lines as $line) {
$cnt++;
printf($rowhtml, $cnt, $this->escape($line));
}
?>
icingaweb2-module-businessprocess-2.6.0/configuration.php 0000664 0000000 0000000 00000005134 15163210572 0023631 0 ustar 00root root 0000000 0000000
// SPDX-License-Identifier: GPL-3.0-or-later
use Icinga\Application\Config;
use Icinga\Module\Businessprocess\Forms\GeneralConfigForm;
use Icinga\Module\Businessprocess\Storage\LegacyStorage;
use Icinga\Module\Businessprocess\Web\Navigation\Renderer\ProcessProblemsBadge;
/** @var \Icinga\Application\Modules\Module $this */
$section = $this->menuSection(N_('Business Processes'), array(
'renderer' => 'ProcessesProblemsBadge',
'url' => 'businessprocess',
'icon' => 'sitemap',
'priority' => 46
));
try {
$storage = LegacyStorage::getInstance();
$maxMenuProcesses = Config::module('businessprocess')
->getSection('general')
->get('max_menu_processes', GeneralConfigForm::MAX_MENU_PROCESSES);
if ($maxMenuProcesses > 0) {
$prio = 0;
foreach ($storage->listProcessNames() as $name) {
$meta = $storage->loadMetadata($name);
if ($meta->get('AddToMenu') === 'no') {
continue;
}
$prio++;
if ($prio > $maxMenuProcesses) {
$section->add(N_('Show all'), array(
'url' => 'businessprocess',
'priority' => $prio
));
break;
}
$section->add($meta->getTitle(), array(
'renderer' => (new ProcessProblemsBadge())->setBpConfigName($name),
'url' => 'businessprocess/process/show',
'urlParameters' => array('config' => $name),
'priority' => $prio
));
}
}
} catch (Exception $e) {
// Well... there is not much we could do here
}
$this->providePermission(
'businessprocess/showall',
$this->translate('Allow to see all available processes, regardless of configured restrictions')
);
$this->providePermission(
'businessprocess/create',
$this->translate('Allow to create whole new process configuration (files)')
);
$this->providePermission(
'businessprocess/modify',
$this->translate('Allow to modify process definitions, to add and remove nodes')
);
$this->provideRestriction(
'businessprocess/prefix',
$this->translate('Restrict access to configurations with the given prefix')
);
$this->provideConfigTab(
'general',
[
'title' => $this->translate('General'),
'label' => $this->translate('General'),
'url' => 'config/general'
]
);
$this->provideJsFile('vendor/Sortable.js');
$this->provideJsFile('behavior/sortable.js');
$this->provideJsFile('vendor/jquery.fn.sortable.js');
icingaweb2-module-businessprocess-2.6.0/doc/ 0000775 0000000 0000000 00000000000 15163210572 0021013 5 ustar 00root root 0000000 0000000 icingaweb2-module-businessprocess-2.6.0/doc/01-About.md 0000664 0000000 0000000 00000001543 15163210572 0022630 0 ustar 00root root 0000000 0000000 # Icinga Business Process Modeling
If you want to visualize and monitor hierarchical business processes based on
objects monitored by Icinga, Icinga Business Process Modeling is the solution.
[](16-Add-To-Dashboard.md)
Want to create custom process-based dashboards? Trigger notifications at
process or sub-process level? Provide a quick top-level view for thousands of
components on a single screen? That's what this module has been designed for!
You're running a huge cloud, want to get rid of the monitoring noise triggered
by your auto-scaling platform but still want to have detailed information just
a couple of clicks away in case you need them? You will love this little module!
## Documentation
* [Installation](02-Installation.md)
* [Getting Started](03-Getting-Started.md)
icingaweb2-module-businessprocess-2.6.0/doc/02-Installation.md 0000664 0000000 0000000 00000002155 15163210572 0024220 0 ustar 00root root 0000000 0000000
# Installing Icinga Business Process Modeling
The recommended way to install Icinga Business Process Modeling is to use prebuilt packages for
all supported platforms from our official release repository.
Please note that [Icinga Web](https://icinga.com/docs/icinga-web) is required to run Icinga
Business Process Modeling and if it is not already set up, it is best to do this first.
The following steps will guide you through installing and setting up Icinga Business Process Modeling.
## Installing the Package
If the [repository](https://packages.icinga.com) is not configured yet, please add it first.
Then use your distribution's package manager to install the `icinga-businessprocess` package
or install [from source](02-Installation.md.d/From-Source.md).
## Configuring Icinga Business Process Modeling
That's it, Icinga Business Process Modeling is now ready to use.
Please read more on [how to get started](03-Getting-Started.md).
icingaweb2-module-businessprocess-2.6.0/doc/02-Installation.md.d/ 0000775 0000000 0000000 00000000000 15163210572 0024514 5 ustar 00root root 0000000 0000000 icingaweb2-module-businessprocess-2.6.0/doc/02-Installation.md.d/From-Source.md 0000664 0000000 0000000 00000001266 15163210572 0027204 0 ustar 00root root 0000000 0000000 # Installing Icinga Business Process Modeling from Source
Please see the Icinga Web documentation on
[how to install modules](https://icinga.com/docs/icinga-web/latest/doc/08-Modules/#installation) from source.
Make sure you use `businessprocess` as the module name. The following requirements must also be met.
## Requirements
* PHP ≥ 8.2
* [Icinga Web](https://github.com/Icinga/icingaweb2) ≥ 2.12.5
* [Icinga DB Web](https://github.com/Icinga/icingadb-web) ≥ 1.1.0
* [Icinga PHP Library (ipl)](https://github.com/Icinga/icinga-php-library) ≥ 0.19.0
* [Icinga PHP Thirdparty](https://github.com/Icinga/icinga-php-thirdparty) ≥ 0.15.0
icingaweb2-module-businessprocess-2.6.0/doc/03-Getting-Started.md 0000664 0000000 0000000 00000005242 15163210572 0024565 0 ustar 00root root 0000000 0000000 # Getting Started
Once you enable Icinga Business Process Modeling, it will pop up in your menu.
If you click on it, it will show you a new Dashboard:

## A new Business Process configuration
From here we choose to create a new *Business Process configuration*:

Let's have a look at the single fields:
### Configuration name

The Business Process definition will be stored with this name. This is going to
be used when referencing this process in URLs and in Check Commands.
### Title

You might optionally want to provide an additional title. In that case the title
is shown in the GUI, while the name is still used as a reference. The title will
default to the name.
### Description

Provide a short description explaining within 100-150 character what this
configuration provides. This will be shown on the Dashboard.
### Backend

**Hint:** *Usually this should not be changed*
Icinga Web 2 currently uses only one Monitoring Backend, but in theory you
could configure multiple ones. They won't be usable in a meaningful way at the
time of this writing. Still, you might want to use a different backend as a data
provider for your Business Process.
### State Type

You can decide whether `SOFT` or `HARD` states should be the used as a base when
calculating the state of a Business Process definition.
### Add to menu
Business Process configurations can be linked to the Icinga Web menu. By default, the
first five items are shown. This can be adjusted in the module's general configuration.

That's all for now, click `Add` to store your new (still empty) Business Process
configuration.
## Empty configuration
You are redirected to your newly created Business Process configuration:

From here we can now add as many deeply nested Business Processes as we want.
But let's first have a look at our Dashboard once again:

Now let's move on and [create your first Nodes](04-Create-your-first-process-node.md).
icingaweb2-module-businessprocess-2.6.0/doc/04-Create-your-first-process-node.md 0000664 0000000 0000000 00000005050 15163210572 0027501 0 ustar 00root root 0000000 0000000 # Create your first Business Process Node
A *Business Process Node* consists of a *name*, *title*, an *operator* and one or
more child nodes. It can be a Root Node, child node of other Business Process
Nodes - or both.

## Configuring our first node
To create our first *Business Process Node* we click the *Add* button. This
leads to the related configuration form:

First setting is the *Node name*, an identifier that must be unique throughout
all Nodes that are going to be defined. This identifier will be used in every
link and also in *Check Commands* referring this node from an Icinga *Service
Check*.
### Set a title
As uniqueness sometimes leads to not-so-beautiful names, you are additionally
allowed to specify a title. This is what the frontend is going to show:

### Choose an operator
Every Business Process requires an *Operator*. This operator defines it's
behaviour, this specifies how it's very own state is going to be calculated:

### Specify where to display
The form suggests to create a *Toplevel Process*. It does so as we are about
to create a new *root node*. We could alternatively also create a sub process.
As we are currently not adding it to another Node, this would lead to an *Unbound
Node* that could be linked later on.

### Provide an optional Info URL
One might also want to provide a link to additional information related to a
specific process. This could be instructions with more technical details or
hints telling what should happen if outage occurs. You might not want to do so
for every single Node, but it might come in handy for your most important (top
level?) nodes:

That's it, your are ready to submit the form.
### First Business Process Node ready
You are now shown your first Business Process Node. A red bar reminds you that
your pending changes have not been stored yet:

You could now *Store the Configuration* or move on with adding additional nodes
to complete your configuration.
**Hint**: the blue arrow makes part of a breadcrumb showing your current position.
You might want to learn more about [breadcrumbs](12-Web-Components-Breadcrumb.md).
icingaweb2-module-businessprocess-2.6.0/doc/05-Importing-Processes.md 0000664 0000000 0000000 00000003573 15163210572 0025503 0 ustar 00root root 0000000 0000000 # Importing Processes
To avoid redundancy and make complex *Business Process Configurations* easier
to maintain it is possible to import processes from other configurations.
In order to be able to import a process create a root node first. You cannot
import processes into the root level.

## Importing a Process
Once the related configuration form is open, choose `Existing Process` and wait
for the form to refresh.

### Choose Configuration
You can now choose the configuration to import processes from. Or simply hit
`Next` to just utilize a process from the current configuration.

### Select Processes
Now select the processes you want to import and submit the form.

### Import Successful
You are now looking at the result. The process has been imported. Do not forget
to save your changes!

## Navigation with Imported Processes
### Seamless Breadcrumbs
You may have already noticed that the breadcrumbs integrate the hierarchy
of the imported process. Once you navigate further the actions below the
breadcrumbs change and don't permit to unlock editing.

To change imported processes you need to open them in their original
configuration first. To do so click on the arrow to the right which is
displayed in a tile's action urls in the upper left. While in tree view
these can be found at the very right of an process' row.

icingaweb2-module-businessprocess-2.6.0/doc/06-Customize-Node-Order.md 0000664 0000000 0000000 00000004106 15163210572 0025477 0 ustar 00root root 0000000 0000000 # Customize Node Order
By default all nodes are ordered alphabetically while viewing them in the UI.
Though, it is also possible to order nodes entirely manually.
> **Note**
>
> Once manual order is applied (no matter where) alphabetical order is
> disabled for the entire configuration.
## Reorder by Drag'n'Drop
Make sure to unlock the configuration first to be able to reorder nodes.
### Tile View
To move a tile simply grab it with your mouse and drag it to the location you
want it to appear at.


### Tree View
While in tree view nodes can be moved the same way. You just have a narrower
area to grab them.


The tree view also has an advantage the tile view has not. It is possible to
move nodes within the entire hierarchy. But remember to unfold processes first,
if you want to move a node into them.
## File Format Extensions
The configuration file format has slightly been changed to accommodate the new
manual order. Though, previous configurations are perfectly upwards compatible.
### New Header
A new header is used to flag a configuration file as being manually ordered.
```
# ManualOrder : yes
```
Once this is set alphabetical order is disabled and only the next techniques
define the order of nodes.
### Changed `display` Semantic
Previously there were only two valid values for the `display` directive.
(0 = Subprocess, 1 = Toplevel Process)
```
display 0|1;