Droits harmonieux des fichiers d'un serveur


4 novembre 2012

Pour disposer d'un dépôt de fichier possèdant des droit pas trop laxistes et pas trop restrictifs, j'utilise INotify sur mes serveurs web. �a permet de ne pas tout mettre en root (si, si, j'en connais beaucoup qui font ça) et de ne pas tout mettre en 0777 (�a c'est pour Magento et ses problèmes de droits imbéciles). Pour mettre ça en place, il suffit d'utiliser INotify et d'exécuter le script qui suit et tout est magique :)

#!/bin/bash

(inotifywait -mqr --format "%w%f" --excludei ".*\.log" -e create /home/www |
        while read item; do
                echo "$item";
                DirName=`dirname "$item"`;
                #Tous les éléments fils de /home/www doivent avoir www-data comme propriétaire (Apache) et www-coder comme groupe ou le groupe du dossier parent
                ParentGroup=`stat -c '%G' "$DirName"`
                chown www-data:$ParentGroup "$item";
                #
                chmod 0460 "$item";
                #
                [[ -d "$item" ]] && chmod ug+x "$item";
                #Si le dossier parent possède un droit en écriture pour le propriétaire, alors on règle le même droit pour le nouveau fichier (dossiers d'uploads, logs etc)
                IsParentFolderWritable=`stat -c '%A' "$DirName" | cut -c 3`;
                [[ $IsParentFolderWritable == "w" ]] && chmod u+w "$item";
        done
) &

Le résultat ? Dès qu'un fichier est créé dans un (sous-)dossier quelconque de mon espace regroupant tous mes sites web, il possède automatiquement les droits 460. Pour un dossier ça sera 570. Le propriétaire est toujours www-data (L'utilisateur exécutant Apache) et le groupe est toujours www-coder. Ainsi si l'utilisateur crée un fichier avec un touch ou à l'aide d'un IDE comme Kate ou Coda et que cet utilisateur fait partie du groupe www-coder, toutes les opérations sont transparentes et il n'aura pas besoin de faire le moindre chmod/chown. Liberté...

�a n'est pas tout : par défaut Apache ne peut pas modifier un nouveau fichier et ne peut pas non plus créer quoi que ce soit dans un nouveau dossier (le propriétaire, Apache, peut juste lire l'élément). C'est important car ça évite beaucoup de problèmes). Que faire si on a un dossier "upload" dans lequel Apache doit pouvoir écrire des choses ? Il suffit de faire un chmod u+w sur ce dossier et tous les fichiers/dossiers qui seront créés disposeront également de ce droit. Magique je vous dit :)

L'étape d'après est que chaque site sous /home/www puisse avoir un groupe différent et que chaque dossier/fichier créé à l'intérieur au lieu d'être affecté à www-data:www-coder puisse être affecté au groupe de son parent. Ainsi, chaque fichier continuera d'avoir pour propriétaire www-data mais aura codersite1 ou codersite2 comme groupe. La granularité est (?) optimale.

Faire la suite avec ma nouvelle version :
#!/bin/bash

killCommand()       {
    kill $INotifyPID
    rm -f $PipePath
    exit
}

handleItem()        {
    item=$1
    echo "$item";
    DirName=`dirname "$item"`;
    #Tous les éléments fils de /home/www doivent avoir www-data comme propriétaire (Apache) et www-coder comme gro ou le groupe du dossier parent
    ParentGroup=`stat -c '%G' "$DirName"`
    chown www-data:$ParentGroup "$item";
    #
    chmod 0460 "$item";
    #
    [[ -d "$item" ]] && chmod ug+x "$item";
    #Si le dossier parent possède un droit en écriture pour le propriétaire, alors on règle le même droit pour le nouveau fichier
    IsParentFolderWritable=`stat -c '%A' "$DirName" | cut -c 3`;
    [[ $IsParentFolderWritable == "w" ]] && chmod u+w "$item";
}

PipePath="/tmp/adjustWWW.pipe"
mkfifo $PipePath

inotifywait -mqr --format "%w%f" --excludei ".*\.log" -e create,close_write /home/www > $PipePath &
INotifyPID=$!
trap "killCommand" 2 3 15

while read item; do
    handleItem $item &
done < $PipePath

killCommand
Source : http://kerlinux.org/2010/08/utilisation-de-inotifywait-dans-des-scripts-shell/

Coran généré sur OSX


14 octobre 2012

Si l'on veut lire un passage du Coran et qu'on a oublié de le prendre avec soi, il suffit d'avoir un Mac à portée de main et d'exécuter le script Bash suivant :

for i in `seq -w 1 114`; do curl -s "http://www.hisnulmuslim.com/coran/index.php?num_sourate=$i" | iconv -f iso-8859-1 -t utf-8 | php -r '$C=str_replace(Array("\n", "\r", "\t", chr(146)), Array("", "", "", "A".chr(39)), file_get_contents("php://stdin")); preg_match("@&lth1>&lt;span class=\"[^\"]*\">(.*?)&lt;/span>(.*?)&lt;/h1>.*?&lt;em>(.*?)&lt;/em>.*?&lt;p class=\"texte\">(.*?)&lt;/p>@m",$C, $M)."\n"; echo $M[1]."".$M[2]."\n".$M[3]."\n".str_replace("&lt;br /> ", "\n", preg_replace("@&lt;span class=\"num_verset\"[^>]*>([^&lt;]*)&lt;/span>(.*?)@", "$1 : $2", $M[4])); echo "\n";' &gt; sourat$i.txt; cupsfilter -o media=A4 -o landscape -o cpi=14 -o lpi=8 -o page-top=50 -o page-bottom=50 -o page-left=50 -o page-right=50 -o wrap sourat$i.txt &gt; sourat$i.pdf 2&gt;/dev/null; done && /System/Library/Automator/Combine\ PDF\ Pages.action/Contents/Resources/join.py -o coran.pdf sourat*pdf && rm -f sourat*

En plus de produire le Coran suivant le texte de la librairie Tawhid (grande qualité de traduction) ce script illustre les points suivants :

  • Comment générer un PDF à partir de texte brut : cupsfilter, tout simplement.
  • Comment combiner/joindre/concaténer des fichiers PDF sur OSX : le script Automator /System/Library/Automator/Combine\ PDF\ Pages.action.
  • On est aussi confortable sur un Mac que sous Linux : la CLI est au même niveau (Bash 3.X) et les commandes disponibles sont les mêmes. C'est un Unix :)

Bien évidemment je remercie hisnulmuslim.com pour la mise en ligne du texte Français.

Sources :

Moralité : il faudra réaliser une version 2 de ce script afin de générer un PDF encore plus avancé.

Admin : chroot et sftp


26 juillet 2011

Je veux lister plusieurs liens concernant la mise en place d'une jail pour les utilisateurs d'un SFTP en attendant de faire un post complet et sérieux :

  • http://ubuntuforums.org/showthread.php?t=915985
  • http://undeadly.org/cgi?action=article&sid=20080220110039
  • http://www.cyberciti.biz/faq/page/7/
  • http://www.queret.net/blog/post/2010/03/03/Chrooter-une-session-SSH-utilisateur

Admin : Apache et rewrite dans des .htaccess


26 juillet 2011

Je veux lister plusieurs liens concernant du rewrite dans des .htaccess en attendant de faire un post complet et sérieux :

  • http://corz.org/serv/tricks/htaccess2.php
  • http://www.askapache.com/htaccess/mod_rewrite-tips-and-tricks.html

Admin : l'appel rsync le plus fréquent


21 mai 2011

La plupart des rsync que je fais sont semblables à celui qui suit, récursif, il compresse, quand il peut, les données, il ne modifie pas les droits de ce qu'il transfère et il exécute réellement le transfert seulement quand c'est nécessaire (avec une vérification par checksum), le tout avec une transmission des données par SSH. En plus elle se retient facilement :

rsync -carzv --progress --skip-compress='bz2/gz/mp3/jpg/7z/png/rar/zip' --rsh="ssh" SourceDir/ user@hostname:DestDir/
Accueil1 2 3