Página 1 de 1

Re: Back up mail

Publicado: 17 Feb 2009, 11:11
por quinux
Hola a todos de nuevo. Os incluyo de nuevo el código modificado. He cambiado cosas que tenía forzadas al nombre del directorio donde estaba la aplicación y además he añadido un parámetro más para que el usuario pueda seleccionar el directorio temporal de trabajo.

Os adjunto el código de la parte de configuración:

Código: Seleccionar todo

; ==========================================================================================
; AGRADEZCO ENORMEMENTE LAS APORTACIONES QUE TODOS LOS USUARIOS DEL FORO DE AUTOIT REALIZAN.
; SIN ELLAS ESTE PROGRAMA NO HUBIERA SIDO POSIBLE
; ==========================================================================================

; ======================================= QCOPMAIL_CONF ===============================================================
; ESTE PROGRAMA MUESTRA UNA VENTANA DE CONFIGURACION DEL INI PARA QUE POSTERIORMENTE EL PROGRAMA QCOPMAIL_COP PUEDA
; SABER QUE DEBE COPIAR Y DONDE DEBE COPIARLO
; ====================================================================================================================



#include <GUIConstants.au3>


GUICreate("QCOPMAIL - Configuración",600,650)

Dim $g_fichero
Dim $g_directorio
Dim $g_ruta_ini= @ScriptDir & "\config.ini"
Dim $g_opcion_origen = 0



; GROUP WITH RADIO BUTTONS
GuiCtrlCreateGroup("Origen: ", 10, 20,400,80)
$g_radio_fichero = GuiCtrlCreateRadio("Fichero ", 20, 40, 80)
GuiCtrlSetState(-1, $GUI_CHECKED)
$g_radio_directorio = GuiCtrlCreateRadio("Directorio", 20, 60, 80)
GUICtrlCreateGroup ("",-99,-99,1,1)  ;close group

if IniRead($g_ruta_ini,"datos","opcion","") = 0 Then
	GUICtrlSetState($g_radio_fichero, $GUI_CHECKED)
Else
	GUICtrlSetState($g_radio_directorio, $GUI_CHECKED)	
EndIf


;$g_etiqueta_origen=GuiCtrlCreateLabel("Origen: ", 15, 102, 100, 40)
$g_fichero_origen=GUICtrlCreateInput(IniRead($g_ruta_ini,"datos","fichero",""),100,50,220,20)
$g_boton_origen=GuiCtrlCreateButton("...",325, 50, 25, 20)

$g_etiqueta_destino=GuiCtrlCreateLabel("Destino: ", 10, 122, 100, 40)
$g_directorio_destino=GUICtrlCreateInput(IniRead($g_ruta_ini,"datos","directorio",""),50,120,220,20)
$g_boton_destino=GuiCtrlCreateButton("...",275, 120, 25, 20)

$g_etiqueta_mail=GuiCtrlCreateLabel("Mail: ", 10, 152, 100, 40)
$g_cliente_mail=GUICtrlCreateInput(IniRead($g_ruta_ini,"datos","programa",""),50,150,220,20)

$g_etiqueta_temporal=GuiCtrlCreateLabel("Temp: ", 10, 182, 100, 40)
$g_directorio_temporal=GUICtrlCreateInput(IniRead($g_ruta_ini,"datos","temporal",""),50,180,220,20)
$g_boton_temporal=GuiCtrlCreateButton("...",275, 180, 25, 20)

$g_boton_salir = GuiCtrlCreateButton("Salir",400,550,70,20)
$g_boton_actualizar_ini = GuiCtrlCreateButton ("Guardar",480,550,70,20)


GuiSetState()

While 1
	$msg = GUIGetMsg()
	

	Select
		Case $msg = $g_radio_fichero
			$g_opcion_origen = 0
		case $msg = $g_radio_directorio
			$g_opcion_origen = 1
			
		Case $msg = $GUI_EVENT_CLOSE Or $msg = $g_boton_salir
			ExitLoop
		
		Case $msg = $g_boton_origen
			if $g_opcion_origen = 0 Then
				$g_fichero = FileOpenDialog("Seleccione fichero a copiar ","c:\","All (*.*)")		
			Else
				$g_fichero = FileSelectFolder("Seleccione directorio origen", "")
			EndIf
			GUICtrlSetData($g_fichero_origen,$g_fichero)
			
		Case $msg = $g_boton_destino
			$g_directorio = ""
			$g_directorio = FileSelectFolder("Seleccione directorio de copia", "")
			GUICtrlSetData($g_directorio_destino,$g_directorio)
		
		Case $msg = $g_boton_temporal
			$g_directorio = ""
			$g_directorio = FileSelectFolder("Seleccione directorio de trabajo", "")
			GUICtrlSetData($g_directorio_temporal,$g_directorio)

		Case $msg = $g_boton_actualizar_ini
			IniWrite ($g_ruta_ini,"datos","fichero",GUICtrlRead($g_fichero_origen))
			IniWrite ($g_ruta_ini,"datos","directorio",GUICtrlRead($g_directorio_destino))
			IniWrite ($g_ruta_ini,"datos","programa",GUICtrlRead($g_cliente_mail))		
			IniWrite ($g_ruta_ini,"datos","opcion",$g_opcion_origen)
			IniWrite ($g_ruta_ini,"datos","temporal",GUICtrlRead($g_directorio_temporal))						
			
			if @error Then
				MsgBox(0,"ERROR","Se ha producido un error al actualizar el ini. consulte con el administrador")
			Else
				MsgBox(0,"ANTENCION","Ini actualizado correctamente")
			EndIf
	EndSelect		
WEnd

GUIDelete()

Exit

y ahora el código del programa que hace la copia

Código: Seleccionar todo

; ==========================================================================================
; AGRADEZCO ENORMEMENTE LAS APORTACIONES QUE TODOS LOS USUARIOS DEL FORO DE AUTOIT REALIZAN.
; SIN ELLAS ESTE PROGRAMA NO HUBIERA SIDO POSIBLE
; ==========================================================================================

; ======================================= QCOPMAIL_COP ===============================================================
; ESTE PROGRAMA ES EL ENCARGADO DE RALIZAR LA COPIA DE SEGURIDAD DE CORREO ELECTRÓNICO BASANDOSE EN LOS PARAMTEROS QUE 
; EL USUARIO HAYA CONFIGURADO USANDO EL QCOPMAIL_CONF
; ====================================================================================================================


#include <File.au3>
#Include <Date.au3>
#include <Process.au3>
#include <INet.au3>
Opt("TrayMenuMode",1)	
TraySetState()
TraySetIcon(@ScriptDir & "\principal.ico")

GUICreate("QCOPMAIL - Información sobre el BACKUP MAIL",400,500)
$g_log_usuario = GuiCtrlCreateEdit("", 10, 10, 380, 440)
$g_boton_salir = GuiCtrlCreateButton("Salir",315,460,70,20)

Dim $g_ruta_programa=@ScriptDir & "\"
Dim $g_ruta_ini=@ScriptDir & "\config.ini"
Dim $g_ruta_trabajo=IniRead($g_ruta_ini,"datos","temporal",@ScriptDir & "\temp")
Dim $g_ruta_log=@ScriptDir & "\qcop.log"
Dim $g_nombre_fichero = @YEAR & @mon & @mday & @hour & @MIN & @sec & ".rar"
Dim $g_ruta_nombre_rar=@ScriptDir & "\" & $g_nombre_fichero
Dim $g_nombre_rar= @ScriptDir & "\" & @YEAR & @mon & @mday & ".rar"
Dim $g_server_encendido = 0
Dim $g_ultima_copia
Dim $g_log_txt = ""

$g_fichero=IniRead($g_ruta_ini,"datos","fichero","")
$g_directorio=IniRead($g_ruta_ini,"datos","directorio","")
$g_ultima_copia=IniRead($g_ruta_ini,"datos","ultimo","")
$g_cliente_correo=IniRead($g_ruta_ini,"datos","programa","OUTLOOK.exe")
$g_opcion_origen=IniRead($g_ruta_ini,"datos","opcion",0)



if @error then 
Else
	p_actualiza_log("########### INICIO DEL PROCESO DE COPIA ###########")	
	
	; Compruebo que el servidor está encendido
	$g_server_encendido = f_ping_server("192.1.1.220")
	
	; Compruebo que el cliente de correo usado por el cliente este abierto. Si está abierto lo cierro
	if f_cierra_cliente_correo($g_cliente_correo) = 0 Then	
		; Copio el fichero origen al directorio de trabajo. Esto lo hago porque no puedo comprimir directamente sobre ciertas carpetas si su atributo es de solo lectura

		p_actualiza_log("Inicio de la copia del fichero " & $g_fichero & " al directorio " & $g_ruta_trabajo)		

		if f_copia_origen_a_temporal($g_opcion_origen,$g_fichero,$g_ruta_trabajo) = 0 Then
			p_actualiza_log("Error en la copia del fichero origen" )			
		Else

			; Comprimo el directorio de trabajo
			p_actualiza_log("Comprimo el fichero " & $g_ruta_trabajo & " a " & $g_ruta_programa)
			if  f_comprimir($g_opcion_origen,$g_ruta_nombre_rar,$g_ruta_trabajo) = 0 Then
			
				p_actualiza_log("Borrado del contenido del directorio temporal " & $g_ruta_trabajo & "*.*")	
				if DirRemove($g_ruta_trabajo,1) = 0 Then ;Borro la copia que se ha realizado del fichero					
					p_actualiza_log("Error al borrar " & $g_ruta_trabajo & "*.*")
				EndIf
			
				if $g_server_encendido = 0 Then
					p_actualiza_log("Imposible contectar con el servidor. La copia se quedará en local en " & $g_ruta_nombre_rar)
				Else					
					p_actualiza_log("Copiado del fichero " & $g_ruta_nombre_rar & " a " & $g_directorio)
					if FileCopy($g_ruta_nombre_rar,$g_directorio) = 0 Then
						p_actualiza_log("Error en la copia de " & $g_ruta_nombre_rar & " a " & $g_directorio)
					Else
						p_actualiza_log("Copia de " & $g_ruta_nombre_rar & " a " & $g_directorio & " FINALIZADA")
						p_actualiza_log("Borrado del fichero " & $g_ruta_nombre_rar & " en el directorio de trabajo")
						IF FileDelete($g_ruta_nombre_rar)=0 Then
							p_actualiza_log("Error en el borrado del fichero " & $g_ruta_nombre_rar)
						EndIf
					EndIf
				EndIf
			
				; Una vez que se ha terminado el proceso de copia borraremos el último fichero de copia que hay en el servidor para evitar sobrecargar
				; el servidor con datos
				p_borrado_ultima_copia($g_server_encendido,$g_ultima_copia,$g_directorio)
					
				; Tras borrar la última copia en el servidor actulizamos el .ini para indicar cual es la última copia para cuando se vuelva a 
				; ejecutar el proceso							
				p_actualiza_log("Actualizando el campo ULTIMO del ini con el valor: " & $g_nombre_fichero)							
				IniWrite ($g_ruta_ini,"datos","ultimo",$g_nombre_fichero)
			Else
				p_actualiza_log("Error al comprimir " & $g_ruta_trabajo & " a " & $g_ruta_nombre_rar)
			EndIf		
		EndIf
	Else
		p_actualiza_log("Error, el cliente de mail estaba activo " & $g_ruta_trabajo & " a " & $g_ruta_nombre_rar)
	EndIf

EndIf
p_actualiza_log("########### PROCESO DE COPIA FINALIZADO ###########")
p_informa_direccion()
	
GUICtrlSetData($g_log_usuario,$g_log_txt)
GuiSetState()

While 1
	$msg = GUIGetMsg()
	
	Select
		
		Case $msg = $g_boton_salir
			ExitLoop
		
	EndSelect		
WEnd

GUIDelete()

Exit



; ====================================================================================================================
; Name...........: p_borrado_ultima_copia
; Description ...: Borra la última copia de seguridad creada
; Syntax.........: p_borrado_ultima_copia($p_server_encendido,$p_ultima_copia,$p_directorio)
; Parameters ....: $p_server_encendido   - Indicador de si el servidor está encendido
;                  $p_ultima_copia			- Nombre de la última copia de seguridad
;				   $p_directorio			- Directorio dónde se encuentra la última copia realizada
; Return values .: 
; Author ........: [email protected]
; Remarks .......: La función actualiza el log que se encuentra en el directorio de la aplicación
; ===============================================================================================================================

Func p_borrado_ultima_copia($p_server_encendido,$p_ultima_copia,$p_directorio)
	
	if $p_server_encendido = 1 then
		p_actualiza_log("Borrado de la última copia de seguridad " & $p_directorio & "\" & $p_ultima_copia)
		if FileDelete($g_directorio & "\" & $p_ultima_copia) = 0 Then
			p_actualiza_log("Error en el borrado de la última copia " & $p_directorio & "\" & $p_ultima_copia)
		Else
			p_actualiza_log("Borrado de la última copia de seguridad REALIZADO" & $p_directorio & "\" & $p_ultima_copia)
		EndIf	
	Else
		p_actualiza_log("Imposible borrar la última copia. El servidor no está encendido" & $p_directorio & "\" & $p_ultima_copia)
	EndIf

EndFunc

; ====================================================================================================================
; Name...........: p_ping_server
; Description ...: Comprueba si el servidor esta activo
; Syntax.........: $p_ip
; Parameters ....: $p_ip				- Ip del servidor
; Return values .: 1	- Si el servidor responde al Ping
;				   0 	- Si el servidor NO responde al Ping
; Author ........: [email protected]
; Remarks .......: La función actualiza el log que se encuentra en el directorio de la aplicación
; ===============================================================================================================================
Func f_ping_server($p_ip)
	Dim $var
	$var = Ping($p_ip,50)

	If $var Then				
		return 1
	Else		
		return 0
	EndIf
EndFunc

; ====================================================================================================================
; Name...........: p_cierra_cliente_correo
; Description ...: Comprueba si el servidor esta activo
; Syntax.........: 
; Parameters ....: $p_cliente_correo: nombre del proceso del cliente de correo que estemos usando.
; Return values .: 
; Author ........: [email protected]
; Remarks .......: La función actualiza el log que se encuentra en el directorio de la aplicación
; ===============================================================================================================================

Func f_cierra_cliente_correo($p_cliente_correo)
	Local $v_existe = 0	
	
	$v_existe = ProcessExists($p_cliente_correo) 
	;while ProcessExists($p_cliente_correo) 
	;	$v_existe = 1
	;	ProcessClose($p_cliente_correo)
	;WEnd
	
	; De momento no cierro el cliente de correo ya que provca errores en la base de datos del cliente de correo. Por ahora si el cliente de correo estaba abierto
	; lo unico que hago es no hacer la copia de correo
	
	If $v_existe = 0 Then
		p_actualiza_log("El cliente de correo " & $p_cliente_correo & " estaba INACTIVO")
	Else
		p_actualiza_log("El cliente de correo " & $p_cliente_correo & " estaba ACTIVO")
	EndIf
	
	return $v_existe
EndFunc

; ====================================================================================================================
; Name...........: p_actualiza_log($p_mensaje)
; Description ...: Actualiza el fichero de log con el mensaje pasado como parámetro
; Syntax.........: 
; Parameters ....: $p_mensaje: mensaje de texto. El mensaje debe ir entre comillas
; Return values .: 
; Author ........: [email protected]
; Remarks .......: La función actualiza el log que se encuentra en el directorio de la aplicación
; ===============================================================================================================================

Func p_actualiza_log($p_mensaje)
	_FileWriteLog($g_ruta_log,$p_mensaje)
	$g_log_txt = $g_log_txt & @CRLF & @MDAY & "/" & @MON & "/" & @YEAR & " " & @HOUR & ":" & @MIN & ": " & $p_mensaje
EndFunc

; ====================================================================================================================
; Name...........: p_informa_direccion()
; Description ...: Informa a cualquier ordenador que se le configure copiando el log en el directorio compartido
; Syntax.........: 
; Parameters ....: 
; Return values .: 
; Author ........: [email protected]
; Remarks .......: 
; ===============================================================================================================================
Func p_informa_direccion()
	if FileCopy($g_ruta_log,"\\192.1.1.220\log_correo\" & @ComputerName & "_" & @YEAR & @MON & @MDAY & "_" & @HOUR & @MIN & @SEC & ".txt") = 0 Then		
	Else
	EndIf	
EndFunc

; ====================================================================================================================
; Name...........: f_copia_origen_a_temporal()
; Description ...: Copia el fichero o directorio origen al directorio temporal de trabajo
; Syntax.........: 
; Parameters ....: $p_tipo			- Si es 0 es un fichero, si es 1 es un directorio
;				   $p_fichero		- Nombre o ruta del fichero o directorio
;				   $p_ruta_trabajo	- Ruta del directorio temporal de trabajo
; Return values .: 0 si no pudo realizar la copia
;				   Cualquier otro valor si pudo realizar la copia
; Author ........: [email protected]
; Remarks .......: 
; ===============================================================================================================================

Func f_copia_origen_a_temporal($p_tipo,$p_fichero,$p_ruta_trabajo)
	
	If $p_tipo = 0 Then
		return (FileCopy($p_fichero,$p_ruta_trabajo))
	Else
		Return (DirCopy ($p_fichero, $p_ruta_trabajo,1))
	EndIf	
EndFunc


; ====================================================================================================================
; Name...........: f_comprimir()
; Description ...: Copia el fichero o directorio origen al directorio temporal de trabajo
; Syntax.........: 
; Parameters ....: $p_tipo			- Si es 0 es un fichero, si es 1 es un directorio
;				   $p_fichero		- Nombre o ruta del fichero o directorio
;				   $p_ruta_trabajo	- Ruta del directorio temporal de trabajo
; Return values .: 0 si no pudo realizar la copia
;				   Cualquier otro valor si pudo realizar la copia
; Author ........: [email protected]
; Remarks .......: 
; ===============================================================================================================================

Func f_comprimir($p_tipo,$p_ruta_nombre_rar,$p_ruta_trabajo)
			
	If $p_tipo = 0 Then
		return (_RunDOS("c:\qcopmail\rar.exe a " & $p_ruta_nombre_rar & " " & $p_ruta_trabajo))
	Else
		Return (_RunDOS("c:\qcopmail\rar.exe a -r " & $p_ruta_nombre_rar & " " & $p_ruta_trabajo & "\*.*"))
	EndIf
EndFunc


Bueno, q disfrutéis y hasta la próxima actualización del código