<?php

// Pandora FMS - http://pandorafms.com
// ==================================================
// Copyright (c) 2005-2011 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 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.

global $config;
include_once($config['homedir'] . "/include/functions_agents.php");
require_once ('include/functions_modules.php');
require_once ('include/functions_alerts.php');
require_once ('include/functions_reporting.php');
require_once ('include/graphs/functions_utils.php');

function snmp_explorer() {

    $idAgent = (int) get_parameter('id_agente', 0);
    $ipAgent = db_get_value('direccion', 'tagente', 'id_agente', $idAgent);

    // Load global vars
    global $config;


    check_login ();

    $ip_target = (string) get_parameter ('ip_target', $ipAgent);
    $snmp_community = (string) get_parameter ('snmp_community', 'public');
    $snmp_version = get_parameter('snmp_version', '1');
    $snmp3_auth_user = get_parameter('snmp3_auth_user');
    $snmp3_security_level = get_parameter('snmp3_security_level');
    $snmp3_auth_method = get_parameter('snmp3_auth_method');
    $snmp3_auth_pass = get_parameter('snmp3_auth_pass');
    $snmp3_privacy_method = get_parameter('snmp3_privacy_method');
    $snmp3_privacy_pass = get_parameter('snmp3_privacy_pass');
    $tcp_port = (string) get_parameter ('tcp_port');

    //See if id_agente is set (either POST or GET, otherwise -1
    $id_agent = $idAgent;

    // Get passed variables
    $snmpwalk = (int) get_parameter("snmpwalk", 0);
    $create_modules = (int) get_parameter("create_modules", 0);

    $interfaces = array();

    if($snmpwalk) {	

	    $snmpis = get_snmpwalk($ip_target, $snmp_version, $snmp_community, $snmp3_auth_user,
				    $snmp3_security_level, $snmp3_auth_method, $snmp3_auth_pass,
				    $snmp3_privacy_method, $snmp3_privacy_pass, 0, ".1.3.6.1.2.1");

	    if($snmpis === false) {
			    $snmpis = array();
	    }
	
	    $interfaces = array();

        // We get here only the interface part of the MIB, not full mib
	    foreach($snmpis as $key => $snmp) {

		    $data = explode(': ',$snmp);
		    $keydata = explode('::',$key);
		    $keydata2 = explode('.',$keydata[1]);
		
		    if(!isset($keydata2[1])) {
			    continue;
		    }
		
		    if(array_key_exists(1,$data)){
			    $interfaces[$keydata2[1]][$keydata2[0]]['type'] = $data[0];
			    $interfaces[$keydata2[1]][$keydata2[0]]['value'] = $data[1];
		    }else {
			    $interfaces[$keydata2[1]][$keydata2[0]]['type'] = '';
			    $interfaces[$keydata2[1]][$keydata2[0]]['value'] = $data[0];
		    }
		
		    $interfaces[$keydata2[1]][$keydata2[0]]['oid'] = $key;
		    $interfaces[$keydata2[1]][$keydata2[0]]['checked'] = 0;
	    }
		
	    unset($interfaces[0]);
    }

    if($create_modules) {	
        $id_snmp_serialize = get_parameter_post('id_snmp_serialize');
        $interfaces = unserialize_in_temp($id_snmp_serialize);
   	    
   	    if(!$interfaces) {
			$interfaces = array();
		}
		
	    $values = array();
	
	    if($tcp_port != ''){
		    $values['tcp_port'] = $tcp_port;
	    }
	    $values['snmp_community'] = $snmp_community;
	    $values['ip_target'] = $ip_target;
	    $values['tcp_send'] = $snmp_version;
	
	    if($snmp_version == '3') {
		    $values['plugin_user'] = $snmp3_auth_user;
		    $values['plugin_pass'] = $snmp3_auth_pass;
		    $values['plugin_parameter'] = $snmp3_auth_method;
		    $values['custom_string_1'] = $snmp3_privacy_method;
		    $values['custom_string_2'] = $snmp3_privacy_pass;
		    $values['custom_string_3'] = $snmp3_security_level;
	    }
			
	    $oids = array();
	    foreach($interfaces as $key => $interface) {
		    foreach($interface as $key2 => $module) {
			    $oid = get_parameter($key."-".$key2, '');
			    if($oid != '') {
				    $interfaces[$key][$key2]['checked'] = 1;
				    $oids[$key][] = $interfaces[$key][$key2]['oid'];
			    }
			    else {
				    $interfaces[$key][$key2]['checked'] = 0;
			    }
		    }
	    }
	    $modules = get_parameter('module', array());
	    $id_snmp = get_parameter('id_snmp');

	    if($id_snmp == false) {
		    ui_print_error_message (__('No modules selected'));
		    $id_snmp = array();
	    }
	
	    if(agents_get_name($id_agent) == false) {
		    ui_print_error_message (__('No agent selected or the agent does not exist'));
		    $id_snmp = array();
	    }
	
	    $result = false;
	
		$errors = array();
		$done = 0;

	    foreach($id_snmp as $id) {
			if (isset($interfaces[$id]['ifName']) && $interfaces[$id]['ifName']['value'] != ""){
					$ifname = $interfaces[$id]['ifName']['value'];
			}
			else if (isset($interfaces[$id]['ifDescr']) && $interfaces[$id]['ifDescr']['value'] != ""){
					$ifname = $interfaces[$id]['ifDescr']['value'];
			}
		    foreach($modules as $module) {
         			
			    $oid_array = explode('.',$module);
			    $oid_array[count($oid_array)-1] = $id;
			    $oid = implode('.',$oid_array);
			
			    // Get the name
			    $name_array = explode('::',$oid_array[0]);
			    $name = $name_array[1] . "_" . $ifname;
			
                // Clean the name
                $name = str_replace  ( "\""  , "" , $name);

                //  Proc moduletypes
                if (preg_match  ( "/Status/", $name_array[1]))
                    $module_type = 18;

                elseif (preg_match  ( "/Present/", $name_array[1]))
                    $module_type = 18;

                elseif (preg_match  ( "/PromiscuousMode/", $name_array[1]))
                    $module_type = 18;

                //  String moduletypes
                elseif (preg_match  ( "/Alias/", $name_array[1]))
                    $module_type = 17;

                elseif (preg_match  ( "/Address/", $name_array[1]))
                    $module_type = 17;

                elseif (preg_match  ( "/Name/", $name_array[1]))
                    $module_type = 17;

                elseif (preg_match  ( "/Specific/", $name_array[1]))
                    $module_type = 17;

                elseif (preg_match  ( "/Descr/", $name_array[1]))
                    $module_type = 17;

                // Specific counters (ends in s)
                elseif (preg_match  ( "/s$/", $name_array[1]))
                    $module_type = 16;
            
                // Otherwise, numeric
                else
                    $module_type = 15;			
			
			    $values['id_tipo_modulo'] = $module_type;
			    $values['descripcion'] = io_safe_input("(" . $ip_target." - ".$name . ") " . $interfaces[$id]['ifDescr']['value']);
			
			    $values['snmp_oid'] = $oid;
			    $values['id_modulo'] = 2;
						
			    $result = modules_create_agent_module ($id_agent, io_safe_input($name), $values);
			    
			    if(is_error($result)) {
					if(!isset($errors[$result])) {
						$errors[$result] = 0;
					}
					$errors[$result]++;
				}
				else {
					$done++;
				}
		    }
	    }
	    
	    if($done > 0) {
			ui_print_success_message(__('Successfully modules created')." ($done)");
		}
		
		if(!empty($errors)) {
			$msg = __('Could not be created').':';

		
			foreach($errors as $code => $number) {
				switch($code) {
					case ERR_EXIST:
						$msg .= '<br>'.__('Another module already exists with the same name')." ($number)";
						break;
					case ERR_INCOMPLETE:
						$msg .= '<br>'.__('Some required fields are missed').': ('.__('name').') '." ($number)";
						break;
					case ERR_DB:
					case ERR_GENERIC:
					default:
						$msg .= '<br>'.__('Processing error')." ($number)";
						break;
				}
				
			}
			
			ui_print_error_message($msg);
		
		}
    }

    // Create the interface list for the interface
    $interfaces_list = array();
    foreach($interfaces as $interface){
        // Get the interface name, removing " " characters and avoid "blank" interfaces
        if (isset($interface['ifName']) && $interface['ifName']['value'] != ""){
                $ifname = $interface['ifName']['value'];
        }
        else if (isset($interface['ifDescr']) && $interface['ifDescr']['value'] != ""){
                $ifname = $interface['ifDescr']['value'];
        }
        else {
                continue;
        }

	    $interfaces_list[$interface['ifIndex']['value']] = str_replace  ( "\""  , "" , $ifname);

    }

    echo '<span id ="none_text" style="display: none;">' . __('None') . '</span>';
    echo "<form method='post' id='walk_form' action='index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=extension&id_agente=$id_agent&id_extension=snmp_explorer'>";

    $table->width = '98%';

    $table->valign[0] = 'top';
    $table->valign[1] = 'top';

    $table->data[0][0] = '<b>' . __('Target IP') . '</b>';
    $table->data[0][1] = html_print_input_text ('ip_target', $ip_target, '', 15, 60, true);

    $table->data[0][2] = '<b>' . __('Port') . '</b>';
    $table->data[0][3] = html_print_input_text ('tcp_port', $tcp_port, '', 5, 20, true);

    $snmp_versions['1'] = 'v. 1';
    $snmp_versions['2'] = 'v. 2';
    $snmp_versions['2c'] = 'v. 2c';
    $snmp_versions['3'] = 'v. 3';

    $table->data[1][0] = '<b>' . __('SNMP community') . '</b>';
    $table->data[1][1] = html_print_input_text ('snmp_community', $snmp_community, '', 15, 60, true);

    $table->data[1][2] = '<b>' . _('SNMP version') . '</b>';
    $table->data[1][3] = html_print_select ($snmp_versions, 'snmp_version', $snmp_version, '', '', '', true, false, false, '');

    $table->data[1][3] .= '<div id="spinner_modules" style="float: left; display: none;">' . html_print_image("images/spinner.gif", true) . '</div>';
    html_print_input_hidden('snmpwalk', 1);

    html_print_table($table);

    unset($table);

    //SNMP3 OPTIONS 
    $table->width = '98%';

    $table->valign[0] = 'top';
    $table->valign[1] = 'top';

    $table->data[2][1] = '<b>'.__('Auth user').'</b>';
    $table->data[2][2] = html_print_input_text ('snmp3_auth_user', $snmp3_auth_user, '', 15, 60, true);
    $table->data[2][3] = '<b>'.__('Auth password').'</b>';
    $table->data[2][4] = html_print_input_text ('snmp3_auth_pass', $snmp3_auth_pass, '', 15, 60, true);
    $table->data[2][4] .= html_print_input_hidden('active_snmp_v3', 0, true);

    $table->data[5][0] = '<b>'.__('Privacy method').'</b>';
    $table->data[5][1] = html_print_select(array('DES' => __('DES'), 'AES' => __('AES')), 'snmp3_privacy_method', $snmp3_privacy_method, '', '', '', true);
    $table->data[5][2] = '<b>'.__('privacy pass').'</b>';
    $table->data[5][3] = html_print_input_text ('snmp3_privacy_pass', $snmp3_privacy_pass, '', 15, 60, true);

    $table->data[6][0] = '<b>'.__('Auth method').'</b>';
    $table->data[6][1] = html_print_select(array('MD5' => __('MD5'), 'SHA' => __('SHA')), 'snmp3_auth_method', $snmp3_auth_method, '', '', '', true);
    $table->data[6][2] = '<b>'.__('Security level').'</b>';
    $table->data[6][3] = html_print_select(array('noAuthNoPriv' => __('Not auth and not privacy method'),
	    'authNoPriv' => __('Auth and not privacy method'), 'authPriv' => __('Auth and privacy method')), 'snmp3_security_level', $snmp3_security_level, '', '', '', true);

    if($snmp_version == 3) {
	    echo '<div id="snmp3_options">';
    }else {
	    echo '<div id="snmp3_options" style="display: none;">';
    }
    html_print_table($table);
    echo '</div>';
    	    
    echo "<div style='text-align:right; width:".$table->width."'>";
    echo '<span id="oid_loading" class="invisible">' . html_print_image("images/spinner.gif", true) . '</span>';
    html_print_submit_button(__('SNMP Walk'), 'snmp_walk', false, array('class' => 'sub next'));
    echo "</div>";
    
    if($snmpwalk && !$snmpis) {
	    echo '<span id="no_snmp" style="margin-left:50px" class="error">'.__('Unable to do SNMP walk').'</span>';
    }

    unset($table);

    echo "</form>";

    //echo "</tr></table>";
    //echo "</form>";

    if(!empty($interfaces_list)){
	    echo '<span id="form_interfaces">';
	    echo '<span id ="none_text" style="display: none;">' . __('None') . '</span>';
	    echo "<form method='post' action='index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=extension&id_agente=$id_agent&id_extension=snmp_explorer'>";
		
	    $id_snmp_serialize = serialize_in_temp($interfaces, $config['id_user']."_snmp");
	    html_print_input_hidden('id_snmp_serialize', $id_snmp_serialize);

	    html_print_input_hidden('create_modules', 1);
	    html_print_input_hidden('ip_target', $ip_target);
	    html_print_input_hidden('tcp_port', $tcp_port);
	    html_print_input_hidden('snmp_community', $snmp_community);
	    html_print_input_hidden('snmp_version', $snmp_version);
	    html_print_input_hidden('snmp3_auth_user', $snmp3_auth_user);
	    html_print_input_hidden('snmp3_auth_pass', $snmp3_auth_pass);
	    html_print_input_hidden('snmp3_auth_method', $snmp3_auth_method);
	    html_print_input_hidden('snmp3_privacy_method', $snmp3_privacy_method);
	    html_print_input_hidden('snmp3_privacy_pass', $snmp3_privacy_pass);
	    html_print_input_hidden('snmp3_security_level', $snmp3_security_level);
		
	    $table->width = '98%';

	    $table->valign[0] = 'top';
	    $table->valign[1] = 'top';

	    //Agent selector
	    $table->data[0][0] = '<b>'.__('Interfaces').'</b>';
	    $table->data[0][1] = '';
	    $table->data[0][2] = '<b>'.__('Modules').'</b>';

	    $table->data[1][0] = html_print_select ($interfaces_list, 'id_snmp[]', 0, false, '', '', true, true, true, '', false, 'width:200px;');
	    $table->data[1][1] = html_print_image('images/darrowright.png', true);
	    $table->data[1][2] = html_print_select (array (), 'module[]', 0, false, '', 0, true, true, true, '', false, 'width:200px;');
    	$table->data[1][2] .= html_print_input_hidden('agent', $id_agent, true);
	
	    html_print_table($table);

	    echo "<div style='text-align:right; width:".$table->width."'>";
	    html_print_submit_button(__('Create modules'), '', false, array('class' => 'sub add'));
		echo "</div>";
	    unset($table);

	    echo "</form>";
	    echo '</div>';
    }

    ui_require_jquery_file ('pandora.controls');
    ui_require_jquery_file ('ajaxqueue');
    ui_require_jquery_file ('bgiframe');
    ui_require_jquery_file ('autocomplete');

?>
<script language="javascript" type="text/javascript">
/* <![CDATA[ */

$(document).ready (function () {
	var inputActive = true;

	$(document).data('text_for_module', $("#none_text").html());

	$("#id_snmp").change(snmp_changed_by_multiple_snmp);
	
	$("#snmp_version").change(function () {
		if (this.value == "3") {
			$("#snmp3_options").css("display", "");
		}
		else {
			$("#snmp3_options").css("display", "none");
		}
	});

	$("#walk_form").submit(function(){
		$("#submit-snmp_walk").disable ();
		$("#oid_loading").show ();
		$("#no_snmp").hide ();
		$("#form_interfaces").hide ();
	});	
	
});

function snmp_changed_by_multiple_snmp (event, id_snmp, selected) {
	var idSNMP = Array();
	
	jQuery.each ($("#id_snmp option:selected"), function (i, val) {
		idSNMP.push($(val).val());
	});
	$('#module').attr ('disabled', 1);
	$('#module').empty ();
	$('#module').append ($('<option></option>').html ("Loading...").attr ("value", 0));

	jQuery.post ('ajax.php', 
				{"page" : "godmode/agentes/agent_manager",
				 "get_modules_json_for_multiple_snmp": 1,
				 "id_snmp[]": idSNMP,
				 "id_snmp_serialize": $("#hidden-id_snmp_serialize").val()
				 },
				 function (data) {
					 $('#module').empty ();
					 c = 0;
					 jQuery.each (data, function (i, val) {
								  s = js_html_entity_decode(val);
								  $('#module').append ($('<option></option>').html (s).attr ("value", i));
								  $('#module').fadeIn ('normal');
								  c++;
								  });
					 if(c == 0){
						 if (typeof($(document).data('text_for_module')) != 'undefined') {
							 $('#module').append ($('<option></option>').html ($(document).data('text_for_module')).attr("value", 0).attr('selected', true));
						 }
						 else {
							 if (typeof(data['any_text']) != 'undefined') {
								 $('#module').append ($('<option></option>').html (data['any_text']).attr ("value", 0).attr('selected', true));
							 }
							 else {
								 var anyText = $("#any_text").html(); //Trick for catch the translate text.
								 
								 if (anyText == null) {
									 anyText = 'Any';
								 }
								 
								 $('#module').append ($('<option></option>').html (anyText).attr ("value", 0).attr('selected', true));
							 }
						 }
					 }
					 if (selected != undefined)
					 $('#module').attr ('value', selected);
					 $('#module').attr ('disabled', 0);
				 },
				 "json"
				 );
}

/* ]]> */
</script>

<?php
}


extensions_add_godmode_tab_agent('snmp_explorer', __('SNMP Explorer'), 'images/snmp_wizard.png', 'snmp_explorer');
?>
