%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /var/www/projetos/suporte.iigd.com.br/plugins/glpiinventory/inc/
Upload File :
Create Path :
Current File : //var/www/projetos/suporte.iigd.com.br/plugins/glpiinventory/inc/deployaction.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 the actions in package for deploy system.
 */
class PluginGlpiinventoryDeployAction extends PluginGlpiinventoryDeployPackageItem
{
    public $shortname = 'actions';
    public $json_name = 'actions';


   /**
    * Get list of return actions available
    *
    * @return array
    */
    public function getReturnActionNames()
    {
        return [
         0              => Dropdown::EMPTY_VALUE,
         'okCode'       => __("Return code is equal to", 'glpiinventory'),
         'errorCode'    => __("Return code is not equal to", 'glpiinventory'),
         'okPattern'    => __("Command output contains", 'glpiinventory'),
         'errorPattern' => __("Command output does not contains", 'glpiinventory')
        ];
    }


   /**
    * Get types of actions with name => description
    *
    * @return array
    */
    public function getTypes()
    {
        return [
         'cmd'     => __('Command', 'glpiinventory'),
         'move'    => __('Move', 'glpiinventory'),
         'copy'    => __('Copy', 'glpiinventory'),
         'delete'  => __('Delete directory', 'glpiinventory'),
         'mkdir'   => __('Create directory', 'glpiinventory')
        ];
    }


   /**
    * Get description of the type name
    *
    * @param string $type name of the type
    * @return string mapped with the type
    */
    public function getLabelForAType($type)
    {
        $a_types = $this->getTypes();
        if (isset($a_types[$type])) {
            return $a_types[$type];
        }
        return $type;
    }


   /**
    * Display form
    *
    * @param PluginGlpiinventoryDeployPackage $package PluginGlpiinventoryDeployPackage instance
    * @param array $request_data
    * @param string $rand unique element id used to identify/update an element
    * @param string $mode possible values: init|edit|create
    */
    public function displayForm(PluginGlpiinventoryDeployPackage $package, $request_data, $rand, $mode)
    {

       /*
        * Get element config in 'edit' mode
        */
        $config = null;
        if ($mode === self::EDIT && isset($request_data['index'])) {
           /*
            * Add an hidden input about element's index to be updated
            */
            echo "<input type='hidden' name='index' value='" . $request_data['index'] . "' />";

            $element = $package->getSubElement($this->shortname, $request_data['index']);
            if (is_array($element) && count($element) == 1) {
                reset($element);
                $type   = key($element);
                $config = ['type' => $type, 'data' => $element[$type]];
            }
        }

       /*
       * Display start of div form
       */
        if (in_array($mode, [self::INIT], true)) {
            echo "<div id='actions_block$rand' style='display:none'>";
        }

       /*
       * Display element's dropdownType in 'create' or 'edit' mode
       */
        if (in_array($mode, [self::CREATE, self::EDIT], true)) {
            $this->displayDropdownType($package, $config, $rand, $mode);
        }

       /*
       * Display element's values in 'edit' mode only.
       * In 'create' mode, those values are refreshed with dropdownType 'change'
       * javascript event.
       */
        if (in_array($mode, [self::CREATE, self::EDIT], true)) {
            echo "<span id='show_actions_value{$rand}'>";
            if ($mode === self::EDIT) {
                $this->displayAjaxValues($config, $request_data, $rand, $mode);
            }
            echo "</span>";
        }

       /*
       * Close form div
       */
        if (in_array($mode, [self::INIT], true)) {
            echo "</div>";
        }
    }


   /**
    * Display list of actions
    *
    * @param PluginGlpiinventoryDeployPackage $package PluginGlpiinventoryDeployPackage instance
    * @param array $data array converted of 'json' field in DB where stored actions
    * @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;

        $canedit    = $package->canUpdateContent();
        $package_id = $package->getID();
        echo "<table class='tab_cadrehov package_item_list' id='table_action_$rand'>";
        $i = 0;
        foreach ($data['jobs'][$this->json_name] as $action) {
            echo Search::showNewLine(Search::HTML_OUTPUT, ($i % 2));
            if ($canedit) {
                echo "<td class='control'>";
                Html::showCheckbox(['name' => 'actions_entries[' . $i . ']']);
                echo "</td>";
            }
            $keys = array_keys($action);
            $action_type = array_shift($keys);
            echo "<td>";
            if ($canedit) {
                echo "<a class='edit'
                     onclick=\"edit_subtype('action', $package_id, $rand ,this)\">";
            }
            echo $this->getLabelForAType($action_type);
            if ($canedit) {
                echo "</a>";
            }
            echo "<br />";

            foreach ($action[$action_type] as $key => $value) {
                if (is_array($value)) {
                    if ($key === "list") {
                        foreach ($value as $list) {
                            echo $list;
                            echo " ";
                        }
                    }
                } else {
                    echo "<b>";
                    if ($key == 'exec') {
                        echo __('Command to execute', 'glpiinventory');
                    } else {
                        echo $key;
                    }
                    echo "</b>";
                    if ($key === "exec") {
                        echo "<pre style='border-left:solid lightgrey 3px;margin-left: 5px;" .
                          "padding-left:2px;white-space: pre-wrap;'>$value</pre>";
                    } else {
                        echo " $value ";
                    }
                }
            }
            if (isset($action[$action_type]['retChecks'])) {
                echo "<br><b>" . __("return codes saved for this command", 'glpiinventory') .
                "</b> : <ul class='retChecks'>";
                foreach ($action[$action_type]['retChecks'] as $retCheck) {
                    echo "<li>";
                    $getReturnActionNames = $this->getReturnActionNames();
                    echo $getReturnActionNames[$retCheck['type']] . " " . array_shift($retCheck['values']);
                    echo "</li>";
                }
                echo "</ul>";
            }
            echo "</td>";
            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("actionsList$rand", mt_rand());
            echo "</th><th colspan='3' class='mark'></th></tr>";
        }
        echo "</table>";
        if ($canedit) {
            echo "&nbsp;&nbsp;<img src='" . $CFG_GLPI["root_doc"] . "/pics/arrow-left.png' alt=''>";
            echo "<input type='submit' name='delete' value=\"" .
            __('Delete', 'glpiinventory') . "\" class='submit'>";
        }
    }


   /**
    * Display different fields relative the action selected (cmd, move...)
    *
    * @param array $config
    * @param array $request_data
    * @param string $mode mode in use (create, edit...)
    * @return void
    */
    public function displayAjaxValues($config, $request_data, $rand, $mode)
    {
        global $CFG_GLPI;

        $mandatory_mark  = $this->getMandatoryMark();
        $pfDeployPackage = new PluginGlpiinventoryDeployPackage();

        if (isset($request_data['packages_id'])) {
            $pfDeployPackage->getFromDB($request_data['packages_id']);
        } else {
            $pfDeployPackage->getEmpty();
        }

       /*
       * Get type from request params
       */
        $type = null;

        if ($mode === self::CREATE) {
            $type = $request_data['value'];
        } else {
            $type = $config['type'];
            $config_data = $config['data'];
        }

       /*
       * Set default values
       */
        $value_type_1 = "input";
        $value_1      = "";
        $value_2      = "";
        $name_label_2 = "";
        $retChecks    = null;
        $name_value   = (isset($config_data['name'])) ? $config_data['name'] : "";

       /*
       * set values from element's config in 'edit' mode
       */
        switch ($type) {
            case 'move':
            case 'copy':
                $value_label_1 = __("From", 'glpiinventory');
                $name_label_1  = "from";
                $value_label_2 = __("To", 'glpiinventory');
                $name_label_2  = "to";
                if ($mode === self::EDIT) {
                    /** @phpstan-ignore-next-line  */
                    $value_1 = $config_data['from'];
                    /** @phpstan-ignore-next-line  */
                    $value_2 = $config_data['to'];
                }
                break;

            case 'cmd':
                $value_label_1 = __("exec", 'glpiinventory');
                $name_label_1  = "exec";
                $value_label_2 = false;
                $value_type_1  = "textarea";
                if ($mode === self::EDIT) {
                    /** @phpstan-ignore-next-line  */
                    $value_1 = $config_data['exec'];
                    if (isset($config_data['retChecks'])) {
                        $retChecks = $config_data['retChecks'];
                    }
                }
                break;

            case 'delete':
            case 'mkdir':
                $value_label_1 = __("path", 'glpiinventory');
                $name_label_1  = "list[]";
                $value_label_2 = false;
                if ($mode === self::EDIT) {
                   /*
                    * TODO : Add list input like `retChecks` on `mkdir` and `delete`
                    * because those methods are defined as list in specification
                    */
                    /** @phpstan-ignore-next-line  */
                    $value_1 = array_shift($config_data['list']);
                }
                break;

            default:
                return false;
        }

        echo "<table class='package_item'>";
        echo "<tr>";
        echo "<th>" . __('Action label', 'glpiinventory') . "</th>";
        echo "<td><input type='text' name='name' id='check_name' value=\"{$name_value}\" /></td>";
        echo "</tr>";
        echo "<tr>";
        echo "<th>$value_label_1&nbsp;" . $mandatory_mark . "</th>";
        echo "<td>";
        switch ($value_type_1) {
            case "input":
                echo "<input type='text' name='$name_label_1' value='$value_1' />";
                break;

            case "textarea":
                echo "<textarea name='$name_label_1' rows='3' style='width: 760px;'>$value_1</textarea>";
                break;
        }
        echo "</td>";
        echo "</tr>";
        if ($value_label_2 !== false) {
            echo "<tr>";
            echo "<th>" . $value_label_2 . "&nbsp;" . $mandatory_mark . "</th>";
            echo "<td><input type='text' name='$name_label_2' value='$value_2'/></td>";
            echo "</tr>";
        }

       //specific case for cmd : add retcheck form
        if ($type == "cmd") {
            echo "<tr>";
            echo "<th>" . __("Execution checks", 'glpiinventory');
            PluginGlpiinventoryDeployPackage::plusButton("retchecks", ".table_retchecks.template");
            echo "</th>";
            echo "<td>";
            echo "<span id='retchecks' style='display:block'>";

            if (
                is_array($retChecks)
                 && count($retChecks)
            ) {
                foreach ($retChecks as $retcheck) {
                    echo "<table class='table_retchecks'>";
                    echo "<tr>";
                    echo "<td>";
                    Dropdown::showFromArray(
                        'retchecks_type[]',
                        self::getReturnActionNames(),
                        [ 'value' => $retcheck['type'],
                                         'width' => '200px'
                                       ]
                    );
                    echo "</td>";
                    echo "<td>";
                    echo "<input type='text' name='retchecks_value[]' value='" .
                     $retcheck['values'][0] . "' />";
                    echo "</td>";
                    echo "<td><a class='edit' onclick='removeLine(this)'><img src='" .
                     $CFG_GLPI["root_doc"] . "/pics/delete.png' /></a></td>";
                    echo "</tr>";

                    echo "</table>";
                }
            }
            echo "<table class='table_retchecks template' style='display:none'>";
            echo "<tr>";
            echo "<td>";
            Dropdown::showFromArray(
                'retchecks_type[]',
                $this->getReturnActionNames(),
                ['width' => '200px']
            );
            echo "</td>";
            echo "<td><input type='text' name='retchecks_value[]' /></td>";
            echo "<td><a class='edit' onclick='removeLine(this)'><img src='" .
               $CFG_GLPI["root_doc"] . "/pics/delete.png' /></a></td>";
            echo "</tr>";

            echo "</span>";
            echo "</td>";
            echo "</tr>";
            echo "</table>";
        }

        if ($type == 'cmd') {
            echo "<tr>";
            echo "<th>" . __('Number of output lines to retrieve', 'glpiinventory') . "</th>";
            echo "<td>";
            $options = ['min'   => 0,
                     'max'   => 5000,
                     'step'  => 10,
                     'toadd' => [0 => __('None'), -1 => __('All')],
                     'value' => (isset($config_data['logLineLimit'])) ? $config_data['logLineLimit'] : 10
                    ];
            Dropdown::showNumber('logLineLimit', $options);
            echo "&nbsp;<span class='red'><i>";
            echo sprintf(__('GLPI-Agent or Fusioninventory-Agent >= %1s mandatory', 'glpiinventory'), '2.3.20');
            echo "</i></span></td>";
            echo "</tr>";
        }

        $this->addOrSaveButton($pfDeployPackage, $mode);

        echo "<script type='text/javascript'>
         function removeLine(item) {
            var tag_table = item.parentNode.parentNode.parentNode.parentNode;
            var parent = tag_table.parentNode;
               parent.removeChild(tag_table);
         }
      </script>";
    }


   /**
    * Add a new item in actions of the package
    *
    * @param array $params list of fields with value of the action
    */
    public function add_item($params)
    {
        //prepare new action entry to insert in json
        $fields = ['list', 'from', 'to', 'exec', 'name', 'logLineLimit'];
        $tmp = [];
        foreach ($fields as $field) {
            if (isset($params[$field])) {
                $tmp[$field] = $params[$field];
            }
        }

       //process ret checks
        if (
            isset($params['retchecks_type'])
              && !empty($params['retchecks_type'])
        ) {
            foreach ($params['retchecks_type'] as $index => $type) {
                if ($type !== '0') {
                    $tmp['retChecks'][] = [
                    'type'  => $type,
                    'values' => [$params['retchecks_value'][$index]]
                    ];
                }
            }
        }

       //append prepared data to new entry
        $new_entry[$params['actionstype']] = $tmp;

       //get current order json
        $data = json_decode($this->getJson($params['id']), true);

       //add new entry
        $data['jobs'][$this->json_name][] = $new_entry;

       //update order
        $this->updateOrderJson($params['id'], $data);
    }


   /**
    * Save the item in actions
    *
    * @param array $params list of fields with value of the action
    */
    public function save_item($params)
    {
        $tmp    = [];
        $fields = ['list', 'from', 'to', 'exec', 'name', 'logLineLimit'];
        foreach ($fields as $field) {
            if (isset($params[$field])) {
                $tmp[$field] = $params[$field];
            }
        }

       //process ret checks
        if (isset($params['retchecks_type']) && !empty($params['retchecks_type'])) {
            foreach ($params['retchecks_type'] as $index => $type) {
               //if type == '0', this means nothing is selected
                if ($type !== '0') {
                    $tmp['retChecks'][] = [
                    'type'  => $type,
                    'values' => [$params['retchecks_value'][$index]]
                    ];
                }
            }
        }

       //append prepared data to new entry
        $entry[$params['actionstype']] = $tmp;

       //update order
        $this->updateOrderJson(
            $params['id'],
            $this->prepareDataToSave($params, $entry)
        );
    }
}

Zerion Mini Shell 1.0