/**
 * 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;
}
Example #3
0
/**
 * 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;
}
Example #4
0
/**
 * 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;
}
Example #5
0
/**
 * 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;
}
Example #6
0
/**
 * 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;
}
Example #7
0
/**
 * 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;
}
Example #8
0
/**
 * 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;
}
Example #9
0
/**
 * 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;
}