<?php

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

require_once($config['homedir'] . "/include/functions_modules.php");
require_once($config['homedir'] . "/include/functions_tags.php");

/**
 * Compose and return a WMI query
 * 
 * @param string WMI client i.e. wmic
 * @param string Administrator user of the system
 * @param string Administrator password
 * @param string host IP or host of the system
 * @param string parameter --namespace of the WMI query (if not provided, will be ignored)
 *
 * @return string WMI query
 */
function wmi_compose_query($wmi_client, $user, $password, $host, $namespace = '') {
	$wmi_command = '';
	
	if (!empty($password)) {
		$wmi_command = $wmi_client . ' -U "' . $user . '"%"' . $password . '"';
	}
	else {
		$wmi_command = $wmi_client . ' -U "' . $user . '"';
	}
	
	if (!empty($namespace)) {
		$namespace = str_replace("&quot;", "'", $namespace);
		$wmi_command .= ' --namespace="' . $namespace . '"';
	}
	
	$wmi_command .= ' //' . $host;
	
	return $wmi_command;
}


function wmi_create_wizard_modules($id_agent, $names, $wizard_mode, $values, $id_police=0, $module_id=0, $server_to_exec = 0) {
	$results = array(ERR_GENERIC => array(), NOERR => array());
	
	if (empty($names)) {
		return array();
	}
	
	foreach($names as $name) {
		// Add query to wmi_command
		switch ($wizard_mode) {
			case 'services':
				$wmi_query = 'SELECT state FROM Win32_Service WHERE Name="' . io_safe_output($name) . '"';
				break;
			case 'processes':
				$wmi_query = 'SELECT Name FROM Win32_Process WHERE Name="' . io_safe_output($name) . '"';
				break;
			case 'disks':
				$wmi_query = 'SELECT Freespace FROM Win32_LogicalDisk WHERE DeviceID ="' . io_safe_output($name) . '"';
				break;
		}
		
		// Add the query to values
		$values['snmp_oid'] = io_safe_input($wmi_query);
		
		if($id_police != 0){
			$new_module_configuration_data = "module_begin\nmodule_name " . $name . "\nmodule_type generic_data_string\nmodule_wmi " . $values['ip_target'] . "\nmodule_wmiquery " . $wmi_query . "\nmodule_wmiauth " . $values['plugin_user'] . "%" . $values['plugin_pass'] . "\nmodule_end";
			$values['configuration_data'] = $new_module_configuration_data;

			$return = policies_create_module ($name, $id_police, $module_id, $values);
		}
		else{
			$return = modules_create_agent_module ($id_agent, $name, $values);
		}
		if($return < 0) {
			$results[ERR_GENERIC][] = $name;
		}
		else {
			if ($id_police == 0) {
				if ($server_to_exec != 0) {
					$sql = sprintf("SELECT server_type FROM tserver WHERE id_server = %d", $server_to_exec);
					$row = db_get_row_sql ($sql);
					
					if ($row['server_type'] == 13) {
						$new_module_configuration_data = "module_begin\nmodule_name " . $name . "\nmodule_type generic_data_string\nmodule_wmi " . $values['ip_target'] . "\nmodule_wmiquery " . $wmi_query . "\nmodule_wmiauth " . $values['plugin_user'] . "%" . $values['plugin_pass'] . "\nmodule_end";

						config_agents_add_module_in_conf($id_agent, $new_module_configuration_data);
					}
				}
			}

			$results[NOERR][] = $name;
		}
	}
	
	return $results;
}

function wmi_create_module_from_components($components, $values, $id_police=0, $module_id=0, $server_to_exec = 0) {
	$results = array(ERR_GENERIC => array(), NOERR => array(), ERR_EXIST => array());
	
	if (empty($components)) {
		return array();
	}
	foreach ($components as $component_id) {
		$nc = db_get_row ("tnetwork_component", "id_nc", $component_id);
		
		// Compatibilize the fields between components and modules table
		if($id_police == 0){
			$nc['descripcion'] = $nc['description'];
			unset($nc['description']);
		
			$nc['nombre'] = $nc['name'];
			unset($nc['name']);
		}
		
		$nc['id_tipo_modulo'] = $nc['type'];
		unset($nc['type']);
		
		unset($nc['id_nc']);
		unset($nc['id_group']);
		if($id_police != 0){
			unset($nc['id_modulo']);
			unset($nc['wizard_level']);
		}
		// Store the passed values with the component values
		foreach ($values as $k => $v) {
			$nc[$k] = $v;
		}
		
		// Put tags in array if the component has to add them later
		if(!empty($nc['tags'])) {
			$tags = explode(',', $nc['tags']);
		}
		else {
			$tags = array();
		}
		
		unset($nc['tags']);
		
		// Check if this module exists in the agent
		if($nc['id_agente'] != ""){
			$module_name_check = db_get_value_filter('id_agente_modulo', 'tagente_modulo', array('delete_pending' => 0, 'nombre' => $nc['nombre'], 'id_agente' => $nc['id_agente']));
			}
		else{
			$module_name_check = false;
		}
		if ($module_name_check !== false) {
			$results[ERR_EXIST][] = $nc["nombre"];
		}
		else {
			if($id_police == 0){
				$id_agente_modulo = modules_create_agent_module($nc["id_agente"], $nc["nombre"], $nc);
			}
			else{
				$new_module_configuration_data = "module_begin\nmodule_name " . $nc['nombre'] . "\nmodule_type generic_data_string\nmodule_wmi " . $values['ip_target'] . "\nmodule_wmiquery " . io_safe_output($nc['snmp_oid']) . "\nmodule_wmiauth " . $values['plugin_user'] . "%" . $values['plugin_pass'] . "\nmodule_end";
				$nc['configuration_data'] = $new_module_configuration_data;

				$id_agente_modulo = policies_create_module ($nc["name"], $id_police, $module_id, $nc);	
			}

			if ($id_agente_modulo === false) {
				$results[ERR_GENERIC][] = $nc["nombre"];
			}
			else {
				if ($id_police == 0) {
					if ($server_to_exec != 0) {
						$sql = sprintf("SELECT server_type FROM tserver WHERE id_server = %d", $server_to_exec);
						$row = db_get_row_sql ($sql);
						
						if ($row['server_type'] == 13) {
							$new_module_configuration_data = "module_begin\nmodule_name " . $nc['nombre'] . "\nmodule_type generic_data_string\nmodule_wmi " . $values['ip_target'] . "\nmodule_wmiquery " . $nc['snmp_oid'] . "\nmodule_wmiauth " . $values['plugin_user'] . "%" . $values['plugin_pass'] . "\nmodule_end";

							config_agents_add_module_in_conf($nc["id_agente"], $new_module_configuration_data);
						}
					}
				}

				if(!empty($tags)) {
					// Creating tags
					$tag_ids = array();
					foreach ($tags as $tag_name) {
						$tag_id = tags_get_id($tag_name);
						
						//If tag exists in the system we store to create it
						$tag_ids[] = $tag_id;
					}
					
					tags_insert_module_tag ($id_agente_modulo, $tag_ids);
				}
		
				$results[NOERR][] = $nc["nombre"];
			}
		}
	}
	return $results;
}
?>