Generar un zip de backup del servidor FTP

basandome en el código
he modificado la clase para añadirle seguridad (*):

Para ello partimos de una estructura de servidor:

Donde colocamos el fichero zip.php en el raiz

Dentro del fichero configuramos la ruta donde se van a guardar los archivos y las exclusiones que queremos hacer, en este caso los directorios dir2 y dir4 y el propio fichero de generar el zip.

Una vez que invocamos el fichero desde navegador


obtenemos un zip como:


<?php
	//funciones
	function show($str){
		echo $str . "<br/>\n";
		flush();
		ob_flush();
	}
	function secured($nombre,$directorio){
		return str_replace($directorio."/backup",$directorio."/secured_backup",$nombre);
	}
	
	//configuracion
	ini_set('max_execution_time', 5000);
	$maxFilePerArchive = 20000;
	$directorio="zipBk";
	$debug=false;
	//directorios y ficheros que no quieres que se añadan al archivo
	$excludes=array("dir2","dir4","zip.php");
	
	
	//parametros recibidos
	if (isset($_REQUEST['pass'])){
		$password=$_REQUEST['pass'];
	}else{
		$password="";
	}
	if (isset($_REQUEST['delete'])){
		$delete=true;
	}else{
		$delete=false;
	}
	if (isset($_REQUEST['ver'])){
		$ver=true;
	}else{
		$ver=false;
	}
	if (isset($_REQUEST['dias'])){
		$dias=$_REQUEST['dias'];
	}else{
		$dias=2;
	}
	if (isset($_REQUEST['help'])){
		show("Puedes pasar los parametros<br>
		<strong>pass</strong> Para poner password al zip<br>
		<strong>ver</strong> Para ver los archivos que son, pero sin crear el zip<br>
		<strong>delete</strong> Para borrar los archivos zip anteriores, se puede pasar un parametro dias ( indicando el numero de dias de margen para borrar )<br>
		");
		die;
	}
	
	// increase script timeout value
	
	if ($directorio!="" && $directorio!="." && !file_exists($directorio)) {
		mkdir($directorio, 0777, true);
		if($debug){show("Se ha creado el directorio $directorio porque no existia");}
	}
	if ($delete){
		
		show("Borramos los archivos anteriores a 2 dias");
		$ficheros=0;
		$borrados=0;
		$ahora=time();
		foreach (glob($directorio."/*.zip") as $file) {
			if (is_file($file)){
				$ficheros++;
				
				if ($ahora - filemtime($file) >= 60*60*24*$dias){ // 1 days
					$borrados++;
					echo $file;
					unlink($file);
				}
				echo "<br>";
			}
		}
		show("Hemos borrado $borrados archivos");die;
	}
	
	$numFiles = 0;
	$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("./"));
	foreach ($iterator as $key=>$value){
		$key=substr($key,2,strlen($key)-1);
		if (! preg_match('/'.$directorio.'\/backup_'.'/', $key) && !preg_match('/'.$directorio.'\/secured_backup_'.'/', $key)){
			if (!(substr($key,-2)==".." || substr($key,-1)==".")){
				if ($excludes){
					$puede=true;
					foreach ($excludes as $exclude)
					{
						if (preg_match('/^'.$exclude.'/', $key))
						{
							$puede = false;
						} 
					}
				}else{
					$puede=true;
				}
				if ($puede){
					$numFiles += 1;
					if ($ver){
						show("Se insertara el archivo $key");
					}
				}
			}
		}
	}
	show( "Comprimiremos $numFiles archivos" );
	if (!$ver){
		$date = getdate();
		$enlaces=array();
		$splitNum = 0;
		$archive = $directorio."/backup_" . $date[0];
		$currentArchive = $archive . "_" . $splitNum . ".zip";
		$enlaces[]=$currentArchive;
		$zip = new ZipArchive();
		if ($zip->open($currentArchive, ZIPARCHIVE::CREATE) !== TRUE) {
			die ("No se puede abrir el archivo");
		}
		
		
		$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("./"));
		$numFiles = 0;
		$counter = 0;
		
		foreach ($iterator as $key=>$value){
			$counter += 1;
			if ($counter >= $maxFilePerArchive) {
				$zip->close();
				if ($password!=""){
					try{
						system('zip -P '.$password.' '.secured($currentArchive).' '.$currentArchive);
						unlink($currentArchive);
					}catch(Exception $ex){
					
					}
				}
				$currentArchive = $archive . "_" . $splitNum++ . ".zip";
				$enlaces[]=$currentArchive;
				show( "Limite de ficheros: partimos el archivo, Nuevo archivo es $currentArchive" ); 
				
				$zip = new ZipArchive();
				if ($zip->open($currentArchive, ZIPARCHIVE::CREATE) !== TRUE) {
					die ("No se puede crear el archivo");
				}
				
				$counter = 0;
			}
			$key=substr($key,2,strlen($key)-1);
			if (! preg_match('/'.$directorio.'\/backup_'.'/', $key) && !preg_match('/'.$directorio.'\/secured_backup_'.'/', $key)){
				if (substr($key,-2)==".." || substr($key,-1)=="."){
					if ($debug){show( "Excluimos $key" );}
				}else{
					if ($excludes){
						$puede=true;
						foreach ($excludes as $exclude)
						{
							if (preg_match('/^'.$exclude.'/', $key))
							{
								$puede = false;
							} 
						}
					}else{
						$puede=true;
					}
					if ($puede){
						$zip->addFile(realpath($key), $key) or die ("ERROR: No se puede añadir el fichero: $key");
						$numFiles += 1;
						if ($debug){show( "Añadimos $key" );}
					}
				}
				
			} else {
				if($debug){show( "No se comprime el archivo,por ser una copia previa-> $key" );}
			}
		}
		// close and save archive
		$zip->addFromString("LEEME_".time().".txt", "#1 Fichero generado automaticamenta\nPor un proceso para realizar backup de todo el FTP. ");
		$zip->close();
		if ($password!=""){
			try{
				system('zip -P '.$password.' '.secured($currentArchive).' '.$currentArchive);
				unlink($currentArchive);
			}catch(Exception $ex){
			
			}
		}
		
		if ($password=="" ){
			show( "El fichero no tiene clave, llama al script pasando el parametro ?pass=xxxx para mayor seguridad" );
		}
		if ($password!=""){$enlaces=secured($enlaces);}
		echo "<br>";
		if($enlaces){
			foreach($enlaces as $enlace){
				if (file_exists($enlace)){
					echo "<a href='".$enlace."'>".$enlace."</a><br>";
				}else{
					echo "No se pudo generar el fichero $enlace <br>";
				}
			}
		}
	}
?>

(*) Como la clase ZipArchive de php no soporta clave, se genera un segundo zip mediante llamada al sistema operativo que si que pone contraseña al original y lo borra.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

* Please enter the Biggest Number