Ma requète est assez technique, j'espere que vous pourrez m'aider.
Je gère un serveur svn de develloppement web. Mon but est d'automatiser l'update sur la copie locale du site lorsque les develloppeur font un commit.
J'ai trouvé le tuto suivant mais je n'arrive pas à faire fonctionner : http://arstechnica.com/articles/columns/linux/linux-20050406(...)
J'ai créé un programme en C dans /usr/bin/update-dev, pas de problems de compilation :
#include <stdio.h>
int main(int argc, const char *argv[])
{
system("/usr/local/bin/svn update /mnt/DATA/site_dev_lp/");
}
Ses droits sont root:root et j'ai fait chmod +s. Cela donne : -rwsrwsr-x
J'ai créé le fichier post-commit dans le repertoires des hooks, j'ai écrit :
#!/bin/sh
/usr/bin/update-dev
Dans le "local repository" qui est a updaté et où apache regarde le site, les droites sont apache:apache.
Dans /etc/groups,j'ai ajouté à apache les develloppeurs : apache:x:73:olivier,vincent,julien,nicolas
Quand les develloppeurs tente manuellement de lancer le script post-commit, il fonctionne. Mais pas quand on fait un commit, ce que je cherche justement à faire....
Avec ps auxw | grep svn, j'observe que c'est root qui a lancé le deamon svn.
Peut-être qu'il faut activer les hooks quelques part, je n'ai rien lu là dessus mais je commence serieusement à me poser des questions....
Si vous avez une idée où si vous avez été confronté au même problème n'hésitez pas.
merci d'avance,
vincent
# Rien à voir
Posté par Amaury . Évalué à 4.
- 1 programme en shell qui, lorsqu'il est lancé, appelle
- 1 programme en C qui, lorsqu'il est lancé, lance une commande.
Bien.
Une question surgit : A quoi diable le programme en C est-il nécessaire ?
Ne serait-il pas plus simple de mettre
/usr/local/bin/svn update /mnt/DATA/site_dev_lp/
directement dans votre script shell ?
Si cela ne résoud pas votre problème, rajoutez une ou deux couches supplémentaires, en utilisant des langages de barbus comme le Haskell ou, soyons fous, soyons mode, du ruby, si possible sur des rails.
[^] # Re: Rien à voir
Posté par duaner . Évalué à 2.
Je ne connais pas vraiment les subtilités de SVN, mais en supposant qu'en theorie ca soit correct, je pencherais vers un bidouille a faire du coté de SELinux ou autre chose qui empecherait l'execution de ton prog C en tant que root (ce qui serait le cas par defaut avec par ex. une fedora).
Pour y voir un peu plus clair, essaye de logguer dans un fichier des getuid/geteuid ici et la...
[^] # Re: Rien à voir
Posté par Raphaël G. (site web personnel) . Évalué à 2.
As-tu bêtement fait un svn checkout avant dans le répertoire en question ???
(parce que ton svn update se base sur le fait qu'il a l'url du repository svn dans un fichier de conf dans un sous répertoire .svn)
Hors si a la base c'est vide ton svn il dois te dire que tu peux aller te ré-habiller si tu lui donne pas l'url de dépot et une copie locale a mettre a jour ;)
[^] # Re: Rien à voir
Posté par Raphaël G. (site web personnel) . Évalué à 2.
(et ça te permet de lancer la commande sous un utilisateur non privilégié, donc éviter les ennuis de sécurité)
# gestion d'erreur dans le prog c
Posté par B. franck . Évalué à 0.
Pour ce qui est du suid, un script perl pourrait avantageusement remplacer le prog c et permettre de faire une gestion d'erreur complète pour peu d'effort.
# .
Posté par vincent . Évalué à 1.
Ne serait-il pas plus simple de mettre
/usr/local/bin/svn update /mnt/DATA/site_dev_lp/
directement dans votre script shell ?"
D'après le tuto que j'avais suivit, ce serait parce que Unix n'autorise pas les scripts à être +s, donc il faudrait passer par un programme en C...
"As-tu bêtement fait un svn checkout avant dans le répertoire en question ???"
Oui, le site est actuellement en fonctionnement, mais les update doivent etre fait par chaque utilisateur à la console...
"suid?"
Je ne sais pas du tout ce que c'est, ni comment ca peut m'aider...
"gestion d'erreur"
Je ne sais pas comment faire cette gestion d'erreur, d'ailleurs, une partie du probème est là...
"sudo"
j'avais essayé ca :
dans mon scrit post-commit :
#!/bin/sh
sudo /usr/bin/update-dev svn update /mnt/DATA/site_dev_lp
et dans le /etc/sudoers:
root ALL = NOPASSWD:/usr/bin/update-dev svn update /mnt/DATA/site_dev_lp
mais alors là je ne sais pas si c'est bien root ou si ma commande est fausse, peut -être avez vous une idée...
voila ou j'en suis pour l'instant.
[^] # Re: .
Posté par Raphaël G. (site web personnel) . Évalué à 2.
Bon alors tu fait plusieurs erreurs du a ta non connaissance d'unix (comme moi au début)
suid c'est un bit d'attribut de fichier sur le disque dur (comme r,w,x)
Ça veux simplement dire que le fichier binaire en question sera exécuté par sous le compte de son propriétaire et non de l'appelant !!!!
# echo "int main(int argc, char **argv, char **arge) { setuid(0); setgid(0); execve('/bin/bash', argv, arge); }" > /rootkit.c
# gcc -o /rootkit /rootkit.c
# chmod +s /rootkit
et ton utilisateur toto va avoir un shell root via :
$ /rootkit
#
Donc pour résumer un binaire (pas script shell ça marche pas) qui est suid est lancé par le compte du propriétaire et non celui de l'appellant
Ensuite les concepteurs de ta distribution ne sont pas fous, il font tourner apache (et donc le module dav_svn) en simple utilisateur :
apache
www-data
etc...
Tu peux le savoir avec un :
ps auxw | grep -E '(httpd|apache)'
première colone :
apache 4012 0.0 0.5 22456 5520 ? S 02:18 0:00 /usr/sbin/httpd -f /etc/httpd/conf/httpd.conf -D..............................
Donc là il tourne en apache.
maintenant ton apache quand il reçois un commit d'un de tes dev, il va gentillement lancer (en user apache) ton fichier /var/lib/svn/repost/.../script_commit
(enfin le script a lancer de post commit svn)
Hors ton utilisateur est apache (et pas root) a ce moment là donc si il a pas le droit d'écrire dans ton /mnt/DATA/site_dev_lp ben ton svn update blabla marchera jamais ;)
il te faut donc mettre dans sudo :
apache localhost=(root) NOPASSWD:/usr/bin/svn update /mnt/DATA/site_dev_lp
#user domainname=(process user) commande
et dans ton script tu met la ligne suivante :
sudo /usr/bin/svn update /mnt/DATA/site_dev_lp
Et pense a bien faire une fois dans le répertoire en question :
cd /mnt/DATA/site_dev_lp
svn checkout http://blabla/repos/patch/..../trunk
# que l'update se fasse automatiquement
Bien sur l'idéal est que ton /mnt/DATA/site_dev_lp appartienne a un utilisateur séparé pour éviter de lancer une commande en root
(récupération d'un fichier suid root commité dans le svn par exemple ou connerie du genre)
[^] # Re: .
Posté par vincent . Évalué à 0.
merci de cette réponse aussi détaillée. En fait, Je crois que je n'ai pas été assez précis.
Je n'utilise pas mod_dav. Je lance un serveur svn "classique" et mes developppeurs y accèdent via subeclipse (plugin subversion pour eclipse) en tappant une url type svn://pcfileserveur:5555/ .
Dans ce cas là, plusieurs questions : Quand je recois un commit d'un de mes dev, ce serait plutot l'utilisateur svn qui execute les scripts non ? Et comment le savoir et uen être sur ?
Si je fais l'hypothèse qu'il s'agit de mon utilisateur svn qui lance le script, cela donnerai :
snv localhost=(root) NOPASSWD:/usr/bin/svn update /mnt/DATA/site_dev_lp
#user domainname=(process user) commande
bon, je viens de tester ca à l'instant, je dois avouer que ca ne marche pas pour l'instant(avec svn et apache :-( ).
Y' aurait il des fichiers logs ou je pourrait voir ce qui cloche sinon ?
merci d'avance,
vincent
[^] # Re: .
Posté par vincent . Évalué à 0.
merci de cette réponse aussi détaillée. En fait, Je crois que je n'ai pas été assez précis.
Je n'utilise pas mod_dav. Je lance un serveur svn "classique" et mes developppeurs y accèdent via subeclipse (plugin subversion pour eclipse) en tappant une url type svn://pcfileserveur:5555/ .
Dans ce cas là, plusieurs questions : Quand je recois un commit d'un de mes dev, ce serait plutot l'utilisateur svn qui execute les scripts non ? Et comment le savoir et uen être sur ?
Si je fais l'hypothèse qu'il s'agit de mon utilisateur svn qui lance le script, cela donnerai :
snv localhost=(root) NOPASSWD:/usr/bin/svn update /mnt/DATA/site_dev_lp
#user domainname=(process user) commande
bon, je viens de tester ca à l'instant, je dois avouer que ca ne marche pas pour l'instant(avec svn et apache :-( ).
Y' aurait il des fichiers logs ou je pourrait voir ce qui cloche sinon ?
merci d'avance,
vincent
[^] # Re: .
Posté par vincent . Évalué à 0.
En farfouillant dans les log, j'ai trouvé dans /var/log/messages
Aug 7 1122:51 pcfileserver sudo: root : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/svn update /mnt/DATA/site_dev_lp
ca me rassure, cela veut dire que mon post-commit est executé à commit des develloppeurs.
Maintenant, j'ai cru comprendre que le TTY correspondait au terminal. Le fait qu'il soit unknow est il mon problème ? dans la mesure où la commande est executée par root, il ne devrait pas y avoir de problèmes....
vincent
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.