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:


\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
pass Para poner password al zip
ver Para ver los archivos que son, pero sin crear el zip
delete Para borrar los archivos zip anteriores, se puede pasar un parametro dias ( indicando el numero de dias de margen para borrar )
"); 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 "
"; } } 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 "
"; if($enlaces){ foreach($enlaces as $enlace){ if (file_exists($enlace)){ echo "".$enlace."
"; }else{ echo "No se pudo generar el fichero $enlace
"; } } } } ?>

(*) 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