pour déploiement auto v2 via gitlab
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

146 lines
5.1 KiB

<?php
if (!defined('__ROOT__')) {
list($environmentPath) = explode(DIRECTORY_SEPARATOR . 'modules', dirname(__FILE__));
$environmentPath .= DIRECTORY_SEPARATOR;
define('__ROOT__', $environmentPath);
}
require_once __ROOT__ . '/modules/base/php/Encoding.php';
// Informations complémentaires sur la doc de l'ATIH
// https://atih.atlassian.net/wiki/spaces/DocDRUIDES/pages/3917479983/Fichier+de+sauvegarde
// Les fichiers issus de Druides suivent cette convention
// <N°Finess>.<Année de transmission>.<Mois de transmission>.<Champs>.<Catégorie de données>.<Sous-catégorie de données>.<Date/heure du dernier contrôle au format AAAAMMJJHHmmSS>.<UID>
// Si on veut lancer depuis l'invit de commande
if (PHP_SAPI === "cli") {
// -fs : Le Fichier Druide zipé situé dans le dossier temp
if ($argc === 3 && ($argv[1]) === "-fs") {
convertDruide($argv[2]);
}else {
var_dump("Utilisez l'option -f");
}
}
function convertDruide($druidesZipSource)
{
// Initialisation du fichier ZIP source
if (!file_exists($druidesZipSource)) {
throw new RuntimeException("Fichier $druidesZipSource inexistant");
}
$tempPathFromCti = pathinfo($druidesZipSource, PATHINFO_DIRNAME);
$originalFilename = pathinfo($druidesZipSource, PATHINFO_FILENAME);
// Traitement des fichiers IN
$druideTypesInFromCti = array(".DRUIDE_SEJ.", ".DRUIDE_ACE.", ".DRUIDE_OQN.");
if (striposa($druidesZipSource, $druideTypesInFromCti)) {
$inZipTargetPath = $tempPathFromCti . DIRECTORY_SEPARATOR . $originalFilename . ".in.zip";
$inZipTargetPath = str_replace(array(".DRUIDE_SEJ.", ".DRUIDE_OQN.", ".DRUIDE_ACE."), array(".ZIN.", ".ZIN.", ".ZIF."), $inZipTargetPath);
creerLegacyInOutDepuisZipsImbriques($druidesZipSource, $inZipTargetPath, array('orig.zip'));
}
// Traitement des fichiers OUT
$druideTypesOutFromCti = array(".DRUIDE_SEJ.", ".DRUIDE_OQN.");
if (striposa($druidesZipSource, $druideTypesOutFromCti)) {
$outZipTargetPath = $tempPathFromCti . DIRECTORY_SEPARATOR . $originalFilename . ".out.zip";
$outZipTargetPath = str_replace(array(".DRUIDE_SEJ.", ".DRUIDE_OQN."), ".ZOU.", $outZipTargetPath);
creerLegacyInOutDepuisZipsImbriques($druidesZipSource, $outZipTargetPath, array('in4ctl.zip', 'data2.zip'));
}
}
// Utils
function endsWith($haystack, $needle)
{
$length = strlen($needle);
return $length > 0 ? substr($haystack, -$length) === $needle : true;
}
function striposa($haystack, array $needles, $offset = 0)
{
foreach ($needles as $needle) {
if (stripos($haystack, $needle, $offset) !== false) {
return true; // stop on first true result
}
}
return false;
}
function creerLegacyInOutDepuisZipsImbriques($zipSourcePath, $zipCiblePath, $fileSuffixesCibles)
{
$zipCible = new ZipArchive();
if ($zipCible->open($zipCiblePath, ZipArchive::CREATE | ZipArchive::OVERWRITE) === false) {
throw new RuntimeException("Erreur dans la création du fichier $zipCiblePath");
}
$contenuInitial = file_get_contents($zipSourcePath);
if ($contenuInitial === false) {
throw new RuntimeException("Impossible de lire le zip source : $zipSourcePath");
}
trouverExtraireFichierZipCible($contenuInitial, $fileSuffixesCibles, $zipCible);
$zipCible->close();
}
function trouverExtraireFichierZipCible($zipContent, $fileSuffixesCibles, $zipCible)
{
// Utilisation de fichiers temporaires et de nom unique pour éviter le problème de path trop long dans windows lorsque l'on dézip
$tmp = tempnam(sys_get_temp_dir(), 'zip_') . '.zip';
file_put_contents($tmp, $zipContent);
$zipTmp = new ZipArchive();
if ($zipTmp->open($tmp) === true) {
for ($i = 0; $i < $zipTmp->numFiles; $i++) {
$nomFichier = $zipTmp->getNameIndex($i);
if (endsWith($nomFichier, '.zip')) {
$contenuZip = $zipTmp->getFromIndex($i);
// Si le nom du zip correspond à un suffixe ciblé
foreach ($fileSuffixesCibles as $suffixe) {
if (endsWith(strtoupper($nomFichier), strtoupper($suffixe))) {
// On traite le zip druide ciblé
extraireFichiersDepuisZipBinaire($contenuZip, $zipCible);
break;
}
}
// Continuer récursivement à parcourir le zip imbriqué
trouverExtraireFichierZipCible($contenuZip, $fileSuffixesCibles, $zipCible);
}
}
$zipTmp->close();
}
if (file_exists($tmp)) {
unlink($tmp);
}
}
function extraireFichiersDepuisZipBinaire($zipData, $zipCible)
{
$tmp = tempnam(sys_get_temp_dir(), 'inner_zip_') . '.zip';
file_put_contents($tmp, $zipData);
$innerZip = new ZipArchive();
if ($innerZip->open($tmp) === true) {
for ($j = 0; $j < $innerZip->numFiles; $j++) {
$nomFichier = $innerZip->getNameIndex($j);
$contenu = $innerZip->getFromIndex($j);
$zipCible->addFromString(basename($nomFichier), $contenu);
}
$innerZip->close();
}
if (file_exists($tmp)) {
unlink($tmp);
}
}