<?php
/**
 * Pandora FMS- http://pandorafms.com.
 * ==================================================
 * Copyright (c) 2005-2021 Artica Soluciones Tecnologicas
 * Please see http://pandorafms.org for full contribution list
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the  GNU Lesser General Public License
 * as published by the Free Software Foundation; version 2
 * This program 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 General Public License for more details.
 */
require_once $config['homedir'].'/include/functions_config.php';
require_once $config['homedir'].'/include/functions_snmp_browser.php';
require_once $config['homedir'].'/include/functions_snmp.php';
require_once $config['homedir'].'/include/functions_network_components.php';

global $config;

set_error_handler(
    function ($code, $string, $file, $line) {
        throw new ErrorException($string, null, $code, $file, $line);
    }
);

register_shutdown_function(
    function () {
        $error = error_get_last();
        if (null !== $error) {
            echo $error['message'];
        }
    }
);

try {
    if ((bool) is_ajax() === true) {
        $method = (string) get_parameter('method', '');
        $action = (string) get_parameter('action', '');
        $target_ip = (string) get_parameter('target_ip', '');
        $target_port = (string) get_parameter('target_port', '');
        $community = (string) io_safe_output((get_parameter('community', '')));
        $snmp_version = (string) get_parameter('snmp_browser_version', '');
        $snmp3_auth_user = io_safe_output(get_parameter('snmp3_browser_auth_user'));
        $snmp3_security_level = get_parameter('snmp3_browser_security_level');
        $snmp3_auth_method = get_parameter('snmp3_browser_auth_method');
        $snmp3_auth_pass = io_safe_output(get_parameter('snmp3_browser_auth_pass'));
        $snmp3_privacy_method = get_parameter('snmp3_browser_privacy_method');
        $snmp3_privacy_pass = io_safe_output(get_parameter('snmp3_browser_privacy_pass'));
        $module_target = get_parameter('module_target', '');
        $targets_oids = get_parameter('oids', '');
        $return_id = get_parameter('return_id', false);
        $custom_action = get_parameter('custom_action', '');
        $server_to_exec = get_parameter('server_to_exec');

        if (!is_array($targets_oids)) {
            $targets_oids = explode(',', $targets_oids);
        }

        if ($custom_action != '') {
            $custom_action = urldecode(base64_decode($custom_action));
        }

        // SNMP browser.
        if ($action == 'snmptree') {
            $starting_oid = (string) get_parameter('starting_oid', '.');

            $snmp_tree = snmp_browser_get_tree(
                $target_ip,
                $community,
                $starting_oid,
                $snmp_version,
                $snmp3_auth_user,
                $snmp3_security_level,
                $snmp3_auth_method,
                $snmp3_auth_pass,
                $snmp3_privacy_method,
                $snmp3_privacy_pass,
                'null',
                $server_to_exec,
                $target_port
            );
            if (! is_array($snmp_tree)) {
                echo $snmp_tree;
            } else {
                snmp_browser_print_tree(
                    $snmp_tree,
                    // Id.
                    0,
                    // Depth.
                    0,
                    // Last.
                    0,
                    // Last_array.
                    [],
                    // Sufix.
                    false,
                    // Checked.
                    [],
                    // Return.
                    false,
                    // Descriptive_ids.
                    false,
                    // Previous_id.
                    ''
                );

                // Div for error/succes dialog.
                $output = '<div id="snmp_result_msg" class="invisible"></div>';

                // Dialog error.
                $output .= '<div id="dialog_error" class="invisible" title="'.__('SNMP modules').'">';
                $output .= '<div>';
                $output .= "<div class='w25p float-left'><img class='pdd_l_20px pdd_t_20px' src='images/icono_error_mr.png'></div>";
                $output .= "<div class='w75p float-left'><h3><strong class='verdana font_13pt'>ERROR</strong></h3>";
                $output .= "<p class='verdana font_12pt mrgn_btn_0px'>".__('Error creating the following modules:').'</p>';
                $output .= "<p id='error_text' class='verdana font_12pt;'></p>";
                $output .= '</div>';
                $output .= '</div>';
                $output .= '</div>';

                // Dialog success.
                $output .= '<div id="dialog_success" class="invisible" title="'.__('SNMP modules').'">';
                $output .= '<div>';
                $output .= "<div class='w25p float-left'><img class='pdd_l_20px pdd_t_20px' src='images/icono_exito_mr.png'></div>";
                $output .= "<div class='w75p float-left'><h3><strong class='verdana font_13pt'>SUCCESS</strong></h3>";
                $output .= "<p class='verdana font_12pt'>".__('Modules successfully created').'</p>';
                $output .= '</div>';
                $output .= '</div>';
                $output .= '</div>';

                // Dialog no agent selected.
                $output .= '<div id="dialog_no_agents_selected" class="invisible" title="'.__('SNMP modules').'">';
                $output .= '<div>';
                $output .= "<div class='w25p float-left'><img class='pdd_l_20px pdd_t_20px' src='images/icono_error_mr.png'></div>";
                $output .= "<div class='w75p float-left'><h3><strong class='verdana font_13pt'>ERROR</strong></h3>";
                $output .= "<p class='verdana font_12pt mrgn_btn_0px'>".__('Module must be applied to an agent or a policy').'</p>';
                $output .= "<p id='error_text' class='verdana font_12pt'></p>";
                $output .= '</div>';
                $output .= '</div>';
                $output .= '</div>';

                echo $output;
            }


            return;
        }

        if ($action == 'snmpget') {
            // SNMP get.
            $target_oid = htmlspecialchars_decode(get_parameter('oid', ''));
            $custom_action = get_parameter('custom_action', '');
            if ($custom_action != '') {
                $custom_action = urldecode(base64_decode($custom_action));
            }

            $oid = snmp_browser_get_oid(
                $target_ip,
                $community,
                $target_oid,
                $snmp_version,
                $snmp3_auth_user,
                $snmp3_security_level,
                $snmp3_auth_method,
                $snmp3_auth_pass,
                $snmp3_privacy_method,
                $snmp3_privacy_pass,
                $server_to_exec
            );

            snmp_browser_print_oid(
                $oid,
                $custom_action,
                false,
                $community,
                $snmp_version
            );
            return;
        }

        if ($method == 'snmp_browser_create_modules') {
            // Get target ids from form.
            $id_items = get_parameter('id_item2', null);
            $id_target = null;
            if (empty($id_items) === false) {
                $id_target = explode(',', $id_items[0]);
            }

            if (empty($id_items[0]) && $module_target !== 'network_component') {
                echo json_encode([0 => -1]);
                exit;
            }

            $snmp_extradata = get_parameter('snmp_extradata', '');

            if (!is_array($snmp_extradata)) {
                // Decode SNMP values.
                $snmp_extradata = json_decode(io_safe_output($snmp_extradata), true);
            }


            foreach ($snmp_extradata as $snmp_conf) {
                $snmp_conf_values[$snmp_conf['name']] = $snmp_conf['value'];
            }

            $fail_modules = snmp_browser_create_modules_snmp(
                $module_target,
                $snmp_conf_values,
                $id_target,
                $server_to_exec
            );

            // Return fail modules for error/success message.
            echo json_encode($fail_modules);
            exit;
        }

        if ($method == 'snmp_browser_print_create_module_massive') {
            // Get SNMP conf vaues from modal onshow extradata.
            $snmp_extradata = get_parameter('extradata', '');

            $return = snmp_browser_print_create_module_massive($module_target, $snmp_extradata, true);
            echo $return;
            exit;
        }

        if ($method == 'snmp_browser_print_create_policy') {
            $return = snmp_browser_print_create_policy();
            echo $return;
            exit;
        }

        if ($method == 'snmp_browser_create_policy') {
            enterprise_include_once('include/functions_policies.php');

            $policy_name = get_parameter('name', '');
            $policy_id_group = get_parameter('id_group', 0);
            $policy_description = get_parameter('description', '');
            $values = [
                'id_group'    => $policy_id_group,
                'description' => $policy_description,

            ];

            // Check if policy exist.
            $policy_exists = policies_get_id($policy_name);
            if ($policy_exists != false) {
                $id_policy = 0;
            } else {
                $id_policy = (boolean) policies_create_policy($policy_name, $values);
            }


            $return = [
                'error' => (int) $id_policy,
                'title' => [
                    __('Failed'),
                    __('Success'),
                ],
                'text'  => [
                    ui_print_error_message(__('Failed to create policy'), '', true),
                    ui_print_success_message(__('Policy created succesfully'), '', true),
                ],
            ];

            echo json_encode($return);
        }
    }
} catch (\Exception $e) {
    echo $e->getMessage();
}