source: admin/WebConsole/comandos/gestores/gestor_Comandos.php @ 5249c5d

Last change on this file since 5249c5d was bf1117d, checked in by OpenGnSys Support Team <soporte-og@…>, 5 years ago

#942 add WoL on commands, procedures and tasks (web)

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