/** * Effacement de la bidouille ci-dessus * Toutefois si la table des auteurs ne contient plus qu'elle * c'est que la copie etait incomplete et on restaure le compte * pour garder la connection au site * * (mais il doit pas etre bien beau * et ca ne marche que si l'id_auteur est sur moins de 3 chiffres) * * @param string $serveur */ function migration_reception_detruire_copieur_si_besoin_dist($status, $data) { include_spip('base/dump'); $status['status'] = 'clean'; $res = base_detruire_copieur_si_besoin(''); update_migration_depuis($status); return $res; }
/** * Vider les tables de la base de destination * pour la copie dans une base * * @param array $tables * @param string $serveur */ function migration_reception_vider_tables_destination_copie($status, $data){ include_spip('base/dump'); $status['status'] = 'vider'; $status['progress']['vider'] = "X Suppression des tables"; base_vider_tables_destination_copie($data['tables'],$data['exlure_tables'],''); update_migration_depuis($status); return true; }
/** * Preparer la table dans la base de destination : * la droper si elle existe (sauf si auteurs ou meta sur le serveur principal) * la creer si necessaire, ou ajouter simplement les champs manquants * * @param string $table * @param array $desc * @param string $serveur_dest * @param bool $init * @return array */ function migration_reception_preparer_table_dest_dist($status, $data) { include_spip('base/dump'); $status['status'] = 'preparer'; // initialiser le compteur de progression if (!isset($status['progress']['tables'][$data['table']])) $status['progress']['tables'][$data['table']] = '0'; $res = base_preparer_table_dest($data['table'],$data['desc'],'',$data['init']); update_migration_depuis($status); return $res; }
/** * ouvrir la connection depuis le site distant * pour verifier que ca fonctionne * * @return bool */ function migration_reception_connect_dist($status, $data){ // inutile de checker une data : // si on est arrive jusque la c'est que la connexion marche // mais pour l'IHM, on attend l'url du site source comme data // ce n'est pas une secu, meme visuelle, car un man in the middle qui a trouvé la clé // pourrait envoyer cette info. // verifier que la version du site distant est acceptable // si la version de la base distante est superieure a la version actuelle // on ne saura pas gerer if (!isset($data['spip_version_base']) OR $data['spip_version_base']>$GLOBALS['spip_version_base']){ return 'migration:erreur_echec_connexion_version'; } $status['status'] = 'connect'; $status['source'] = $data['url_site_source']; update_migration_depuis($status); return true; }
/** * fonction d'insertion en base lors de la copie de base a base * * @param string $table * @param array $row * @param array $desc_dest * @param string $serveur_dest * @return int/bool */ function migration_reception_inserer_copie_dist($status, $data){ include_spip('base/dump'); $status['status'] = 'copier'; $status['compteurs']['table'][$data['table']] += count($data['rows']); $status['progress']['tables'][$data['table']] = $status['compteurs']['table'][$data['table']]; foreach($data['rows'] as $r=>$row){ foreach($row as $k=>$v) if (!isset($data['desc_dest']['field'][$k]) // attention, dans la desc les champs peuvent se retrouver tous en minuscule AND !isset($data['desc_dest']['field'][strtolower($k)])){ unset($data['rows'][$r][$k]); $status['ignore']['tables'][$data['table']][$k]=$k; } } $res = base_inserer_copie($data['table'],$data['rows'],$data['desc_dest'],''); update_migration_depuis($status); return $res; }
/** * Verifier si le fichier de destination est deja la et OK * @param string $file * @param string $size * @param string $md5 * @param string $dir_dest * @param bool $init * @return bool */ function migration_reception_stat_file_dest_dist($status, $data) { include_spip('base/dump'); $status['status'] = 'statfile'; $dir_dest = $data['dir_dest']; if (!in_array($dir_dest,array("_DIR_IMG","_DIR_SQUELETTES"))){ // dossier pas prevu : refuser $res = 'FAIL'; // notons le fichier comme ignore $status['ignore']['files'][$dir_dest.$data['file']]=$dir_dest.$data['file']; spip_log('tentative stat_file sur '.$data['file'].' dans repertoire interdit '.$dir_dest,'migration'); } else { @define('_DIR_SQUELETTES',_DIR_RACINE."squelettes/"); $dir_dest = constant($dir_dest); $status['progress']['files'][$dir_dest.$data['file']] = 0; // verifier l'extension // strict en dehors du dossier skel, // un peu plus de types autorises dans le dossier skel $strict = ($data['dir_dest']!='_DIR_SQUELETTES'); if (migration_type_fichier_autorise($data['file'],$strict)){ $res = base_stat_file_dest_dist($data['file'],$data['size'],$data['md5'],$dir_dest,$data['init']); if (intval($res)) $status['progress']['files'][$dir_dest.$data['file']] = $res; } else { // renvoyons la taille comme si le fichier etait deja la // evite une tentative d'envoi, mais n'empeche pas de securiser // l'ecriture aussi car rien ne nous dit que l'envoyeur soit fair play $res = $data['size']; $status['progress']['files'][$dir_dest.$data['file']] = "X"; // notons le fichier comme ignore $status['ignore']['files'][$dir_dest.$data['file']]=$dir_dest.$data['file']; } } update_migration_depuis($status); return $res; }
/** * Verifier si le fichier de destination est deja la et OK * @param string $file * @param string $size * @param string $md5 * @param string $dir_dest * @param bool $init * @return bool */ function migration_reception_fichier_ecrire_dist($status, $data) { include_spip('base/dump'); $status['status'] = 'cp'; $dir_dest = $data['dir_dest']; if (!in_array($dir_dest,array("_DIR_IMG","_DIR_SQUELETTES"))){ // dossier pas prevu : refuser $res = 'FAIL'; // notons le fichier comme ignore $status['ignore']['files'][$dir_dest.$data['file']]=$dir_dest.$data['file']; spip_log('tentative de copie fichier '.$data['file'].' vers repertoire interdit '.$dir_dest,'migration'); } else { @define('_DIR_SQUELETTES',_DIR_RACINE."squelettes/"); $dir_dest = constant($dir_dest); // strict en dehors du dossier skel, // un peu plus de types autorises dans le dossier skel $strict = ($data['dir_dest']!='_DIR_SQUELETTES'); if (migration_type_fichier_autorise($data['file'],$strict)){ $res = base_fichier_ecrire_dist($data['file'],$data['d'],$dir_dest); if ($res) $status['progress']['files'][$dir_dest.$data['file']] = $res; } else { // on ne devrait pas arriver la car le fichier a ete refuse au moment du stat // on peut presumer que c'est une tentative de passage en force. // Est-ce qu'on ignore juste, ou est-ce qu'on abandonne tout ? $res = 'FAIL'; // notons le fichier comme ignore $status['ignore']['files'][$dir_dest.$data['file']]=$dir_dest.$data['file']; spip_log('tentative ecriture fichier '.$data['file'].' : type interdit dans '.$dir_dest,'migration'); } } update_migration_depuis($status); return $res; }
/** * fermer la connection depuis le site distant * quand on a fini * * @param array $status * @param array $data * @return bool */ function migration_reception_end_dist($status, $data){ spip_log('fin de migration. Resultat:'.var_export($data,1),'migration'); $status['status'] = 'end'; if ($data['status']=='abort'){ $status = abandonner_migration_depuis($status); } else { // s'assurer que l'auteur qui migre est bien webmestre a l'arrivee $id_webmestre = $data['id_webmestre']; include_spip('base/abstract_sql'); $row = sql_fetsel('*','spip_auteurs','id_auteur='.intval($id_webmestre)); if ($row AND $row['statut']=='0minirezo'){ // y a-t-il un champ webmestre dans la base ? if (!isset($row['webmestre'])){ sql_alter("TABLE spip_auteurs ADD webmestre varchar(3) DEFAULT 'non' NOT NULL"); $row['webmestre']='non'; } if ($row['webmestre']!='oui'){ sql_updateq("spip_auteurs",array('webmestre'=>'oui'),'id_auteur='.intval($id_webmestre)); } } } if ((count($status['ignore']) OR count($data['errors'])) AND defined('_MIGRATION_EMAIL_NOTIFY_IGNORE') AND $email = _MIGRATION_EMAIL_NOTIFY_IGNORE){ $sujet = "[Migration-ERR] ".$GLOBALS['meta']['adresse_site']; $texte = ""; if (count($status['ignore'])) $texte .= var_export($status['ignore'],true); if (count($data['errors'])) $texte .= implode("\n",$data['errors']); job_queue_add('envoyer_mail','Erreur migration',array($email, $sujet, $texte),'inc/'); } update_migration_depuis($status); finir_migration_status_depuis(); // si on a pas d'upgrade a suivre, vidons les cache $version_installee = sql_getfetsel('valeur','spip_meta',"nom='version_installee'"); if ($GLOBALS['spip_version']==$version_installee) { // supprimer les cache pour forcer la mise a jour du site include_spip('inc/invalideur'); spip_log("purger le site","migration"); supprime_invalideurs(); @spip_unlink(_CACHE_RUBRIQUES); @spip_unlink(_CACHE_PIPELINES); @spip_unlink(_CACHE_PLUGINS_PATH); @spip_unlink(_CACHE_PLUGINS_OPT); @spip_unlink(_CACHE_PLUGINS_FCT); @spip_unlink(_CACHE_PLUGINS_VERIF); @spip_unlink(_CACHE_CHEMIN); #purger_repertoire(_DIR_CACHE,array('subdir'=>true)); #purger_repertoire(_DIR_AIDE); purger_repertoire(_DIR_VAR.'cache-css'); purger_repertoire(_DIR_VAR.'cache-js'); } @spip_unlink(_FILE_META); // on renvoit le bilan pour affichage sur le site source return $status; }
/** * Abandon de la migration sur erreur ou demande d'abandon * @param array $status * @return array */ function abandonner_migration_depuis($status=null){ if (is_null($status)) $status = lire_migration_depuis_status(); $status['status'] = 'aborted'; if (migration_restore_base_si_possible()) $status['status'] = 'basereverted'; update_migration_depuis($status); return $status; }