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);
}