CreaParametro("@tipoaccion",$opcion,1); $cmd->CreaParametro("@idtipoaccion",0,1); $cmd->CreaParametro("@descriaccion","",0); $cmd->CreaParametro("@idordenador",0,1); $cmd->CreaParametro("@ip","",0); $cmd->CreaParametro("@sesion",$sesion,1); $cmd->CreaParametro("@idcomando",0,1); $cmd->CreaParametro("@parametros","",0); $cmd->CreaParametro("@fechahorareg","",0); $cmd->CreaParametro("@fechahorafin","",0); $cmd->CreaParametro("@estado",$ACCION_INICIADA,1); $cmd->CreaParametro("@resultado",$ACCION_SINRESULTADO,1); $cmd->CreaParametro("@descrinotificacion","",0); $cmd->CreaParametro("@idprocedimiento",0,1); $cmd->CreaParametro("@idtarea",0,1); $cmd->CreaParametro("@idcentro",$idcentro,1); $cmd->CreaParametro("@ambito",0,1); $cmd->CreaParametro("@idambito",0,1); $cmd->CreaParametro("@restrambito","",0); } switch($opcion){ case $EJECUCION_AUTOEXEC: $resul=actualizaAutoexec($idprocedimiento); $literal="resultado_gestion_procedimiento"; break; case $EJECUCION_PROCEDIMIENTO: $cmd->ParamSetValor("@idtipoaccion",$idprocedimiento); $cmd->ParamSetValor("@descriaccion",$descriprocedimiento); $resul=ejecucionProcedimiento($idprocedimiento,$ambito,$idambito); $literal="resultado_gestion_procedimiento"; break; case $EJECUCION_TAREA: $cmd->ParamSetValor("@idtipoaccion",$idtarea); $cmd->ParamSetValor("@descriaccion",$descritarea); $cmd->ParamSetValor("@idtarea",$idtarea); $resul=ejecucionTarea($idtarea); $literal="resultado_ejecutar_tareas"; break; } $cmd->Conexion->Cerrar(); } if ($resul){ if(empty($swc)){ echo $literal."(1,'".$cmd->DescripUltimoError()."');".chr(13); } else{ echo ''; } } else{ if(empty($swc)){ echo $literal."(0,'".$cmd->DescripUltimoError()."')"; } else{ echo ''; } } //******************************************************************************************************** // // Incorpora un procedimiento como autoexec //________________________________________________________________________________________________________ function actualizaAutoexec($idprocedimiento) { global $cadenaid; global $cmd; $cmd->texto="UPDATE ordenadores SET idproautoexec=".$idprocedimiento." WHERE idordenador IN (".$cadenaid.")"; $resul=$cmd->Ejecutar(); return(resul); } //________________________________________recorreProcedimientos________________________________________________________________ // // Ejecuta un procedimiento: lo registra en acciones y lo envía por la red //________________________________________________________________________________________________________ function ejecucionProcedimiento($idprocedimiento,$ambito,$idambito) { return(recorreProcedimientos($idprocedimiento,$ambito,$idambito)); } //________________________________________________________________________________________________________ // // Ejecuta una tarea: la registra en acciones y la envía por la red //________________________________________________________________________________________________________ function ejecucionTarea($idtarea) { return(recorreTareas($idtarea)); } //________________________________________________________________________________________________________ function recorreProcedimientos($idprocedimiento,$ambito,$idambito) { global $cmd; global $sesion; $cmd->texto="SELECT idcomando,procedimientoid,parametros FROM procedimientos_acciones WHERE idprocedimiento=".$idprocedimiento." ORDER BY orden"; $rs=new Recordset; $rs->Comando=&$cmd; if (!$rs->Abrir()) return(false); // Error al abrir recordset while (!$rs->EOF){ $procedimientoid=$rs->campos["procedimientoid"]; if($procedimientoid>0){ // Procedimiento recursivo if(!recorreProcedimientos($procedimientoid,$ambito,$idambito)){ return(false); } } else{ $parametros=$rs->campos["parametros"]; $idcomando=$rs->campos["idcomando"]; // Ticket 681: bucle infinito en procedimiento compuesto (J.M. Alonso). do{ $nwsesion=time(); }while($sesion==$nwsesion); $sesion=$nwsesion; $cmd->ParamSetValor("@sesion",$sesion); // Fin ticket 681. if(!insertaComando($idcomando,$parametros,$idprocedimiento,$ambito,$idambito)) return(false); } $rs->Siguiente(); } return(true); } //________________________________________________________________________________________________________ function recorreTareas($idtarea) { global $cadenaid; global $cadenaip; global $cadenamac; global $cmd; $cmd->texto="SELECT tareas_acciones.orden,tareas_acciones.idprocedimiento,tareas_acciones.tareaid, tareas.ambito,tareas.idambito,tareas.restrambito FROM tareas INNER JOIN tareas_acciones ON tareas_acciones.idtarea=tareas.idtarea WHERE tareas_acciones.idtarea=".$idtarea." ORDER BY tareas_acciones.orden"; //echo $cmd->texto; $rs=new Recordset; $rs->Comando=&$cmd; if (!$rs->Abrir()) return(false); // Error al abrir recordset while (!$rs->EOF){ $tareaid=$rs->campos["tareaid"]; if($tareaid>0){ // Tarea recursiva if(!recorreTareas($tareaid)){ return(false); } } else{ $ambito=$rs->campos["ambito"]; $idambito=$rs->campos["idambito"]; if($ambito==0 && $idambito==0){ // Ámbito restringido $idambito=$rs->campos["restrambito"]; } RecopilaIpesMacs($cmd,$ambito,$idambito); // Recopila Ipes del ámbito $idprocedimiento=$rs->campos["idprocedimiento"]; if(!recorreProcedimientos($idprocedimiento,$ambito,$idambito)) return(false); } $rs->Siguiente(); } return(true); } //________________________________________________________________________________________________________ // // Registra un procedimiento para un ambito concreto //________________________________________________________________________________________________________ function insertaComando($idcomando,$parametros,$idprocedimiento,$ambito,$idambito) { global $cadenaid; global $cadenaip; global $cmd; global $sesion; global $vez; if($ambito==0){ // Ambito restringido a un subconjuto de ordenadores con formato (idordenador1,idordenador2,etc) $cmd->ParamSetValor("@restrambito",$idambito); $idambito=0; } $cmd->ParamSetValor("@idcomando",$idcomando); $cmd->ParamSetValor("@idprocedimiento",$idprocedimiento); $cmd->ParamSetValor("@parametros",$parametros); $cmd->ParamSetValor("@fechahorareg",date("y/m/d H:i:s")); $cmd->ParamSetValor("@ambito",$ambito); $cmd->ParamSetValor("@idambito",$idambito); if(strlen($cadenaip)==0) return(true); $auxID=explode(",",$cadenaid); $auxIP=explode(";",$cadenaip); for ($i=0;$iParamSetValor("@idordenador",$auxID[$i]); $cmd->ParamSetValor("@ip",$auxIP[$i]); $cmd->texto="INSERT INTO acciones (idordenador,tipoaccion,idtipoaccion,descriaccion,ip,sesion,idcomando,parametros,fechahorareg,estado,resultado,ambito,idambito,restrambito,idprocedimiento,idtarea,idcentro) VALUES (@idordenador,@tipoaccion,@idtipoaccion,@descriaccion,@ip,@sesion,@idcomando,@parametros,@fechahorareg,@estado,@resultado,@ambito,@idambito,@restrambito,@idprocedimiento,@idtarea,@idcentro)"; $resul=$cmd->Ejecutar(); //echo $cmd->texto; if(!$resul) return(false); /* Sólo envía por la red el primer comando, el resto, si hubiera, lo encontrará el cliente a través de los comandos pendientes */ if(empty($vez)){ if(!enviaComando($parametros,$sesion)) return(false); $vez++; } } return(true); } //________________________________________________________________________________________________________ // // Envia un procedimiento a un grupo de ordenadores a través de la red //________________________________________________________________________________________________________ function enviaComando($parametros,$sesion) { global $cadenaid; global $cadenaip; global $cadenamac; global $servidorhidra; global $hidraport; global $LONCABECERA; global $shidra; // Envio al servidor $aplicacion=chr(13)."ido=".$cadenaid.chr(13)."mac=".$cadenamac.chr(13)."iph=".$cadenaip.chr(13); $acciones=chr(13)."ids=".$sesion.chr(13); // Para seguimiento if ($shidra->conectar()){ // Se ha establecido la conexión con el servidor hidra $parametros.=$aplicacion; $parametros.=$acciones; $shidra->envia_comando($parametros); $trama=$shidra->recibe_respuesta(); $shidra->desconectar(); } return(true); }