source: admin/WebConsole/gestores/gestor_ejecutaracciones.php

qndtest
Last change on this file was 00f0fe2, checked in by OpenGnSys Support Team <soporte-og@…>, 4 years ago

#915 Fix WoL command support in procedures and tasks

Irina reports that the Wake on Lan command does not work in procedures.
The client/computer does not turn on, causing that any of the other
commands are executed.

This bug appears when we adapt the procedures and tasks to work with the
new API REST of the ogAdmServer. It is caused because the client needs
to be on to ask itself for the pending commands, but the WoL command can
not work this way because the client is off.

This commit changes the behaviour of recorreProcedimientos to send the
WoL command without the client has to ask.

  • Property mode set to 100644
File size: 10.6 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: Mayo-2005
7// Nombre del fichero: gestor_procedimientos.php
8// Descripción :
9//              Gestiona la ejecución de procedimientos
10// *************************************************************************************************************************************************
11include_once("../includes/ctrlacc.php");
12include_once("../clases/AdoPhp.php");
13include_once("../clases/XmlPhp.php");
14include_once("../clases/ArbolVistaXML.php");
15include_once("../includes/CreaComando.php");
16include_once("../includes/constantes.php");
17include_once("../includes/comunes.php");
18include_once("../includes/RecopilaIpesMacs.php");
19include_once("../includes/restfunctions.php");
20//________________________________________________________________________________________________________
21
22define('OG_CMD_ID_WAKEUP', 1);
23
24$opcion=0; // Inicializa parametros
25
26$idprocedimiento=0;
27$idtarea=0;
28$ambito=0;
29$idambito=0;
30$swc=0; // switch de cliente, esta pagina la llama el cliente a través del browser
31
32if (isset($_POST["opcion"])) $opcion=$_POST["opcion"];
33if (isset($_POST["idprocedimiento"]))   $idprocedimiento=$_POST["idprocedimiento"];
34if (isset($_POST["descriprocedimiento"]))       $descriprocedimiento=$_POST["descriprocedimiento"];
35if (isset($_POST["ambito"])) $ambito=$_POST["ambito"];
36if (isset($_POST["idambito"])) $idambito=$_POST["idambito"];
37if (isset($_POST["idtarea"]))   $idtarea=$_POST["idtarea"];
38if (isset($_POST["descritarea"]))       $descritarea=$_POST["descritarea"];
39
40if (isset($_GET["opcion"])) $opcion=$_GET["opcion"];
41if (isset($_GET["idprocedimiento"])) $idprocedimiento=$_GET["idprocedimiento"];
42if (isset($_GET["descriprocedimiento"]))$descriprocedimiento=$_GET["descriprocedimiento"];
43if (isset($_GET["ambito"])) $ambito=$_GET["ambito"];
44if (isset($_GET["idambito"])) $idambito=$_GET["idambito"];
45if (isset($_GET["idtarea"])) $idtarea=$_GET["idtarea"];
46if (isset($_GET["descritarea"])) $descritarea=$_GET["descritarea"];
47
48if (isset($_GET["swc"])) $swc=$_GET["swc"]; // Switch que indica que la página la solicita un cliente a través del browser
49
50$cmd=CreaComando($cadenaconexion); // Crea objeto comando
51$resul=false;
52if ($cmd){
53        $cadenaid="";
54        $cadenaip="";
55        $cadenamac="";
56        $sesion=0;
57        $vez=0;
58        if(opcion!=$EJECUCION_TAREA)
59                RecopilaIpesMacs($cmd,$ambito,$idambito); // Recopila Ipes del ámbito
60        if(opcion!=$EJECUCION_AUTOEXEC){
61                //Creación parametros para inserción en tabla acciones
62                $sesion=time();
63                $cmd->CreaParametro("@tipoaccion",$opcion,1);
64                $cmd->CreaParametro("@idtipoaccion",0,1);
65                $cmd->CreaParametro("@descriaccion","",0);
66                $cmd->CreaParametro("@idordenador",0,1);
67                $cmd->CreaParametro("@ip","",0);
68                $cmd->CreaParametro("@sesion",$sesion,1);
69                $cmd->CreaParametro("@idcomando",0,1);
70                $cmd->CreaParametro("@parametros","",0);
71                $cmd->CreaParametro("@fechahorareg","",0);
72                $cmd->CreaParametro("@fechahorafin","",0);
73                $cmd->CreaParametro("@estado",$ACCION_INICIADA,1);
74                $cmd->CreaParametro("@resultado",$ACCION_SINRESULTADO,1);
75                $cmd->CreaParametro("@descrinotificacion","",0);
76                $cmd->CreaParametro("@idprocedimiento",0,1);
77                $cmd->CreaParametro("@idtarea",0,1);
78                $cmd->CreaParametro("@idcentro",$idcentro,1);
79                $cmd->CreaParametro("@ambito",0,1);
80                $cmd->CreaParametro("@idambito",0,1);
81                $cmd->CreaParametro("@restrambito","",0);
82        }
83        switch($opcion){
84                case $EJECUCION_AUTOEXEC:
85                        $resul=actualizaAutoexec($idprocedimiento);
86                        $literal="resultado_gestion_procedimiento";
87                        break;
88                case $EJECUCION_PROCEDIMIENTO:
89                        $cmd->ParamSetValor("@idtipoaccion",$idprocedimiento);
90                        $cmd->ParamSetValor("@descriaccion",$descriprocedimiento);
91                        $resul=ejecucionProcedimiento($idprocedimiento,$ambito,$idambito);
92                        $literal="resultado_gestion_procedimiento";
93                        break;
94                case $EJECUCION_TAREA:
95                        $cmd->ParamSetValor("@idtipoaccion",$idtarea);
96                        $cmd->ParamSetValor("@descriaccion",$descritarea);
97                        $cmd->ParamSetValor("@idtarea",$idtarea);
98                        $resul=ejecucionTarea($idtarea);
99                        $literal="resultado_ejecutar_tareas";
100                        break;
101        }
102        $cmd->Conexion->Cerrar();
103}
104if ($resul){
105        if(empty($swc)){
106                echo $literal."(1,'".$cmd->DescripUltimoError()."');".chr(13);
107        }
108        else{
109                echo '<SCRIPT language="javascript">'.chr(13);
110                echo 'alert("El item se ha ejecutado correctamente");'.chr(13);
111                echo 'var wurl="../varios/menucliente.php?iph='.trim($_SESSION["ogCliente"]).'";';
112                echo 'history.back();';
113                echo '</SCRIPT>';
114        }
115}
116else{
117        if(empty($swc)){
118                echo $literal."(0,'".$cmd->DescripUltimoError()."')";
119        }
120        else{
121                echo '<SCRIPT language="javascript">'.chr(13);
122                echo 'alert("***ATENCIÓN:El item NO se ha podido ejecutar");'.chr(13);
123                echo 'var wurl="../varios/menucliente.php?iph='.trim($_SESSION["ogCliente"]).'";';
124                echo 'location.href=wurl;';
125                echo '</SCRIPT>';
126        }
127}
128//********************************************************************************************************
129//
130// Incorpora un procedimiento como autoexec
131//________________________________________________________________________________________________________
132function actualizaAutoexec($idprocedimiento)
133{
134        global $cadenaid;
135        global $cmd;
136
137        $cmd->texto="UPDATE ordenadores SET idproautoexec=".$idprocedimiento." WHERE idordenador IN (".$cadenaid.")";
138        $resul=$cmd->Ejecutar();
139        return(resul);
140}
141//________________________________________recorreProcedimientos________________________________________________________________
142//
143// Ejecuta un procedimiento: lo registra en acciones y lo envía por la red
144//________________________________________________________________________________________________________
145function ejecucionProcedimiento($idprocedimiento,$ambito,$idambito)
146{
147        return(recorreProcedimientos($idprocedimiento,$ambito,$idambito));                                               
148}
149//________________________________________________________________________________________________________
150//
151// Ejecuta una tarea: la registra en acciones y la envía por la red
152//________________________________________________________________________________________________________
153function ejecucionTarea($idtarea)
154{
155        return(recorreTareas($idtarea));                                                 
156}
157//________________________________________________________________________________________________________
158function recorreProcedimientos($idprocedimiento,$ambito,$idambito)
159{               
160        global $cadenamac;
161        global $cadenaip;
162        global $sesion;
163        global $cmd;
164
165        $wol_params;
166
167        $cmd->texto="SELECT   idcomando,procedimientoid,parametros
168                         FROM procedimientos_acciones
169                        WHERE idprocedimiento=".$idprocedimiento."
170                        ORDER BY orden";       
171
172        $rs=new Recordset; 
173        $rs->Comando=&$cmd; 
174        if (!$rs->Abrir()) return(false); // Error al abrir recordset
175        while (!$rs->EOF){
176                $procedimientoid=$rs->campos["procedimientoid"];
177                if($procedimientoid>0){ // Procedimiento recursivo
178                        if(!recorreProcedimientos($procedimientoid,$ambito,$idambito)){
179                                return(false);
180                        }
181                }
182                else{
183                        $parametros=$rs->campos["parametros"];
184                        $idcomando=$rs->campos["idcomando"];
185                        // Ticket 681: bucle infinito en procedimiento compuesto (J.M. Alonso).
186                        do{
187                                $nwsesion=time();       
188                        }while($sesion==$nwsesion);
189                        $sesion=$nwsesion;
190                        $cmd->ParamSetValor("@sesion",$sesion);
191                        // Fin ticket 681.
192                        if ($idcomando == OG_CMD_ID_WAKEUP)
193                                $wol_params = $parametros;
194                        if(!insertaComando($idcomando,$parametros,$idprocedimiento,$ambito,$idambito)) 
195                                return(false); 
196                }
197                $rs->Siguiente();
198        }
199
200        if (isset($wol_params)) {
201                $atributos = substr(trim($wol_params), -1);
202                include("../comandos/gestores/wakeonlan_repo.php");
203        }
204
205        return(true);
206}
207//________________________________________________________________________________________________________
208function recorreTareas($idtarea)
209{               
210        global $cadenaid;
211        global $cadenaip;
212        global $cadenamac;     
213        global $cmd;   
214                         
215        $cmd->texto="SELECT tareas_acciones.orden,tareas_acciones.idprocedimiento,tareas_acciones.tareaid,
216                                                tareas.ambito,tareas.idambito,tareas.restrambito
217                                 FROM tareas
218                                 INNER JOIN tareas_acciones ON tareas_acciones.idtarea=tareas.idtarea
219                                 WHERE tareas_acciones.idtarea=".$idtarea."
220                                 ORDER BY tareas_acciones.orden";       
221        //echo $cmd->texto;                                                                     
222        $rs=new Recordset; 
223        $rs->Comando=&$cmd; 
224        if (!$rs->Abrir()) return(false); // Error al abrir recordset
225        while (!$rs->EOF){
226                $tareaid=$rs->campos["tareaid"];
227                if($tareaid>0){ // Tarea recursiva
228                        if(!recorreTareas($tareaid)){
229                                return(false);
230                        }
231                }
232                else{
233                        $ambito=$rs->campos["ambito"];
234                        $idambito=$rs->campos["idambito"];
235                        if($ambito==0 && $idambito==0){ // Ámbito restringido
236                                $idambito=$rs->campos["restrambito"];
237                        }
238                        RecopilaIpesMacs($cmd,$ambito,$idambito); // Recopila Ipes del ámbito           
239                        $idprocedimiento=$rs->campos["idprocedimiento"];
240                        if(!recorreProcedimientos($idprocedimiento,$ambito,$idambito)) 
241                                return(false); 
242                }
243                $rs->Siguiente();
244        }
245        return(true);
246}
247//________________________________________________________________________________________________________
248//
249//      Registra un procedimiento para un ambito concreto
250//________________________________________________________________________________________________________
251function insertaComando($idcomando,$parametros,$idprocedimiento,$ambito,$idambito)
252{
253        global $cadenaid;
254        global $cadenaip;
255        global $cmd;   
256        global $sesion;
257        global $vez;
258
259        if($ambito==0){ // Ambito restringido a un subconjuto de ordenadores con formato (idordenador1,idordenador2,etc)
260                $cmd->ParamSetValor("@restrambito",$idambito);
261                $idambito=0;
262        }       
263       
264        $cmd->ParamSetValor("@idcomando",$idcomando);
265        $cmd->ParamSetValor("@idprocedimiento",$idprocedimiento);
266        $cmd->ParamSetValor("@parametros",$parametros);
267        $cmd->ParamSetValor("@fechahorareg",date("y/m/d H:i:s"));
268        $cmd->ParamSetValor("@ambito",$ambito);
269        $cmd->ParamSetValor("@idambito",$idambito);
270
271        if(strlen($cadenaip)==0) return(true); 
272
273        $auxID=explode(",",$cadenaid);
274        $auxIP=explode(";",$cadenaip);
275
276        for ($i=0;$i<sizeof($auxID);$i++){
277                $cmd->ParamSetValor("@idordenador",$auxID[$i]);
278                $cmd->ParamSetValor("@ip",$auxIP[$i]);
279                $cmd->texto="INSERT INTO acciones (idordenador,tipoaccion,idtipoaccion,descriaccion,ip,sesion,idcomando,parametros,fechahorareg,estado,resultado,ambito,idambito,restrambito,idprocedimiento,idtarea,idcentro)
280                                        VALUES (@idordenador,@tipoaccion,@idtipoaccion,@descriaccion,@ip,@sesion,@idcomando,@parametros,@fechahorareg,@estado,@resultado,@ambito,@idambito,@restrambito,@idprocedimiento,@idtarea,@idcentro)";
281                $resul=$cmd->Ejecutar();
282                //echo $cmd->texto;
283                if(!$resul) return(false);
284
285                // Let the clients know they can start executing pending commands.
286                if(empty($vez)){
287                        run_schedule($cadenaip);
288                        $vez++;
289                }
290        }
291        return(true);
292}
293
Note: See TracBrowser for help on using the repository browser.