{"id":347,"date":"2017-08-01T09:35:06","date_gmt":"2017-08-01T09:35:06","guid":{"rendered":"http:\/\/www.josejavierfm.es\/blog\/?p=347"},"modified":"2017-08-02T09:08:14","modified_gmt":"2017-08-02T09:08:14","slug":"generar-un-zip-de-backup-del-servidor-ftp","status":"publish","type":"post","link":"https:\/\/www.josejavierfm.es\/blog\/2017\/08\/01\/generar-un-zip-de-backup-del-servidor-ftp\/","title":{"rendered":"Generar un zip de backup del servidor FTP"},"content":{"rendered":"<p>basandome en el <a href=\"https:\/\/gist.github.com\/jonmaim\/1141513\" target=\"_blank\">c\u00f3digo<\/a><br \/>\nhe modificado la clase para a\u00f1adirle seguridad (*):<\/p>\n<p>Para ello partimos de una estructura de servidor:<\/p>\n<p><a href=\"http:\/\/www.josejavierfm.es\/blog\/wp-content\/uploads\/2017\/08\/blog-generar-un-zip-de-backup-del-servidor-ftp-zipphp1.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.josejavierfm.es\/blog\/wp-content\/uploads\/2017\/08\/blog-generar-un-zip-de-backup-del-servidor-ftp-zipphp1-274x300.png\" alt=\"\" width=\"274\" height=\"300\" class=\"alignnone size-medium wp-image-349\" srcset=\"https:\/\/www.josejavierfm.es\/blog\/wp-content\/uploads\/2017\/08\/blog-generar-un-zip-de-backup-del-servidor-ftp-zipphp1-274x300.png 274w, https:\/\/www.josejavierfm.es\/blog\/wp-content\/uploads\/2017\/08\/blog-generar-un-zip-de-backup-del-servidor-ftp-zipphp1.png 300w\" sizes=\"(max-width: 274px) 100vw, 274px\" \/><\/a><\/p>\n<p>Donde colocamos el fichero zip.php en el raiz<\/p>\n<p>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.<\/p>\n<p>Una vez que invocamos el fichero desde navegador <\/p>\n<p><a href=\"http:\/\/www.josejavierfm.es\/blog\/wp-content\/uploads\/2017\/08\/blog-generar-un-zip-de-backup-del-servidor-ftp-zipphp2.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.josejavierfm.es\/blog\/wp-content\/uploads\/2017\/08\/blog-generar-un-zip-de-backup-del-servidor-ftp-zipphp2-300x48.png\" alt=\"\" width=\"300\" height=\"48\" class=\"alignnone size-medium wp-image-352\" srcset=\"https:\/\/www.josejavierfm.es\/blog\/wp-content\/uploads\/2017\/08\/blog-generar-un-zip-de-backup-del-servidor-ftp-zipphp2-300x48.png 300w, https:\/\/www.josejavierfm.es\/blog\/wp-content\/uploads\/2017\/08\/blog-generar-un-zip-de-backup-del-servidor-ftp-zipphp2.png 598w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nobtenemos un zip como:<br \/>\n<a href=\"http:\/\/www.josejavierfm.es\/blog\/wp-content\/uploads\/2017\/08\/blog-generar-un-zip-de-backup-del-servidor-ftp-zipphp3.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.josejavierfm.es\/blog\/wp-content\/uploads\/2017\/08\/blog-generar-un-zip-de-backup-del-servidor-ftp-zipphp3-300x123.png\" alt=\"\" width=\"300\" height=\"123\" class=\"alignnone size-medium wp-image-351\" srcset=\"https:\/\/www.josejavierfm.es\/blog\/wp-content\/uploads\/2017\/08\/blog-generar-un-zip-de-backup-del-servidor-ftp-zipphp3-300x123.png 300w, https:\/\/www.josejavierfm.es\/blog\/wp-content\/uploads\/2017\/08\/blog-generar-un-zip-de-backup-del-servidor-ftp-zipphp3.png 533w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<pre>\r\n\r\n<?php\r\n\t\/\/funciones\r\n\tfunction show($str){\r\n\t\techo $str . \"<br\/>\\n\";\r\n\t\tflush();\r\n\t\tob_flush();\r\n\t}\r\n\tfunction secured($nombre,$directorio){\r\n\t\treturn str_replace($directorio.\"\/backup\",$directorio.\"\/secured_backup\",$nombre);\r\n\t}\r\n\t\r\n\t\/\/configuracion\r\n\tini_set('max_execution_time', 5000);\r\n\t$maxFilePerArchive = 20000;\r\n\t$directorio=\"zipBk\";\r\n\t$debug=false;\r\n\t\/\/directorios y ficheros que no quieres que se a\u00f1adan al archivo\r\n\t$excludes=array(\"dir2\",\"dir4\",\"zip.php\");\r\n\t\r\n\t\r\n\t\/\/parametros recibidos\r\n\tif (isset($_REQUEST['pass'])){\r\n\t\t$password=$_REQUEST['pass'];\r\n\t}else{\r\n\t\t$password=\"\";\r\n\t}\r\n\tif (isset($_REQUEST['delete'])){\r\n\t\t$delete=true;\r\n\t}else{\r\n\t\t$delete=false;\r\n\t}\r\n\tif (isset($_REQUEST['ver'])){\r\n\t\t$ver=true;\r\n\t}else{\r\n\t\t$ver=false;\r\n\t}\r\n\tif (isset($_REQUEST['dias'])){\r\n\t\t$dias=$_REQUEST['dias'];\r\n\t}else{\r\n\t\t$dias=2;\r\n\t}\r\n\tif (isset($_REQUEST['help'])){\r\n\t\tshow(\"Puedes pasar los parametros<br>\r\n\t\t<strong>pass<\/strong> Para poner password al zip<br>\r\n\t\t<strong>ver<\/strong> Para ver los archivos que son, pero sin crear el zip<br>\r\n\t\t<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>\r\n\t\t\");\r\n\t\tdie;\r\n\t}\r\n\t\r\n\t\/\/ increase script timeout value\r\n\t\r\n\tif ($directorio!=\"\" && $directorio!=\".\" && !file_exists($directorio)) {\r\n\t\tmkdir($directorio, 0777, true);\r\n\t\tif($debug){show(\"Se ha creado el directorio $directorio porque no existia\");}\r\n\t}\r\n\tif ($delete){\r\n\t\t\r\n\t\tshow(\"Borramos los archivos anteriores a 2 dias\");\r\n\t\t$ficheros=0;\r\n\t\t$borrados=0;\r\n\t\t$ahora=time();\r\n\t\tforeach (glob($directorio.\"\/*.zip\") as $file) {\r\n\t\t\tif (is_file($file)){\r\n\t\t\t\t$ficheros++;\r\n\t\t\t\t\r\n\t\t\t\tif ($ahora - filemtime($file) >= 60*60*24*$dias){ \/\/ 1 days\r\n\t\t\t\t\t$borrados++;\r\n\t\t\t\t\techo $file;\r\n\t\t\t\t\tunlink($file);\r\n\t\t\t\t}\r\n\t\t\t\techo \"<br>\";\r\n\t\t\t}\r\n\t\t}\r\n\t\tshow(\"Hemos borrado $borrados archivos\");die;\r\n\t}\r\n\t\r\n\t$numFiles = 0;\r\n\t$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(\".\/\"));\r\n\tforeach ($iterator as $key=>$value){\r\n\t\t$key=substr($key,2,strlen($key)-1);\r\n\t\tif (! preg_match('\/'.$directorio.'\\\/backup_'.'\/', $key) && !preg_match('\/'.$directorio.'\\\/secured_backup_'.'\/', $key)){\r\n\t\t\tif (!(substr($key,-2)==\"..\" || substr($key,-1)==\".\")){\r\n\t\t\t\tif ($excludes){\r\n\t\t\t\t\t$puede=true;\r\n\t\t\t\t\tforeach ($excludes as $exclude)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (preg_match('\/^'.$exclude.'\/', $key))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t$puede = false;\r\n\t\t\t\t\t\t} \r\n\t\t\t\t\t}\r\n\t\t\t\t}else{\r\n\t\t\t\t\t$puede=true;\r\n\t\t\t\t}\r\n\t\t\t\tif ($puede){\r\n\t\t\t\t\t$numFiles += 1;\r\n\t\t\t\t\tif ($ver){\r\n\t\t\t\t\t\tshow(\"Se insertara el archivo $key\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tshow( \"Comprimiremos $numFiles archivos\" );\r\n\tif (!$ver){\r\n\t\t$date = getdate();\r\n\t\t$enlaces=array();\r\n\t\t$splitNum = 0;\r\n\t\t$archive = $directorio.\"\/backup_\" . $date[0];\r\n\t\t$currentArchive = $archive . \"_\" . $splitNum . \".zip\";\r\n\t\t$enlaces[]=$currentArchive;\r\n\t\t$zip = new ZipArchive();\r\n\t\tif ($zip->open($currentArchive, ZIPARCHIVE::CREATE) !== TRUE) {\r\n\t\t\tdie (\"No se puede abrir el archivo\");\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(\".\/\"));\r\n\t\t$numFiles = 0;\r\n\t\t$counter = 0;\r\n\t\t\r\n\t\tforeach ($iterator as $key=>$value){\r\n\t\t\t$counter += 1;\r\n\t\t\tif ($counter >= $maxFilePerArchive) {\r\n\t\t\t\t$zip->close();\r\n\t\t\t\tif ($password!=\"\"){\r\n\t\t\t\t\ttry{\r\n\t\t\t\t\t\tsystem('zip -P '.$password.' '.secured($currentArchive).' '.$currentArchive);\r\n\t\t\t\t\t\tunlink($currentArchive);\r\n\t\t\t\t\t}catch(Exception $ex){\r\n\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t$currentArchive = $archive . \"_\" . $splitNum++ . \".zip\";\r\n\t\t\t\t$enlaces[]=$currentArchive;\r\n\t\t\t\tshow( \"Limite de ficheros: partimos el archivo, Nuevo archivo es $currentArchive\" ); \r\n\t\t\t\t\r\n\t\t\t\t$zip = new ZipArchive();\r\n\t\t\t\tif ($zip->open($currentArchive, ZIPARCHIVE::CREATE) !== TRUE) {\r\n\t\t\t\t\tdie (\"No se puede crear el archivo\");\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t$counter = 0;\r\n\t\t\t}\r\n\t\t\t$key=substr($key,2,strlen($key)-1);\r\n\t\t\tif (! preg_match('\/'.$directorio.'\\\/backup_'.'\/', $key) && !preg_match('\/'.$directorio.'\\\/secured_backup_'.'\/', $key)){\r\n\t\t\t\tif (substr($key,-2)==\"..\" || substr($key,-1)==\".\"){\r\n\t\t\t\t\tif ($debug){show( \"Excluimos $key\" );}\r\n\t\t\t\t}else{\r\n\t\t\t\t\tif ($excludes){\r\n\t\t\t\t\t\t$puede=true;\r\n\t\t\t\t\t\tforeach ($excludes as $exclude)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif (preg_match('\/^'.$exclude.'\/', $key))\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t$puede = false;\r\n\t\t\t\t\t\t\t} \r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}else{\r\n\t\t\t\t\t\t$puede=true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ($puede){\r\n\t\t\t\t\t\t$zip->addFile(realpath($key), $key) or die (\"ERROR: No se puede a\u00f1adir el fichero: $key\");\r\n\t\t\t\t\t\t$numFiles += 1;\r\n\t\t\t\t\t\tif ($debug){show( \"A\u00f1adimos $key\" );}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t} else {\r\n\t\t\t\tif($debug){show( \"No se comprime el archivo,por ser una copia previa-> $key\" );}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\/\/ close and save archive\r\n\t\t$zip->addFromString(\"LEEME_\".time().\".txt\", \"#1 Fichero generado automaticamenta\\nPor un proceso para realizar backup de todo el FTP. \");\r\n\t\t$zip->close();\r\n\t\tif ($password!=\"\"){\r\n\t\t\ttry{\r\n\t\t\t\tsystem('zip -P '.$password.' '.secured($currentArchive).' '.$currentArchive);\r\n\t\t\t\tunlink($currentArchive);\r\n\t\t\t}catch(Exception $ex){\r\n\t\t\t\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tif ($password==\"\" ){\r\n\t\t\tshow( \"El fichero no tiene clave, llama al script pasando el parametro ?pass=xxxx para mayor seguridad\" );\r\n\t\t}\r\n\t\tif ($password!=\"\"){$enlaces=secured($enlaces);}\r\n\t\techo \"<br>\";\r\n\t\tif($enlaces){\r\n\t\t\tforeach($enlaces as $enlace){\r\n\t\t\t\tif (file_exists($enlace)){\r\n\t\t\t\t\techo \"<a href='\".$enlace.\"'>\".$enlace.\"<\/a><br>\";\r\n\t\t\t\t}else{\r\n\t\t\t\t\techo \"No se pudo generar el fichero $enlace <br>\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n?>\r\n\r\n<\/pre>\n<p>(*) Como la clase ZipArchive de php no soporta clave, se genera un segundo zip mediante llamada al sistema operativo que si que pone contrase\u00f1a al original y lo borra.<\/p>\n\n<div class=\"twitter-share\"><a href=\"https:\/\/twitter.com\/intent\/tweet?via=josejavierfm\" class=\"twitter-share-button\">Twittear<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>basandome en el c\u00f3digo he modificado la clase para a\u00f1adirle 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 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[15],"tags":[],"_links":{"self":[{"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/posts\/347"}],"collection":[{"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/comments?post=347"}],"version-history":[{"count":3,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/posts\/347\/revisions"}],"predecessor-version":[{"id":353,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/posts\/347\/revisions\/353"}],"wp:attachment":[{"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/media?parent=347"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/categories?post=347"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.josejavierfm.es\/blog\/wp-json\/wp\/v2\/tags?post=347"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}