Changeset 88456 in spip-zone


Ignore:
Timestamp:
Apr 4, 2015, 10:04:47 PM (4 years ago)
Author:
marcimat@…
Message:

Première passe pour une forme de rsync par http

On s'inspire de ce que fait la librairie https://github.com/outlandishideas/sync en adaptant,
car à la fois on transmet les fichiers cryptés, et on verifie leur intégrité avec un calcul de sha256.

Le site destination envoie la liste des fichiers dont il dispose, avec leur taille et leur date.
Le serveur réceptionne et retourne la liste des fichiers qui difèrent.

Le site destination récupère cette liste et supprime les fichiers qui n'ont plus lieu d'être.
Pour tous les autres fichiers (nouveaux ou de date ou taille différentes), le site va prendre un lot
de fichiers (100 fichiers ou 100Mo) et demander au site source de calculer leur sha256.

Pour tout ce lot, on télécharge les fichiers un par un en vérifiant leur hash.
Une fois fini, on prend un nouveau lot.

Le calcul du sha256 sur l'ensemble des fichiers était trop lourd ; de la sorte, on est pratiquement sûr de
télécharger un certain nombre de fichiers à chaque exécution, même si on ne peut pas modifier le timeout sur notre PHP.

Location:
_plugins_/migrateur/dev-by-http
Files:
4 added
5 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/migrateur/dev-by-http/class/Client.php

    r88450 r88456  
    4242                $act->setParent($this);
    4343                $act->setDestination(migrateur_infos());
     44
    4445                return $act->run($args);
    4546        }
     
    7778                        $this->log("Type de réponse erroné");
    7879                        var_dump($reponse);
     80                        #print_r($reponse);
    7981                        return false;
    8082                }
     
    180182                curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
    181183
    182                 list($headers, $body) = explode("\r\n\r\n", curl_exec($curl), 2);
     184                $response = curl_exec($curl);
     185
     186                $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
     187                $headers = substr($response, 0, $header_size);
     188                $body = substr($response, $header_size);
     189                unset($response);
     190
    183191                $code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    184192                if ($code != 200) {
     
    232240                $this->log("Demande du fichier <em>$file</em>");
    233241
    234                 if (!stream_filter_register('crypteur.decrypt', '\SPIP\Migrateur\Crypteur\DecryptFilter')) {
    235                         return "Filtre de decryptage introuvable";
     242                if (!in_array('crypteur.decrypt', stream_get_filters())) {
     243                        if (!stream_filter_register('crypteur.decrypt', '\SPIP\Migrateur\Crypteur\DecryptFilter')) {
     244                                return "Filtre de decryptage introuvable";
     245                        }
    236246                }
    237247
  • _plugins_/migrateur/dev-by-http/class/Crypteur/DecryptFilter.php

    r88450 r88456  
    3232                        $this->bufferlen += $bucket->datalen;
    3333                        $consumed += $bucket->datalen;
     34                        // hack pour closing…
     35                        $this->last_bucket = $bucket;
    3436
    3537                        if ($this->bufferlen < self::LEN) {
     
    4446
    4547                        stream_bucket_append($out, $bucket);
    46 
    47                         // hack pour closing…
    48                         $this->last_bucket = $bucket;
    4948                }
    5049
  • _plugins_/migrateur/dev-by-http/class/Data.php

    r88450 r88456  
    8181         * @return string Code pour lancer la commande
    8282        **/
    83         function commande($command) {
     83        public function commande($command) {
    8484                return $this->obtenir_commande_serveur($command);
    8585        }
     
    101101         *     Chemin de la commande
    102102        **/
    103         function obtenir_commande_serveur($command) {
     103        public function obtenir_commande_serveur($command) {
    104104                static $commands = array();
    105105                if (array_key_exists($command, $commands)) {
     
    119119
    120120
     121
     122        /**
     123         * Retourne la liste des fichiers d'un répertoire donné
     124         *
     125         * @link https://github.com/outlandishideas/sync/
     126         *
     127         * @param $path string
     128         * @return array
     129         */
     130        public function getFileList($path) {
     131                if (!$path or !is_string($path) or (strpos($path, '..') !== false)) {
     132                        migrateur_log("Path erroné");
     133                        return array();
     134                }
     135
     136                $path = rtrim($path, '/') . DIRECTORY_SEPARATOR;
     137                $path = $this->dir . DIRECTORY_SEPARATOR . $path;
     138
     139                $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path,
     140                                \FilesystemIterator::CURRENT_AS_FILEINFO |
     141                                \FilesystemIterator::SKIP_DOTS
     142                ));
     143
     144
     145                $pathPrefixLength = strlen($path);
     146                $files = array();
     147                foreach ($iterator as $fileInfo) {
     148                        $fullPath = str_replace(DIRECTORY_SEPARATOR, '/', substr($fileInfo->getRealPath(), $pathPrefixLength));
     149                        $files[$fullPath] = array($fileInfo->getSize(), $fileInfo->getMTime());
     150                }
     151
     152                return $files;
     153        }
     154
     155
    121156        /**
    122157         * Ajoute un message de log dans tmp/migrateur/migrateur.log
  • _plugins_/migrateur/dev-by-http/class/Serveur/Action/GetFile.php

    r88450 r88456  
    2121                }
    2222
    23                 if (!stream_filter_register('crypteur.encrypt', '\SPIP\Migrateur\Crypteur\EncryptFilter')) {
    24                         return "Filtre de cryptage introuvable";
     23                if (!in_array('crypteur.encrypt', stream_get_filters())) {
     24                        if (!stream_filter_register('crypteur.encrypt', '\SPIP\Migrateur\Crypteur\EncryptFilter')) {
     25                                return "Filtre de cryptage introuvable";
     26                        }
    2527                }
    2628
  • _plugins_/migrateur/dev-by-http/class/Serveur/Action/Test.php

    r88450 r88456  
    88
    99        public function run($data = null) {
    10                 $this->log("Test reçu : ");
     10                $this->log_run("Test reçu : ");
    1111                $this->log($data);
    1212
Note: See TracChangeset for help on using the changeset viewer.