%PDF- %PDF-
| Direktori : /var/www/projetos/suporte.iigd.com.br/plugins/glpiinventory/inc/ |
| Current File : /var/www/projetos/suporte.iigd.com.br/plugins/glpiinventory/inc/deployuserinteraction.class.php |
<?php
/**
* ---------------------------------------------------------------------
* GLPI Inventory Plugin
* Copyright (C) 2021 Teclib' and contributors.
*
* http://glpi-project.org
*
* based on FusionInventory for GLPI
* Copyright (C) 2010-2021 by the FusionInventory Development Team.
*
* ---------------------------------------------------------------------
*
* LICENSE
*
* This file is part of GLPI Inventory Plugin.
*
* GLPI Inventory Plugin 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.
*
* GLPI Inventory Plugin 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 GLPI Inventory Plugin. If not, see <https://www.gnu.org/licenses/>.
* ---------------------------------------------------------------------
*/
if (!defined('GLPI_ROOT')) {
die("Sorry. You can't access directly to this file");
}
/**
* Manage user interactions.
* @since 9.2
*/
class PluginGlpiinventoryDeployUserinteraction extends PluginGlpiinventoryDeployPackageItem
{
public $shortname = 'userinteractions';
public $json_name = 'userinteractions';
//--------------- Events ---------------------------------------//
//Audits are all been executed successfully, just before download
const EVENT_BEFORE_DOWNLOAD = 'before';
//File download has been done, just before actions execution
const EVENT_AFTER_DOWNLOAD = 'after_download';
//Actions have been executed, deployement is finished
const EVENT_AFTER_ACTIONS = 'after';
//At least one downlod has failed
const EVENT_DOWNLOAD_FAILURE = 'after_download_failure';
//At least one action has failed
const EVENT_ACTION_FAILURE = 'after_failure';
//--------------- Responses ---------------------------------------//
//The agent notice that the job must continue
const RESPONSE_CONTINUE = 'continue';
//The agent notice that the job must be postponed
const RESPONSE_POSTPONE = 'postpone';
//The agent notice that the job must be canceled
const RESPONSE_STOP = 'stop';
//The agent recieved a malformed or non existing event
const RESPONSE_BAD_EVENT = 'error_bad_event';
//String to replace a \r\n, to avoid stripcslashes issue
const RN_TRANSFORMATION = "$#r$#n";
/**
* Get name of this type by language of the user connected
*
* @param integer $nb number of elements
* @return string name of this type
*/
public static function getTypeName($nb = 0)
{
return _n(
'User interaction',
'User interactions',
$nb,
'glpiinventory'
);
}
/**
* Get events with name => description
* @since 9.2
* @return array
*/
public function getTypes()
{
return [self::EVENT_BEFORE_DOWNLOAD => __("Before download", 'glpiinventory'),
self::EVENT_AFTER_DOWNLOAD => __("After download", 'glpiinventory'),
self::EVENT_AFTER_ACTIONS => __("After actions", 'glpiinventory'),
self::EVENT_DOWNLOAD_FAILURE => __("On download failure", 'glpiinventory'),
self::EVENT_ACTION_FAILURE => __("On actions failure", 'glpiinventory')
];
}
/**
* Get an event label by its identifier
* @since 9.2
* @return string
*/
public function getLabelForAType($event)
{
$events = $this->getTypes();
if (isset($events[$event])) {
return $events[$event];
} else {
return false;
}
}
/**
* Display different fields relative the check selected
*
* @param array $config
* @param array $request_data
* @param string $rand unique element id used to identify/update an element
* @param string $mode mode in use (create, edit...)
* @return void
*/
public function displayAjaxValues($config, $request_data, $rand, $mode)
{
global $CFG_GLPI;
$pfDeployPackage = new PluginGlpiinventoryDeployPackage();
if (isset($request_data['packages_id'])) {
$pfDeployPackage->getFromDB($request_data['orders_id']);
} else {
$pfDeployPackage->getEmpty();
}
/*
* Get type from request params
*/
$type = null;
if ($mode === self::CREATE) {
$type = $request_data['value'];
$config_data = null;
} else {
$type = $config['type'];
$config_data = $config['data'];
}
$values = $this->getValues($type, $config_data, $mode);
if ($values === false) {
return false;
}
echo "<table class='package_item'>";
echo "<tr>";
echo "<th>{$values['name_label']}</th>";
echo "<td><input type='text' name='name' id='userinteraction_name{$rand}' value=\"{$values['name_value']}\" /></td>";
echo "</tr>";
echo "<tr>";
echo "<th>{$values['title_label']}</th>";
echo "<td><input type='text' name='title' id='userinteraction_title{$rand}' value=\"{$values['title_value']}\" />";
echo "</td>";
echo "</tr>";
echo "<tr>";
echo "<th>{$values['description_label']}</th>";
echo "<td><textarea name='text' id='userinteraction_description{$rand}' rows='5'>{$values['description_value']}</textarea>";
echo "</td>";
echo "</tr>";
echo "<tr>";
echo "<th>{$values['template_label']}</th>";
echo "<td>";
Dropdown::show(
'PluginGlpiinventoryDeployUserinteractionTemplate',
['value' => $values['template_value'], 'name' => 'template']
);
echo "</td>";
echo "</tr>";
$this->addOrSaveButton($pfDeployPackage, $mode);
echo "</table>";
}
/**
* Get fields for the check type requested
*
* @param string $type the type of check
* @param array $data fields yet defined in edit mode
* @param string $mode mode in use (create, edit...)
*
* @return string|false
*/
public function getValues($type, $data, $mode)
{
$values = [
'name_value' => "",
'name_label' => __('Interaction label', 'glpiinventory'),
'name_type' => "input",
'title_label' => __('Title') . $this->getMandatoryMark(),
'title_value' => "",
'title_type' => "input",
'description_label' => __('Message'),
'description_type' => "text",
'description_value' => "",
'template_label'
=> PluginGlpiinventoryDeployUserinteractionTemplate::getTypeName(1)
. $this->getMandatoryMark(),
'template_value' => "",
'template_type' => "dropdown",
];
if ($mode === self::EDIT) {
$values['name_value'] = isset($data['name']) ? $data['name'] : "";
$values['title_value'] = isset($data['title']) ? $data['title'] : "";
$values['description_value'] = isset($data['text']) ? $data['text'] : "";
$values['template_value'] = isset($data['template']) ? $data['template'] : "";
}
//Trick to add \r\n in the description text area
$values['description_value'] = str_replace(
self::RN_TRANSFORMATION,
"\r\n",
$values['description_value']
);
return $values;
}
/**
* Display list of user interactions
*
* @param PluginGlpiinventoryDeployPackage $package PluginGlpiinventoryDeployPackage instance
* @param array $data array converted of 'json' field in DB where stored checks
* @param string $rand unique element id used to identify/update an element
*/
public function displayList(PluginGlpiinventoryDeployPackage $package, $data, $rand)
{
/** @var array $CFG_GLPI */
global $CFG_GLPI;
$interaction_types = $this->getTypes();
$package_id = $package->getID();
$canedit = $package->canUpdateContent();
$i = 0;
echo "<table class='tab_cadrehov package_item_list' id='table_userinteractions_$rand'>";
foreach ($data['jobs']['userinteractions'] as $interaction) {
echo Search::showNewLine(Search::HTML_OUTPUT, ($i % 2));
if ($canedit) {
echo "<td class='control'>";
Html::showCheckbox(['name' => 'userinteractions_entries[' . $i . ']']);
echo "</td>";
}
//Get the audit full description (with type and return value)
//to be displayed in the UI
$text = $this->getInteractionDescription($interaction);
echo "<td>";
if ($canedit) {
echo "<a class='edit'
onclick=\"edit_subtype('userinteraction', $package_id, $rand ,this)\">";
}
echo $text;
if ($canedit) {
echo "</a>";
}
echo "</td>";
if ($canedit) {
echo "<td class='rowhandler control' title='" . __('drag', 'glpiinventory') .
"'><div class='drag row'></div></td>";
}
echo "</tr>";
$i++;
}
if ($canedit) {
echo "<tr><th>";
echo Html::getCheckAllAsCheckbox("userinteractionsList$rand", mt_rand());
echo "</th><th colspan='3' class='mark'></th></tr>";
}
echo "</table>";
if ($canedit) {
echo " <img src='" . $CFG_GLPI["root_doc"] . "/pics/arrow-left.png' alt='' />";
echo "<input type='submit' name='delete' value=\"" .
__('Delete', 'glpiinventory') . "\" class='submit' />";
}
}
/**
* Get of a short description of a user interaction
*
* @since 9.2
* @param string $interaction an array representing an interaction
* @return string a short description
*/
public function getInteractionDescription($interaction)
{
$text = '';
if (isset($interaction['label']) && !empty($interaction['label'])) {
$text = $interaction['label'];
} elseif (isset($interaction['name'])) {
$text .= $interaction['name'];
}
$text .= ' - ' . $this->getLabelForAType($interaction['type']);
if ($interaction['template']) {
$text .= ' (';
$text .= Dropdown::getDropdownName(
'glpi_plugin_glpiinventory_deployuserinteractiontemplates',
$interaction['template']
);
$text .= ')';
}
return $text;
}
/**
* Add a new item in checks of the package
*
* @param array $params list of fields with value of the check
*/
public function add_item($params)
{
if (!isset($params['text'])) {
$params['text'] = "";
}
if (!isset($params['template'])) {
$params['template'] = 0;
}
//prepare new check entry to insert in json
$entry = [
'name' => $params['name'],
'title' => $params['title'],
'text' => $params['text'],
'type' => $params['userinteractionstype'],
'template' => $params['template']
];
//Add to package defintion
$this->addToPackage($params['id'], $entry, 'userinteractions');
}
/**
* Save the item in checks
*
* @param array $params list of fields with value of the check
*/
public function save_item($params)
{
if (!isset($params['value'])) {
$params['value'] = "";
}
if (!isset($params['name'])) {
$params['name'] = "";
}
//prepare new check entry to insert in json
$entry = [
'name' => $params['name'],
'title' => $params['title'],
'text' => $params['text'],
'type' => $params['userinteractionstype'],
'template' => $params['template']
];
//update order
$this->updateOrderJson(
$params['id'],
$this->prepareDataToSave($params, $entry)
);
}
/**
* @param PluginGlpiinventoryDeployPackage $package
* @return array
*/
public function getTypesAlreadyInUse(PluginGlpiinventoryDeployPackage $package)
{
$used_interactions = [];
$json = json_decode($package->fields['json'], true);
if (
isset($json['jobs'][$this->json_name])
&& !empty($json['jobs'][$this->json_name])
) {
foreach ($json['jobs'][$this->json_name] as $interaction) {
if (!isset($used_interactions[$interaction['type']])) {
$used_interactions[$interaction['type']] = $interaction['type'];
}
}
}
return $used_interactions;
}
/**
* Get a log message depending on an agent response
* @since 9.2
*
* @param string $behavior the behavior the agent must adopt for the job
* @param string $type the type of event that triggered the user interaction
* @param string $event the button clicked by the user
* (or the what's happened in special cases, as defined in a template)
* @param integer $user userid the user who performed the interaction
* @return string the message to be display in a taskjob log
*/
public function getLogMessage($behavior, $type, $event, $user)
{
$message = self::getTypeName(1);
$message .= ': ' . $this->getLabelForAType($type);
$message .= '/';
switch ($behavior) {
case self::RESPONSE_STOP:
$message .= sprintf(__(
'Job cancelled by the user %1$s',
'glpiinventory'
), $user);
break;
case self::RESPONSE_CONTINUE:
$message .= sprintf(__(
'User %1$s agreed to continue the job',
'glpiinventory'
), $user);
break;
case self::RESPONSE_POSTPONE:
$message .= sprintf(
__('Job postponed by the user %1$s', 'glpiinventory'),
$user
);
break;
case self::RESPONSE_BAD_EVENT:
$message .= __('Bad event sent to the agent', 'glpiinventory');
break;
}
$message .= ' (' . $this->getEventMessage($event) . ')';
return $message;
}
public function getEventMessage($event = '')
{
$message = __('%1$s button pressed');
switch ($event) {
case 'on_ok':
return sprintf($message, __('OK'));
case 'on_yes':
return sprintf($message, __('Yes'));
case 'on_async':
return __('Alert displayed, no input required', 'glpiinventory');
case 'on_no':
return sprintf($message, __('No'));
case 'on_retry':
return sprintf($message, __('Retry', 'glpiinventory'));
case 'on_cancel':
return sprintf($message, __('Cancel'));
case 'on_abort':
return sprintf($message, __('Abort', 'glpiinventory'));
case 'on_ignore':
return sprintf($message, __('Ignore', 'glpiinventory'));
case 'on_continue':
return sprintf($message, __('Continue'));
case 'on_timeout':
return __('Alert duration exceeded', 'glpiinventory');
case 'on_nouser':
return __('No user connected', 'glpiinventory');
case 'on_multiusers':
return __('Multiple users connected', 'glpiinventory');
}
}
}