483 lines
16 KiB
PHP
483 lines
16 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.
|
|
* @since 9.2
|
|
*/
|
|
class PluginFusioninventoryDeployUserinteraction extends PluginFusioninventoryDeployPackageItem {
|
|
|
|
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
|
|
*/
|
|
static function getTypeName($nb = 0) {
|
|
return _n('User interaction',
|
|
'User interactions', $nb, 'fusioninventory');
|
|
}
|
|
|
|
|
|
/**
|
|
* Get events with name => description
|
|
* @since 9.2
|
|
* @return array
|
|
*/
|
|
function getTypes() {
|
|
return [self::EVENT_BEFORE_DOWNLOAD => __("Before download", 'fusioninventory'),
|
|
self::EVENT_AFTER_DOWNLOAD => __("After download", 'fusioninventory'),
|
|
self::EVENT_AFTER_ACTIONS => __("After actions", 'fusioninventory'),
|
|
self::EVENT_DOWNLOAD_FAILURE => __("On download failure", 'fusioninventory'),
|
|
self::EVENT_ACTION_FAILURE => __("On actions failure", 'fusioninventory')
|
|
];
|
|
}
|
|
|
|
|
|
/**
|
|
* Get an event label by it's identifier
|
|
* @since 9.2
|
|
* @return array
|
|
*/
|
|
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 boolean
|
|
*/
|
|
function displayAjaxValues($config, $request_data, $rand, $mode) {
|
|
global $CFG_GLPI;
|
|
|
|
$pfDeployPackage = new PluginFusioninventoryDeployPackage();
|
|
|
|
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('PluginFusioninventoryDeployUserinteractionTemplate',
|
|
['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
|
|
*/
|
|
function getValues($type, $data, $mode) {
|
|
$values = [
|
|
'name_value' => "",
|
|
'name_label' => __('Interaction label', 'fusioninventory'),
|
|
'name_type' => "input",
|
|
'title_label' => __('Title').$this->getMandatoryMark(),
|
|
'title_value' => "",
|
|
'title_type' => "input",
|
|
'description_label' => __('Message'),
|
|
'description_type' => "text",
|
|
'description_value' => "",
|
|
'template_label'
|
|
=> PluginFusioninventoryDeployUserinteractionTemplate::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
|
|
*
|
|
* @global array $CFG_GLPI
|
|
* @param object $package PluginFusioninventoryDeployPackage 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
|
|
*/
|
|
function displayList(PluginFusioninventoryDeployPackage $package, $data, $rand) {
|
|
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', 'fusioninventory').
|
|
"'><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', 'fusioninventory')."\" class='submit' />";
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Get of a short description of a user interaction
|
|
*
|
|
* @since 9.2
|
|
* @param interaction an array representing an interaction
|
|
* @return a short description
|
|
*/
|
|
function getInteractionDescription($interaction) {
|
|
$text = '';
|
|
|
|
if (isset($interaction['label']) && !empty($interaction['label'])) {
|
|
$text = $interaction['label'];
|
|
} else if (isset($interaction['name'])) {
|
|
$text.= $interaction['name'];
|
|
}
|
|
$text .= ' - '.$this->getLabelForAType($interaction['type']);
|
|
|
|
if ($interaction['template']) {
|
|
$text .= ' (';
|
|
$text .= Dropdown::getDropdownName('glpi_plugin_fusioninventory_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
|
|
*/
|
|
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
|
|
*/
|
|
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));
|
|
}
|
|
|
|
|
|
function getTypesAlreadyInUse(PluginFusioninventoryDeployPackage $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 behavior the behavior the agent must adopt for the job
|
|
* @param type the type of event that triggered the user interaction
|
|
* @param $event the button clicked by the user
|
|
* (or the what's happened in special cases, as defined in a template)
|
|
* @param 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',
|
|
'fusioninventory'), $user);
|
|
break;
|
|
|
|
case self::RESPONSE_CONTINUE:
|
|
$message .= sprintf(__('User %1$s agreed to continue the job',
|
|
'fusioninventory'), $user);
|
|
break;
|
|
|
|
case self::RESPONSE_POSTPONE:
|
|
$message .= sprintf(__('Job postponed by the user %1$s', 'fusioninventory'),
|
|
$user);
|
|
break;
|
|
|
|
case self::RESPONSE_BAD_EVENT:
|
|
$message .= __('Bad event sent to the agent', 'fusioninventory');
|
|
break;
|
|
|
|
}
|
|
$message.= ' ('.$this->getEventMessage($event).')';
|
|
return $message;
|
|
}
|
|
|
|
|
|
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', 'fusioninventory');
|
|
|
|
case 'on_no':
|
|
return sprintf($message, __('No'));
|
|
|
|
case 'on_retry':
|
|
return sprintf($message, __('Retry', 'fusioninventory'));
|
|
|
|
case 'on_cancel':
|
|
return sprintf($message, __('Cancel'));
|
|
|
|
case 'on_abort':
|
|
return sprintf($message, __('Abort', 'fusioninventory'));
|
|
|
|
case 'on_ignore':
|
|
return sprintf($message, __('Ignore', 'fusioninventory'));
|
|
|
|
case 'on_continue':
|
|
return sprintf($message, __('Continue'));
|
|
|
|
case 'on_timeout':
|
|
return __('Alert duration exceeded', 'fusioninventory');
|
|
|
|
case 'on_nouser':
|
|
return __('No user connected', 'fusioninventory');
|
|
|
|
case 'on_multiusers':
|
|
return __('Multiple users connected', 'fusioninventory');
|
|
}
|
|
}
|
|
}
|