source: admin/WebConsole/comandos/gestores/gestor_Comandos.php @ bde58da

configfile
Last change on this file since bde58da was 8ecc409, checked in by OpenGnSys Support Team <soporte-og@…>, 5 years ago

#915 Fix WoL command support in queued commands

Irina reports that the Wake on Lan command does not work in queued
commands.

This bug appeared when we fixed duplicated command execution when added
to the queue (ccb862b). It is caused because the client needs to be ON
to ask itself for the queued command, but the WoL command can not work
this way because the client is OFF.

This commit changes the behaviour of gestor_Comandos.php to always send
the WoL command immediately.

  • Property mode set to 100644
File size: 16.3 KB
Line 
1<?php
2// *************************************************************************************************************************************************
3// Aplicación WEB: ogAdmWebCon
4// Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla
5// Fecha Creación: Año 2009-2010
6// Fecha Última modificación: Agosto-2010
7// Nombre del fichero: gestor_Comandos.php
8// Descripción :
9//              Gestor de todos los comandos
10// *************************************************************************************************************************************************
11include_once("../../includes/ctrlacc.php");
12include_once("../../includes/restfunctions.php");
13include_once("../../clases/AdoPhp.php");
14include_once("../../includes/constantes.php");
15include_once("../../includes/comunes.php");
16include_once("../../includes/CreaComando.php");
17include_once("../../includes/RecopilaIpesMacs.php");
18//________________________________________________________________________________________________________
19include_once("../includes/capturaacciones.php");
20//________________________________________________________________________________________________________
21
22define('OG_CMD_ID_WAKEUP', 1);
23define('OG_CMD_ID_POWEROFF', 2);
24define('OG_CMD_ID_RESTORE_IMAGE', 3);
25define('OG_CMD_ID_CREATE_IMAGE', 4);
26define('OG_CMD_ID_REBOOT', 5);
27define('OG_CMD_ID_HARDWARE', 6);
28define('OG_CMD_ID_SOFTWARE', 7);
29define("OG_CMD_ID_SCRIPT", 8);
30define('OG_CMD_ID_SESSION', 9);
31define('OG_CMD_ID_SETUP', 10);
32define('OG_CMD_ID_CREATE_BASIC_IMAGE', 12);
33define('OG_CMD_ID_RESTORE_BASIC_IMAGE', 13);
34define('OG_CMD_ID_CREATE_INCREMENTAL_IMAGE', 14);
35define('OG_CMD_ID_RESTORE_INCREMENTAL_IMAGE', 15);
36define('OG_CMD_ID_SENDMESSAGE', 16);
37
38function run_command($idcomando, $cadenaip, $cadenamac, $atributos) {
39        global $cmd;
40        switch ($idcomando) {
41                case OG_CMD_ID_WAKEUP:
42                        include("wakeonlan_repo.php");
43                        break;
44                case OG_CMD_ID_SETUP:
45                        setup($cadenaip, $atributos);
46                        break;
47                case OG_CMD_ID_SESSION:
48                        session($cadenaip, $atributos);
49                        break;
50                case OG_CMD_ID_CREATE_BASIC_IMAGE:
51                        create_basic_image($cadenaip, $atributos);
52                        break;
53                case OG_CMD_ID_CREATE_INCREMENTAL_IMAGE:
54                        create_incremental_image($cadenaip, $atributos);
55                        break;
56                case OG_CMD_ID_RESTORE_BASIC_IMAGE:
57                        restore_basic_image($cadenaip, $atributos);
58                        break;
59                case OG_CMD_ID_RESTORE_INCREMENTAL_IMAGE:
60                        restore_incremental_image($cadenaip, $atributos);
61                        break;
62                case OG_CMD_ID_POWEROFF:
63                        poweroff($cadenaip);
64                        break;
65                case OG_CMD_ID_CREATE_IMAGE:
66                        create_image($cadenaip, $atributos);
67                        break;
68                case OG_CMD_ID_RESTORE_IMAGE:
69                        restore_image($cadenaip, $atributos);
70                        break;
71                case OG_CMD_ID_REBOOT:
72                        reboot($cadenaip);
73                        break;
74                case OG_CMD_ID_HARDWARE:
75                        hardware($cadenaip);
76                        break;
77                case OG_CMD_ID_SOFTWARE:
78                        software($cadenaip, $atributos);
79                        break;
80                case OG_CMD_ID_SCRIPT:
81                        shell(3, $cadenaip, $atributos);
82                        break;
83        }
84}
85
86// Recoge parametros de seguimiento
87$sw_ejya="";
88$sw_seguimiento="";
89$sw_ejprg="";
90$sw_mkprocedimiento="";
91$nombreprocedimiento="";
92$idprocedimiento="";
93$ordprocedimiento=0;
94$avisoRepo=false;
95
96$sw_mktarea="";
97$nombretarea="";
98$idtarea="";
99$ordtarea=0;
100
101if (isset($_POST["sw_ejya"]))   $sw_ejya=$_POST["sw_ejya"];
102if (isset($_POST["sw_seguimiento"]))    $sw_seguimiento=$_POST["sw_seguimiento"];
103
104if (isset($_POST["sw_ejprg"]))  $sw_ejprg=$_POST["sw_ejprg"];
105
106if (isset($_POST["sw_mkprocedimiento"]))        $sw_mkprocedimiento=$_POST["sw_mkprocedimiento"];
107if (isset($_POST["nombreprocedimiento"]))       $nombreprocedimiento=$_POST["nombreprocedimiento"];
108if (isset($_POST["idprocedimiento"]))   $idprocedimiento=$_POST["idprocedimiento"];
109if (isset($_POST["ordprocedimiento"]))  $ordprocedimiento=$_POST["ordprocedimiento"];
110if(empty($ordprocedimiento)) $ordprocedimiento=0;
111
112if (isset($_POST["sw_mktarea"]))        $sw_mktarea=$_POST["sw_mktarea"];
113if (isset($_POST["nombretarea"]))       $nombretarea=$_POST["nombretarea"];
114if (isset($_POST["idtarea"]))   $idtarea=$_POST["idtarea"];
115if (isset($_POST["ordtarea"]))  $ordtarea=$_POST["ordtarea"];
116if(empty($ordtarea)) $ordtarea=0;
117
118//__________________________________________________________________
119$cmd=CreaComando($cadenaconexion);
120if (!$cmd)
121        Header('Location: '.$pagerror.'?herror=2'); // Error de conexión con servidor B.D.
122//__________________________________________________________________
123$funcion="nfn=".$funcion.chr(13); // Nombre de la función que procesa el comando y el script que lo implementa
124$aplicacion=""; // Ámbito de aplicación (cadena de ipes separadas por ";" y de identificadores de ordenadores por ","
125$acciones=""; // Cadena de identificadores de acciones separadas por ";" para seguimiento
126
127
128
129$atributos=str_replace('@',chr(13),$atributos); // Reemplaza caracters
130$atributos=str_replace('#',chr(10),$atributos);
131$atributos=str_replace('$',chr(9),$atributos);
132
133
134//__________________________________________________________________
135?>
136<HTML>
137<HEAD>
138        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
139        <SCRIPT language="javascript" src="../jscripts/comunescomandos.js"></SCRIPT>
140        <?php echo '<SCRIPT language="javascript" src="../../idiomas/javascripts/'.$idioma.'/comandos/comunescomandos_'.$idioma.'.js"></SCRIPT>'?>
141
142<?php
143//##################################################################
144/* Recopila identificadore ,ipes y macs para envío de comandos */
145$cadenaid="";
146$cadenaip="";
147$cadenamac="";
148$cadenaoga="";  // Clave de acceso a la API REST de OGAgent.
149
150if(!empty($filtro)){ // Ambito restringido a un subconjuto de ordenadores
151        if(substr($filtro,strlen($cadenaid)-1,1)==";") // Si el último caracter es una coma
152                $filtro=substr($filtro,0,strlen($filtro)-1); // Quita la coma
153}
154RecopilaIpesMacs($cmd,$ambito,$idambito,$filtro);
155
156/*--------------------------------------------------------------------------------------------------------------------
157        Creación de parametros para sentencias SQL
158--------------------------------------------------------------------------------------------------------------------*/
159$cmd->CreaParametro("@tipoaccion",0,1);
160$cmd->CreaParametro("@idtipoaccion",0,1);
161$cmd->CreaParametro("@descriaccion","",0);
162$cmd->CreaParametro("@idordenador",0,1);
163$cmd->CreaParametro("@ip","",0);
164$cmd->CreaParametro("@sesion",0,1);
165$cmd->CreaParametro("@parametros","",0);
166$cmd->CreaParametro("@fechahorareg","",0);
167$cmd->CreaParametro("@estado",0,1);
168$cmd->CreaParametro("@resultado",0,1);
169$cmd->CreaParametro("@idcentro",0,1);
170$cmd->CreaParametro("@idprocedimiento",0,1);
171$cmd->CreaParametro("@descripcion","",0);
172$cmd->CreaParametro("@idcomando",0,1);
173$cmd->CreaParametro("@idtarea",0,1);
174$cmd->CreaParametro("@ambito",0,1);
175$cmd->CreaParametro("@idambito",0,1);
176$cmd->CreaParametro("@restrambito","",0);
177$cmd->CreaParametro("@ordprocedimiento",0,1);
178$cmd->CreaParametro("@ordtarea",0,1);
179
180if($ambito==0){ // Ambito restringido a un subconjuto de ordenadores con formato (idordenador1,idordenador2,etc)
181        $cmd->ParamSetValor("@restrambito",$idambito);
182        $idambito=0;
183}
184if(!empty($filtro)){ // Ambito restringido a un subconjuto de ordenadores
185        $cmd->ParamSetValor("@restrambito",$filtro);
186}
187$resul=true;
188
189/*--------------------------------------------------------------------------------------------------------------------
190        Switch de ejecución inmediata y de seguimiento
191--------------------------------------------------------------------------------------------------------------------*/
192if($sw_ejya=='on' || $sw_ejprg=="on" ){
193        $parametros=$funcion.$atributos;
194        $aplicacion=chr(13)."ido=".$cadenaid.chr(13)."mac=".$cadenamac.chr(13)."iph=".$cadenaip.chr(13);
195        if($sw_seguimiento==1 || $sw_ejprg=="on"){ // Switch de ejecución con seguimiento o comando programado
196                $sesion=time();
197                $cmd->ParamSetValor("@tipoaccion",$EJECUCION_COMANDO);
198                $cmd->ParamSetValor("@idtipoaccion",$idcomando);
199                $cmd->ParamSetValor("@descriaccion",$descricomando);
200                $cmd->ParamSetValor("@sesion",$sesion);
201                $cmd->ParamSetValor("@idcomando",$idcomando);
202                $cmd->ParamSetValor("@parametros",$parametros);
203                $cmd->ParamSetValor("@fechahorareg",date("y/m/d H:i:s"));
204                if($sw_ejprg=="on") // Switch de ejecución con programación (se para el comando tarea para lanzarlo posteriormente)
205                        $cmd->ParamSetValor("@estado",$ACCION_DETENIDA);
206                else
207                        $cmd->ParamSetValor("@estado",$ACCION_INICIADA);
208                $cmd->ParamSetValor("@resultado",$ACCION_SINRESULTADO);
209                $cmd->ParamSetValor("@ambito",$ambito);
210                $cmd->ParamSetValor("@idambito",$idambito);                     
211                $cmd->ParamSetValor("@idcentro",$idcentro);
212                $auxID=explode(",",$cadenaid);
213                $auxIP=explode(";",$cadenaip);
214                for ($i=0;$i<sizeof($auxID);$i++){
215                        $cmd->ParamSetValor("@idordenador",$auxID[$i]);
216                        $cmd->ParamSetValor("@ip",$auxIP[$i]);
217                        $cmd->texto="INSERT INTO acciones (idordenador,tipoaccion,idtipoaccion,descriaccion,ip,
218                                                sesion,idcomando,parametros,fechahorareg,estado,resultado,ambito,idambito,restrambito,idcentro)
219                                                VALUES (@idordenador,@tipoaccion,@idtipoaccion,@descriaccion,@ip,
220                                                @sesion,@idcomando,@parametros,@fechahorareg,@estado,@resultado,@ambito,@idambito,@restrambito,@idcentro)";
221                        $resul=$cmd->Ejecutar();
222                }
223                $acciones=chr(13)."ids=".$sesion.chr(13); // Para seguimiento
224        }
225        if (!$resul){
226                echo '<SCRIPT language="javascript">';
227                echo 'resultado_comando(7);'.chr(13);
228                echo '</SCRIPT>';
229        }
230        else{
231                $ValorParametros=extrae_parametros($parametros,chr(13),'=');
232                $script=@urldecode($ValorParametros["scp"]);
233                if($sw_ejya=='on'){
234                        if (($sw_seguimiento == 1 || $sw_ejprg == "on") &&
235                            $idcomando != OG_CMD_ID_WAKEUP)
236                                run_schedule($cadenaip);
237                        else
238                                run_command($idcomando, $cadenaip, $cadenamac, $atributos);
239
240                        // En agente nuevo devuelvo siempre correcto
241                        $resulhidra = 1;
242
243                        // Comprobamos si el comando es soportado por el nuevo OGAgent
244                        $numip=0;
245                        $ogAgentNuevo = false;
246                        switch ($idcomando) {
247                                case OG_CMD_ID_POWEROFF:
248                                        // Apagar
249                                        $urlcomando = 'poweroff';
250                                        $ogAgentNuevo = true;
251                                        break;
252                                case OG_CMD_ID_REBOOT:
253                                        // Reiniciar
254                                        $urlcomando = 'reboot';
255                                        $ogAgentNuevo = true;
256                                        break;
257                                case OG_CMD_ID_SCRIPT:
258                                        // Ejecutar script
259                                        $urlcomando = 'script';
260                                        $ogAgentNuevo = true;
261                                        $client = (isset ($_POST['modoejecucion']) && $_POST['modoejecucion'] != '' ) ? $_POST['modoejecucion'] : 'true';
262                                        $paramsPost = '{"script":"'.base64_encode($script).'","client":"'.$client.'"}';
263                                        break;
264                                case OG_CMD_ID_SENDMESSAGE:
265                                        // Enviar mensaje
266                                        $urlcomando = 'popup';
267                                        $ogAgentNuevo = true;
268                                        $paramsPost = '{"title":"'.$_POST['titulo'].'","message":"'.$_POST['mensaje'].'"}';
269                                        break;
270                        }
271
272                        // Se envía acción al nuevo ogAgent
273                        if ( $ogAgentNuevo ) {
274                                // Send REST requests to new OGAgent clients.
275                                $urls = array();
276                                $ipsuccess = '';
277                                // Compose array of REST URLs.
278                                $auxIp = explode(';', $cadenaip);
279                                $auxKey = explode(";", $cadenaoga);
280                                $i = 0;
281                                foreach ($auxIp as $ip) {
282                                        $urls[$ip]['url'] = "https://$ip:8000/opengnsys/$urlcomando";
283                                        if (isset($auxKey[$i]))  $urls[$ip]['header'] = Array("Authorization: ".$auxKey[$i]);
284                                        if (isset($paramsPost))  $urls[$ip]['post'] = $paramsPost;
285                                        $i++;
286                                }
287                                // Launch concurrent requests.
288                                $responses = multiRequest($urls);
289                                // Process responses array (IP as array index).
290                                foreach ($responses as $ip => $resp) {
291                                        // Check if response code is OK (200).
292                                        if ($resp['code'] == 200) {
293                                                $ipsuccess .= "'".$ip."',";
294                                                $numip++;
295                                        }
296                                }
297                                // quitamos último carácter ','
298                                $ipsuccess=substr($ipsuccess, 0, -1);
299
300                                // Actualizamos la cola de acciones con los que no dan error
301                                if ( $numip >> 0 ) {
302                                        $fin= date ("Y-m-d H:i:s");
303                                        $cmd->texto="UPDATE acciones SET resultado='1', estado='3', ".
304                                                " descrinotificacion='', fechahorafin='".$fin."' ".
305                                                " WHERE ip IN  ($ipsuccess) AND idcomando='$idcomando' ".
306                                                " ORDER BY idaccion DESC LIMIT $numip";
307                                        $resul=$cmd->Ejecutar();
308                                }
309                        }
310                        // Mostramos mensaje con resultado
311                        if (!$resulhidra && $numip == 0){
312                                echo '<SCRIPT language="javascript">';
313                                echo 'resultado_comando(1);'.chr(13);
314                                echo '</SCRIPT>';
315                        }
316                        else{
317                                echo '<SCRIPT language="javascript">'.chr(13);
318                                if ($avisoRepo) {
319                                        echo 'resultado_comando(17);'.chr(13);
320                                } else {
321                                        echo 'resultado_comando(2);'.chr(13);
322                                }
323                                echo '</SCRIPT>'.chr(13);
324                        }               
325                }
326        }
327}
328/*--------------------------------------------------------------------------------------------------------------------
329        Switch de creación o inclusión en procedimiento
330--------------------------------------------------------------------------------------------------------------------*/
331if($sw_mkprocedimiento=='on' || $sw_mktarea=='on'){
332        $resul=false;
333        if($idprocedimiento==0 || $sw_mktarea=='on'){ // Nuevo procedimiento o Tarea
334                if($sw_mktarea=='on' && empty($nombreprocedimiento)){ // Si tarea con inclusión de procedimiento...
335                        if(!empty($nombretarea))
336                                $nombreprocedimiento="Proc($nombretarea)";      // .. tarea nueva
337                        else
338                                $nombreprocedimiento="Proc($idtarea)";  // .. inclusión en tarea
339                }
340                $cmd->ParamSetValor("@descripcion",$nombreprocedimiento);
341                $cmd->ParamSetValor("@idcentro",$idcentro);
342                $cmd->texto="INSERT INTO procedimientos(descripcion,idcentro) VALUES (@descripcion,@idcentro)";
343                $resul=$cmd->Ejecutar();
344                if($resul){
345                        if($idprocedimiento==0) // Cambia el identificador sólo si es nuevo procedimiento
346                                $idprocedimiento=$cmd->Autonumerico();
347                        if($sw_mktarea=='on')
348                                $idprocedimientotarea=$cmd->Autonumerico(); // Identificador para la tarea;     
349                }
350        }
351        if( $idprocedimiento>0 || $sw_mktarea=='on'){ //  inclusión en procedimiento existente
352                $cmd->ParamSetValor("@idprocedimiento",$idprocedimiento);
353                $cmd->ParamSetValor("@idcomando",$idcomando);
354                $cmd->ParamSetValor("@ordprocedimiento",$ordprocedimiento);
355                $parametros=$funcion.$atributos;
356                $cmd->ParamSetValor("@parametros",$parametros);
357                $cmd->texto="INSERT INTO procedimientos_acciones(idprocedimiento,orden,idcomando,parametros)
358                                    VALUES (@idprocedimiento,@ordprocedimiento,@idcomando,@parametros)";
359                $resul=$cmd->Ejecutar();
360                if($sw_mktarea=='on' && $idprocedimiento!=$idprocedimientotarea){ // Si es tarea se graba para su procedimiento independiente aunque los parametros sean los mismos
361                        $cmd->ParamSetValor("@idprocedimiento",$idprocedimientotarea);         
362                        $cmd->texto="INSERT INTO procedimientos_acciones(idprocedimiento,orden,idcomando,parametros)
363                                            VALUES (@idprocedimiento,@ordprocedimiento,@idcomando,@parametros)";
364                        $resul=$cmd->Ejecutar();
365                }
366        }
367        if (!$resul){
368                echo '<SCRIPT language="javascript">';
369                echo 'resultado_comando(3);'.chr(13);
370                echo '</SCRIPT>';
371        }
372        else{
373                if($sw_mkprocedimiento=='on'){
374                        echo '<SCRIPT language="javascript">'.chr(13);
375                        echo 'resultado_comando(4);'.chr(13);
376                        echo '</SCRIPT>'.chr(13);
377                }
378        }
379}       
380/*--------------------------------------------------------------------------------------------------------------------
381        Switch de creación o inclusión en tarea
382--------------------------------------------------------------------------------------------------------------------*/
383if($sw_mktarea=='on'){
384        $resul=false;
385        if($idtarea==0){ // Nueva tarea
386                $cmd->ParamSetValor("@descripcion",$nombretarea);
387                $cmd->ParamSetValor("@idcentro",$idcentro);
388                $cmd->ParamSetValor("@ambito",$ambito);
389                $cmd->ParamSetValor("@idambito",$idambito);             
390                $cmd->texto="INSERT INTO tareas(descripcion,idcentro,ambito,idambito,restrambito)
391                                        VALUES (@descripcion,@idcentro,@ambito,@idambito,@restrambito)";
392                $resul=$cmd->Ejecutar();
393                if($resul)
394                        $idtarea=$cmd->Autonumerico();
395        }
396        if($idtarea>0){ //  inclusión en tarea existente
397                $cmd->ParamSetValor("@idtarea",$idtarea);
398                $cmd->ParamSetValor("@idprocedimiento",$idprocedimientotarea);
399                $cmd->ParamSetValor("@ordtarea",$ordtarea);
400                $cmd->texto="INSERT INTO tareas_acciones(idtarea,orden,idprocedimiento)
401                                                        VALUES (@idtarea,@ordtarea,@idprocedimiento)";
402                $resul=$cmd->Ejecutar();
403                //echo $cmd->texto;
404        }
405        if (!$resul){
406                echo '<SCRIPT language="javascript">'.chr(13);
407                echo 'resultado_comando(5);'.chr(13);
408                echo '</SCRIPT>'.chr(13);
409        }
410        else{
411                echo '<SCRIPT language="javascript">'.chr(13);
412                echo 'resultado_comando(6);'.chr(13);
413                echo '</SCRIPT>'.chr(13);
414        }
415}
416/* Programación del comando */
417if ($resul){
418        if($sw_ejprg=="on" ){   
419                echo '<SCRIPT language="javascript">'.chr(13);
420                echo 'var whref="../../varios/programaciones.php?idcomando='.$idcomando.'";'.chr(13);
421                echo 'whref+="&sesion='.$sesion.'&descripcioncomando='.UrlEncode($descricomando).'&tipoaccion='.$EJECUCION_COMANDO.'";'.chr(13);
422                echo 'location.href=whref;';
423                echo '</SCRIPT>';
424        }
425}
426?>
427</HEAD>
428<BODY>
429</BODY>
430</HTML>
431
Note: See TracBrowser for help on using the repository browser.