source: admin/WebConsole/comandos/gestores/gestor_Comandos.php @ 5d05b06

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

#990 Use client broadcast address on WoL

Some universities have computers in a different subnet where the
ogServer is, but ogServer WoL functionality only supported to send
packet to its own subnets. This commit solves this.

Now ogServer sends two WoL packets per client, one with the broadcast
address of the interface indicated in the config file, the other with
the broadcast address calculated with the address and netmask of the
client.

To ensure that the second WoL works correctly you must configure
correctly the IP and netmask of the clients. Also, you have to configure
the network of your organization to route WoL packet to the correct
subnet.

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