Forum Programmation.python Fabric inclure while dans un run (Résolu)

Posté par . Licence CC by-sa.
0
2
fév.
2016

Bonjour à tous,

Le contexte nous devons modifier l'ensemble des vhost en ajoutant un nouveau paramètre SSL sur l'ensemble de nos serveurs.
Fabric fonctionne est très utile mais là je bloque.

Nous essayons de faire une commande sur fabric dont je ne trouve pas la solution et je ne suis pas sûr que cela soit réalisable depuis fabric.

la commande que nous souhaitont exécuter est la suivante:

find /tmp/ -type f -name '*.foo.fr' -print0| while IFS= read -r -d '' filename; do sed -i 's/<\/VirtualHost>/SSL xxxx\n<\/VirtualHost>/' $filename; done

sur bash pas de problème sa fonctionne en revanche sur fabric lors de l'exécution nous avons les messages suivant

[localhost] sudo: find /tmp/ -type f -name *.cacom.fr -print0| while IFS= read -r -d filename; do sed -i s/<\/VirtualHost>/SSL xxxx\n<\/VirtualHost>/ $filename; done
[localhost] out: sudo password:
[localhost] out: /bin/bash: /VirtualHost: Aucun fichier ou dossier de ce type
[localhost] out:

Warning: sudo() received nonzero return code 1 while executing 'find /tmp/ -type f -name *.cacom.fr -print0| while IFS= read -r -d filename; do sed -i s/<\/VirtualHost>/SSL xxxx\n<\/VirtualHost>/ $filename; done'!

Bizarement il est indiqué qu'il ne trouve pas /VirtualHost et pourtant c'est pas ce qui est demandé

Voici le bout de mon programme
sudo('find /tmp/ -type f -name ''*.foo.fr'' -print0| while IFS= read -r -d '' filename; do sed -i ''s/<\/VirtualHost>/SSL xxxx\n<\/VirtualHost>/'' $filename; done')

Nous avons essayé différentes syntaxes

sudo('find /tmp/ -type f -name ''*.foo.fr'' -print0| while IFS= read -r -d '' filename; do sed -i ''s/<\/VirtualHost>/SSL xxxx\\n<\/VirtualHost>/'' $filename; done')

sudo('find /tmp/ -type f -name ''*.foo.fr'' -print0| while IFS= read -r -d '' filename; do sed -i ''s/<\/VirtualHost>/SSL xxxx\n<\/VirtualHost>/'' $filename; done').succeeded

sudo('find /tmp/ -type f -name ''*.foo.fr'' -print0| while read -r -d '' filename; do sed -i ''s/<\/VirtualHost>/SSL xxxx\n<\/VirtualHost>/'' $filename; done')

sans succès

Votre aide est la bienvenue ;-)

  • # Échappement

    Posté par . Évalué à 1.

    Ça ressemble fort à un échappement des guillemets,
    j'ai cherché 30sec (je connais pas Fabric) mais peut-êre que ces liens pourront aider:
    * [Fab-user] Problems escaping double and single quotes within run()
    * Bug when scaping quotes in sed #567

  • # quote quote quotek

    Posté par (page perso) . Évalué à 2.

    As-tu tenté?
    sudo("""find /tmp/ -type f -name '*.foo.fr' -print0| while IFS= read -r -d '' filename; do sed -i 's/<\/VirtualHost>/SSL xxxx\n<\/VirtualHost>/' $filename; done""")

    Voir forcer en "raw string"
    sudo(r"""find /tmp/ -type f -name '*.foo.fr' -print0| while IFS= read -r -d '' filename; do sed -i 's/<\/VirtualHost>/SSL xxxx\n<\/VirtualHost>/' $filename; done""")

    Is it a Bird? Is it a Plane?? No, it's Super Poil !!!

    • [^] # Re: quote quote quotek

      Posté par . Évalué à 1.

      Pour la première méthode sa ne fonctionne pas
      Message d'exécution fabric.
      Warning: sudo() received nonzero return code 1 while executing 'find /tmp/ -type f -name '*.cacom.fr' -print0| while IFS= read -r -d '' filename; do sed -i 's/<\/VirtualHost>/SSL xxxx
      <\/VirtualHost>/' $filename; done'!

      En revanche avec la seconde ligne sa fonctionne parfaitement

      sudo(r"""find /tmp/ -type f -name '*.foo.fr' -print0| while IFS= read -r -d '' filename; do sed -i 's/<\/VirtualHost>/SSL xxxx\n<\/VirtualHost>/' $filename; done""")

      Merci!

  • # un run = une action

    Posté par . Évalué à 1.

    Bonjour,

    Fabric inclu une fonction sed, deja pourquoi ne pas l'utiliser ?
    Ensuite, pourquoi tout mettre dans un seul run et ne pas découper plus logiquement la tâche ?

    from fabric.contrib.files import sed
    filelist = sudo('find /tmp/ -type f -name ''*.foo.fr'' -print')
    for f in filelist.splitlines():
      sed(f, "<\/VirtualHost>", "SSL xxxx\n<\/VirtualHost>", use_sudo=True)

    Dire que vous vous n'en avez rien à faire de la vie privée parce que vous n'avez rien à cacher, c'est comme dire que vous n'en avez rien à faire de la liberté d'expression parce que vous n'avez rien à dire. Edward Snowden

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.