From 1c713a2465d4adb9f7a71db5e0975b026a27bd8b Mon Sep 17 00:00:00 2001
From: slerena <slerena@gmail.com>
Date: Fri, 7 Mar 2008 16:25:50 +0000
Subject: [PATCH] 2008-03-06  Sancho Lerena <slerena@gmail.com>

        *  conf/pandora_server.conf: New tokens for the new servers.

        * lib/PandoraFMS/Config.pm: Added support for WMI Server.

        * lib/PandoraFMS/DB.pm: Updated pandora_updateserver function.

        * bin/pandora_wmi: Skeleton of WMI server, not functional, only
        a concept proof and initializacion for create a WMI server.

        * bin/pandora_plugin: Almost functional code, fully skeleton,
        initializacion and modules.



git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@740 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f
---
 pandora_server/ChangeLog                | 14 ++++
 pandora_server/bin/pandora_plugin       | 90 +++++++++++--------------
 pandora_server/bin/pandora_wmi          | 88 ++++++++++++++++++++++++
 pandora_server/conf/pandora_server.conf | 12 ++++
 pandora_server/lib/PandoraFMS/Config.pm | 83 ++++++++++++++---------
 pandora_server/lib/PandoraFMS/DB.pm     | 43 ++++++++----
 6 files changed, 236 insertions(+), 94 deletions(-)
 create mode 100755 pandora_server/bin/pandora_wmi

diff --git a/pandora_server/ChangeLog b/pandora_server/ChangeLog
index 544e2346db..56404d9e5a 100644
--- a/pandora_server/ChangeLog
+++ b/pandora_server/ChangeLog
@@ -1,3 +1,17 @@
+2008-03-06  Sancho Lerena <slerena@gmail.com>
+
+        *  conf/pandora_server.conf: New tokens for the new servers.
+
+        * lib/PandoraFMS/Config.pm: Added support for WMI Server.
+
+        * lib/PandoraFMS/DB.pm: Updated pandora_updateserver function.
+
+        * bin/pandora_wmi: Skeleton of WMI server, not functional, only
+        a concept proof and initializacion for create a WMI server.
+
+        * bin/pandora_plugin: Almost functional code, fully skeleton,
+        initializacion and modules.
+
 2008-02-25 Sancho Lerena <slerena@gmail.com>
 
 	* conf/pandora_server.conf: Added new tokens.
diff --git a/pandora_server/bin/pandora_plugin b/pandora_server/bin/pandora_plugin
index a13bf96899..aa5e567e89 100755
--- a/pandora_server/bin/pandora_plugin
+++ b/pandora_server/bin/pandora_plugin
@@ -35,6 +35,8 @@ use PandoraFMS::DB;
 my @pending_task : shared;
 my %pending_task_hash : shared;
 my %current_task_hash : shared;
+my $queue_lock : shared;
+
 
 # FLUSH in each IO (only for debug, very slooow)
 # ENABLED in DEBUGMODE
@@ -57,22 +59,22 @@ pandora_audit (\%pa_config, "Pandora FMS Plugin server starting", "SYSTEM", "Sys
 
 print " [*] Starting up plugin threads\n";
 
+die "Aqui me quedo";
+
 if ( $pa_config{"daemon"} eq "1" ) {
 	print " [*] Backgrounding Pandora FMS Plugin Server process.\n\n";
 	&daemonize;
 }
 
-/*
+=for COMMENT BLOCK
 # Launch now all plugin threads
 # $ax is local thread id for this server
 for (my $ax=0; $ax < $pa_config{'plugin_threads'}; $ax++){
 	threads->new( \&pandora_plugin_consumer, \%pa_config, $ax);
 }
-
+=cut
 # Launch now the producer thread
 threads->new( \&pandora_plugin_producer, \%pa_config);
-*/
-
 
 print " [*] All threads loaded and running \n\n";
 # Last thread is the main process (this process)
@@ -84,7 +86,6 @@ my $dbh = DBI->connect("DBI:mysql:$dbname:$dbhost:3306",
 						$pa_config{'dbpass'},
 						{ RaiseError => 1, AutoCommit => 1 });
 
-
 # Server keepalive thread running in main thread on a infinite loop
 while (1) {
 	pandora_serverkeepaliver (\%pa_config, 1, $dbh);
@@ -145,7 +146,8 @@ sub pandora_plugin_consumer ($$) {
 			# Executing network task with unmanaged error trapping
 			eval {
 				# Call network execution process
-				exec_network_module ( $pa_config, $data_id_agent_module, $dbh);
+				# exec_network_module ( $pa_config, $data_id_agent_module, $dbh);
+                exec_plugin_module ($pa_config, $data_id_agent_module, $dbh);
 			};
 			if ($@){
 				logger ($pa_config, "[ERROR] Plugin Task for module $data_id_agent_module causes a system exception", 0);
@@ -256,7 +258,7 @@ sub pandora_plugin_producer ($) {
 ##########################################################################
 sub exec_plugin_module {
     my $pa_config       = $_[0];
-    my $id_agent_plugin = $_[1];
+    my $id_am           = $_[1];
     my $dbh             = $_[2];
 
     # Set global variables for this sub
@@ -265,26 +267,16 @@ sub exec_plugin_module {
     my $plugin; # hash container for tplugin
 
     # Get a full hash for agent_plugin record reference ($agent_plugin)
-	my $query_sql = "SELECT * FROM tagent_plugin WHERE id = $id_agent_plugin";
+	my $query_sql = "SELECT * FROM tagente_modulo WHERE id_agente_modulo = $id_am";
 	my $exec_sql = $dbh->prepare($query_sql);
 	$exec_sql ->execute;
-	if (! $agent_plugin = $exec_sql->fetchrow_hashref){
-        # This piece of code should not be executed never.
-        $exec_sql->finish();
-        logger (\%pa_config,"[ERROR] Processing data for invalid plugin module", 0);
-        return 0;
-	}
+	$agent_plugin = $exec_sql->fetchrow_hashref;
 
     # Get a full hash for plugin record reference ($plugin)
     $query_sql = "SELECT * FROM tplugin WHERE id = ".$agent_plugin->{'id_plugin'};
     $exec_sql = $dbh->prepare($query_sql);
-    $exec_sql ->execute;
-    if (! $plugin = $exec_sql->fetchrow_hashref){
-        # This piece of code should not be executed never.
-        $exec_sql->finish();
-        logger (\%pa_config,"[ERROR] Processing data for invalid plugin reference", 0);
-        return 0;
-    }
+    $exec_sql->execute();
+    $plugin = $exec_sql->fetchrow_hashref;
 
     # Calculate min timeout for this call
     if ($plugin->{'max_timeout'} < $timeout){
@@ -295,38 +287,27 @@ sub exec_plugin_module {
 	my $agent_name = dame_agente_nombre ($pa_config, $agent_plugin->{'id_agente'}, $dbh);
 	my $module_result = 1;  # Fail by default
 	my $module_data = 0;    # 0 data for default
+    my $module_interval = 0;
 
     # Build execution command to plugin
     my $exec_output = "";
     my $plugin_command = $plugin->{"execute"};
     if ($plugin->{'net_dst_opt'} ne ""){
-        $plugin_command = $plugin_command . " ". $plugin->{'net_dst_opt'} ." ". $agent_module->{'net_dst'};
+        $plugin_command = $plugin_command . " ". $plugin->{'net_dst_opt'} ." ". $agent_plugin->{'ip_target'};
     } 
     if ($plugin->{'net_port_opt'} ne "") {
-        $plugin_command = $plugin_command . " ". $plugin->{'net_port_opt'} ." ". $agent_module->{'net_port'};
+        $plugin_command = $plugin_command . " ". $plugin->{'net_port_opt'} ." ". $agent_plugin->{'tcp_port'};
     }
     if ($plugin->{'user_opt'} ne "") {
-        $plugin_command = $plugin_command . " ". $plugin->{'user_opt'} ." ". $agent_module->{'access_user'};
+        $plugin_command = $plugin_command . " ". $plugin->{'user_opt'} ." ". $agent_plugin->{'plugin_user'};
     }
     if ($plugin->{'pass_opt'} ne "") {
-        $plugin_command = $plugin_command . " ". $plugin->{'pass_opt'} ." ". $agent_module->{'access_pass'};
+        $plugin_command = $plugin_command . " ". $plugin->{'pass_opt'} ." ". $agent_plugin->{'plugin_pass'};
     }
 
-    # Proccess field / optional / dynamic fields (5)
-    if ($agent_module->{'field1'} ne "") {
-        $plugin_command = $plugin_command . " \"". $agent_module->{'field1'}. "\"";
-    }
-    if ($agent_module->{'field2'} ne "") {
-        $plugin_command = $plugin_command . " \"". $agent_module->{'field2'}. "\"";
-    }
-    if ($agent_module->{'field3'} ne "") {
-        $plugin_command = $plugin_command . " \"". $agent_module->{'field3'}. "\"";
-    }
-    if ($agent_module->{'field4'} ne "") {
-        $plugin_command = $plugin_command . " \"". $agent_module->{'field4'}. "\"";
-    }
-    if ($agent_module->{'field5'} ne "") {
-        $plugin_command = $plugin_command . " \"". $agent_module->{'field5'}. "\"";
+    # Proccess field / optional / dynamic field
+    if ($agent_plugin->{'plugin_parameter'} ne "") {
+        $plugin_command = $plugin_command . $agent_plugin->{'plugin_parameter'};
     }
 
     # Final command line execution is stored at "plugin_command"
@@ -337,10 +318,10 @@ sub exec_plugin_module {
         $module_result = 0; # If comes here, this is a successfull exec
     };
     if ($@ =~ /PANDORA PLUGIN SERVER TIMED OUT/) {
-        logger ($pa_config, "[ERROR] Plugin Task for module ".$agent_plugin->{'id'}." causes a system timeout in exec", 1);
+        logger ($pa_config, "[ERROR] Plugin Task for module ".$agent_plugin->{'id_agente_modulo'}." causes a system timeout in exec", 1);
         # resuming eval block...
     } else {
-        logger ($pa_config, "[ERROR] Plugin Task for module ".$agent_plugin->{'id'}." causes an unknown system error", 1);
+        logger ($pa_config, "[ERROR] Plugin Task for module ".$agent_plugin->{'id_agente_modulo'}." causes an unknown system error", 1);
         logger ($pa_config, "[ERROR] $@", 1);
     }
 
@@ -358,18 +339,23 @@ sub exec_plugin_module {
 		$part{'name'}[0] = $agent_plugin->{'id_agent'};
 		$part{'description'}[0] = "";
 		$part{'data'}[0] = $module_data;
-		my $tipo_modulo = dame_nombretipomodulo_idagentemodulo ($pa_config, $agent_plugin->{'id_module_type'}, $dbh);
+		my $tipo_modulo = $agent_plugin->{'id_module_type'};
 
-		if ($tipo_modulo eq 'generic_data') {
+        # 1 - generic_data
+        # 2 - generic_proc
+        # 3 - generic_data_string
+        # 4 - generic_data_inc
+
+		if (1 == $tipo_modulo) {
 			module_generic_data ($pa_config, \%part, $timestamp, $agent_name, $tipo_modulo, $dbh);
 		}
-		elsif ($tipo_modulo eq 'generic_data_inc' ) {
+		elsif (4 == $tipo_modulo) {
 			module_generic_data_inc ($pa_config, \%part, $timestamp, $agent_name, $tipo_modulo, $dbh);
 		}
-		elsif ($tipo_modulo eq 'generic_data_string') {
+		elsif (3 == $tipo_modulo) {
 			module_generic_data_string ($pa_config, \%part, $timestamp, $agent_name, $tipo_modulo, $dbh);
 		}
-		elsif ($tipo_modulo eq 'generic_data_proc') {
+		elsif (2 == $tipo_modulo) {
 			module_generic_proc ($pa_config, \%part, $timestamp, $agent_name, $tipo_modulo, $dbh);
 		}
 		else {
@@ -379,14 +365,14 @@ sub exec_plugin_module {
 		# Update agent last contact
 		# Insert Pandora version as agent version
 		pandora_lastagentcontact ($pa_config, $timestamp, $agent_name,  $pa_config->{'servername'}.$pa_config->{"servermode"}, $pa_config->{'version'}, -1, $dbh);
-	} else { 
+	} else {
         # If module execution get a INVALID value
-		if ($module_interval == 0){
-            $module_interval = dame_intervalo ($pa_config, $agent_plugin->{'id_agent'}, $dbh);
+		if ($agent_plugin->{'intervalo'} == 0){
+            $module_interval = dame_intervalo ($pa_config, $agent_plugin->{'id_agente'}, $dbh);
         }
 		# Modules who cannot connect or something go bad, update last_execution_try field
-		logger ($pa_config, "Cannot obtain exec Network Module $nombre from agent $agent_name", 4);
-		my $query_act = "UPDATE tagente_estado SET current_interval = $module_interval,  last_execution_try = $utimestamp WHERE id_agente_modulo = $id_agente_modulo AND data_source = 2";
+		logger ($pa_config, "Cannot obtain exec plugin Module ".$agent_plugin->{'nombre'}." from agent $agent_name", 3);
+		my $query_act = "UPDATE tagente_estado SET current_interval = $module_interval, last_execution_try = $utimestamp WHERE id_agente_modulo = ".$agent_plugin->{'id_agente_modulo'};
         $dbh->do($query_act);
 	}
 skipdb_execmod:
diff --git a/pandora_server/bin/pandora_wmi b/pandora_server/bin/pandora_wmi
new file mode 100755
index 0000000000..14888a3073
--- /dev/null
+++ b/pandora_server/bin/pandora_wmi
@@ -0,0 +1,88 @@
+#!/usr/bin/perl
+##########################################################################
+# Pandora FMS Plugin Server
+##########################################################################
+# Copyright (c) 2008 Sancho Lerena, slerena@gmail.com
+#           (c) 2008 Artica Soluciones Tecnologicas S.L
+# 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 (only).
+#
+# 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.
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+##########################################################################
+
+# Includes list
+use strict;
+use warnings;
+
+use Date::Manip;        # Needed to manipulate DateTime formats of input, output and compare
+use Time::Local;        # DateTime basic manipulation
+use threads;
+use threads::shared;
+
+# Pandora Modules
+use PandoraFMS::Config;
+use PandoraFMS::Tools;
+use PandoraFMS::DB;
+# use Win32::OLE qw(in);
+
+# Queue management
+my @pending_task : shared;
+my %pending_task_hash : shared;
+my %current_task_hash : shared;
+my $queue_lock : shared;
+
+# FLUSH in each IO (only for debug, very slooow)
+# ENABLED in DEBUGMODE
+# DISABLE FOR PRODUCTION
+$| = 0;
+
+my %pa_config;
+
+$SIG{'TERM'} = 'pandora_shutdown';
+$SIG{'INT'} = 'pandora_shutdown';
+
+# Inicio del bucle principal de programa
+pandora_init(\%pa_config, "Pandora FMS WMI Server");
+
+# Read config file for Global variables
+pandora_loadconfig (\%pa_config, 6);
+
+# Audit server starting
+pandora_audit (\%pa_config, "Pandora FMS WMI server starting", "SYSTEM", "System");
+
+print " [*] Starting up plugin threads\n";
+
+die ("hasta aqui hemos llegado");
+
+# This is a prototype, not real code !!!
+
+# Basic Skeleton to exec a WMI call remotely
+
+
+$Win32::OLE::Warn = 3;
+
+my $wmipath  = "root\\cimv2";
+my $user     = "administrador"; # if ADO needs DOMAIN\user
+my $pwd      = "none";
+my $computer = "192.168.50.121";
+
+
+my $wmiwebloc = Win32::OLE->new('WbemScripting.SWbemLocator') ||
+           die "Cannot access WMI on local machine: ", Win32::OLE->LastError;
+
+my $wmi = $wmiwebloc->ConnectServer($computer,$wmipath,$user,$pwd); 
+
+# get all the service objects
+my @services = in $wmi->InstancesOf("Win32_Service");
+
+# Take 10 first services
+for (my $a=0;$a<10;$a++){
+    print "Service ", $services[$a]->Name, " is ", $services[$a]->Status, "\n";
+}
\ No newline at end of file
diff --git a/pandora_server/conf/pandora_server.conf b/pandora_server/conf/pandora_server.conf
index 6372d3d8dc..cdf411000b 100755
--- a/pandora_server/conf/pandora_server.conf
+++ b/pandora_server/conf/pandora_server.conf
@@ -139,3 +139,15 @@ pluginserver 1
 # predictionserver : 1 or 0. Set to 1 to activate prediction server with this setup
 
 predictionserver 1
+
+# wmiserver : 1 or 0. Set to 1 to activate prediction server with this setup
+
+wmiserver 1
+
+# wmi_timeout : specific timeout for wmi request.
+
+wmi_timeout 10
+
+# wmi_threads: Specify number of WMI server threads for processing WMI remote calls
+
+wmi_threads 3
diff --git a/pandora_server/lib/PandoraFMS/Config.pm b/pandora_server/lib/PandoraFMS/Config.pm
index efbcd75434..371b589c2c 100644
--- a/pandora_server/lib/PandoraFMS/Config.pm
+++ b/pandora_server/lib/PandoraFMS/Config.pm
@@ -34,8 +34,8 @@ our @EXPORT = qw( 	pandora_help_screen
 # There is no global vars, all variables (setup) passed as hash reference
 
 # version: Defines actual version of Pandora Server for this module only
-my $pandora_version = "1.4-dev";
-my $pandora_build="PS080225";
+my $pandora_version = "2.0-dev";
+my $pandora_build="PS080226";
 our $VERSION = $pandora_version." ".$pandora_build;
 
 # Setup hash
@@ -70,9 +70,6 @@ sub pandora_init {
 	printf "This program is Free Software, licensed under the terms of GPL License v2.\n";
 	printf "You can download latest versions and documentation at http://pandora.sourceforge.net. \n\n";
 
-	# Check we are running GNU/Linux
-	die "[ERROR] This isn't GNU/Linux. Pandora FMS Servers are only OFFICIALLY supported in GNU/Linux.\nContact us if you require assistance running Pandora FMS Server in other OS.\n\n" unless ($^O =~ m/linux/i);
-
 	# Load config file from command line
 	if ($#ARGV == -1 ){
 		print "I Need at least one parameter: Complete path to Pandora FMS Server configuration file. \n";
@@ -85,18 +82,27 @@ sub pandora_init {
 	# If there are not valid parameters
 	my $parametro;
 	my $ltotal=$#ARGV; my $ax;
-	for ($ax=0;$ax<=$ltotal;$ax++){
-		$parametro = $ARGV[$ax];
-		if ($parametro =~ m/-h\z/i ) { help_screen();  }
-		elsif ($parametro =~ m/-help\z/i ) { help_screen();  }
-		elsif ($parametro =~ m/-help\z/i ) { help_screen();  }
-		elsif ($parametro =~ m/-v\z/i) { $pa_config->{"verbosity"}=5; }
-		elsif ($parametro =~ m/-d\z/) { $pa_config->{"verbosity"}=10; }
-		elsif ($parametro =~ m/-D\z/) { $pa_config->{"daemon"}=1; }
-		else { ($pa_config->{"pandora_path"} = $parametro); }
-	}
+    for ($ax=0;$ax<=$ltotal;$ax++){
+        $parametro = $ARGV[$ax];
+        if (($parametro =~ m/-h\z/i ) || ($parametro =~ m/help\z/i )) { 
+            help_screen();  
+        }
+        elsif ($parametro =~ m/-v\z/i) { 
+            $pa_config->{"verbosity"}=5; 
+        }
+        elsif ($parametro =~ m/-d\z/) { 
+            $pa_config->{"verbosity"}=10; 
+        }
+        elsif ($parametro =~ m/-D\z/) { 
+            $pa_config->{"daemon"}=1; 
+        }
+        else { 
+            ($pa_config->{"pandora_path"} = $parametro); 
+        }
+    }
 	if ($pa_config->{"pandora_path"} eq ""){
-		print "I Need at least one parameter: Complete path to Pandora FMS configuration file. \n";
+		print " [ERROR] I Need at least one parameter: Complete path to Pandora FMS configuration file. \n";
+        print "         For example: ./pandora_server /etc/pandora/pandora_server.conf\n\n";
 		exit;
 	}
 }
@@ -107,7 +113,9 @@ sub pandora_init {
 
 sub pandora_loadconfig {
     my $pa_config = $_[0];
-    my $opmode = $_[1]; # 0 dataserver, 1 network server, 2 snmp console, 3 recon server, 4 plugin server, 5 prediction server
+    my $opmode = $_[1]; # 0 dataserver, 1 network server, 2 snmp console
+                        # 3 recon srv, 4 plugin srv, 5 prediction srv
+                        # 6 WMI server
     my $archivo_cfg = $pa_config->{'pandora_path'};
     my $buffer_line;
     my @command_line;
@@ -137,8 +145,9 @@ sub pandora_loadconfig {
     $pa_config->{"networkserver"} = 0;
     $pa_config->{"snmpconsole"} = 0;
     $pa_config->{"reconserver"} = 0;
-    $pa_config->{"pluginserver"} = 0; # Introduced on 1.4
-    $pa_config->{"predictionserver"} = 0; # Introduced on 1.4
+    $pa_config->{"wmiserver"} = 0; # Introduced on 2.0
+    $pa_config->{"pluginserver"} = 0; # Introduced on 2.0
+    $pa_config->{"predictionserver"} = 0; # Introduced on 2.0
     $pa_config->{"servermode"} = "";
     $pa_config->{'snmp_logfile'} = "/var/log/pandora_snmptrap.log";
     $pa_config->{"network_threads"} = 5; # Fixed default
@@ -151,8 +160,10 @@ sub pandora_loadconfig {
     $pa_config->{"tcp_checks"} = 1; # Introduced on 1.3.1
     $pa_config->{"tcp_timeout"} = 20; # Introduced on 1.3.1
     $pa_config->{"snmp_proc_deadresponse"} = 0; # Introduced on 1.3.1 10 Feb08
-    $pa_config->{"plugin_threads"} = 3; # Introduced on 1.4
-    $pa_config->{"plugin_timeout"} = 5; # Introduced on 1.
+    $pa_config->{"plugin_threads"} = 3; # Introduced on 2.0
+    $pa_config->{"plugin_timeout"} = 5; # Introduced on 2.0
+    $pa_config->{"wmi_threads"} = 3; # Introduced on 2.0
+    $pa_config->{"wmi_timeout"} = 5; # Introduced on 2.0
 
 	# Check for UID0
 	if ($> == 0){
@@ -248,8 +259,11 @@ sub pandora_loadconfig {
         elsif ($parametro =~ m/^reconserver\s([0-9]*)/i) {
             $pa_config->{'reconserver'}= clean_blank($1);
         }
-        elsif ($parametro =~ m/^networkserver\s([0-9]*)/i) {
-	        $pa_config->{'networkserver'}= clean_blank($1);
+        elsif ($parametro =~ m/^reconserver\s([0-9]*)/i) {
+            $pa_config->{'reconserver'}= clean_blank($1);
+        }
+        elsif ($parametro =~ m/^wmiserver\s([0-9]*)/i) {
+	        $pa_config->{'wmiserver'}= clean_blank($1);
         }
         elsif ($parametro =~ m/^servername\s(.*)/i) { 
             $pa_config->{'servername'}= clean_blank($1);
@@ -326,27 +340,31 @@ sub pandora_loadconfig {
 		exit;
 	}
     if (($opmode ==0) && ($pa_config->{"dataserver"} ne 1)) {
-	    print " [ERROR] You must enable Dataserver in setup file to run Pandora FMS Data Server. \n\n";
+	    print " [ERROR] You must enable 'dataserver' in setup file to run Pandora FMS Data Server. \n\n";
 	    exit;
     } 
     if (($opmode ==1) && ($pa_config->{"networkserver"} ne 1)) {
-	    print " [ERROR] You must enable NetworkServer in setup file to run Pandora FMS Network Server. \n\n";
+	    print " [ERROR] You must enable 'networkserver' in setup file to run Pandora FMS Network Server. \n\n";
 	    exit;
     }
     if (($opmode ==2) && ($pa_config->{"snmpconsole"} ne 1)) {
-	    print " [ERROR] You must enable SnmpConsole in setup file to run Pandora FMS SNMP Console. \n\n";
+	    print " [ERROR] You must enable 'snmpconsole' in setup file to run Pandora FMS SNMP Console. \n\n";
 	    exit;
     }
     if (($opmode ==3) && ($pa_config->{"reconserver"} ne 1)) {
-	    print " [ERROR] You must enable Recon server in setup file to run Pandora FMS Recon server. \n\n";
+	    print " [ERROR] You must enable 'reconserver' in setup file to run Pandora FMS Recon server. \n\n";
 	    exit;
     }
     if (($opmode ==4) && ($pa_config->{"pluginserver"} ne 1)) {
-        print " [ERROR] You must enable Plugin server in setup file to run Pandora FMS Plugin server. \n\n";
+        print " [ERROR] You must enable 'pluginserver' in setup file to run Pandora FMS Plugin server. \n\n";
         exit;
     }
     if (($opmode ==5) && ($pa_config->{"predictionserver"} ne 1)) {
-        print " [ERROR] You must enable Prediction server in setup file to run Pandora FMS Prediction server. \n\n";
+        print " [ERROR] You must enable 'predictionserver' in setup file to run Pandora FMS Prediction server. \n\n";
+        exit;
+    }
+    if (($opmode ==6) && ($pa_config->{"wmiserver"} ne 1)) {
+        print " [ERROR] You must enable 'wmiserver' in setup file to run Pandora FMS WMI server. \n\n";
         exit;
     }
 	if ($opmode == 0){
@@ -374,10 +392,15 @@ sub pandora_loadconfig {
         $parametro ="Pandora FMS Plugin Server";
         $pa_config->{"servermode"}="_Plugin";
     }
-    if ($opmode == 3){
+    if ($opmode == 5){
         print " [*] You are running Pandora FMS Prediction Server. \n";
         $parametro ="Pandora FMS Prediction Server";
         $pa_config->{"servermode"}="_Prediction";
+    }
+    if ($opmode == 6){
+        print " [*] You are running Pandora FMS WMI Server. \n";
+        $parametro ="Pandora FMS WMI Server";
+        $pa_config->{"servermode"}="_WMI";
     }
 	if ($pa_config->{"pandora_check"} == 1) {
 		print " [*] MD5 Security enabled.\n";
diff --git a/pandora_server/lib/PandoraFMS/DB.pm b/pandora_server/lib/PandoraFMS/DB.pm
index 386882f7ba..1c65f3b230 100644
--- a/pandora_server/lib/PandoraFMS/DB.pm
+++ b/pandora_server/lib/PandoraFMS/DB.pm
@@ -1001,14 +1001,17 @@ sub pandora_serverkeepaliver (%$$) {
 ## Update server status
 ##########################################################################
 sub pandora_updateserver (%$$$) {
-    	my $pa_config= $_[0];
-	my $servername = $_[1];
-	my $status = $_[2];
-	my $opmode = $_[3]; # 0 dataserver, 1 network server, 2 snmp console, 3 recon
-	my $dbh = $_[4];
-	my $sql_update;
-	my $pandorasuffix;
-	my $version_data;
+    my $pa_config= $_[0];
+    my $servername = $_[1];
+    my $status = $_[2];
+    my $opmode = $_[3]; # 0 dataserver, 1 network server, 2 snmp console, 3 recon
+                        # 4 plugin, 5 prediction, 6 wmi
+    my $dbh = $_[4];
+
+
+    my $sql_update;
+    my $pandorasuffix;
+    my $version_data;
 
 	if ($opmode == 0){
 		$pandorasuffix = "_Data";
@@ -1018,7 +1021,18 @@ sub pandora_updateserver (%$$$) {
 		$pandorasuffix = "_SNMP";
 	} elsif ($opmode == 3){
 		$pandorasuffix = "_Recon";
-	}
+	} elsif ($opmode == 4){
+        $pandorasuffix = "_Plugin";
+    } elsif ($opmode == 5){
+        $pandorasuffix = "_IA";
+    } elsif ($opmode == 6){
+        $pandorasuffix = "_WMI";
+    } else {
+        logger ($pa_config, "Error: received a unknown server type. Aborting startup.",0);
+        print (" [ERROR] Received a unknown server type. Aborting startup \n\n");
+        exit;
+    }
+
 	my $id_server = dame_server_id($pa_config, $servername.$pandorasuffix, $dbh);
 	if ($id_server == -1){ 
 		# Must create a server entry
@@ -1028,7 +1042,7 @@ sub pandora_updateserver (%$$$) {
 		$id_server = dame_server_id($pa_config, $pa_config->{'servername'}.$pandorasuffix, $dbh);
 	}
 	my @data;
-	my $query_idag = "select * from tserver where id_server = $id_server";
+	my $query_idag = "SELECT * FROM tserver WHERE id_server = $id_server";
 	my $s_idag = $dbh->prepare($query_idag);
 	$s_idag ->execute;
 	if ($s_idag->rows != 0) {
@@ -1048,7 +1062,13 @@ sub pandora_updateserver (%$$$) {
 				$sql_update = "update tserver set version = '$version_data', status = 1, laststart = '$timestamp', keepalive = '$timestamp', recon_server = 0, snmp_server = 1, network_server = 0, data_server = 0, master = $pa_config->{'pandora_master'}, checksum = 0 where id_server = $id_server";
 			} elsif ($opmode == 3) {
 				$sql_update = "update tserver set version = '$version_data', status = 1, laststart = '$timestamp', keepalive = '$timestamp', recon_server = 1, snmp_server = 0, network_server = 0, data_server = 0, master =  $pa_config->{'pandora_master'}, checksum = 0 where id_server = $id_server";
-			}
+			} elsif ($opmode == 4) {
+                $sql_update = "update tserver set version = '$version_data', status = 1, laststart = '$timestamp', keepalive = '$timestamp', plugin_server = 1, master =  $pa_config->{'pandora_master'}, checksum = 0 where id_server = $id_server";
+            } elsif ($opmode == 5) {
+                $sql_update = "update tserver set version = '$version_data', status = 1, laststart = '$timestamp', keepalive = '$timestamp', prediction_server = 1, master =  $pa_config->{'pandora_master'}, checksum = 0 where id_server = $id_server";
+            } elsif ($opmode == 6) {
+                $sql_update = "update tserver set version = '$version_data', status = 1, laststart = '$timestamp', keepalive = '$timestamp', wmi_server = 1, master =  $pa_config->{'pandora_master'}, checksum = 0 where id_server = $id_server";
+            }
 			$dbh->do($sql_update);
 		}
 		$s_idag->finish();
@@ -1345,7 +1365,6 @@ sub give_group_disabled (%$$) {
     	return $disabled;
 }
 
-
 ##########################################################################
 ## SUB dame_modulo_id (nombre_modulo)
 ## Return module ID, given "nombre_modulo" as module name