Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/06/2011, à 14:37

Christophe C

Code d'erreur pour installation de dépôt dans un script

Bonjour,

Quand j'essaie d'installer un prog par un sudo apt-get install toto, il y a un code qui est renvoyé dans la  variable d'environnement $?.
Si toto n'existe pas, par exemple, cela renvoie 100.

Pratique dans un script d'installation, pour connaitre les prog dont l'install a planté.

Par contre, quand j'install des PPA (genre sudo add-apt-repository ppa:toto), comment savoir si l'install a marché ou planté ? La variable $? renvoit 0 dans les 2 cas.

Cordialement.


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne

#2 Le 12/06/2011, à 15:07

Levi59

Re : Code d'erreur pour installation de dépôt dans un script

je suis sous debian et je n'ai donc pas le "add-apt-repository" à ma disposition donc je ne connais pas bien le fonctionnement de la commande mais si tu mets un faux ppa, celui-ci est-il ajouté à sources.list ou bien as-tu un message d'erreur indiquant que le dépôt n'existe pas?

Si il est ajouté au "sources.list" alors sans message d'erreur une façon de savoir si l'ajout a fonctionné est de vérifier le contenu du fichier...

Hors ligne

#3 Le 12/06/2011, à 15:16

bishop.sad.clown

Re : Code d'erreur pour installation de dépôt dans un script

Pt-être en clonant la sortie standard de la commande apt-get-repository dans un fichier temporaire et faire une recherche sur ce fichier... Exemple:

FICHIER_TMP="ce que tu veux"  
add-apt-repository ppa:toto | tee $FICHIER_TMP  # ou meme add-apt-repository ppa:toto > $FICHIER_TMP si tu ne veux pas la cloner mais la rediriger.
REZ=$(grep -ci error $FICHIER_TMP)
[ $REZ -eq 0 ] || exit 1

et la $? vari...
C'est une idée de methode... à corriger et adapter...

Dernière modification par bishop.sad.clown (Le 12/06/2011, à 19:09)


@++ , Rob'
→ Trusty x64
Je n'ai pas toujours les réponses mais je les cherche en même temps que vous... =· þ

Hors ligne

#4 Le 13/06/2011, à 08:53

Christophe C

Re : Code d'erreur pour installation de dépôt dans un script

Voila ce que cela donne :

chris@chris-System-Product-Name:~$ sudo add-apt-repository ppa:toto
[sudo] password for chris:
Error reading https://launchpad.net/api/1.0/~toto/+archive/ppa: HTTP Error 404: Not Found

Donc je suppose que la méthode de bishop.sad.clown devrait marcher.

Par contre, bizarrement, il le met bien dans le source list :


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne

#5 Le 13/06/2011, à 12:04

bishop.sad.clown

Re : Code d'erreur pour installation de dépôt dans un script

J'm'en suis appercu hier que la commande add-apt-repositoty ajoute la source tout de même... j'planche dessus ^_^


@++ , Rob'
→ Trusty x64
Je n'ai pas toujours les réponses mais je les cherche en même temps que vous... =· þ

Hors ligne

#6 Le 13/06/2011, à 12:55

pode

Re : Code d'erreur pour installation de dépôt dans un script

En récupérant le code source de add-apt-repository :

$ dpkg -S add-apt-repository
python-software-properties: /usr/bin/add-apt-repository
python-software-properties: /usr/share/man/man1/add-apt-repository.1.gz
$ apt-get source python-software-properties

on voit que :

Fichier add-apt-repository

[...]
    sp = SoftwareProperties()
    line = args[0]
[...]
        if not sp.add_source_from_line(line):
            print _("Error: '%s' invalid" % line)
            sys.exit(1)
        sp.sourceslist.save()

i.e. la commande add-apt-repository va exécuter la méthode "add_source_from_line" de la classe SoftwareProperties avec en entrée, la ligne passée en paramètre.

Fichier softwareproperties/SoftwareProperties.py

  def add_source_from_line(self, line):
[...]
    self.check_and_add_key_for_whitelisted_channels(deb_line)

i.e. la méthode "add_source_from_line" va exécuter la méthode de vérification et ajout de la clé "check_and_add_key_for_whitelisted_channels".

Fichier softwareproperties/SoftwareProperties.py

  def check_and_add_key_for_whitelisted_channels(self, srcline):
[...]
    if parsed_uri.netloc == 'ppa.launchpad.net':
      worker = AddPPASigningKeyThread(parsed_uri.path)
      worker.start()

i.e. la méthode "check_and_add_key_for_whitelisted_channels" lance un thread. Le traitement de vérification et ajout de clé se fait donc en asynchrone.

Fichier softwareproperties/ppa.py

class AddPPASigningKeyThread(Thread):
    " thread class for adding the signing key in the background "
[...]
    def run(self):
        self.add_ppa_signing_key(self.ppa_path)

    def add_ppa_signing_key(self, ppa_path):
[...]
        lp_url = ('https://launchpad.net/api/1.0/~%s/+archive/%s' % (
            owner_name, ppa_name))
        try:
[...]
        except URLError, e:
            print "Error reading %s: %s" % (lp_url, e)
            return False

On retrouve bien l'erreur "Error reading" et l'URL https://launchpad.net/api/1.0/~..........
La méthode renvoie bien dans ce cas d'erreur un booléen False, mais la méthode a été lancée via un Thread et rien n'est prévu dans la méthode "check_and_add_key_for_whitelisted_channels" pour gérer les cas d'erreurs renvoyés par le thread.

Si on revient dans softwareproperties/SoftwareProperties.py, comme on a :

  def add_source_from_line(self, line):
[...]
    self.check_and_add_key_for_whitelisted_channels(deb_line)
    self.sourceslist.list.append(new_deb_entry)
    self.sourceslist.list.append(new_debsrc_entry)

cela signifie qu'on va exécuter, inconditionnellement, les méthodes "append" d'ajout de lignes dans le fichier source.list

Voilà la cause de l'ajout indu des lignes

deb http://ppa.launchpad.net/toto/ppa/ubuntu natty main
deb-src http://ppa.launchpad.net/toto/ppa/ubuntu natty main

Dernière modification par pode (Le 13/06/2011, à 12:56)

Hors ligne

#7 Le 13/06/2011, à 13:12

bishop.sad.clown

Re : Code d'erreur pour installation de dépôt dans un script

Python j'y comprends rien... Par contre en attendant, j'ai pondu ça:

#! /bin/sh

### add-apt-repository control (aar_control.sh)

FICHIER_TMP="/tmp/aar_c.tmp"  
PPA="$1"
PPA_NAME=`echo $PPA | cut -d : -f 2`

if [ $# != 1 ] ; then
    echo "ERREUR de paramètre" ; exit 1
fi
add-apt-repository $PPA | tee $FICHIER_TMP  # ou meme add-apt-repository ppa:toto > $FICHIER_TMP si tu ne veux pas la cloner mais la rediriger.
N_ERR=$(grep -ci "error" $FICHIER_TMP)
if [ $N_ERR -gt 0 ] ; then
    find /etc/apt -type f -name "*$PPA_NAME*" -exec rm {} \;
fi

J'vais essayer de motiver pour assimiler comment fonctionne les scripts python ^_^
= þ

Dernière modification par bishop.sad.clown (Le 13/06/2011, à 13:26)


@++ , Rob'
→ Trusty x64
Je n'ai pas toujours les réponses mais je les cherche en même temps que vous... =· þ

Hors ligne

#8 Le 13/06/2011, à 16:23

Levi59

Re : Code d'erreur pour installation de dépôt dans un script

Si il n'y a pas de rapport de bug à ce sujet sur launchpad, ce serait bien de l'ajouter afin que ces défauts soit corrigés :
- retour du code d'erreur
- ajout inconditionnel dans sources.list

Je n'ai personnellement pas de compte sur ce site mais si l'un de vous en a un, je l'invite à le faire...

Hors ligne

#9 Le 13/06/2011, à 16:30

bishop.sad.clown

Re : Code d'erreur pour installation de dépôt dans un script

Pendant que j'y pense:

 rm $FICHIER_TMP 

à ajouter en fin de script histoire de laisser propre en quittant... = D

Dernière modification par bishop.sad.clown (Le 13/06/2011, à 16:30)


@++ , Rob'
→ Trusty x64
Je n'ai pas toujours les réponses mais je les cherche en même temps que vous... =· þ

Hors ligne

#10 Le 13/06/2011, à 18:19

pode

Re : Code d'erreur pour installation de dépôt dans un script

Levi59 a écrit :

Si il n'y a pas de rapport de bug à ce sujet sur launchpad, ce serait bien de l'ajouter afin que ces défauts soit corrigés :
- retour du code d'erreur
- ajout inconditionnel dans sources.list

Je n'ai personnellement pas de compte sur ce site mais si l'un de vous en a un, je l'invite à le faire...

En fait, il existe déjà un bug sur launchpad qui date de 2009 :
add-apt-repository should return exit code and not adding wrong repositories
mais le bug n'explique pas l'origine du problème.
J'ai rajouté un commentaire. ..

Hors ligne

#11 Le 13/06/2011, à 19:13

Levi59

Re : Code d'erreur pour installation de dépôt dans un script

bishop.sad.clown a écrit :

Python j'y comprends rien... Par contre en attendant, j'ai pondu ça:

...

J'vais essayer de motiver pour assimiler comment fonctionne les scripts python ^_^
= þ

J'aurais plutôt fait comme ça : (la boucle for...done n'est probablement pas nécessaire)

Confere messages suivants

EDIT le find à la fin est je pense une mauvaise idée dans cette forme... si un petit malin appel son ppa "e" par exemple, il va y avoir pas mal de choses supprimée. Quel type de nom de fichier recherche-t-on (un exemple serait pas mal)?

Dernière modification par Levi59 (Le 14/06/2011, à 04:43)

Hors ligne

#12 Le 13/06/2011, à 19:41

pode

Re : Code d'erreur pour installation de dépôt dans un script

Pour générer le nom du fichier

$ sudo add-apt-repository ppa:toto
Error reading https://launchpad.net/api/1.0/~toto/+archive/ppa: HTTP Error 404: Not Found
$ ls /etc/apt/sources.list.d/
[...]
toto-ppa-natty.list

à partir du paramètre passé en entrée de la commande add-apt-repository, il y a plus direct :

$ PPA=ppa:toto
$ echo ${PPA#ppa:}-ppa-$(lsb_release -cs).list
toto-ppa-natty.list

Hors ligne

#13 Le 13/06/2011, à 19:43

Levi59

Re : Code d'erreur pour installation de dépôt dans un script

Qu'est ce que ça donne comme nom dans le cas de ppa de la forme "ppa:blabla/truc"?

En fonction du résultat, il faudra modifier la commande find et la remplacer par un simple rm (pas besoin de find si le nom de fichier est créé toujours de la même façon)

Dernière modification par Levi59 (Le 13/06/2011, à 19:44)

Hors ligne

#14 Le 13/06/2011, à 20:04

pode

Re : Code d'erreur pour installation de dépôt dans un script

Levi59 a écrit :

Qu'est ce que ça donne comme nom dans le cas de ppa de la forme "ppa:blabla/truc"?

ça donne /etc/apt/sources.list.d/toto-truc-natty.list

Mise à jour du script de génération du nom de fichier en fonction du PPA :

$ cat ppa.sh 
#!/bin/bash
nomPPA() {
local PPA=$1
PPA=${PPA#ppa:}
local DIR=${PPA#*/}

if [[ "${PPA}" = "${DIR}" ]]; then
  echo "Fichier : ${PPA}-ppa-$(lsb_release -cs).list"
else
  echo "Fichier : ${PPA%/*}-${DIR}-$(lsb_release -cs).list"
fi
}

nomPPA ppa:toto
nomPPA ppa:toto/truc

qui donne :

$ ./ppa.sh 
Fichier : toto-ppa-natty.list
Fichier : toto-truc-natty.list

Hors ligne

#15 Le 13/06/2011, à 20:30

Levi59

Re : Code d'erreur pour installation de dépôt dans un script

ok merci! du coup on aurait :

Confere messages suivants

Dernière modification par Levi59 (Le 14/06/2011, à 04:42)

Hors ligne

#16 Le 13/06/2011, à 20:44

pode

Re : Code d'erreur pour installation de dépôt dans un script

Levi59 a écrit :
            rm /etc/apt/sources.list.d/${PPA_NAME/\//-}.list

Plutôt :

            rm /etc/apt/sources.list.d/${PPA_NAME/\//-}-${RELEASE}.list
Levi59 a écrit :
            rm /etc/apt/sources.list.d/${PPA_NAME}-${RELEASE}.list

Plutôt :

            rm /etc/apt/sources.list.d/${PPA_NAME}-ppa-${RELEASE}.list

Hors ligne

#17 Le 13/06/2011, à 21:43

bishop.sad.clown

Re : Code d'erreur pour installation de dépôt dans un script

Avec la dernière synthèse des idées faute par Lévi j'ai des erreurs de synthaxes ( ca encore c'pas trop grave ) mais par contre meme avec un ppa valide j'ai ce message;

 Error: need a repository as argument 

et si j'appelle le script sans argument il retourne rien...

Ma maman me disait souvent: " Le mieux est l'ennemi du bien." = D = þ


@++ , Rob'
→ Trusty x64
Je n'ai pas toujours les réponses mais je les cherche en même temps que vous... =· þ

Hors ligne

#18 Le 14/06/2011, à 04:42

Levi59

Re : Code d'erreur pour installation de dépôt dans un script

Pour le test du script, je ne peux pas le faire puisque je n'ai pas "aar" sur debian (ou plutot il ne fonctionne pas, je viens de me rendre compte que la commande existe en unstable mais il y a une erreur losque je la lance) donc des corrections sont surement à faire. Et en effet pour la vérification du nom de fichier, je ne sais pas pourquoi j'ai fait une erreur aussi grossière...

Je viens de voir également que j'avais oublié de spécifier le ppa dans la définition de $ERREUR (C'est sûr que comme ça elle va rouler beaucoup moins bien! ^^). Bref j'ai corrigé et ceci devrait marcher.

donc on reprend :

#!/bin/bash

### add-apt-repository control (aar_control.sh)

RELEASE=$(lsb_release -cs)

for PPA in "${@}"
do
    PPA_NAME=${PPA#*:}

    if [ $# -lt 1 ] ; then
        echo "ERREUR de paramètre" ; exit 1
    fi

    {
        ERROR=$(add-apt-repository ${PPA} 2>&1 >&4 | tee >(grep "Error 404") >&4)
    } 4>&1
    
    echo $ERROR
    
    [ -n "$ERROR" ] && {
        [  -f  "rm /etc/apt/sources.list.d/${PPA_NAME/\//-}-${RELEASE}.list" ] \
        && \
        rm /etc/apt/sources.list.d/${PPA_NAME/\//-}-${RELEASE}.list \
        || \
        rm /etc/apt/sources.list.d/${PPA_NAME}-ppa-${RELEASE}.list
    }
done

Dernière modification par Levi59 (Le 14/06/2011, à 05:00)

Hors ligne

#19 Le 14/06/2011, à 13:28

bishop.sad.clown

Re : Code d'erreur pour installation de dépôt dans un script

Yep ca roule !

juste une chose, il faut sortir

if [ $# -lt 1 ] ; then
        echo "ERREUR de paramètre" ; exit 1
fi

... de la boucle for/done . sinon la condition ne s'applique pas... ^_^

Cette version du script = nickel chez moi = ) Missi M'ssieur = þ

#!/bin/bash

### add-apt-repository control (aar_control.sh)

RELEASE=$(lsb_release -cs)

if [ $# -lt 1 ] ; then
        echo "ERREUR de paramètre" ; exit 1
fi

for PPA in "${@}"
do
    PPA_NAME=${PPA#*:}

    {
        ERROR=$(add-apt-repository ${PPA} 2>&1 >&4 | tee >(grep "Error 404") >&4)
    } 4>&1
    
    echo $ERROR
    
    [ -n "$ERROR" ] && {
        [  -f  "rm /etc/apt/sources.list.d/${PPA_NAME/\//-}-${RELEASE}.list" ] \
        && \
        rm /etc/apt/sources.list.d/${PPA_NAME/\//-}-${RELEASE}.list \
        || \
        rm /etc/apt/sources.list.d/${PPA_NAME}-ppa-${RELEASE}.list
    }
done

Une petite chose encore... Peux-tu me traduire stp : PPA#*:

issue de

  PPA_NAME=${PPA#*:} 

= /

Dernière modification par bishop.sad.clown (Le 14/06/2011, à 14:29)


@++ , Rob'
→ Trusty x64
Je n'ai pas toujours les réponses mais je les cherche en même temps que vous... =· þ

Hors ligne

#20 Le 14/06/2011, à 14:12

FRUiT

Re : Code d'erreur pour installation de dépôt dans un script

Man bash : chapitre parameter expansion.


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne

#21 Le 14/06/2011, à 14:27

bishop.sad.clown

Re : Code d'erreur pour installation de dépôt dans un script

@FRUiT : Merki = ) j'y cours de ce pas !


@++ , Rob'
→ Trusty x64
Je n'ai pas toujours les réponses mais je les cherche en même temps que vous... =· þ

Hors ligne

#22 Le 14/06/2011, à 15:00

FRUiT

Re : Code d'erreur pour installation de dépôt dans un script

D'ailleurs regarde aussi le man dash (même chapitre), car ses possibilités en développement de paramètres sont bien moindres.


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne