NxTIC/doc/set_permissions.php

158 lines
3.8 KiB
PHP
Executable File

<?php
define('__BUILD__', dirname(dirname(__FILE__)));
/* CHARGE LA CONFIGURATION DES DROITS
*
*/
function loadConfig(){
$config = json_decode( file_get_contents(__BUILD__.'/doc/permissions.json'), true );
// Si erreur
if( is_null($config) )
return false;
return $config;
}
/* DEFINIT LES DROITS DE MANIERE RECURSIVE
*
*/
function chmodR($dirOrFile, $chmod=null, $chown=null){
/* [0] On vérifie que la ressource existe
=========================================================*/
if( !file_exists($dirOrFile) )
return false;
/* [1] Si c'est un fichier simple ou un dossier
=========================================================*/
echo "$dirOrFile, $chown, $chmod\n";
// On lui donne les droits
if( !is_null($chmod) )
chmod($dirOrFile, intval($chmod, 8) );
// Et un propriétaire
if( !is_null($chown) ){
// On decupde 'owner:group' en un tableau
$owners = explode(':', $chown);
// On définit le propriétaire
chown($dirOrFile, $owners[0]);
// On définit le groupe
chgrp($dirOrFile, $owners[1]);
}
/* [2] Si c'est un dossier
=========================================================*/
if( is_dir($dirOrFile) ){
// On récupère son contenu
$content = scandir($dirOrFile);
// On supprime les valeurs inutiles et on met le chemin en absolu
foreach($content as $i=>$file){
// Si c'est . ou .., on passe au suivant
if( $file == '.' || $file == '..' ){
unset($content[$i]);
continue;
}
// Sinon, on lance recursivement
chmodR( implode('/', array_merge(explode('/', $dirOrFile), [$file])), $chmod, $chown );
}
}
}
/* APPLIQUE LES DROITS SUR UN DOSSIER EN FONCTION DE LA CONFIG
*
*/
function applyPermissions($parent, $children, $permissions){
/* [0] Si une permission est définie, on l'applique
=========================================================*/
/* (0) Si la permission existe et est référencée */
if( isset($children['permissions']) && isset($permissions[$children['permissions']]) ){
// On récupère les permissions
$permission = $permissions[$children['permissions']];
/* (1) Valeur par défaut des propriétaires si n'est pas défini */
if( !isset($permission['chown']) )
$permission['chown'] = null;
/* (2) Valeur par défaut des droits si n'est pas défini */
if( !isset($permission['chmod']) )
$permission['chmod'] = null;
/* (3) Gestion du .htaccess, si défini et si un dossier */
if( isset($permission['.htaccess']) && is_dir($parent) ){
echo 'creating '."$parent/.htaccess\n";
$fht = fopen("$parent/.htaccess", 'w');
fwrite($fht, $permission['.htaccess']);
fclose($fht);
/* (4) On applique les permissions sur le .htaccess (par défaut depuis config) */
chmodR("$parent/.htaccess", $permissions['.htaccess']['chmod'], $permissions['.htaccess']['chown']);
}
/* (5) On retire les permissions de la liste des enfants pour la suite */
unset($children['permissions']);
}
/* [1] Pour chaque enfant, s'il y en a
=========================================================*/
/* (1) On lance récursivement sur tous les enfants */
if( is_array($children) )
foreach($children as $child=>$subChildren)
applyPermissions("$parent/$child", $subChildren, $permissions);
}
/* [1] On charge la configuration
=========================================================*/
$config = loadConfig();
// Si erreur de configuration
if( is_null($config) ){
echo 'Config error';
exit();
}
/* [2] Gestion de 'umask' si défini
=========================================================*/
chdir($config['root']);
if( isset($config['umask']) )
umask( decoct($config['umask']) );
/* [3] On traite toute l'arborescence
=========================================================*/
applyPermissions($config['root'], $config['files'], $config['permissions']);
?>