Projet/Mission4/roles/glpi/files/fusioninventory/inc/deployuserinteractiontemplate.class.php
2022-02-11 15:48:06 +01:00

725 lines
21 KiB
PHP

<?php
/**
* FusionInventory
*
* Copyright (C) 2010-2016 by the FusionInventory Development Team.
*
* http://www.fusioninventory.org/
* https://github.com/fusioninventory/fusioninventory-for-glpi
* http://forge.fusioninventory.org/
*
* ------------------------------------------------------------------------
*
* LICENSE
*
* This file is part of FusionInventory project.
*
* FusionInventory is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* FusionInventory is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with FusionInventory. If not, see <http://www.gnu.org/licenses/>.
*
* ------------------------------------------------------------------------
*
* This file is used to manage the actions in package for deploy system.
*
* ------------------------------------------------------------------------
*
* @package FusionInventory
* @author Walid Nouh
* @copyright Copyright (c) 2010-2016 FusionInventory team
* @license AGPL License 3.0 or (at your option) any later version
* http://www.gnu.org/licenses/agpl-3.0-standalone.html
* @link http://www.fusioninventory.org/
* @link https://github.com/fusioninventory/fusioninventory-for-glpi
*
*/
if (!defined('GLPI_ROOT')) {
die("Sorry. You can't access directly to this file");
}
/**
* Manage user interactions templates.
* @since 9.2
*/
class PluginFusioninventoryDeployUserinteractionTemplate extends CommonDropdown {
/**
* The right name for this class
*
* @var string
*/
static $rightname = 'plugin_fusioninventory_userinteractiontemplate';
const ALERT_WTS = 'win32'; //Alerts for win32 platform (WTS API)
//Behaviors (to sent to the agent) :
//in two parts :
//- left part is the instruction for the agent
//- right part is the code that the agent returns to the server
//Continue a software deployment
const BEHAVIOR_CONTINUE_DEPLOY = 'continue:continue';
//Cancel a software deployment
const BEHAVIOR_STOP_DEPLOY = 'stop:stop';
//Postpone a software deployment
const BEHAVIOR_POSTPONE_DEPLOY = 'stop:postpone';
//Available buttons for Windows WTS API
const WTS_BUTTON_OK_SYNC = 'ok';
const WTS_BUTTON_OK_ASYNC = 'ok_async';
const WTS_BUTTON_OK_CANCEL = 'okcancel';
const WTS_BUTTON_YES_NO = 'yesno';
const WTS_BUTTON_ABORT_RETRY_IGNORE = 'abortretryignore';
const WTS_BUTTON_RETRY_CANCEL = 'retrycancel';
const WTS_BUTTON_YES_NO_CANCEL = 'yesnocancel';
const WTS_BUTTON_CANCEL_TRY_CONTINUE = 'canceltrycontinue';
//Icons to be displayed
const WTS_ICON_NONE = 'none';
const WTS_ICON_WARNING = 'warn';
const WTS_ICON_QUESTION = 'question';
const WTS_ICON_INFO = 'info';
const WTS_ICON_ERROR = 'error';
/**
* @see CommonGLPI::defineTabs()
**/
function defineTabs($options = []) {
$ong = [];
$this->addStandardTab(__CLASS__, $ong, $options)
->addStandardTab('Log', $ong, $options);
return $ong;
}
/**
* @see CommonGLPI::getTabNameForItem()
**/
function getTabNameForItem(CommonGLPI $item, $withtemplate = 0) {
$tabs[1] = __('General');
$tabs[2] = _n('Behavior', 'Behaviors', 2, 'fusioninventory');
return $tabs;
}
/**
* @param $item CommonGLPI object
* @param $tabnum (default 1)
* @param $withtemplate (default 0)
**/
static function displayTabContentForItem(CommonGLPI $item, $tabnum = 1, $withtemplate = 0) {
global $CFG_GLPI;
if ($item->getType() == __CLASS__) {
switch ($tabnum) {
case 1 :
$item->showForm($item->fields['id']);
break;
case 2 :
$item->showBehaviors($item->fields['id']);
break;
}
}
return true;
}
/**
* Get name of this type by language of the user connected
*
* @param integer $nb number of elements
* @return string name of this type
*/
static function getTypeName($nb = 0) {
return _n('User interaction template',
'User interaction templates', $nb, 'fusioninventory');
}
/**
* Get list of supported interaction methods
*
* @since 9.2
* @return array
*/
static function getTypes() {
return [self::ALERT_WTS
=> __("Windows system alert (WTS)", 'fusioninventory')];
}
/**
* Display a dropdown with the list of alert types
*
* @since 9.2
* @param type the type of alert (if one already selected)
* @return rand
*/
function dropdownTypes($type = self::ALERT_WTS) {
return Dropdown::showFromArray('platform', self::getTypes(),
['value' => $type]);
}
/**
* Get available buttons for alerts, by interaction type
*
* @since 9.2
* @param interaction_type the type of interaction
* @return array
*/
static function getButtons($interaction_type = '') {
$interactions = [
self::ALERT_WTS => [
self::WTS_BUTTON_OK_SYNC => __('OK', 'fusioninventory'),
self::WTS_BUTTON_OK_ASYNC => __('OK (asynchronous)', 'fusioninventory'),
self::WTS_BUTTON_OK_CANCEL => __('OK - Cancel', 'fusioninventory'),
self::WTS_BUTTON_YES_NO => __('Yes - No', 'fusioninventory'),
self::WTS_BUTTON_ABORT_RETRY_IGNORE => __('OK - Abort - Retry', 'fusioninventory'),
self::WTS_BUTTON_RETRY_CANCEL => __('Retry - Cancel', 'fusioninventory'),
self::WTS_BUTTON_ABORT_RETRY_IGNORE => __('Abort - Retry - Ignore', 'fusioninventory'),
self::WTS_BUTTON_CANCEL_TRY_CONTINUE => __('Cancel - Try - Continue', 'fusioninventory'),
self::WTS_BUTTON_YES_NO_CANCEL => __('Yes - No - Cancel', 'fusioninventory')
]
];
if (isset($interactions[$interaction_type])) {
return $interactions[$interaction_type];
} else {
return false;
}
}
/**
* Display a dropdown with the list of buttons available
*
* @since 9.2
* @param type the type of button (if one already selected)
* @return rand
*/
public function dropdownButtons($button = self::WTS_BUTTON_OK_SYNC) {
return Dropdown::showFromArray('buttons',
self::getButtons(self::ALERT_WTS),
['value' => $button]);
}
/**
* Get available icons for alerts, by interaction type
*
* @since 9.2
* @param interaction_type the type of interaction
* @return array
*/
static function getIcons($interaction_type = self::ALERT_WTS) {
$icons = [
self::ALERT_WTS => [
self::WTS_ICON_NONE => __('None'),
self::WTS_ICON_WARNING => __('Warning'),
self::WTS_ICON_INFO => _n('Information', 'Informations', 1),
self::WTS_ICON_ERROR => __('Error'),
self::WTS_ICON_QUESTION => __('Question', 'fusioninventory')
]
];
if (isset($icons[$interaction_type])) {
return $icons[$interaction_type];
} else {
return false;
}
}
/**
* Display a dropdown with the list of buttons available
*
* @since 9.2
* @param type the type of button (if one already selected)
* @return rand
*/
function dropdownIcons($icon = self::WTS_ICON_NONE) {
return Dropdown::showFromArray('icon',
self::getIcons(),
['value' => $icon]);
}
/**
* Get available behaviors in case of user interactions
*
* @since 9.2
* @return array
*/
static function getBehaviors() {
return [self::BEHAVIOR_CONTINUE_DEPLOY => __('Continue job with no user interaction', 'fusioninventory'),
self::BEHAVIOR_POSTPONE_DEPLOY => __('Retry job later', 'fusioninventory'),
self::BEHAVIOR_STOP_DEPLOY => __('Cancel job', 'fusioninventory')
];
}
/**
* Display a dropdown with the list of available behaviors
*
* @since 9.2
* @param type the type of bahaviors (if one already selected)
* @return rand
*/
function dropdownBehaviors($name, $behavior = self::BEHAVIOR_CONTINUE_DEPLOY) {
return Dropdown::showFromArray($name,
self::getBehaviors(),
['value' => $behavior]);
}
/**
* Get the fields to be encoded in json
* @since 9.2
* @return an array of field names
*/
function getJsonFields() {
return array_merge($this->getMainFormFields(),
$this->getBehaviorsFields());
}
/**
* Get the fields to be encoded in json
* @since 9.2
* @return an array of field names
*/
function getMainFormFields() {
return ['platform', 'timeout', 'buttons', 'icon',
'retry_after', 'nb_max_retry'];
}
/**
* Get the fields to be encoded in json
* @since 9.2
* @return an array of field names
*/
function getBehaviorsFields() {
return ['on_timeout', 'on_nouser', 'on_multiusers', 'on_ok', 'on_no',
'on_yes', 'on_cancel', 'on_abort', 'on_retry', 'on_tryagain',
'on_ignore', 'on_continue', 'on_async'];
}
/**
* Initialize json fields
* @since 9.2
*
* @return an array of field names
*/
function initializeJsonFields($json_fields) {
foreach ($this->getJsonFields() as $field) {
if (!isset($json_fields[$field])) {
$json_fields[$field] = $this->getDefaultBehaviorForAButton($field);
}
}
return $json_fields;
}
/**
* Save form data as a json encoded array
* @since 9.2
* @param params form parameters
* @return json encoded array
*/
function saveToJson($params = []) {
$result = [];
foreach ($this->getJsonFields() as $field) {
if (isset($params[$field])) {
$result[$field] = $params[$field];
}
}
return json_encode($result);
}
/**
* Add the json template fields to package
*
* @since 9.2
* @param the input array
* @param array now containing input data + data from the template
*/
function addJsonFieldsToArray($params = []) {
$fields = json_decode($this->fields['json'], true);
foreach ($this->getJsonFields() as $field) {
if (isset($fields[$field])) {
$params[$field] = $fields[$field];
}
}
//If we deal with an asynchronous OK, then wait must be set to 0
if ($params['buttons'] == self::WTS_BUTTON_OK_ASYNC) {
$params['buttons'] = self::WTS_BUTTON_OK_SYNC;
$params['wait'] = 'no';
} else {
//Otherwise wait is 1
$params['wait'] = 'yes';
}
return $params;
}
/**
* Display an interaction template form
* @since 9.2
* @param $id id of a template to edit
* @param options POST form options
*/
function showForm($ID, $options = []) {
$this->initForm($ID);
$this->showFormHeader();
$json_data = json_decode($this->fields['json'], true);
$json_data = $this->initializeJsonFields($json_data);
echo "<tr class='tab_bg_1'>";
foreach ($this->getBehaviorsFields() as $field) {
echo Html::hidden($field, ['value' => $json_data[$field]]);
}
$rand = mt_rand();
$tplmark = $this->getAutofillMark('name', $options);
//TRANS: %1$s is a string, %2$s a second one without spaces between them : to change for RTL
echo "<td><label for='textfield_name$rand'>".sprintf(__('%1$s%2$s'), __('Name'), $tplmark) .
"</label></td>";
echo "<td>";
$objectName = autoName($this->fields["name"], "name",
(isset($options['withtemplate']) && ( $options['withtemplate']== 2)),
$this->getType(), $this->fields["entities_id"]);
Html::autocompletionTextField($this, 'name', [ 'value' => $objectName,
'rand' => $rand
]);
echo "</td>";
echo "<td>".__('Interaction format', 'fusioninventory')."</td>";
echo "<td>";
$this->dropdownTypes($json_data['platform']);
echo "</td>";
echo "</tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>".__('Interaction type', 'fusioninventory')."</td>";
echo "<td>";
$this->dropdownButtons($json_data['buttons']);
echo "</td>";
echo "<td>".__('Alert icon', 'fusioninventory')."</td>";
echo "<td>";
$this->dropdownIcons($json_data['icon']);
echo "</td>";
echo "</tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>".__('Retry job after', 'fusioninventory')."</td>";
echo "<td>";
$this->dropdownRetry($json_data['retry_after']);
echo "</td>";
echo "<td>".__('Maximum number of retry allowed', 'fusioninventory')."</td>";
echo "<td>";
Dropdown::showNumber('nb_max_retry',
['value' => $json_data['nb_max_retry'],
'min' => 1,
'max' => 20,
'step' => 1
]);
echo "</td>";
echo "</tr>";
echo "<tr class='tab_bg_1'>";
echo "<td>".__('Alert display timeout', 'fusioninventory')."</td>";
echo "<td>";
$this->dropdownTimeout($json_data['timeout']);
echo "</td>";
echo "<td colspan='2'></td>";
echo "</tr>";
$this->showFormButtons();
return true;
}
/**
* Dropdown for frequency (interval between 2 actions)
*
* @param $name select name
* @param $value default value (default 0)
**/
function dropdownRetry($value = 0) {
$tab[0] = __('Never');
$tab[MINUTE_TIMESTAMP] = sprintf(_n('%d minute', '%d minutes', 1), 1);
$tab[2*MINUTE_TIMESTAMP] = sprintf(_n('%d minute', '%d minutes', 2), 2);
$tab[3*MINUTE_TIMESTAMP] = sprintf(_n('%d minute', '%d minutes', 3), 3);
$tab[4*MINUTE_TIMESTAMP] = sprintf(_n('%d minute', '%d minutes', 4), 4);
// Minutes
for ($i=5; $i<60; $i+=5) {
$tab[$i*MINUTE_TIMESTAMP] = sprintf(_n('%d minute', '%d minutes', $i), $i);
}
// Heures
for ($i=1; $i<24; $i++) {
$tab[$i*HOUR_TIMESTAMP] = sprintf(_n('%d hour', '%d hours', $i), $i);
}
// Jours
$tab[DAY_TIMESTAMP] = __('Each day');
for ($i=2; $i<7; $i++) {
$tab[$i*DAY_TIMESTAMP] = sprintf(_n('%d day', '%d days', $i), $i);
}
$tab[WEEK_TIMESTAMP] = __('Each week');
$tab[MONTH_TIMESTAMP] = __('Each month');
Dropdown::showFromArray('retry_after', $tab, ['value' => $value]);
}
/**
* Dropdown for frequency (interval between 2 actions)
*
* @param $name select name
* @param $value default value (default 0)
**/
function dropdownTimeout($value = 0) {
$tab[0] = __('Never');
// Minutes
for ($i=30; $i<60; $i+=5) {
$tab[$i] = sprintf(_n('%d second', '%d seconds', $i), $i);
}
$tab[MINUTE_TIMESTAMP] = sprintf(_n('%d minute', '%d minutes', 1), 1);
$tab[2*MINUTE_TIMESTAMP] = sprintf(_n('%d minute', '%d minutes', 2), 2);
$tab[3*MINUTE_TIMESTAMP] = sprintf(_n('%d minute', '%d minutes', 3), 3);
$tab[4*MINUTE_TIMESTAMP] = sprintf(_n('%d minute', '%d minutes', 4), 4);
// Minutes
for ($i=5; $i<60; $i+=5) {
$tab[$i*MINUTE_TIMESTAMP] = sprintf(_n('%d minute', '%d minutes', $i), $i);
}
// Hours
for ($i=1; $i<13; $i++) {
$tab[$i*HOUR_TIMESTAMP] = sprintf(_n('%d hour', '%d hours', $i), $i);
}
Dropdown::showFromArray('timeout', $tab, ['value' => $value]);
}
/**
* Get all events leading to an action on a task
*
* @since 9.2
* @return array an array of event => event label
*/
public function getEvents() {
return ['on_ok' => __('Button ok', 'fusioninventory'),
'on_yes' => __('Button yes', 'fusioninventory'),
'on_continue' => __('Button continue', 'fusioninventory'),
'on_retry' => __('Button retry', 'fusioninventory'),
'on_tryagain' => __('Button try', 'fusioninventory'),
'on_no' => __('Button no', 'fusioninventory'),
'on_cancel' => __('Button cancel', 'fusioninventory'),
'on_abort' => __('Button abort', 'fusioninventory'),
'on_ignore' => __('Button ignore', 'fusioninventory'),
'on_nouser' => __('No active session', 'fusioninventory'),
'on_timeout' => __('Alert timeout exceeded', 'fusioninventory'),
'on_multiusers' => __('Several active sessions', 'fusioninventory')
];
}
/**
* Get the behaviors to define for an agent to correctly handle the interaction
*
* @since 9.2
* @param $param the button selected in the interaction template form
* @return array an array of needed interaction behaviors
*/
public function getBehaviorsToDisplay($button) {
$display = ['on_timeout', 'on_nouser', 'on_multiusers'];
switch ($button) {
case self::WTS_BUTTON_OK_SYNC:
case self::WTS_BUTTON_OK_ASYNC:
$display[] = 'on_ok';
break;
case self::WTS_BUTTON_YES_NO:
$display[] = 'on_yes';
$display[] = 'on_no';
break;
case self::WTS_BUTTON_YES_NO_CANCEL:
$display[] = 'on_yes';
$display[] = 'on_no';
$display[] = 'on_cancel';
break;
case self::WTS_BUTTON_OK_CANCEL:
$display[] = 'on_ok';
$display[] = 'on_cancel';
break;
case self::WTS_BUTTON_ABORT_RETRY_IGNORE:
$display[] = 'on_abort';
$display[] = 'on_retry';
$display[] = 'on_ignore';
break;
case self::WTS_BUTTON_RETRY_CANCEL:
$display[] = 'on_retry';
$display[] = 'on_cancel';
break;
case self::WTS_BUTTON_CANCEL_TRY_CONTINUE:
$display[] = 'on_tryagain';
$display[] = 'on_cancel';
$display[] = 'on_continue';
break;
}
return $display;
}
/**
* Get the default behavior for a button
* @since 9.2
* @param string $button the button for which the default behavior is request
* @return string the behavior
*/
public function getDefaultBehaviorForAButton($button) {
$behavior = '';
switch ($button) {
case 'on_yes':
case 'on_ok':
case 'on_multiusers':
case 'on_timeout':
case 'on_nouser':
$behavior = self::BEHAVIOR_CONTINUE_DEPLOY;
break;
case 'on_no':
case 'on_cancel':
case 'on_abort':
$behavior = self::BEHAVIOR_STOP_DEPLOY;
break;
case 'on_retry':
case 'on_ignore':
case 'on_tryagain':
$behavior = self::BEHAVIOR_POSTPONE_DEPLOY;
break;
}
return $behavior;
}
/**
* Show behaviors form
*
* @since 9.2
* @param ID the template's ID
*/
public function showBehaviors($ID) {
$json_data = json_decode($this->fields['json'], true);
$json_data = $this->initializeJsonFields($json_data);
$this->initForm($ID);
$this->showFormHeader();
echo "<tr class='tab_bg_1'>";
echo "<th colspan='4'>".__('Behaviors', 'fusioninventory')."</th>";
echo "</tr>";
foreach ($this->getMainFormFields() as $field) {
echo Html::hidden($field, ['value' => $json_data[$field]]);
}
foreach ($this->getEvents() as $event => $label) {
if (in_array($event,
$this->getBehaviorsToDisplay($json_data['buttons']))) {
echo "<tr class='tab_bg_1'>";
echo "<td>$label</td>";
echo "<td>";
if (empty($json_data[$event])) {
$value = $this->getDefaultBehaviorForAButton($event);
} else {
$value = $json_data[$event];
}
$this->dropdownBehaviors($event, $value);
echo "</td>";
echo "</tr>";
} else {
echo Html::hidden($event, $json_data[$event]);
}
}
$this->showFormButtons();
return true;
}
public function prepareInputForAdd($input) {
//Save params as a json array, ready to be saved in db
$input['json'] = $this->saveToJson($input);
return $input;
}
public function prepareInputForUpdate($input) {
return $this->prepareInputForAdd($input);
}
/**
* Get temlate values as an array
* @since 9.2
* @return array the template values as an array
*/
public function getValues() {
return json_decode($this->fields['json'], true);
}
}