XOneMonitor



El XOne Monitor es un servicio que pretende cubrir una necesidad muy común en el mundo de la informática, asegurarse de que todo va como debiera ir.

Por lo tanto, es un servicio que nos va a permitir comprobar que ciertas funciones de nuestro servidor funcionan correctamente.

Adicionalmente, se han añadido algunas funcionalidades usadas para algún caso específico, las cuales quizás no cumplan tan sólo con el objetivo de comprobar que algo está funcionando correctamente, pero pueden resultar útiles.

Funcionalidades
Comprobar si algún servicio está parado, arrancarlo de nuevo y enviar un correo advirtiéndonos del suceso.
Enviarnos algún correo con algunos parámetros que nos resulten indicativos del estado del proyecto.
Ejecutar mantenimientos periódicos de las tablas de la aplicación y de la réplica si la hubiera.
Envío de correo avisándonos de algún comportamiento erróneo.
Creación de log de cualquiera de los errores anteriores para su posterior supervisión.
Creación, copia y traslado de ficheros de una ubicación a otra.
Compresión de ficheros.
Borrado de actualizaciones ya confirmadas.


Los datos incluidos en el fichero de configuración son los siguientes:

Atributo Descripción
Xml Path Ruta del fichero XML donde están las comprobaciones del monitor.
servername Nombre del Servidor
appname Nombre de la Aplicación
interval Intervalo de tiempo para revisar por defecto, siempre no haya definido. Expresado en segundos.
PARAMETROS DE CORREO
smtpserver Dirección del servidor de correo
displayUserName Nombre para mostrar como remitente del correo.
mailfrom Dirección remitente del correo.
smtpuser Usuario con el que nos conectamos para enviar los correos.
smtppwdr Contraseña del usuario de correo.
smtpport Puerto para el envío del correo.
smtpusessl Si está a true, especifica que vamos a utilizar SSL para el envío smtp.
PARAMETROS DE LOG
log Si queremos dejar log en el visor de sucesos (true/false).
log file Si queremos dejar log en un fichero txt externo (true/false).
path log file Ruta del fichero de log txt externo si ponemos a true la opción anterior.
PARÁMETROS DE FORMATO DE CORREO
Format Html El formato del correo es texto simple, si queremos darle formato html debemos habilitar ésta opción (true/false). Por defecto, si no se pone nada, se devuelve en el nuevo formato.
Title Size Tamaño del texto para el título del correo. Si no se especifica ningún valor, el valor por defecto es 24.
Title Forecolor Color del texto para el título del correo. Si no se especifica ningún valor, el valor por defecto es #042244.
Title Font family Tipo de letra del texto para el título del correo. Si no se especifica ningún valor, el valor por defecto es Calibri.
Text Size Tamaño del texto para el cuerpo del correo.Si no se especifica ningún valor, el valor por defecto es 14.
Text Forecolor Color del texto para el cuerpo del correo. Si no se especifica ningún valor, el valor por defecto es #052b57.
Text Font family Tipo de letra del texto para el cuerpo del correo. Si no se especifica ningún valor, el valor por defecto es Calibri.
Firm Name Nombre inicial de la firma. TEXTO,TAMAÑO,COLOR y TIPO DE LETRA para el título de la firma. P.ej: “Xonemonitor,14,#df2c28,Calibri”.
Firm Email Email de quien envía el correo, se puede poner el que sea, si no se especifica nada se pondrá el que se configure en el checking o maintenance. TEXTO,TAMAÑO,COLOR y TIPO DE LETRA para el correo de la firma. P.ej: “direccion@servidor.es,14,#df2c28,Calibri”.
Firm Image Path Ruta donde se encuentra la imagen a asociar de la firma. El tipo de imagen que se aceptan son: .jpg .png .tif. ADVERTENCIA: Se aconseja que el tamaño de la imagen no sea muy grande porque podría demorarse en montar el mensaje.
Firm Address TEXTO,TAMAÑO,COLOR y TIPO DE LETRA para la dirección que aparece en la firma.
Firm Image Size Especifica el ancho y alto de la imagen de la firma. La estructura es: Value:“Ancho, Alto”.
Firm Zipcode TEXTO,TAMAÑO,COLOR y TIPO DE LETRA para el código postal que aparece en la firma.
Firm City TEXTO,TAMAÑO,COLOR y TIPO DE LETRA para la localidad que aparece en la firma.
Firm Phone TEXTO,TAMAÑO,COLOR y TIPO DE LETRA para el teléfono que aparece en la firma.
Firm Web Address TEXTO,TAMAÑO,COLOR y TIPO DE LETRA para la dirección web que aparece en la firma.
PARÁMETROS DE BASE DE DATOS
ROWID Field Name Nombre del campo ROWID en las tablas de la BD.
SQL Field Name Nombre del campo SQL en la tabla MASTER_REPLICA_QUEUE.
Date Format Formato de fecha de la BD.
MID Number MID que queremos usar si vamos a escribir algo en el QUEUE.
<add key="Xml Path" value="C:\monitor.xml" />
 
<add key="servername" value="XOne"/>
<add key="appname" value="Aplicacion"/>
<add key="interval" value="500"/>
 
<!-- CLAVES DE CORREO -->
<add key="smtpserver" value = "www.servidor.es"/>
<add key="displayUserName" value="XOneManager"/>
<add key="mailfrom" value="cuenta@servidor.es"/>
<add key="smtpuser" value ="cuentacorreo"/>
<add key="smtppwdr" value ="contraseña"/>
<add key="smtpport" value ="587"/>
<add key="smtpusessl" value="false"/>
 
<!-- CLAVES DE LOG -->
<add key="log" value="true" />
<add key="log file" value="false"/>
<add key="path log file" value="C:\Archivos de programa\XOne\Monitor\"/>
 
<!-- CLAVES DE FORMATO DE CORREO -->
<add key="Format Html" value="true"/>
 
<add key="Title Size" value="24"/>
<add key="Title Forecolor" value="#df2c28"/>
<add key="Title Font family" value="Calibri"/>
 
<add key="Text Size" value="14"/>
<add key="Text Forecolor" value="#000000"/>
<add key="Text Font family" value="Calibri"/>
 
<add key="Firm Name" value="Xonemonitor,14,#df2c28,Calibri" />
<add key="Firm Email" value="Xonemonitor@xone.es,14,#df2c28,Calibri"/>
<add key="Firm Image Path" value="C:\Archivos de programa\XOne\Monitor\image.jpg"/>
<add key="Firm Address" value="Direccion avenida sin nombre s/n.,14,#df2c28,Calibri"/>
<add key="Firm Zipcode" value=""/>
<add key="Firm City" value=""/>
<add key="Firm Phone" value="900123456,14,#000000,Calibri"/>
<add key="Firm Web Address" value="http://www.direccionweb.com,14,#df2c28,Calibri"/>
 
 
<!-- CLAVES DE LA BASE DE DATOS -->
<add key="ROWID Field Name" value="ROWID" />
<add key="SQL Field Name" value="CGSSQL" />
<add key="Date Format" value="yyyy/MM/dd" />
<add key="MID Number" value="9999" />
 
<!-- 
Cadena de conexión de la Base de Datos que vamos a monitorizar 
Esta es la conexión por defecto, si queremos especificar otra, le ponemos otro nombre 
y la podemos instanciar desde cualquier nodo checking con el atributo connection="NOMBRECONEXION"
-->
<add name="monitordb" connectionString="Persist Security Info=False;database=BASEDATOS;server=SERVIDOR;user id=USUARIO;Password=CLAVE" 
	providerName="MySql.Data.MySqlClient" />


Nuestro fichero XML contendrá un nodo <xml> y dentro de éste tendremos los distintos nodos ‘checking’ (Las acciones se ejecutan únicamente si se cumple la condición) o ‘maintenance’ que se ejecutan siempre según la cronología definida en el atributo cron-expression.

Dentro de un nodo checking o maintenance podemos usar los siguientes nodos:

sql Es el atributo donde se define la consulta SQL que queremos lanzar.
service Utilizado exclusivamente en los checking con type=“checkservice”
table Utilizado exclusivamente en los checking con type=“checktable”
errormessage Mensaje que queremos mostrar en el correo que se envíe
email Destinatario/s del correo.
actions Acciones a ejecutar en orden secuencial.
Todos los tipos de checking son case-sensitive en minúsculas.

Cada nodo checking, tiene el nombre de la comprobación (name), el tipo (type) y opcionalmente una conexión alternativa (La conexión es por si queremos usar una diferente a la que viene por defecto monitordb (En el archivo de configuración).
También opcionalmente se puede especificar una expresión cron para programar la comprobación.
Los nodos checking tienen la siguiente estructura:

<!-- ***********************************************************
    name:		Nombre que le queramos dar al checking.
    type:		Tipo de checking, para ver qué condición debe cumplirse.
    connection:		Opcional. "name" de la conexión a BD que queramos utilizar para el checking ("monitordb" por defecto),
    			esta conexión se define en el fichero de configuración.
    cron-expression: 	Opcional. Expresión cron para programar el checking con una cierta periodicidad diferente 
    			de la especificada en la clave "interval" del fichero de configuración.
 *********************************************************** -->
 
<checking name=" " type=" " connection=" " cron-expression=" ">
count Se lanza una consulta a la base de datos la cual se compone únicamente de un count de una tabla que queramos monitorear.
Si el valor devuelto por el count es mayor que el especificado en el atributo count del nodo sql se realiza la acción especificada.
groupby Se lanza una consulta para sacar datos de varios registros agrupados (ej. Agrupados por usuario).
Si el SQL especificado devuelve alguna fila entonces se ejecuta la acción especificada.
checktable Comprobar si hay registros en una tabla que no están en el master_replica_queue o master_replica_queue_history.
(Por defecto, esta opción inserta esos registros en el queue).
Adicionalmente se puede ejecutar una acción al encontrar registros.
checkservice Esta opción comprueba que un servicio está arrancado.
Si el servicio se encuentra parado podemos usar una de las acciones que se especifican debajo.
filejob Esta opción es para realizar un mantenimiento de ficheros. Solamente se realiza si la SQL devuelve algún valor. Versiones anteriores a la 4.0.5.0 utilizaban “filejop” en lugar de “filejob”
pdf Esta opción genera un fichero PDF. Solamente se realiza si la SQL devuelve algún valor.
<!-- 
	Se lanza una consulta a la base de datos la cual se compone únicamente de un COUNT de una tabla que queramos monitorizar. 
	Si el valor devuelto en la SQL es mayor que el especificado en el atributo count, se realiza la acción especificada.
-->
<checking name="Comprobar IQUEUE" type="count">
    <sql value="SELECT COUNT(ID) FROM master_replica_iqueue" count="20" />
    <errormessage subject="Error" body="Hay mas de 20 operaciones en el IQUEUE"  header="" />
    <email to="email@xone.es" CC="carboncopy@xone.es" BCC="blindcarboncopy@xone.es" />
    <actions>
        <action name="sendmail" />
    </actions>
</checking>
 
<!--
	Esta opción comprueba que un servicio está arrancado. 
	Si el servicio se encuentra parado podemos usar una de las acciones que se especifican debajo.
--> 
<checking name="Comprobar replicador" type="checkservice">
    <service value="CGSRepServer2" />
    <errormessage subject="Error" body="El replicador estaba parado y se ha arrancado."  header="" />
    <email to="email@xone.es" CC="carboncopy@xone.es" BCC="blindcarboncopy@xone.es" />
    <actions>
	<action name="startservice" value="CGSRepServer2" />
    </actions>
</checking>
 
<!--
	Comprobar si hay registros en una tabla que NO están en el master_replica_queue o master_replica_queue_history.
	(Por defecto, esta opción inserta esos registros en el queue). 
	Adicionalmente se puede ejecutar una acción al encontrar registros.
--> 
<checking name="Comprobar usuarios" type="checktable">
    <table value="gen_usuarios">
    <errormessage subject="Error" body="Se han reparado ##CHECKCOUNT## registros en gen_usuarios"  header="" />
    <email to="email@xone.es" CC="carboncopy@xone.es" BCC="blindcarboncopy@xone.es" />
    <actions>
	<action name="sendmail" />
    </actions>
</checking>
 
<checking name="Comprobar IQUEUE" type="count" cron-expression="0 1 9,12,16,18 ? * MON-FRI">
	<sql value="SELECT MID, COUNT(ID) as CUENTA FROM master_replica_iqueue where (GETDATE() - RCVTIMESTAMP) &gt; (10/(24*60)) GROUP BY MID HAVING COUNT(ID)&gt;40" count="1" groupby="MID" />
	<errormessage subject="IQUEUE" body="Hay ##ROW_CUENTA## operaciones del terminal ##ROW_MID## en la tabla IQUEUE. Puede existir un problema."  header="" />
	<email to="correo@electronico.es" cc="" bcc=""  execute-if-error="true"/>
	<actions>
		<action name="sendmail" />
	</actions>
</checking>
 
<checking name="Comprobar IQUEUE 2" type="count" cron-expression="0 2 9,10,11,12,13,14,15,16,17,18,19 ? * MON-FRI">
	<sql value="SELECT COUNT(ID) as CUENTA FROM master_replica_iqueue where (GETDATE() - RCVTIMESTAMP) &gt; (10/(24*60))" count="0" />
	<errormessage subject="IQUEUE" body="Hay ##ROW_CUENTA## operaciones en la tabla IQUEUE esperando más de 10 minutos"  header="" />
	<email to="xxxxxxxx" cc="" bcc=""  execute-if-error="true"/>
	<actions>
		<action name="sendmail" />
	</actions>
</checking>
 
 
<!--
	Se lanza una consulta para sacar datos de varios registros agrupados. 
	Si el SQL especificado devuelve alguna fila entonces se ejecuta la acción especificada. 
-->
<checking name="Comprobar tareas" type="groupby">
    <sql value="......." />
    <email to="##ROW_MAP_CORREO##" CC="carboncopy@xone.es" BCC="blindcarboncopy@xone.es" />
    <actions>
        <action name="sendmail" />
    </actions>
</checking>
 
 
<!-- EJEMPLO DE COMO ADJUNTAR FICHEROS DE FORMA DINAMICA A PARTIR DE UN SQL QUE SE LANZA EN LA BASE DE DATOS -->
<checking name="Enviar Adjuntos (dinamico)" type="groupby">
  <sql value="SELECT ID,CORREO,FICHEROS_ADJUNTOS,MESSAGE FROM GEN_ADJUNTOS WHERE ENVIADO = 0" groupby="ID" />
  <errormessage subject="##ROW_MESSAGE##"  body="Messaje : ##ROW_ID##"  header="Envio de adjuntos" />
  <email to="##ROW_CORREO##" cc="" bcc="">
    <!-- 
        <attach/> nodo para poder agregar ficheros al correo.
        files : indica un listado de ficheros que queremos que se adjunten al correo, se puede poner el fichero o el listado de ficheros directamente
        o sacarlos con la macro ##ROW_##.
        compress: (true|false), indica si queremos que los ficheros se compriman o no, NOTA: se comprimira todos los ficheros en uno solo, por defecto false.
      -->
    <attach files="##ROW_FICHEROS_ADJUNTOS##" compress="true" />
  </email>
  <actions>
    <action name="sendmail" >
      <after-action>
        <!-- se ejecuta si no hay errores -->
        <action name="executequery" value="UPDATE GEN_ADJUNTOS SET ENVIADO=5 WHERE ID=##ROW_ID##" />
        <!-- se ejecuta solo si hay algun error -->
        <action name="executequery" execute-if-error="true" value="UPDATE GEN_ADJUNTOS SET ENVIADO=3 WHERE ID=##ROW_ID##" />
      </after-action>
    </action>
  </actions>
</checking>
 
 
 
<!-- EJEMPLO DE COMO ADJUNTAR FICHEROS FIJOS -->
<checking name="Enviar Adjuntos (fijo)" type="groupby">
  <sql value="SELECT ID,CORREO,FICHEROS_ADJUNTOS,MESSAGE FROM GEN_ADJUNTOS WHERE ENVIADO = 0" groupby="ID" />
  <errormessage  subject="##ROW_MESSAGE##" body="Messaje : ##ROW_ID##" header="Envio de adjuntos" />
  <email to="##ROW_MAP_CORREO##" cc="" bcc="" >
    <attach files="D:\Descargas\combo-box-hi.png" compress="false" />
  </email>
  <actions>
    <action name="sendmail" >
      <after-action>
        <action name="executequery" value="UPDATE GEN_ADJUNTOS SET ENVIADO=5 WHERE ID=##ROW_ID##" />
        <action name="executequery" execute-if-error="true" value="UPDATE GEN_ADJUNTOS SET ENVIADO=3 WHERE ID=##ROW_ID##" />
      </after-action>
    </action>
  </actions>
</checking>
Valores posibles que se pueden poner en el Actions del envío del PUSH
pid default: mandatory
google-auth-key default: mandatory
device-type 0:androide/1:IOS (default: 0) optional
mute true/false (default:false ) (optional)
notification-title default: (optional)
notification-message default: (optional)
notifcation-type 0:start-replica/ 1: start-live/2: message (default: 2) (optional)
priority high/normal (default: normal) (optional)
proxy default: (optional)
proxy-credential default: (optional)
<checking name="SENDPUSH" type="groupby" connection="monitordb" >		  
	<sql value="SELECT ID,IMEI,PID,GOOGLEAUTHKEY,TITLE,MESSAGE,TYPE,PLATFORM,'true' AS MUTE FROM gen_send_push where PUSH=0 " groupby="ID" />
	<errormessage subject="Error Moviendo los ficheros" body=""  header="" />
	<email to="x@x.com" cc="" bcc="" />
	<actions>
	  <action name="send-push" 				
		pid="##ROW_PID##" 
		google-auth-key="##ROW_GOOGLEAUTHKEY##"
		device-type="##ROW_PLATFORM##"
		mute="##ROW_MUTE##"
		notification-title="##ROW_TITLE##"
		notification-message="##ROW_MESSAGE##"
		priority="high"
		notification-type="##ROW_TYPE##" >
 
			<after-action>
				<action name="executequery" value="INSERT INTO gen_send_push_log (IMEI,RESULT,PUSHDATE) VALUES ('##ROW_IMEI##','##RESULT##',sysdate())" />		
				<action name="executequery" value="UPDATE gen_send_push SET RESULT='##RESULT##',LAST_SEND_PUSH=sysdate() WHERE ID=##ROW_ID##" />				
			</after-action>
		</action>
	</actions>
</checking>	

Podemos definir acciones a ejecutar en caso de que se cumplan las condiciones en los nodos checking o para los nodos maintenance que no son condicionales y se ejecutan cuando lo indique el cron-expression que tienen definido.

Todas las acciones son case-sensitive en minúsculas y pueden ser escritas también con guión medio, p.ej: send-mail, execute-query, etc...
sendmail Se lanza una consulta a la base de datos la cual se compone únicamente de un count de una tabla que queramos monitorear.
Si el valor devuelto por el count es mayor que el especificado en el atributo count del nodo sql se realiza la acción especificada.
executequery Se lanza una consulta para sacar datos de varios registros agrupados (ej. Agrupados por usuario).
Si el SQL especificado devuelve alguna fila entonces se ejecuta la acción especificada.
startservice Comprobar si hay registros en una tabla que no están en el master_replica_queue o master_replica_queue_history.
(Por defecto, esta opción inserta esos registros en el queue).
Adicionalmente se puede ejecutar una acción al encontrar registros.
stopservice Esta opción comprueba que un servicio está arrancado.
Si el servicio se encuentra parado podemos usar una de las acciones que se especifican debajo.
restartservice Esta opción es para realizar un mantenimiento de ficheros. Solamente se realiza si la SQL devuelve algún valor. Versiones anteriores a la 4.0.5.0 utilizaban “filejop” en lugar de “filejob”
savetofile Experimental.
deletefile Experimental.
copyfile Esta opción copia un fichero.
movefile Esta opción cambia de lugar un fichero. Ver ejemplo más abajo.
movedirectory Experimental.
createfolder Experimental.
compressfiles Experimental.
cleanupdates Específica para borrar actualizaciones del repositorio. Ver ejemplo más abajo.


Por defecto, si el action anterior ha fallado, no sigue ejecutando las siguientes. En caso de querer ejecutar siempre las acciones, aunque el action anterior haya fallado, hemos de especificar el atributo execute-always=true (por defecto es false).

	<action name="sendmail" /> 	<!-- Utilizado junto con el nodo email -->
 
	<action name="executequery" value="DELETE FROM MASTER_REPLICA_SQUEUE WHERE SENT=1" />
	<action name="executequery" execute-always="true" value="ALTER INDEX IX_T1_RL REBUILD" />  <!-- Aunque falle el anterior, se ejecuta -->
 
	<action name="startservice" value="XOneRepServer" />
	<action name="stopservice" value="XOneRepServer" />
	<action name="restartservice" value="Xone Replicator Client Advanced" />
 
	<action name="move-file" from="##ROW_MAP_FILENAMEFROM##" to="##ROW_MAP_FILENAMETO##" 
		sql="UPDATE GEN_FOTOSTAREA SET MOVEFILE=1 WHERE ID='##ROW_MAP_ID##'"/>
 
 
<!--
	Acción para eliminar las actualizaciones que se van poniendo a los dispositivos, una vez que se han descargado y confirmado.
	PARAMETROS:
 
	path: 			Ruta hasta la licencia dentro de la carpeta del repositorio.
	version-folder: 	Nombre de la carpeta donde se ponen las actualizaciones del XOneManager.
	licenses-folder: 	Nombre de la carpeta donde se ponen las actualizaciones que se descargan los dispositivos (gzip).
	last-version-file:	Nombre del fichero que contiene las actualizaciones que se van confirmando.
	clean-version-folder:	****** Para eliminar las carpetas de las licencias que ya se hayan confirmado. ********
-->
	<action name="cleanupdates" path="C:\XOneRepository\Updates\10000168" version-folder="Actualizaciones" licenses-folder="Licencias" 
		last-version-file="lastversion" clean-version-folder="true" />

Envia un email con los datos del nodo email y errormessage.

<action name="sendmail" />


Dentro de Sendmail se ha implementado un subnodo “after-action” (A partir de la versión 3.0.4.9), para realizar alguna acción tras enviar el correo.

<action name="sendmail" >
	<after-action>
		<action name="executequery" value="UPDATE GEN_ADJUNTOS SET ENVIADO=5 WHERE ID=##ROW_ID##" />
		<action name="executequery" execute-if-error="true" value="UPDATE GEN_ADJUNTOS SET ENVIADO=3 WHERE ID=##ROW_ID##" />
	</after-action>
</action>

Arranca el servicio especificado en el atributo value.

  • El valor que debemos especificar en el atributo value es el nombre del servicio (Service Name), no el nombre que aparece en la ventana de servicios (Display Name). Si vamos a la consola de servicios, hacemos clic derecho sobre uno y vamos a la opción de propiedades sería el primero que aparece.
<action name="startservice" value="CGSRepServer2" />

Detiene el servicio especificado en el atributo value.

  • El valor que debemos especificar en el atributo value es el nombre del servicio (Service Name), no el nombre que aparece en la ventana de servicios (Display Name). Si vamos a la consola de servicios, hacemos clic derecho sobre uno y vamos a la opción de propiedades sería el primero que aparece.
<action name="stopservice" value="CGSRepServer2" />

Reinicia el servicio especificado en el atributo value.

  • El valor que debemos especificar en el atributo value es el nombre del servicio (Service Name), no el nombre que aparece en la ventana de servicios (Display Name). Si vamos a la consola de servicios, hacemos clic derecho sobre uno y vamos a la opción de propiedades, sería el primero que aparece.
<action name="restartservice" value="CGSRepServer2" />

Guarda la estructura del nodo errormessage en un fichero.

  • En el atributo value se le especifica la ruta completa al fichero que queremos crear (nombre de fichero incluído). Además existe un atributo append, por defecto es true de modo que añade al final del fichero, si lo ponemos a false crearía un fichero nuevo en cada ejecución.
<action name="savetofile" value="c:\generated_file.txt" append="false" />

Mueve un fichero de ubicación.

  • En el atributo from se especifica la ruta completa al fichero que queremos mover (nombre de fichero incluído) y en el atributo to igual pero para el destino. Además existe un atributo sql para ejecutar una SQL cuando tenga lugar la acción.


<actions>	
	<action name="move-file" from="##ROW_MAP_FILENAMEFROM##" to="##ROW_MAP_FILENAMETO##" sql="UPDATE GEN_FOTOSTAREA SET MOVEFILE=1 WHERE ID='##ROW_MAP_ID##'"/>
</actions>

Ejemplo:

<!-- MOVER FICHEROS DE UNA CARPETA A OTRA -->
 
<checking name="MoverFicheros" type="FileJob" connection="monitordb" >
    <sql value="SELECT * FROM (SELECT FD.FOTO AS FILE,concat(RE.CODREMESA,'_',RE.ANNO) AS DIRECTORY,RE.REMESADO,RE.ID FROM gen_remesa RE
              LEFT OUTER JOIN gen_detremesa DT ON DT.CODREMESA = RE.CODREMESA
              LEFT OUTER JOIN gen_denuncia DE ON DE.CODUSUARIO = DT.NUMDENUNCIA
              LEFT OUTER JOIN gen_fotosdenuncia FD ON FD.NUMDENUNCIA = DE.NUMDENUNCIA
              WHERE FD.FOTO IS NOT NULL
              UNION
              SELECT FDNF.FOTO AS FILE,concat(RE.CODREMESA,'_',RE.ANNO) AS DIRECTORY,RE.REMESADO,RE.ID FROM BD.gen_remesa RE
              LEFT OUTER JOIN gen_detremesa DT ON DT.CODREMESA = RE.CODREMESA
              LEFT OUTER JOIN gen_denuncia DE ON DE.CODUSUARIO = DT.NUMDENUNCIA
              LEFT OUTER JOIN gen_fotosdenuncianofile FDNF ON FDNF.NUMDENUNCIA = DE.NUMDENUNCIA
              WHERE FDNF.FOTO IS NOT NULL
              UNION
              SELECT FID.FIRMA AS FILE,concat(RE.CODREMESA,'_',RE.ANNO) AS DIRECTORY,RE.REMESADO,RE.ID FROM BDS.gen_remesa RE
              LEFT OUTER JOIN gen_detremesa DT ON DT.CODREMESA = RE.CODREMESA
              LEFT OUTER JOIN gen_denuncia DE ON DE.CODUSUARIO = DT.NUMDENUNCIA
              LEFT OUTER JOIN gen_firmasdenuncia FID ON FID.NUMDENUNCIA = DE.NUMDENUNCIA 
              WHERE FID.FIRMA IS NOT NULL) T WHERE (T.REMESADO IS NULL OR T.REMESADO=0)" />
    <errormessage subject="Error Moviendo los ficheros" body=""  header="" />
    <email to="" cc="" bcc="" />
    <actions>
      <action name="movefile" from="D:\RepFiles\##ROW_FILE##" to="D:\RepFiles\##ROW_DIRECTORY##\Foto\##ROW_FILE##" />
      <action name="executequery" execute-if-error="false" value="UPDATE gen_remesa SET REMESADO=1 WHERE ID=##ROW_ID##" />
    </actions>
  </checking>


MACROS DESCRIPCIÓN
##NL## Salto de Línea
##TAB## Tabulación
##SRVNAME## Nombre del Server
##APPNAME## Nombre de la aplicación
##SQL## SQL que se ha lanzado
##CHECKCOUNT## Contador de rows que se han arreglado (Para usar con checktable)
##ROW_NOMBRECAMPOQUESEA## Sacamos el valor del campo devuelto por el SQL


Diferentes Nodos que tenemos disponibles dentro del Nodo CHECKING:

Nodos del Nodo Checking
SQL
ERRORMESSAGE
EMAIL
SERVICE - Sólo para los checking de tipo checkservice
TABLE - Sólo para los checking de tipo checktable
PDF

Tiene el sql que queremos lanzar (value) y dos atributos más.
Dentro de éste nodo tenemos un atributo COUNT que indica el número que se debe superar para realizar alguna acción, y GROUPBY indica el campo o campos (separados por comas) por el cual debemos agrupar la consulta.

  <sql value=" " count="" groupby="" />

Contiene el asunto del email (subject), un cuerpo de mensaje (body) y una cabecera que será lo primero que se muestre (header).
En el caso de una comprobación tipo groupby, la cabecera se mostrará una vez, y el cuerpo se repetirá por cada uno de los registros agrupados. Todas y cada una de las macros que se han indicado anteriormente, se pueden utilizar en los atributos de este nodo.

  <errormessage subject="" body=" "  header="" />

Ejemplo de Uso, en el que se mandan tantos correos como usuarios se agrupan, poniendo en cada correo todas y cada una de las tareas pendientes que tiene asociada. El asunto se pone en el campo subject, cabecera en el campo header y cuerpo en el body:

<checking name="Tareas Pendientes" type="groupby" cron-expression="0 0 8 ? * MON,FRI">
    <sql value="SELECT (SELECT COUNT(dt1.ID) FROM GEN_DetTarea dt1,gen_usuarios u1,gen_tareas t1 WHERE
			u1.ID=dt1.IDUSUARIO and dt1.IDUSUARIO=u.ID and dt1.IDTAREA=t1.ID and (u1.BAJA=0 AND u1.EMAIL IS NOT NULL) 
			and ((dt1.OPCIONES &amp; POWER(2,0))/POWER(2,0)) = 0
			and ((t1.OPCIONES &amp; POWER(2,0))/POWER(2,0)) = 0) as MAP_TOTALTAREAS,
    		u.LOGIN AS MAP_LOGIN,dt.*,dt.DESCRIPCION AS MAP_DESCRIPCION,
			t.IDEMPRESA AS MAP_IDEMPRESA,t.DESCRIPCION AS MAP_PROYECTO,t.IDCLIENTE AS MAP_IDCLIENTE,
			u2.LOGIN AS MAP_CREADOR,
			t2.SIMBOLO AS MAP_ESTADO,
			t3.ETIQUETA AS MAP_TIPOTAREA,t3.DESCRIPCION AS MAP_TIPOTAREADES,
			c.OPCIONES AS MAP_OPCIONES,
      		d.NUMCOMPLETO AS MAP_PRESUPUESTO,
      		u.EMAIL AS MAP_CORREO,
      		dt.IDUSUARIO AS MAP_USUARIO
			FROM (((((((GEN_DetTarea dt 
			LEFT OUTER JOIN gen_Tareas t ON dt.IDTAREA=t.ID)
			LEFT OUTER JOIN gen_Clientes c ON t.IDCLIENTE=c.ID)
			LEFT OUTER JOIN gen_Usuarios u2 ON dt.IDASIGNA=u2.ID)
			LEFT OUTER JOIN gen_Usuarios u ON dt.IDUSUARIO=u.ID)
			LEFT OUTER JOIN gen_Estados t2 ON dt.IDESTADO=t2.ID)
			LEFT OUTER JOIN gen_Documentos d ON dt.IDDOCUMENTO=d.ID)
			LEFT OUTER JOIN gen_tiposervicio t3 ON dt.IDTIPOTAREA=t3.ID)   
			WHERE (u.BAJA=0 AND u.EMAIL IS NOT NULL) 
			and ((t.OPCIONES &amp; POWER(2,0))/POWER(2,0)) = 0 AND
			((dt.OPCIONES &amp; POWER(2,0))/POWER(2,0)) = 0  ORDER BY t.DESCRIPCION,dt.FECHA" groupby="MAP_USUARIO" />
    <errormessage subject="Tareas Pendientes de '##APPNAME##'" 
     body="##NL##PROYECTO: '##ROW_MAP_PROYECTO##'##NL##FECHA INICIO: '##ROW_FECHA##'##NL##FECHA MAXIMA: '##ROW_FECHAINICIO##'##NL##DESCRIPCION: '##ROW_DESCRIPCION##'##NL##----------------------------##NL##" 
     header="Tareas Pendientes de: '##ROW_MAP_LOGIN##'.##NL##*Servidor:##SRVNAME####NL##*Aplicacion: ##APPNAME##.##NL##*Tareas Pendientes: ##ROW_MAP_TOTALTAREAS####NL##----------------------------##NL##----------------------------##NL##" />
    <email to="##ROW_MAP_CORREO##" cc="pepitogrillo@xone.es" />    
    <actions>
      <action name="sendmail" />
    </actions>
  </checking>

Contiene el destinatario del correo electrónico (to), los correos que queramos añadir en copia (CC – Carbon Copy) y los que queramos poner como copia oculta (BCC – Blind Carbon Copy)
Las direcciones de correo se especifican separadas por punto y coma. Además, se puede usar una sentencia SQL para rescatar direcciones de correo desde la base de datos, la cual debe ir encerrada entre paréntesis y no puede contener punto y coma dentro de ellos. A continuación, se muestran un par de ejemplos.

  <email to=" " CC=" " BCC=" " />
  <email to="correo@nada.es" CC=" " BCC=" " />
  <email to="correo@nada.es;correo2@nada.es;correo@nada.es" CC=" " BCC=" " />
  <email to="(SELECT email FROM gen_correos)" CC=" " BCC=" " />
  <email to="(SELECT email FROM gen_correos);correo@nada.es;correo2@nada.es" CC=" " BCC=" " />


Subnodo attach

Dentro del nodo “email”, existe un subnodo “attach” (A partir de la versión 3.0.4.9), para poder adjuntar ficheros en el correo que se envíe.

Atributo Descripción
files Listado de ficheros que queremos que se adjunten al correo separados por “;”. Se puede poner el fichero ficheros separados por punto y coma o sacarlos de la select que hagamos, utilizando la macro ##ROW_CAMPOQUESEA##
compress true/false Indica si queremos que los ficheros se compriman o no en ZIP, NOTA: se comprimirán todos los ficheros en uno solo, por defecto false.
  <email to="##ROW_MAP_CORREO##" cc="" bcc="" >
	<attach files="D:\Descargas\combo-box-hi.png" compress="false" />
  </email>
    <email to="##ROW_CORREO##" cc="" bcc="">
      <attach files="##ROW_FICHEROS_ADJUNTOS##" compress="true" />
    </email>

Contiene el nombre del servicio que vamos a comprobar (value). El nombre requerido es el nombre del servicio instalado, no el nombre para mostrar. (Esta opción solo se usa con el tipo checkservice)

<service value=" " />

Nos permite especificar la tabla que queremos comprobar (value), usado con el tipo checktable.

<table value="gen_usuarios">



Para crear una acción de tipo PDF, se debe crear un 'checking' de type=“pdf” y contener además de los nodos habituales (sql, email, actions…). Uno específico para generar el PDF, el nodo 'pdf' que contendrá toda la configuración necesaria para crear y mandar los ficheros generados.
Todos los atributos del nodo 'pdf' pueden contener valores fijos o capturados en el sql mediante macros.

Las macros permitidas son:

MACROS PERMITIDAS
##ROW_XXXX## Esta macro va cogiendo el valor del campo XXXX que rescatamos en la SQL.
##NOW## Esta macro es sustituida por la fecha/hora actual (dd-MM-yyyy_HH-mm-ss).
##DATE## Esta macro es sustituida por la fecha actual (dd-MM-yyyy).



Conviene indicar que si el nombre del fichero PDF se autogenera con la única diferenciación entre unos y otros de la fecha, conviene usar la macro ##NOW## ya que:

##DATE## simplemente daría ficheros idénticos durante el mismo día.
##NAMEPDF## Nombre del fichero (sin ruta) del PDF generado. Se puede usar para generar un link de descarga.
##SIZEPDF## Indica el peso en Kbs del fichero generado.


Asimismo se permiten el resto de macros usadas en otras acciones (##APPNAME##, ##SRVNAME##…)

Atributos del Nodo Pdf


En este caso el monitor se encarga de montar el PDF, basado en imágenes, 1 ó 2 por página.

Las imágenes para que todos los márgenes aparezcan perfectos serán:

Para que salga 1 por pagina, de 538x765px
Para que salgan 2 por pagina, 538x382px


Ver ejemplo de checking pdf más abajo.

pathpdf Obligatorio. Indica la ruta donde se generaran los ficheros PDF. P.ej: “C:\inetpub\wwwroot\clientes”
pathpages Obligatorio. Indica la ruta donde están las imágenes que formarán las páginas del PDF. P.ej: “C:\inetpub\wwwroot\catalogo\files\”
pages Obligatorio. Indica el nombre de la imagen a insertar en el PDF. Normalmente será un campo del sql y será leído de cada registro del sql, debe llevar su extensión (.jpg, .png,…). P.Ej: “pagina1.jpg”
namepdf Obligatorio. Nombre del pdf a generar. Normalmente será un campo del sql o una conjunción de macros. El nombre de fichero debe ser único, NO hay que poner la extensión .pdf.
sql Obligatorio. Es un sql que se lanza tras leer cada registro. Su utilidad es lanzar un UPDATE o un DELETE(no se aconseja) a un determinado ID, ROWID
mailto Obligatorio. Destinatario del pdf.
mailcc Opcional. Copia de mail con el pdf.
mailbcc Opcional. Copia oculta de mail con el pdf.
mailsubject Opcional. Título del mail.
mailbody Opcional. Cuerpo del mail.
orientation Opcional. Indica la orientación del pdf (vertical/horizontal). Por defecto, vertical.
text Opcional. Permite poner un texto debajo de la imagen.
attachpdf Opcional. Permite indicar si se envía o no el PDF al correo como adjunto (true/false). Por defecto, true.
attachsize Opcional. Permite indicar el tamaño en Bytes máximo para enviar un fichero como adjunto. Valor numérico. Si se indica este valor, solo se enviará el PDF adjunto si attachpdf=true y el fichero ocupa menos de lo que se indica en este valor.
<!-- 
	Los checking con type COUNT, CHECKSERVICE, CHECKTABLE y GROUPBY son condicionales
 
	COUNT: 		Se ejecuta si el número devuelto es mayor que el especificado en el atributo count
	CHECKSERVICE:	Se ejecuta si el servicio estuviera detenido.
	CHECKTABLE:	Se ejecuta si la tabla *******
	GROUPBY: 	Se ejecuta y se realiza tantas veces como registros se devuelvan en la consulta.
 
	Si se desea hacer algún mantenimiento que no sea condicional, en lugar de CHECKING, utilizar el nodo MAINTENANCE.
-->
 
<!--	***********************************************************************************
		ALERTA DE MAS DE 10 OPERACIONES EN IQUEUE para un MID
		- Configurar numero de operaciones maximas para lanzar alerta
	***********************************************************************************	-->
<checking name="Comprobar IQUEUE" type="groupby" cron-expression="">
	<sql value="SELECT MID FROM master_replica_iqueue WHERE MID&gt;0 GROUP BY MID HAVING COUNT(ID)&gt;10" groupby="MID" />
	<errormessage subject="XOneMonitor IQUEUE" body="XOneMOnitor XONE" header="Hay mas de 10 operaciones en el IQUEUE para un MID" />
	<email to="quiensea@correo.es" cc="" bcc="" execute-if-error="true"/>
	<actions>
		<action name="sendmail" />
		<action name="savetofile" value="X:\Logs\XOneMonitor\XOneMonitor_iqueue.txt" append="true" />
	</actions>
</checking>
 
<checking name="Comprobar replicador" type="checkservice">
    <service value="CGSRepServer2" />
    <errormessage subject="Error" body="El replicador estaba parado y se ha arrancado."  header="" />
    <email to="aquiencorresponda@elcorreo.es" CC="carboncopy@xone.es" BCC="blindcarboncopy@xone.es" />
    <actions>
        <action name="sendmail" />
        <action name="startservice" value="CGSRepServer2" />
    </actions>
</checking>
 
<checking name="Comprobar usuarios" type="checktable">
    <table value="gen_usuarios">
    <errormessage subject="Error" body="Se han reparado ##CHECKCOUNT## registros en gen_usuarios"  header="" />
    <email to="aquiencorresponda@elcorreo.es" CC="carboncopy@xone.es" BCC="blindcarboncopy@xone.es" />
    <actions>
        <action name="sendmail" />
    </actions>
</checking>
 
<checking name="Comprobar tareas" type="groupby">
    <sql value="SELECT u.LOGIN AS MAP_LOGIN,dt.*,dt.DESCRIPCION AS MAP_DESCRIPCION,
    u.EMAIL AS MAP_CORREO,
    dt.IDUSUARIO AS MAP_USUARIO
    FROM (gen_DetTarea dt 
    LEFT OUTER JOIN gen_Tareas t ON dt.IDTAREA=t.ID)
    WHERE t.TERMINADO=0 ORDER BY t.DESCRIPCION,dt.FECHA" groupby="MAP_USUARIO" />	
    <errormessage 	subject="Tareas Pendientes de '##APPNAME##' para '##ROW_MAP_LOGIN##'"
    body="PROYECTO: '##ROW_MAP_PROYECTO##'##NL##FECHA INICIO: '##ROW_FECHA##'##NL##FECHA MAXIMA: '##ROW_FECHAINICIO##'##NL##DESCRIPCION: '##ROW_DESCRIPCION##'##NL##----------------------------##NL##"
    header="Tareas Pendientes.##NL##*Servidor:##SRVNAME####NL##*Aplicacion: ##APPNAME####NL##----------------------------##NL##----------------------------##NL##" />
    <email to="##ROW_MAP_CORREO##" CC="carboncopy@xone.es" BCC="blindcarboncopy@xone.es" />
    <actions>
        <action name="sendmail" />
    </actions>
</checking>
 
<checking name="CopiarFichero" type="filejob" cron-expression="0 0 1 ? * *" >
	<sql value="SELECT ID AS MAP_ID,TAREAID AS MAP_TAREAID,'E:/ReplicaFiles/' || FOTO AS MAP_FILENAMEFROM,
	'E:/XoneUpdates/ReplicaFicheros/filesOLD/' || FOTO AS MAP_FILENAMETO FROM GEN_FOTOSTAREA 
	WHERE RESULTCODE=0 AND NINTENTOS&lt;=6 AND MOVEFILE=0 and to_date(fechar,'DD/MM/YY')&gt;to_date('4/12/13','DD/MM/YY')
	AND FOTO NOT LIKE '%_NOPRESENTA%'" />
		<errormessage subject="se han copiado los archivos." body=""  header="" />
		<email to="aquiensea@correo.es" cc="" bcc="" />
		<actions>	
			<action name="move-file" from="##ROW_MAP_FILENAMEFROM##" to="##ROW_MAP_FILENAMETO##" sql="UPDATE GEN_FOTOSTAREA SET MOVEFILE=1 WHERE ID='##ROW_MAP_ID##'"/>
	</actions>
</checking>
 
<!--	***********************************************************************************
	   MANTENIMIENTO PARA LIMPIAR ACTUALIZACIONES DESCARGADAS
	   - Sustituir rutas de Updates y numeros de licencia
	***********************************************************************************  -->
<maintenance name="Maintenance_Actualizaciones" cron-expression="0 05 3 * * ?">
	<errormessage subject="XOneMonitor XONE. Mantenimiento Actualizaciones" body="Se ha ejecutado correctamente el mantenimiento de limpieza de Actualizaciones descargadas de XONE" header="XOneMonitor XONE" />
	<email to="usuario@sucorreo.es" cc="" bcc="" execute-if-error="true"/>
	<actions>
		<action name="cleanupdates" path="X:\XOneRepository\########" version-folder="Actualizaciones" licenses-folder="Licencias" last-version-file="lastversion" clean-version-folder="true" />
		<action name="savetofile" value="X:\Logs\XOneMonitor\XOneMonitor_Maintenance_Fich.txt" append="true" />
		<action name="sendmail"  />
	</actions>
</maintenance>	
 
 
<!-- MANTENIMIENTO PARA BORRAR ACTUALIZACIONES DESCARGADAS POR LOS DISPOSITIVOS, CON UN CIERTO TIEMPO. SE PUEDEN PONER TANTAS LICENCIAS COMO TENGAMOS. -->
<maintenance name="BORRADO_DATOS"  cron-expression="0 5 5 ? * MON-SUN">
    <errormessage subject="BORRADO DE DATOS" body="borrando datos" header="Borrando datos" />
    <actions>
		<!--
        name: indica el nombre de la accion a ejecutar.
        path: india la carpeta de las actualizaciones de la licencia X.
        version-folder: indica el nombre de la carpeta donde se guardan las actualizaciones.
        licenses-folder: indica el nombre de la carpeta donde se guardan lo gzip que se descarga cada licencia.
        clean-version-folder: borra las carpeta generadas dentro de la carpeta licencias/xxxx/...
        delete-time: indica el tiempo que queremos mantener una actualizacion, es decir desde que se creo cuanto tiempo queremos dejar sin borrar.
			- posibles valores del delete-time (el último valor se debe indicar una de las siguientes letras. ):
              _D: se borrara el fichero si desde su fecha de creacion han pasado x dias.
              _W: se borrara el fichero si desde su fecha de creacion han pasado x semanas.
              _M: se borrara el fichero si desde su fecha de creacion han pasado x Meses.
              _Y: se borrara el fichero si desde su fecha de creacion han pasado x años.
              Ejemplo delete-time="5D" , permanecera sin borrarse 5 dias.
          -->
      <action name="cleanupdates" exclude-files="updates.xml" delete-time="1M" path="C:\XOneRepository\Updates\00000227" version-folder="Actualizaciones" licenses-folder="Licencias" last-version-file="lastversion" clean-version-folder="true" />
      <action name="cleanupdates" exclude-files="updates.xml" delete-time="1M" path="C:\XOneRepository\Updates\00000257" version-folder="Actualizaciones" licenses-folder="Licencias" last-version-file="lastversion" clean-version-folder="true" />
    </actions>
  </maintenance>
 
 
<!--	***********************************************************************************
	*** ORACLE ***  
	Este nodo MAINTENANCE, NO es condicional y simplemente se ejecuta cuando lo diga el cron-expression.
	En éste caso, el cron está puesto para que haga todos los días a las 3 am.
	***********************************************************************************  -->
 
<maintenance name="Maintenance" cron-expression="0 0 3 * * ?">
	<errormessage subject="Mantenimiento" body="" header="" />
	<email to="quiensea@correo.es" cc="" bcc="" />
	<actions>
		<action name="stopservice" value="XOneITFBajada" />
		<action name="stopservice" value="XOneITFSubida" />>
		<action name="stopservice" value="XOneProvisioning" />
		<action name="stopservice" value="XOneRepServer" />
		<action name="executequery" value="DELETE FROM adm_xonelive_logs WHERE TIMESTAMP&lt;=TO_CHAR(sysdate - 15,'dd/mm/yyyy hh24:mi:ss')" />
	<action name="executequery" value="DELETE FROM adm_xonelive_errorlog WHERE TIMESTAMP&lt;=TO_CHAR(sysdate - 15,'dd/mm/yyyy hh24:mi:ss')" />
	<action name="executequery" value="DELETE FROM adm_provisioning_task WHERE STATUS=2 AND started&lt;=TO_CHAR(sysdate - 15,'dd/mm/yyyy hh24:mi:ss')" />
	<action name="executequery" value="DELETE FROM adm_provisioning_logs WHERE logcreated&lt;=TO_CHAR(sysdate - 15,'dd/mm/yyyy hh24:mi:ss')" />
	<action name="executequery" value="DELETE FROM MASTER_REPLICA_QUEUE_HISTORY WHERE TIMESTAMP&lt;=TO_CHAR(sysdate - 60,'dd/mm/yyyy hh24:mi:ss')" />
	<action name="executequery" value="INSERT INTO MASTER_REPLICA_QUEUE_HISTORY (CGSROWID,OPERID,TIMESTAMP,OPER,MID,SQL,DMID,IDORIGINAL,TBL) SELECT CGSROWID,OPERID,TIMESTAMP,OPER,MID,SQL,DMID,ID,TBL FROM MASTER_REPLICA_QUEUE WHERE  DMID IS NULL AND id NOT IN (SELECT QID FROM MASTER_REPLICA_SQUEUE) AND ID&lt;(SELECT MIN(LASTCID) FROM MASTER_REPLICA_SLAVE WHERE CONDITIONAL=1 AND PENDIENTE=0)" />
	<action name="executequery" value="DELETE FROM MASTER_REPLICA_QUEUE WHERE DMID IS NULL AND id NOT IN (SELECT QID FROM MASTER_REPLICA_sQUEUE) AND ID&lt;(SELECT MIN(LASTCID) FROM MASTER_rEPLICA_SLAVE WHERE CONDITIONAL=1 AND PENDIENTE=0)" />
	<action name="executequery" value="DELETE FROM MASTER_REPLICA_SQUEUE WHERE MID IN (SELECT S.MID FROM MASTER_REPLICA_SLAVE S WHERE S.PENDIENTE=1)" />
	<action name="executequery" value="DELETE FROM MASTER_REPLICA_SQUEUE WHERE SENT=1" />
	<!--mantenimientos de las tablas -->
	<action name="executequery" value="DELETE from gen_tareas where CGSROWID NOT IN (SELECT CGSROWID FROM MASTER_REPLICA_QUEUE) AND (estado&gt;=5 or estado&lt;0) and fechaverif&lt;=TO_CHAR(sysdate - 60,'dd/mm/yy')" />
	<action name="executequery" value="DELETE from gen_tareasd1 WHERE TAREAID NOT IN (SELECT TAREAID from gen_tareas) AND CGSROWID NOT IN (SELECT CGSROWID FROM MASTER_REPLICA_QUEUE)" />
 
	<action name="cleanupdates" path="C:\XOneRepository\Updates\10000168" version-folder="Actualizaciones" licenses-folder="Licencias" last-version-file="lastversion" clean-version-folder="true" />
	</actions>
</maintenance>
 
<maintenance name="Maintenance3" cron-expression="0 30 3 * * ?">
	<errormessage subject="Mantenimiento INDICES" body="Indices reconstruidos con exito." header="" />
	<email to="aquiensea@correo.es" cc="" bcc="" />
	<actions>
		<action name="executequery" execute-always="true" value="ALTER INDEX IX_GEN_TAREAS_TAREAID REBUILD" />
		<action name="executequery" execute-always="true" value="ALTER INDEX IX_GEN_TAREAS_ROWID REBUILD" />
		<action name="executequery" execute-always="true" value="ALTER INDEX IX_GEN_DANOS_TAREAID REBUILD" />
		<action name="sendmail" />	
	</actions>
</maintenance>
 
<!--	***********************************************************************************
	**** SQL SERVER ***
	   MANTENIMIENTO PARA LIMPIAR TABLAS MASTER_REPLICA
	   - Borrado de tabla master_replica_errorlog
	   - Limpieza de operaciones en master_replica_queue ya descargadas por todos los terminales
	   - Borrado de operaciones en master_replica_squeue de terminales desactivados y terminales que aun no han descargado la instalacion inicial.
	- Desactivacion de terminales con mas de 60 dias sin comunicar.
	***********************************************************************************	-->		
<maintenance name="Mantenimiento_master_replica_" cron-expression="0 05 1 * * ?">
	<errormessage subject="XOneMonitor XONE. Mantenimiento tablas master_replica_..." body="Se ha ejecutado correctamente el mantenimiento de las tablas master_replica_... de XONE" header="XOneMonitor XONE" />
	<email to="aquiencorresponda@elcorreo.es" cc="" bcc="" execute-if-error="true"/>
 	<actions>
		<action name="executequery" value="delete from master_replica_errorlog;" />			
		<action name="executequery" value="DELETE FROM MASTER_REPLICA_QUEUE WHERE ID&lt;(SELECT MIN(LASTID) FROM master_replica_slave WHERE PENDIENTE=0 AND SINCRONISMO IS NOT NULL);"/>			
		<action name="executequery" value="DELETE FROM master_replica_squeue WHERE QID NOT IN (SELECT ID FROM master_replica_queue) OR MID IN (SELECT MID FROM master_replica_slave WHERE PENDIENTE=1 OR SINCRONISMO IS NULL);"/>
		<action name="executequery" value="UPDATE MASTER_REPLICA_SLAVE SET PENDIENTE=1 WHERE DATEDIFF(CURDATE(),CONCAT(CONCAT(CONCAT(CONCAT(SUBSTR(SINCRONISMO,7,4),'-'),SUBSTR(SINCRONISMO,4,2)),'-'),SUBSTR(SINCRONISMO,1,2))) &gt;60;"/>
		<action name="savetofile" value="X:\Logs\XOneMonitor\XOneMonitor_Maintenance_queue.txt" append="true" />				
		<action name="sendmail"  />
	</actions>
</maintenance>	
 
<!--	***********************************************************************************
	*** MYSQL ***
	   MANTENIMIENTO PARA LIMPIAR TABLAS MASTER_REPLICA
	   - Borrado de tabla master_replica_errorlog
	   - Limpieza de operaciones en master_replica_queue ya descargadas por todos los terminales
	   - Borrado de operaciones en master_replica_squeue de terminales desactivados y terminales que aun no han descargado la instalacion inicial
	- Desactivacion de terminales con mas de 60 dias sin comunicar
	***********************************************************************************  -->		
<maintenance name="Mantenimiento_master_replica_" cron-expression="0 05 1 * * ?">
	<errormessage subject="XOneMonitor XONE. Mantenimiento tablas master_replica_..." body="Se ha ejecutado correctamente el mantenimiento de las tablas master_replica_... de XONE" header="XOneMonitor XONE" />
	<email to="aquiencorresponda@elcorreo.es" cc="" bcc="" execute-if-error="true"/>
 	<actions>
		<action name="executequery" value="delete from master_replica_errorlog;" />			
		<action name="executequery" value="DELETE FROM MASTER_REPLICA_QUEUE WHERE ID&lt;(SELECT MIN(LASTID) FROM master_replica_slave WHERE PENDIENTE=0 AND SINCRONISMO IS NOT NULL);"/>			
			<action name="executequery" value="DELETE FROM master_replica_squeue WHERE QID NOT IN (SELECT ID FROM master_replica_queue) OR MID IN (SELECT MID FROM master_replica_slave WHERE PENDIENTE=1 OR SINCRONISMO IS NULL);"/>
		<action name="executequery" value="UPDATE MASTER_REPLICA_SLAVE SET PENDIENTE=1 WHERE DATEDIFF(CURDATE(),CONCAT(CONCAT(CONCAT(CONCAT(SUBSTR(SINCRONISMO,7,4),'-'),SUBSTR(SINCRONISMO,4,2)),'-'),SUBSTR(SINCRONISMO,1,2))) &gt;60;"/>
		<action name="savetofile" value="X:\Logs\XOneMonitor\XOneMonitor_Maintenance_queue.txt" append="true" />				
		<action name="sendmail"  />
	</actions>
</maintenance>	
 
 
<!-- ***************************************************************************************************************************************
    MANTENIMIENTO PARA BORRAR DATOS DE LA BASE DE DATOS. ADICIONALMENTE SE PUEDE PONER LA CONEXION DE LA TABLA QUE QUEREMOS REVISAR, POR SI NUESTRO SISTEMA TIENE VARIAS BASE DE DATOS 
    IMPORTANTE. IMPORTANTE. IMPORTANTE. IMPORTANTE. REVISAR LOS SQL QUE SE INDICAN COMO EJEMPLO ANTES DE EJECUTARLOS EN LA BASE DE DATOS DE PRODUCCION -->
  *****************************************************************************************************************************************  
<maintenance name="BORRADO_DATOS" connection="nombre_conexion_definida_en_fichero_config" cron-expression="0 5 5 ? * MON-SUN">
<errormessage subject="BORRADO DE DATOS" body="borrando datos" header="Borrando datos" />
<actions>
  <action name="executequery" value="TRUNCATE TABLE MASTER_REPLICA_ERRORLOG" />
  <action name="executequery" value="TRUNCATE TABLE ADM_XONELIVE_ERRORLOG" />
  <action name="executequery" value="TRUNCATE TABLE ADM_XONELIVE_LOGS" />
  <action name="executequery" value="TRUNCATE TABLE ADM_provisioning_logs" />
 
  <!-- ******************************************************************
      BORRAR DATOS DE LA TABLA SQUEUE QUE YA ESTAN REPLICADAS POR LOS DISPOSITIVOS SI LE HEMOS INDICADO AL REPLICADOR QUE NO LAS BORRE AUTOMATICAMENTE. 
      SE PUEDE AÑADIR UNA FECHA QUE DEBE CUMPLIR. -->
 
      <action name="executequery" value="delete from master_replica_squeue where SENT = 1;" />				
 
  <!-- ************************************************************
        BORRAR DATOS DE LA TABLA SQUEUE DE DISPOSITIVOS QUE NO ESTAN ACTIVOS.-->
 
        <action name="executequery" value="delete from master_replica_squeue where MID in (select MID from master_replica_slave where PENDIENTE = 1) AND MID NOT IN (SELECT MID FROM ADM_provisioning_task WHERE STATUS=1);" />	
  <!-- ************************************************************
       BORRAR OPERACIONES QUE SE HAN REPLICADO YA POR TODOS LOS DISPOSITIVOS DE LA TABLA QUEUE. -->
 
       <action name="executequery" value="delete from master_replica_queue where ID not in (select QID from master_replica_squeue) and ID &lt; (select MIN(LASTID) from master_replica_slave where CONDITIONAL=1 and PENDIENTE=0 and LASTID&gt;0);" />		
       </actions>
      </maintenance>
 
<!-- 	***********************************************************************************
	   ALERTA DE errores en ERRORLOG
	   - Ajustar numero de operaciones para alerta y Warnings que se quieran descargar del aviso
	***********************************************************************************  -->
<checking name="errorlog" type="count" cron-expression="">
	<sql value="SELECT count(ID) FROM master_replica_errorlog WHERE DESCRIPTION  DESCRIPTION NOT LIKE '%already%' " count="4" />		
	<errormessage subject="XOneMonitor XONE Errorlog" body="-"  header="Hay errores en el errorlog. Revisar el servidor." />		
	<email to="quiensea@correo.es" cc="" bcc="" execute-if-error="true"/>
	<actions>
		<action name="sendmail"  />
		<action name="savetofile" value="X:\Logs\XOneMonitor\XOneMonitor_errorlog.txt" append="true" />
	</actions>
</checking>	
 
<!-- 	***********************************************************************************
	   Generación de PDF
	   En este caso el monitor se encarga de montar el PDF, basado en imágenes, 1 por página
	   pathpdf:	Ruta donde va a dejar el fichero generado en el servidor.
	   pathpages:	Ruta de las imágenes que van a formar el pdf. P.ej: C:\inetpub\wwwroot\catalogo\files\
	   pages:		Nombre de la imagen con su extensión. P.Ej: pagina1.jpg
	   namepdf:	Nombre final del fichero pdf.
	   orientation:	Por defecto vertical, puede ser también horizontal.
	   attachpdf:	true para que intente adjuntar el pdf al correo que se envía, se combina con el atributo attachsize.
	   attachsize:	Tamaño en bytes máximo para adjuntar el fichero al correo, si supera ésta cantidad, el fichero se genera en
			una carpeta accesible del servidor y se pone el enlace a la dirección del fichero pdf generado en el correo que se envía.
	   text:		En el pie de página se puede poner un texto, aquí es donde se define.
	   Nota: Las imágenes para que todos los márgenes aparezcan perfectas con los márgenes correspondientes serán: 
	         Para que salga 1 por pagina, de 538x765px, para que salgan 2 por pagina, 538x382px. 
	***********************************************************************************  -->
 
<checking name="CrearPDF" type="pdf" >
	<sql value="SELECT SENDID, ROWID,STRPRECIO, 'PruebaPDF' AS MAP_NAME,IMGNAME,NOMFOTO AS MAP_PAGES, EMAIL1 AS MAP_CORREO, EMAIL2 AS MAP_COPIA FROM view_clientescatalogosend" />
	<pdf pathpdf="C:\inetpub\wwwroot\clientes" 
	pathpages="##ROW_MAP_PAGES##" 
	pages="##ROW_IMGNAME##" 
	namepdf="##ROW_MAP_NAME##-##NOW##" 
	orientation="vertical"
	attachpdf="true"
	attachsize="2050"
	text="##ROW_STRPRECIO##"
	sql="UPDATE gen_clientescatalogosend SET ACTUALIZADO=10 WHERE ID=##ROW_SENDID##"
	mailto="##ROW_MAP_CORREO##" 
	mailcc="##ROW_MAP_COPIA##" mailbcc="" 
	mailsubject="Envío de catálogo adjunto PDF" 
	mailbody="PDF creado automáticamente para envío del Catálogo de Productos. Si no puede ver bien el fichero adjunto, acceda a la direccion  http://www.direccionweb.com/clientes/##NAMEPDF##"/>
	<errormessage subject="Error generando el catalogo" body="No se pudo crear pdf"  header="" />
	<email to="elquesea@sucorreo.es" cc="" bcc="" />
	<actions>
		<action name="sendmail" execute-always="true"/>
		<action name="executequery" execute-if-error="true" value="UPDATE gen_clientescatalogosend SET ACTUALIZADO=998,FECHAENVIO=GETDATE() WHERE ID=##ROW_SENDID##" />
		<action name="executequery" value="UPDATE gen_clientescatalogosend SET ACTUALIZADO=100,FECHAENVIO=GETDATE()  WHERE ID=##ROW_SENDID##" />
	</actions>
</checking>
 
<checking name="Notificar Error" type="groupby" cron-expression="0 0 8 ? * *">
	<sql value="SELECT ID AS SENDID,EMAIL1 AS MAP_CORREO, EMAIL2 AS MAP_COPIA FROM gen_clientescatalogosend WHERE ACTUALIZADO=998" groupby="SENDID" />
	<errormessage subject="Error generando el catalogo" body="No se pudo crear pdf ##ROW_SENDID## para ##ROW_MAP_CORREO## y ##ROW_MAP_COPIA##"  header=""/>
	<email to="quiensea@sucorreo.com" cc="" bcc="" />
	<actions>			
		<action name="sendmail" />
		<action name="executequery" value="UPDATE gen_clientescatalogosend SET ACTUALIZADO=999,FECHANOTIF=GETDATE()  WHERE ID=##ROW_SENDID##" />
	</actions>
</checking>
 
*********************************************************************************************
<!-- CREAR FICHEROS PDF A PARTIR DE INFORMACION DE LA BASE DE DATOS  -->
<!-- FICHERO XML QUE TIENE EL FORMATO DE LA CREACION DEL FICHERO PDF QUE QUEREMOS OBTENER-->
*********************************************************************************************
<checking name="CREAR-PDF" connection="AppsWEB" type="groupby" cron-expression="0 0/1 * ? * MON-SUN">
    <sql value="SELECT V.ID,V.VISITA + '.PDF' as VISITAFILE1,
  REPLACE(REPLACE(REPLACE(d.NOMBRE,' ',''),',',''),'.','') + '.PDF' as VISITAFILE,
  'C:\XOneRepository\XOneMonitor\PlantillaParaCrearPDF.xml' AS TEMPLATE,
  CORREOPDF
  FROM GEN_VISITASFABRICA V
  LEFT OUTER JOIN GEN_DEALERS d ON v.CUENTACLIENTE=d.CUENTACLIENTE
  WHERE PDF=1" groupby="ID" />
    <errormessage subject="Visita Fabrica" header="Adjuntamos la ficha de la Visita de Fabrica" body="##NL##No responder a este correo, los correos de los encargados de gestionar las visitas podreis verlos en el pdf adjunto." />
    <email to="##ROW_CORREOPDF##">
      <attach files="C:\XOneRepository\PDF\##ROW_VISITAFILE##" compress="false" />
    </email>
    <actions>
      <action name="createPDF" template="##ROW_TEMPLATE##" path="C:\XOneRepository\PDF\##ROW_VISITAFILE##" />
      <action name="executequery" value="UPDATE GEN_VISITASFABRICA SET PDF=2 WHERE PDF=1" execute-always="true" />
      <action name="sendmail" />
    </actions>
  </checking>
 
  ****************************************************************************
   <!-- LEER EVENTOS DEL VISOR DE EVENTOS DE WINDOWS -->
  **************************************************************************** 
<checking name="Comprobar visor de eventos" type="checkEventViewer">
<EventLog>
  <EventLogitem value="Application"></EventLogitem>
</EventLog>
<EvenViewParam>
  <Category value=""></Category>
  <CategoryNumber value=""></CategoryNumber>
  <EventID value=""></EventID>
  <MachineName value=""></MachineName>
  <Message value=""></Message>
  <TimeGenerated value=""></TimeGenerated>
  <TimeWritten value=""></TimeWritten>
  <Source value=""></Source>
  <InstanceId value=""></InstanceId>  
 
  <EventSuccess value="false"></EventSuccess>
  <Information value="false"></Information>
  <Warning value="false"></Warning>
  <Error value="false"></Error>
  <FailureAudit value="false"></FailureAudit>
  <SuccessAudit value="false"></SuccessAudit>
</EvenViewParam>
<errormessage  subject="" body="" header="" />
<email to="" cc="" bcc="" />
<actions>
  <action name="sendmail" />
</actions>
</checking>
************************************************************************************
 
<!--	***********************************************************************************
	   ALERTA DE REPLICADOR DETENIDO
	***********************************************************************************   -->
<checking name="Comprobar replicador" type="checkservice" cron-expression="">
	<service value="CGSRepServer2" />
	<errormessage subject="XOneMonitor XONE CGSRepServer" body="El replicador estaba parado y se ha arrancado."  header="XOneMonitor XONE" />		
	<email to="aquiencorresponda@elcorreo.es" cc="" bcc=""  execute-if-error="true"/>
	<actions>
		<action name="sendmail"   />
		<action name="startservice" value="CGSRepServer2" />
		<action name="savetofile" value="X:\Logs\XOneMonitor\XOneMonitor_replicator.txt" append="true" />
	</actions>
</checking>
 
 
<!--	***********************************************************************************
	   ALERTA DE PROVISIONING DETENIDO
	***********************************************************************************   -->
 
<checking name="Comprobar provisioning" type="checkservice" cron-expression="">
	<service value="XOneProvisioningService"/>
	<errormessage subject="XOneMonitor XONE Provisioning detenido" body="El Servicio XOneProvisioning esta detenido" header="XOneMonitor XONE" />		
	<email to="aquiencorresponda@elcorreo.es" cc="" bcc=""  execute-if-error="true"/>
	<actions>
		<action name="sendmail"  />
		<action name="startservice" value="XOneProvisioningService" />
		<action name="savetofile" value="X:\Logs\XOneMonitor\XOneMonitor_Provisioning.txt" append="true" />
	</actions>
</checking>
 
 
<!--	***********************************************************************************
	   ALERTA DE INTEGRACION DETENIDO
	***********************************************************************************   -->
 
<checking name="Comprobar Integracion" type="checkservice" cron-expression="">
	<service value="Xone ITF Advanced" />
	<errormessage subject="XOneMonitor XONE Integracion detenida" body="El Servicio Xone ITF Advanced esta detenido" header="XOneMonitor XONE" />		
	<email to="aquiencorresponda@elcorreo.es" cc="" bcc=""  execute-if-error="true"/>
	<actions>
		<action name="sendmail"   />
		<action name="startservice" value="Xone ITF Advanced" />
		<action name="savetofile" value="X:\Logs\XOneMonitor\XOneMonitor_Integracion.txt" append="true" />
	</actions>
</checking>