Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[PORTAGE] Gentoo sans Internet (offline-emerge)
View unanswered posts
View posts from last 24 hours

Goto page 1, 2, 3  Next  
Reply to topic    Gentoo Forums Forum Index French
View previous topic :: View next topic  
Author Message
Magic Banana
Veteran
Veteran


Joined: 13 Dec 2005
Posts: 1912
Location: Belo Horizonte, Minas Gerais, Brasil

PostPosted: Mon Nov 06, 2006 5:03 pm    Post subject: [PORTAGE] Gentoo sans Internet (offline-emerge) Reply with quote

Ciao!

Cela fait une dizaine de mois que je suis sans connexion Internet... et pourtant ma Gentoo es à jour ! Mon secret réside en trois petits scripts. Un qui stocke sur un support amovible les fichiers à "fetcher" (que ce soit pour une mise à jour ou une nouvelle installation) : remote-emerge. Un autre qui permet depuis une autre machine (type *NIX mais pas nécessairement Gentoo) de télécharger ces fichiers : remote-fetch. Enfin le troisième script m'installe tout ce que j'ai demandé : homesweethome (si vous avez un meilleur nom... :D ).

Ceci est le comportement de base. Toutefois, ayant un peu d'ambition et bien qu'étant newbie du bash, j'ai voulu ajouter quelques contraintes :
1) remote-emerge peut faire tout ce que fait emerge avec la même syntaxe. Dans le cas où une connexion Internet n'est pas nécessaire à la tâche, remote-emerge l'exécute directement à l'aide d'emerge. Dans l'idéal, l'utilisateur qui serait offline pourrait faire en sorte que emerge soit un alias vers remote-emerge et que les deux autres scripts soit automatiquement lancé au montage du support amovible.
2) Aucune nécessité pour l'utilisateur de se souvenir de ce qu'il a demandé. Autrement dit, lors de l'utilisation de homesweethome, il n'y a qu'à lancer ce script sans aucun argument.
3) Possibilité entre l'utilisation du premier et du troisième script de renoncer facilement à ce que l'on voulait faire. Ainsi si je demande l'installation de kde et finalement change d'avis, je n'ai qu'à supprimer un fichier "kde" sur mon support amovible.
4) Gestion de l'arbre Portage automatique. La commande "emerge --sync" n'est plus nécessaire.
5) Si le périphérique amovible ne peut contenir toutes les sources nécessaire à l'exécutation d'une tâche (d'installation ou de mise à jour), alors le téléchargement des sources se fait en plusieurs aller-retours entre la Gentoo sans Internet et l'autre machine sur Internet. L'installation se fera une fois l'ensemble des sources disponibles.

Pour l'instant ces scripts ne sont pas tout à fait fonctionnels à cause de mes lacunes en bash et de mon impossibilité à les tester facilement (il faudrait pour cela que j'ai un accès Internet chez moi !). Voilà les trois scripts avec en commentaire les choses qui ne fonctionnent pas (BUG) et les choses à faire (TODO).
NB : Les variable PORTDIR, DISTDIR et MOVINGDIR sont à modifier suivant votre installation Gentoo et le répertoire de votre support amovible. Dans mon cas PORTDIR est /usr/portage (installation classique), DISTDIR est /usr/portage/distfiles (installation classique) et MOVINGDIR est /mnt/usb-storage/gentoo/remote-emerge lorsque je suis sur ma Gentoo (script 1 et 3) et /media/usbdisk/gentoo/remote-emerge lorsque je suis sur la machine connectée à Internet (script 2).

remote-emerge:
#!/bin/bash
# Distributed under the terms of the GNU General Public License v2

DISTDIR='/usr/portage/distfiles'
MOVINGDIR='/mnt/usb-storage/gentoo/remote-emerge'

# For any operation which does not require any fetch, use directly emerge
for arg in $*
  do
  case $arg in
      --clean      ) /usr/bin/emerge $* && exit;;
      --depclean   ) /usr/bin/emerge $* && exit;;
      --help       ) echo "remote-emerge uses exactly the same syntax as emerge:" && /usr/bin/emerge $* && exit;;
      --info       ) /usr/bin/emerge $* && exit;;
      --metadata   ) /usr/bin/emerge $* && exit;;
      --pretend    ) /usr/bin/emerge $* && exit;;
      --prune      ) /usr/bin/emerge $* && exit;;
      --regen      ) /usr/bin/emerge $* && exit;;
      --search     ) /usr/bin/emerge $* && exit;;
      --searchdesc ) /usr/bin/emerge $* && exit;;
      --version    ) /usr/bin/emerge $* && exit;;
      -*c*         ) /usr/bin/emerge $* && exit;;
      -*h*         ) echo "remote-emerge uses exactly the same syntax as emerge:" && /usr/bin/emerge $* && exit;;
      -*p*         ) /usr/bin/emerge $* && exit;;
      -*P*         ) /usr/bin/emerge $* && exit;;
      -*s*         ) /usr/bin/emerge $* && exit;;
      -*S*         ) /usr/bin/emerge $* && exit;;
      -*V*         ) /usr/bin/emerge $* && exit;;
  esac
done

# Store a newline in a shell variable (needed by the cut command)
newline='
'

/usr/bin/emerge -fp $* 1> /dev/null 2> ~/.tempfile1

# Strip out fetch-restrict messages, turn spaces into newlines and remove blank lines
cat ~/.tempfile1 | grep -v '^!!!' | cut -d " " -f 1- --output-delim="$newline" | grep -v '^$' | awk -F / '{print $NF" "$0}'z > ~/.tempfile2

rm ~/.tempfile1

# Strip out fetch-restrict messages, turn spaces into newlines and remove blank lines (I found that on a forum and do not really get it)
last=""
while read file url
  do
  if [ "$file" = "$last" ]
      then
      echo $url >> "$MOVINGDIR/urls/$*"
  elif [ ! -f "$DISTDIR/$file" ]
      then
      echo $url >> "$MOVINGDIR/urls/$*"
      last="$file"
  fi
done < ~/.tempfile2

rm ~/.tempfile2

# If DISTDIR already contains everything needed then install
if [ ! -f "$MOVINGDIR/urls/$*" ]
    then
    /usr/bin/emerge $*
fi


remote-fetch:
#!/bin/bash
# Distributed under the terms of the GNU General Public License v2

MOVINGDIR='/media/usbdisk/gentoo/remote-emerge'

# Let's fetch!
for URLlist in "$MOVINGDIR/urls/*"
  do
  wget -nc -nd -P $MOVINGDIR/distfiles -i $URLlist
done
# Every list of URLs is cleaned: the sources which are eventualy fetched lead to the suppression of the related lines
for URLlist in "$MOVINGDIR/urls/*"
  do
  for source in "$MOVINGDIR/distfiles/*"
    do
# BUG: The next line should not work properly since $source contains the full name of the file. I want the part of it after the last '/'. However it seems to work a little bit! (why???)
    sed "/$source/d" $URLlist > $MOVINGDIR/.tempfile
    mv $MOVINGDIR/.tempfile $URLlist
  done
done
# Let's fetch the portage tree
# TODO: Store the date of the last tree that has been fetched to fetch the tree no more than once a day
# TODO: Use the variable GENTOO_MIRRORS and the list of all portage mirrors (in /usr/portage/profile/thirdpartymirrors?)
wget -nc -nd -P $MOVINGDIR http://www.die.unipd.it/pub/Linux/distributions/gentoo-sources/snapshots/portage-latest.tar.bz2


homesweethome:
#!/bin/bash
# Distributed under the terms of the GNU General Public License v2

PORTDIR='/usr/portage'
DISTDIR='/usr/portage/distfiles'
MOVINGDIR='/mnt/usb-storage/gentoo/remote-emerge'

mv $MOVINGDIR/distfiles/* $DISTDIR
# Since most of the amovible media uses VFAT which does not implement permissions and that I love clean permissions :
chmod 644 $DISTDIR/*

for software in $MOVINGDIR/*
  do
  if [ ! -s $software ]
      then
# This is not the distfiles directory
# BUG: The next line simply does not work since $software contains the full name of the file. I want the part of it after the last '/'
      emerge $software
      rm $software
  fi
done
if ( test -f $MOVINGDIR/portage-latest.tar.bz2 )
    then
# There is a new Portage tree to install
# I remove the old one (but keep the precious disfiles!)
# TODO: Use rsync to gain in performance?
    for dir in $PORTDIR/*
      do
      if [ $dir != $DISTDIR ]
     then
     rm -r $dir
      fi
    done
    tar -xvjf $MOVINGDIR/portage-latest.tar.bz2 -C /usr
    emerge --metadata
    rm $MOVINGDIR/portage-latest.tar.bz2
fi


Comme vous pouvez le voir, le problème du moment est comment obtenir la partie d'une variable qui va du dernier '/' à la fin de la variable, autrement dit comment extraire le nom du fichier sans toute l'arborescence. Le pire c'est que je suis certain d'avoir déjà vu une commande (probablement dans core-utils) qui ne sert qu'à cela.

Le reste du travail à faire concerne la synchronisation de l'arbre. Pour l'instant remote-fetch télécharge toujours le snapshot à moins qu'un snapshot téléchargé précédemment soit encore sur le périphérique amovible (et donc pas encore installé). Cela ne me satisfait vraiment pas puisque :
1) Peut-être que le snapshot disponible online est plus récent que celui sur le périphérique amovible (si le périphérique amovible ne touche pas ma Gentoo pendant plus de 24 heures).
2) Peut-être que le snapshot a déjà été téléchargé et décompressé dans la journée. Le retélécharger et le redécompresser est une perte de bande passante et de temps CPU.
Bref, il faudrait écrire (dans un fichier caché sur la clé ?) une date du dernier téléchargement de l'arbre et l'utiliser. Ces deux étapes doivent être effectuées dans remote-fetch.

De plus le mirroir que j'utilise pour télécharger le snapshot est inscrit en dur dans le code. À la place, remote-fetch devrait utiliser la variable GENTOO_PORTAGE et, je crois, $PORTDIR/profile/thirdpartymirrors. Ceci devrait être effectué dans remote-emerge.

En outre je suppose qu'utiliser rsync doit me permettre un gain de performance non négligeable sur la mise à jour de l'arbre. Mais je n'ai jamais utilisé cette commande... :oops:

Enfin, comme vous pouvez le constater, ces scripts nécessitent une certaine structure de fichier sur le périphérique amovible (les répertoires urls et distfiles avec le même père). Ce serait bien de vérifier que cette structure est bien présente et de la créer dans le cas contraire.

Voilà. J'espère qu'une âme généreuse va bien vouloir m'aider à finir tout cela... Je rentre chez moi et ne pourrai donc pas vous lire avant demain matin. :cry:


Last edited by Magic Banana on Fri Dec 01, 2006 9:52 am; edited 3 times in total
Back to top
View user's profile Send private message
truc
Advocate
Advocate


Joined: 25 Jul 2005
Posts: 3199

PostPosted: Mon Nov 06, 2006 6:36 pm    Post subject: Reply with quote

Quote:
Comme vous pouvez le voir, le problème du moment est comment obtenir la partie d'une variable qui va du dernier '/' à la fin de la variable, autrement dit comment extraire le nom du fichier sans toute l'arborescence. Le pire c'est que je suis certain d'avoir déjà vu une commande (probablement dans core-utils) qui ne sert qu'à cela.


j'ai pas tout lu mais ça je peux répondre ;)

Code:
echo $TRUC
/usr/bin/truc
echo ${TRUC##*/}
truc

# de même
echo ${TRUC%/*}
/usr/bin


voili-voilou


Sinon, certains te diront surement que tu peux utiliser dirname, et basename, mais bon..:)


EDIT: ah oui et le "$PORTDIR/profile/thirdpartymirrors" si tu regardes un peu dedans (je ne sais pas si c'est évident remarque.. ) c'est enfait pour permettre de mettre SRI_URI=mirror://gentoo ou sourceforge à la place de gentoo etc.. ainsi, à l'exécution ça pourra essayer les différents serveur de ce "nom/type" jusqu'a ce que le fichier télécharge
_________________
The End of the Internet!
Back to top
View user's profile Send private message
Magic Banana
Veteran
Veteran


Joined: 13 Dec 2005
Posts: 1912
Location: Belo Horizonte, Minas Gerais, Brasil

PostPosted: Tue Nov 07, 2006 10:14 am    Post subject: Reply with quote

Hier soir, en cherchant un peu dans une documentation sur le bash, j'ai aussi trouvé ta solution préférée et l'ai mise dans mes scripts. Il y avait aussi un oublie bête d'un "/urls/" dû au fait que ma précédente version était moins bien organisée (pas de structure particulière).

Je vous redonne les trois scripts corrigés :

remote-emerge:
#!/bin/bash
# Distributed under the terms of the GNU General Public License v2

DISTDIR='/usr/portage/distfiles'
MOVINGDIR='/mnt/usb-storage/gentoo/remote-emerge'

# For any operation which does not require any fetch, use directly emerge
for arg in $*
  do
  case $arg in
      --clean      ) /usr/bin/emerge $* && exit;;
      --depclean   ) /usr/bin/emerge $* && exit;;
      --help       ) echo "remote-emerge uses exactly the same syntax as emerge:" && /usr/bin/emerge $* && exit;;
      --info       ) /usr/bin/emerge $* && exit;;
      --metadata   ) /usr/bin/emerge $* && exit;;
      --pretend    ) /usr/bin/emerge $* && exit;;
      --prune      ) /usr/bin/emerge $* && exit;;
      --regen      ) /usr/bin/emerge $* && exit;;
      --search     ) /usr/bin/emerge $* && exit;;
      --searchdesc ) /usr/bin/emerge $* && exit;;
      --version    ) /usr/bin/emerge $* && exit;;
      -*c*         ) /usr/bin/emerge $* && exit;;
      -*h*         ) echo "remote-emerge uses exactly the same syntax as emerge:" && /usr/bin/emerge $* && exit;;
      -*p*         ) /usr/bin/emerge $* && exit;;
      -*P*         ) /usr/bin/emerge $* && exit;;
      -*s*         ) /usr/bin/emerge $* && exit;;
      -*S*         ) /usr/bin/emerge $* && exit;;
      -*V*         ) /usr/bin/emerge $* && exit;;
  esac
done

# Store a newline in a shell variable (needed by the cut command)
newline='
'

/usr/bin/emerge -fp $* 1> /dev/null 2> ~/.tempfile1

# Strip out fetch-restrict messages, turn spaces into newlines and remove blank lines (I found that on a forum and do not really get it)
cat ~/.tempfile1 | grep -v '^!!!' | cut -d " " -f 1- --output-delim="$newline" | grep -v '^$' | awk -F / '{print $NF" "$0}'z > ~/.tempfile2

rm ~/.tempfile1

# Skip files already in your DISTFILES directory and write the URLs on the amovible device
last=""
while read file url
  do
  if [ "$file" = "$last" ]
      then
      echo $url >> "$MOVINGDIR/urls/$*"
  elif [ ! -f "$DISTDIR/$file" ]
      then
      echo $url >> "$MOVINGDIR/urls/$*"
      last="$file"
  fi
done < ~/.tempfile2

rm ~/.tempfile2

# If DISTDIR already contains everything needed then install
if [ ! -f "$MOVINGDIR/urls/$*" ]
    then
    /usr/bin/emerge $*
fi


remote-fetch:
#!/bin/bash
# Distributed under the terms of the GNU General Public License v2

MOVINGDIR='/media/usbdisk/gentoo/remote-emerge'
GENTOO_MIRRORS='http://www.die.unipd.it/pub/Linux/distributions/gentoo-sources'

# Let's fetch!
for URLlist in "$MOVINGDIR/urls/*"
  do
  wget -nc -nd -P $MOVINGDIR/distfiles -i $URLlist
done
# Every list of URLs is cleaned: the sources which are eventualy fetched lead to the suppression of the related lines
for URLlist in "$MOVINGDIR/urls/*"
  do
  for source in "$MOVINGDIR/distfiles/*"
    do
    sed "/${source##*/}/d" $URLlist > $MOVINGDIR/.tempfile
    mv $MOVINGDIR/.tempfile $URLlist
  done
done
# Let's fetch the portage tree
# TODO: Store the date of the last tree that has been fetched to fetch the tree no more than once a day
for mirror in "$GENTOO_MIRRORS"
  do
  wget -nc -nd -P $MOVINGDIR $mirror/snapshots/portage-latest.tar.bz2
done


homesweethome:
#!/bin/bash
# Distributed under the terms of the GNU General Public License v2

PORTDIR='/usr/portage'
DISTDIR='/usr/portage/distfiles'
MOVINGDIR='/mnt/usb-storage/gentoo/remote-emerge'

mv $MOVINGDIR/distfiles/* $DISTDIR
# Since most of the amovible media uses VFAT which does not implement permissions and that I love clean permissions :
chmod 644 $DISTDIR/*

for software in $MOVINGDIR/urls/*
  do
  if [ ! -s $software ]
      then
# This is not the distfiles directory
      emerge ${software##*/}
      rm $software
  fi
done
if ( test -f $MOVINGDIR/portage-latest.tar.bz2 )
    then
# There is a new Portage tree to install
# I remove the old one (but keep the precious disfiles!)
# TODO: Use rsync to gain in performance?
    for dir in $PORTDIR/*
      do
      if [ $dir != $DISTDIR ]
     then
     rm -r $dir
      fi
    done
    tar -xvjf $MOVINGDIR/portage-latest.tar.bz2 -C /usr
    emerge --metadata
    rm $MOVINGDIR/portage-latest.tar.bz2
fi


En apparence, il n'y a plus de bug. Mais bon... je n'ai pas encore pu tester tout cela ! Si vous avez une Gentoo online, vous m'intéressez ! Bien sûr ce script ne vous est pas destiné, néanmoins vous pouvez sans bouger faire des tests et avez donc un avantage certain sur moi. Il vaut faudra impérativement changer les valeurs des variable PORTDIR, DISTDIR et MOVINGDIR comme je l'ai expliqué dans le premier post de ce thread. Accesoirement vous pouvez aussi changer GENTOO_MIRRORS qui est utilisée pour indiquer par ordre de préférences les mirroirs Gentoo où télécharger le dernier snapshot de l'arbre Portage. Je vous rappelle également que remote-emerge s'utilise exactement comme emerge et que les deux autre scripts s'utilisent sans argument.

Sinon je relance un appel à idées en ce qui concerne les TODO détaillés à la fin de mon précédent post...

J'ai aussi une nouvelle question. J'ai découvert la commande tempfile qui, en gros, permet de créer un fichier temporaire dans à un endroit qui va bien (typiquement /tmp) et sans se soucier d'un problème de redondance de nom. Quelqu'un a déjà utiliser cela. Comment ?

EDIT : N'oubliez pas non plus de créer les deux répertoires urls et distfiles dans $MOVINGDIR !
EDIT2 : Variable GENTOO_MIRRORS pour configurer le ou les mirroirs Gentoo où télécharger le dernier snapshot de l'arbre Portage
Back to top
View user's profile Send private message
Magic Banana
Veteran
Veteran


Joined: 13 Dec 2005
Posts: 1912
Location: Belo Horizonte, Minas Gerais, Brasil

PostPosted: Tue Nov 07, 2006 2:55 pm    Post subject: Reply with quote

Bon... Après test personnel, il manquait quelques guillemets et cela posait problème lorsque remote-emerge est utilisé avec des options comme dans le célèbre (comment ça "pas encore" ?) :
Mettre à jour tout son système sans connexion Internet:
# remote-emerge -uDN world


Je vous redonne les trois scripts et vous invite à relire la fin de ma précédente contribution pour m'aider à les tester.

remote-emerge:
#!/bin/bash
# Distributed under the terms of the GNU General Public License v2

DISTDIR='/usr/portage/distfiles'
MOVINGDIR='/mnt/usb-storage/gentoo/remote-emerge'

# For any operation which does not require any fetch, use directly emerge
for arg in $*
  do
  case $arg in
      --clean      ) /usr/bin/emerge $* && exit;;
      --depclean   ) /usr/bin/emerge $* && exit;;
      --help       ) echo "remote-emerge uses exactly the same syntax as emerge:" && /usr/bin/emerge $* && exit;;
      --info       ) /usr/bin/emerge $* && exit;;
      --metadata   ) /usr/bin/emerge $* && exit;;
      --pretend    ) /usr/bin/emerge $* && exit;;
      --prune      ) /usr/bin/emerge $* && exit;;
      --regen      ) /usr/bin/emerge $* && exit;;
      --search     ) /usr/bin/emerge $* && exit;;
      --searchdesc ) /usr/bin/emerge $* && exit;;
      --version    ) /usr/bin/emerge $* && exit;;
      -*c*         ) /usr/bin/emerge $* && exit;;
      -*h*         ) echo "remote-emerge uses exactly the same syntax as emerge:" && /usr/bin/emerge $* && exit;;
      -*p*         ) /usr/bin/emerge $* && exit;;
      -*P*         ) /usr/bin/emerge $* && exit;;
      -*s*         ) /usr/bin/emerge $* && exit;;
      -*S*         ) /usr/bin/emerge $* && exit;;
      -*V*         ) /usr/bin/emerge $* && exit;;
  esac
done

# Store a newline in a shell variable (needed by the cut command)
newline='
'

/usr/bin/emerge -fp $* 1> /dev/null 2> ~/.tempfile1

# Strip out fetch-restrict messages, turn spaces into newlines and remove blank lines (I found that on a forum and do not really get it)
cat ~/.tempfile1 | grep -v '^!!!' | cut -d " " -f 1- --output-delim="$newline" | grep -v '^$' | awk -F / '{print $NF" "$0}'z > ~/.tempfile2

rm ~/.tempfile1

# Skip files already in your DISTFILES directory and write the URLs on the amovible device
last=""
while read file url
  do
  if [ "$file" = "$last" ]
      then
      echo $url >> "$MOVINGDIR/urls/$*"
  elif [ ! -f "$DISTDIR/$file" ]
      then
      echo $url >> "$MOVINGDIR/urls/$*"
      last="$file"
  fi
done < ~/.tempfile2

rm ~/.tempfile2

# If DISTDIR already contains everything needed then install
if [ ! -f "$MOVINGDIR/urls/$*" ]
    then
    /usr/bin/emerge $*
fi

remote-fetch:
#!/bin/bash
# Distributed under the terms of the GNU General Public License v2

MOVINGDIR='/media/usbdisk/gentoo/remote-emerge'
GENTOO_MIRRORS='http://www.die.unipd.it/pub/Linux/distributions/gentoo-sources'

# Let's fetch!
for URLlist in $MOVINGDIR/urls/*
  do
  wget -nc -nd -P $MOVINGDIR/distfiles -i "$URLlist"
done
# Every list of URLs is cleaned: the sources which are eventualy fetched lead to the suppression of the related lines
for URLlist in $MOVINGDIR/urls/*
  do
  for source in $MOVINGDIR/distfiles/*
    do
    sed "/${source##*/}/d" "$URLlist" > $MOVINGDIR/.tempfile
    mv $MOVINGDIR/.tempfile "$URLlist"
  done
done
# Let's fetch the portage tree
# TODO: Store the date of the last tree that has been fetched to fetch the tree no more than once a day
for mirror in "$GENTOO_MIRRORS"
  do
  wget -nc -nd -P $MOVINGDIR $mirror/snapshots/portage-latest.tar.bz2
done

homesweethome:
#!/bin/bash
# Distributed under the terms of the GNU General Public License v2

PORTDIR='/usr/portage'
DISTDIR='/usr/portage/distfiles'
MOVINGDIR='/mnt/usb-storage/gentoo/remote-emerge'

mv $MOVINGDIR/distfiles/* $DISTDIR
# Since most of the amovible media uses VFAT which does not implement permissions and that I love clean permissions :
chmod 644 $DISTDIR/*

for software in $MOVINGDIR/urls/*
  do
  if [ ! -s "$software" ]
      then
# This is not the distfiles directory
      emerge ${software##*/}
      rm "$software"
  fi
done
if ( test -f $MOVINGDIR/portage-latest.tar.bz2 )
    then
# There is a new Portage tree to install
# I remove the old one (but keep the precious disfiles!)
# TODO: Use rsync to gain in performance?
    for dir in $PORTDIR/*
      do
      if [ $dir != $DISTDIR ]
     then
     rm -r $dir
      fi
    done
    tar -xvjf $MOVINGDIR/portage-latest.tar.bz2 -C /usr
    emerge --metadata
    rm $MOVINGDIR/portage-latest.tar.bz2
fi
Back to top
View user's profile Send private message
Il turisto
l33t
l33t


Joined: 12 May 2004
Posts: 968
Location: Battincourt - Belgique

PostPosted: Tue Nov 07, 2006 4:39 pm    Post subject: Reply with quote

Moi j'utilise tempfile :

comme ceci :

Code:

fichtemp=`tempfile 2>/dev/null` || fichtemp=/tmp/test$$
trap "rm -f $fichtemp" 0 1 2 5 15


Je te laisse le plaisir de comprendre ;-)


edit :

je me demande si dans :

Code:

for arg in $*
  do
  case $arg in
      --clean      ) /usr/bin/emerge $* && exit;;
      --depclean   ) /usr/bin/emerge $* && exit;;
      --help       ) echo "remote-emerge uses exactly the same syntax as emerge:" && /usr/bin/emerge $* && exit;;
      --info       ) /usr/bin/emerge $* && exit;;
      --metadata   ) /usr/bin/emerge $* && exit;;
      --pretend    ) /usr/bin/emerge $* && exit;;
      --prune      ) /usr/bin/emerge $* && exit;;
      --regen      ) /usr/bin/emerge $* && exit;;
      --search     ) /usr/bin/emerge $* && exit;;
      --searchdesc ) /usr/bin/emerge $* && exit;;
      --version    ) /usr/bin/emerge $* && exit;;
      -*c*         ) /usr/bin/emerge $* && exit;;
      -*h*         ) echo "remote-emerge uses exactly the same syntax as emerge:" && /usr/bin/emerge $* && exit;;
      -*p*         ) /usr/bin/emerge $* && exit;;
      -*P*         ) /usr/bin/emerge $* && exit;;
      -*s*         ) /usr/bin/emerge $* && exit;;
      -*S*         ) /usr/bin/emerge $* && exit;;
      -*V*         ) /usr/bin/emerge $* && exit;;
  esac
done


il n'y aurait pas un prob. si je tape ton_script --pretend --search.

Il va executer 2 fois emerge --pretend --search non? à cause du /usr/bin/emerge $*
Back to top
View user's profile Send private message
Magic Banana
Veteran
Veteran


Joined: 13 Dec 2005
Posts: 1912
Location: Belo Horizonte, Minas Gerais, Brasil

PostPosted: Tue Nov 07, 2006 4:59 pm    Post subject: Reply with quote

Je ne suis pas certain de comprendre ce que tu veux dire. Le $* c'est l'ensemble des arguments qui sont passés à remote-emerge. Lorsque la commande demandée ne nécessite pas le réseau (par exemple si je découvre qu'elle contient un --search ou/et un --pretend), je passe le travail à /usr/bin/emerge puis sort avec la commande exit. Donc emerge n'est appelée qu'une seule fois.

Je regarde ce soir comment tu utilises tempfile et vois comment changer mes scripts pour utiliser ça. J'ai également eu il y a quelques minutes, l'idée la plus simple qu'il soit. Pourquoi m'encombrer avec MOVINGDIR dans le script remote-fetch ? Autant mettre ce script dans $MOVINGDIR (celui de remote-emerge) et utiliser des chemins relatifs. Ainsi, nous avons une variable de moins et surtout la possibilité de monter le support amovible où bon nous semble sans avoir à éditer le script.

Je considérerai ces scripts "finaux" une fois que le téléchargement de l'arbre Portage sera fait en vérifiant la date du dernier arbre décompressé et lorsque la structure des répertoires sera créée automatiquement par remote-emerge (si elle n'existe pas déjà). Si vous voulez bidouiller un peu de bash pour m'aider...

Encore une fois, mon gros problème est le temps que me prend les tests (un aller-retour labo-appartement par test). Appel à la population...
Back to top
View user's profile Send private message
ryo-san
l33t
l33t


Joined: 17 Feb 2005
Posts: 729

PostPosted: Tue Nov 07, 2006 5:52 pm    Post subject: Reply with quote

lut

Je suis en train d'etudier tout ca , Je serais plus a l'aise ce soir , mais déja :

Code:

#homesweethome

#pour choper les variables dans /etc/make.conf
PORTDIR=`grep ^PORTDIR= /etc/make.conf | sed 's/PORTDIR=//'`
DISTDIR=`grep ^DISTDIR= /etc/make.conf | sed 's/DISTDIR=//'`

...
tar -xvjfp $MOVINGDIR/portage-latest.tar.bz2 -C /usr #ajout de p pour preserver les permissions
...


EDIT: pour test un rep et le créer:
Code:

if [ ! -d $LEREP ]; then
   mkdir -p -m 755 $LEREP/{dir1,dir2,etc}
fi
Back to top
View user's profile Send private message
Il turisto
l33t
l33t


Joined: 12 May 2004
Posts: 968
Location: Battincourt - Belgique

PostPosted: Wed Nov 08, 2006 8:17 am    Post subject: Reply with quote

Magic Banana wrote:
Je ne suis pas certain de comprendre ce que tu veux dire. Le $* c'est l'ensemble des arguments qui sont passés à remote-emerge. Lorsque la commande demandée ne nécessite pas le réseau (par exemple si je découvre qu'elle contient un --search ou/et un --pretend), je passe le travail à /usr/bin/emerge puis sort avec la commande exit. Donc emerge n'est appelée qu'une seule fois.


Désolé je n'avais pas fais attention au fait que tu faisais exit.

Moi je peux t'aider en bash si tu as des questions mais je n'ai pas le temps de tester des scripts, ... désolé
Back to top
View user's profile Send private message
Magic Banana
Veteran
Veteran


Joined: 13 Dec 2005
Posts: 1912
Location: Belo Horizonte, Minas Gerais, Brasil

PostPosted: Wed Nov 08, 2006 9:56 am    Post subject: Reply with quote

J'ai travaillé un peu hier soir. :wink:
Résultats : Utilisation de tempfile, remote-fetch qui se crée automatiquement avec remote-emerge et qui utilise des chemins relatifs (le périphérique amovible peut maintenant être monté n'importe où sur la machine connectée), utilisation de /etc/make.conf pour trouver les variable PORTDIR, DISTDIR et SYNC (les grands esprits se rencontrent, n'est-ce pas ryo-san ?) et pour définir MOVINGDIR (plus besoin d'éditer les scripts).

Voilà donc les deux scripts (remote-fetch a diisparu dans remote-emerge) :

remote-emerge:
#!/bin/bash
# Distributed under the terms of the GNU General Public License v2

source /etc/make.conf
if [ -z $MOVINGDIR ]
    then
    echo "MOVINGDIR must be the name of a directory on an amovible device. Please set this variable in /etc/make.conf. You can, for instance, adapt the following command:
echo 'MOVINGDIR=\"/media/usbdisk/moving-portage\"' >> /etc/make.conf"
    exit
fi
# The default values for PORTDIR and DISTDIR are the one documented in the man page of make.conf
if [ -z $PORTDIR ]
    then
    PORTDIR="/usr/portage"
fi
if [ -z $DISTDIR ]
    then
    DISTDIR="${PORTDIR}/distfiles"
fi
# For any operation which does not require any fetch, use directly emerge
for arg in $*
  do
  case $arg in
      --clean      ) /usr/bin/emerge $* && exit;;
      --depclean   ) /usr/bin/emerge $* && exit;;
      --help       ) echo "remote-emerge uses exactly the same syntax as emerge:" && /usr/bin/emerge $* && exit;;
      --info       ) /usr/bin/emerge $* && exit;;
      --metadata   ) /usr/bin/emerge $* && exit;;
      --pretend    ) /usr/bin/emerge $* && exit;;
      --prune      ) /usr/bin/emerge $* && exit;;
      --regen      ) /usr/bin/emerge $* && exit;;
      --search     ) /usr/bin/emerge $* && exit;;
      --searchdesc ) /usr/bin/emerge $* && exit;;
      --version    ) /usr/bin/emerge $* && exit;;
      -*c*         ) /usr/bin/emerge $* && exit;;
      -*h*         ) echo "remote-emerge uses exactly the same syntax as emerge:" && /usr/bin/emerge $* && exit;;
      -*p*         ) /usr/bin/emerge $* && exit;;
      -*P*         ) /usr/bin/emerge $* && exit;;
      -*s*         ) /usr/bin/emerge $* && exit;;
      -*S*         ) /usr/bin/emerge $* && exit;;
      -*V*         ) /usr/bin/emerge $* && exit;;
  esac
done
# Store a newline in a shell variable (needed by the cut command)
newline='
'
tempfile1=`tempfile`
/usr/bin/emerge -fp $* 1> /dev/null 2> $tempfile1
tempfile2=`tempfile`
# Strip out fetch-restrict messages, turn spaces into newlines and remove blank lines
cat $tempfile1 | grep -v '^!!!' | cut -d " " -f 1- --output-delim="$newline" | grep -v '^$' | awk -F / '{print $NF" "$0}'z > $tempfile2
rm $tempfile1
if [ -f "$MOVINGDIR/urls/$*" ]
    then
# This command has been invoked earlier without being satisfied, remove the old urls
    rm "$MOVINGDIR/urls/$*"
fi
# Skip files already in your DISTFILES directory and write the URLs on the amovible device
last=""
while read file url
  do
  if [ "$file" = "$last" ]
      then
      echo $url >> "$MOVINGDIR/urls/$*"
  elif [ ! -f "$DISTDIR/$file" ]
      then
      echo $url >> "$MOVINGDIR/urls/$*"
      last="$file"
  fi
done < $tempfile2
rm $tempfile2
if [ -f "$MOVINGDIR/urls/$*" ]
    then
    echo '#!/bin/sh
# Distributed under the terms of the GNU General Public License v2
' > $MOVINGDIR/remote-fetch
    if [ -z $SYNC ]
   then
# The default values for SYNC is the one documented in the man page of make.conf
   echo 'SYNC="http://www.die.unipd.it/pub/Linux/distributions/gentoo-sources"' >> $MOVINGDIR/remote-fetch
    else
   echo "SYNC=$SYNC" >> $MOVINGDIR/remote-fetch
    fi
    echo '
for URLlist in urls/*
  do
  wget -nc -nd -P distfiles -i "$URLlist"
done
# Every list of URLs is cleaned: the sources which are eventualy fetched lead to the suppression of the related lines
for URLlist in urls/*
  do
  for source in distfiles/*
    do
    tempfile=`tempfile`
    sed "/${source##*/}/d" "$URLlist" > $tempfile
    mv $tempfile "$URLlist"
  done
done
# Fetch the Portage tree
# TODO: Store the date of the last tree that has been fetched to fetch the tree no more than once a day
for mirror in "$SYNC"
  do
  wget -nc -nd $mirror/snapshots/portage-latest.tar.bz2
done
' >> $MOVINGDIR/remote-fetch
    chmod 755 $MOVINGDIR/remote-fetch
    echo "From a machine connected to Internet, please run the script remote-fetch present on your amovible device."
else
# $DISTDIR already contains everything needed to proceed. Let's do it!
    /usr/bin/emerge $*
fi

homesweethome:
#!/bin/bash
# Distributed under the terms of the GNU General Public License v2

source /etc/make.conf
if [ -z $MOVINGDIR ]
    then
    echo "MOVINGDIR must be the name of a directory on an amovible device. Please set this variable in /etc/make.conf. You can, for instance, adapt the following command:
echo 'MOVINGDIR=\"/media/usbdisk/moving-portage\"' >> /etc/make.conf"
    exit
fi
# The default values for PORTDIR and DISTDIR are the one documented in the man page of make.conf
if [ -z $PORTDIR ]
    then
    PORTDIR="/usr/portage"
fi
if [ -z $DISTDIR ]
    then
    DISTDIR="${PORTDIR}/distfiles"
fi
mv $MOVINGDIR/distfiles/* $DISTDIR
# Since most of the amovible media uses VFAT which does not implement permissions and that I love clean permissions :
chmod 644 $DISTDIR/*
for software in $MOVINGDIR/urls/*
  do
  if [ ! -s "$software" ]
      then
# This is not the distfiles directory
      emerge ${software##*/}
      rm "$software"
  fi
done
if ( test -f $MOVINGDIR/portage-latest.tar.bz2 )
    then
# There is a new Portage tree to install
# I remove the old one (but keep the precious disfiles!)
# TODO: Use rsync to gain in performance?
    for dir in $PORTDIR/*
      do
      if [ $dir != $DISTDIR ]
     then
     rm -r $dir
      fi
    done
    tar -xvjf $MOVINGDIR/portage-latest.tar.bz2 -C /usr
    emerge --metadata
    rm $MOVINGDIR/portage-latest.tar.bz2
fi


En lisant man make.conf j'ai découvert les arguments par défaut passés à rsync pour synchroniser l'arbre Portage. Je me pencherai sur cela ce soir si j'ai le temps.

Comme vous pouvez le constater, je travaille sur tout sauf sur ce qui est prioritaire (création automatique de l'architecture de répertoires sur le périphérique amovible et, surtout, utilisation de la date du dernier arbre Portage qui fut décompressé). Merci beaucoup à ryo-san, truc et Il turisto pour leur aide.

Est-ce que vous pensez que la structure de répertoires sur le périphérique amovible devrait être supprimée lorsque $MOVINGDIR/urls et $MOVINGDIR/distfiles sont vides ? Ca me semble pas mal (si les répertoires sont là alors remote-fetch devrait être lancé) mais ce comportement peut déstabiliser (le fameux "WTF!!!").

Pour ceux qui veulent tester, cela n'a jamais été aussi simple :
1) Vous copier les deux scripts dans des fichiers que vous rendez exécutables (chmod 755)
2) Vous créez sur le périphérique amovible (ou n'importe où si vous avez Internet et testez mon script par simple bonté :D ) un répertoire qui sera MOVINGDIR et deux sous-répertoires nommés urls et distfiles
3) Vous définissez la variable MOVINGDIR dans /etc/make.conf (si vou ne le faites pas, le script vous le rappellera)
4) Tout est en place ! Vous pouvez (à plusiseurs reprises) utiliser remote-emerge exactement avec la même syntaxe que emerge. Sur la machine connectée vous lancez le script remote-fetch qui est apparu dans $MOVINGDIR. De retour sur votre Gentoo vous lancez homesweethome.

J'attends des retours. Pour être imunisé contre tout problème vous pouvez, avant toute chose, effectuer une sauvegarde de /usr/portage :
Code:
# cp -r /usr/portage ~


Pour ryo-san :
L'option p de tar ne semble pas nécessaire (en tout cas tout va pour le mieux chez moi). En fait, j'ai pris l'exacte commande recommandée par notre Bible à tous.


Last edited by Magic Banana on Wed Nov 08, 2006 10:13 am; edited 1 time in total
Back to top
View user's profile Send private message
Temet
Advocate
Advocate


Joined: 14 Mar 2006
Posts: 2586
Location: 92

PostPosted: Wed Nov 08, 2006 10:12 am    Post subject: Reply with quote

Code:
  case $arg in
      --clean      ) /usr/bin/emerge $* && exit;;
      --depclean   ) /usr/bin/emerge $* && exit;;
      --help       ) echo "remote-emerge uses exactly the same syntax as emerge:" && /usr/bin/emerge $* && exit;;
      --info       ) /usr/bin/emerge $* && exit;;
      --metadata   ) /usr/bin/emerge $* && exit;;
      --pretend    ) /usr/bin/emerge $* && exit;;
      --prune      ) /usr/bin/emerge $* && exit;;
      --regen      ) /usr/bin/emerge $* && exit;;
      --search     ) /usr/bin/emerge $* && exit;;
      --searchdesc ) /usr/bin/emerge $* && exit;;
      --version    ) /usr/bin/emerge $* && exit;;
      -*c*         ) /usr/bin/emerge $* && exit;;
      -*h*         ) echo "remote-emerge uses exactly the same syntax as emerge:" && /usr/bin/emerge $* && exit;;
      -*p*         ) /usr/bin/emerge $* && exit;;
      -*P*         ) /usr/bin/emerge $* && exit;;
      -*s*         ) /usr/bin/emerge $* && exit;;
      -*S*         ) /usr/bin/emerge $* && exit;;
      -*V*         ) /usr/bin/emerge $* && exit;;

Je mettrais ça

Code:
  case "$arg" in
      "--clean" | "-*c*"    ) /usr/bin/emerge $* && exit;;
      "--depclean"  ) /usr/bin/emerge $* && exit;;
      "--help" | "-h" ) echo "remote-emerge uses exactly the same syntax as emerge:" && /usr/bin/emerge $* && exit;;
...


Me demande même si c'est pas possible de faire (je ne connais pas très bien le bash, mais dans les langages courants ça se fait ):

Code:
  case "$arg" in
      "--clean" | "-*c*"    )
      .... (toutes les options qui crachent le même : /usr/bin/emerge $* && exit;;)
      "--version" | "-V"  ) /usr/bin/emerge $* && exit;;
      "--help" | "-h" ) echo "remote-emerge uses exactly the same syntax as emerge:" && /usr/bin/emerge $* && exit;;
Back to top
View user's profile Send private message
Magic Banana
Veteran
Veteran


Joined: 13 Dec 2005
Posts: 1912
Location: Belo Horizonte, Minas Gerais, Brasil

PostPosted: Wed Nov 08, 2006 10:19 am    Post subject: Reply with quote

En gros tu me proposes d'économiser quelques lignes. Mouais... Je vais plutôt me concentrer sur les choses importantes. Merci quand même. :)
Back to top
View user's profile Send private message
Temet
Advocate
Advocate


Joined: 14 Mar 2006
Posts: 2586
Location: 92

PostPosted: Wed Nov 08, 2006 10:22 am    Post subject: Reply with quote

Nan, j'applique le principe de "ce qui est bêtement répété ne doit pas être bêtement répété" :wink:
Back to top
View user's profile Send private message
Magic Banana
Veteran
Veteran


Joined: 13 Dec 2005
Posts: 1912
Location: Belo Horizonte, Minas Gerais, Brasil

PostPosted: Wed Nov 08, 2006 10:28 am    Post subject: Reply with quote

Monsieur Temet travaillerait-il avec des bases de données à longueur de journée ? :P Si tu veux apprendre un peu de bash et éviter la redondance d'information dans remote-emerge, j'intégrerai avec plaisir tes modifications.

Tu peux aussi simplement me faire le plaisir de tester ces scripts et de me dire ce que tu en penses, si tout fonctionne bien, etc.
Moi, insister lourdement ? :lol:
Back to top
View user's profile Send private message
Temet
Advocate
Advocate


Joined: 14 Mar 2006
Posts: 2586
Location: 92

PostPosted: Wed Nov 08, 2006 10:55 am    Post subject: Reply with quote

Ce week end si j'ai le temps ;)

(mais je connais quasi rien en bash moi :x)
Back to top
View user's profile Send private message
Magic Banana
Veteran
Veteran


Joined: 13 Dec 2005
Posts: 1912
Location: Belo Horizonte, Minas Gerais, Brasil

PostPosted: Wed Nov 08, 2006 11:16 am    Post subject: Reply with quote

En étudiant les options par défaut passées à rsync lors d'un emerge --sync, je me suis rendu compte d'un problème dans mon script dû au fait que je n'utilise pas les répertoires /usr/portage/local et /usr/portage/packages. Si vous tenez à ne pas les perdre, faites une sauvegarde de ces répertoires avant de tester homesweethome.

Autre erreur mineure, j'ai mis par défaut le mirroir italien pour télécharger le snapshot de l'arbre Portage...

Dernier problème. Il semblerait que tempfile ne soit pas une option si commune que cela puisque sur la Fedora Core 4 de mon laboratoire, elle n'est pas présente. Je pense donc revenir à l'ancienne méthode pour remote-fetch. Dois-je faire de même pour remote-emerge ou toute gentoo (à jour) a cette commande ?
Back to top
View user's profile Send private message
kaworu
Guru
Guru


Joined: 07 Dec 2005
Posts: 450

PostPosted: Wed Nov 08, 2006 12:30 pm    Post subject: Reply with quote

Code:

default='-*[cpPsSV]*|--clean|--depclean|--info|--metadata|--pretend|--prune|--regen|--search|--searchdesc|--version'
case $arg in
    $default)
        /usr/bin/emerge $*
        exit
        ;;
    -h|--info)
        echo "remote-emerge uses exactly the same syntax as emerge:"
        /usr/bin/emerge $*
        exit
        ;;
esac

ça devrait marcher (je crois hein).
_________________
Macbook
Core2Duo @ 2.0GHz - 1Go RAM - HD 80Go - Intel GMA 945

Gentoo GNU/Linux
~amd64 - 2.6.24-gentoo-r2 - Fluxbox || (KDE && Compiz-Fusion)
Back to top
View user's profile Send private message
Magic Banana
Veteran
Veteran


Joined: 13 Dec 2005
Posts: 1912
Location: Belo Horizonte, Minas Gerais, Brasil

PostPosted: Thu Nov 09, 2006 10:15 am    Post subject: Reply with quote

J'ai encore travaillé ces scripts la nuit dernière. Les deux nouveautés significatives sont :
1) La création automatique de l'arborescence sur le périphérique amovible. (Merci ryo-san)
Remarque : les répertoires urls et distfiles sont présents uniquement si ils sont peuplés.
2) Plus de flexibilté. Les listes d'URLs ne sont plus modifiées par remote-fetch. C'est maintenant homesweethomehome qui s'occupe de cela.
2.1) Si, suite à l'exécutation de remote-fetch, le périphèrique amovible est trop plein (vis à vis d'une autre utilisation), suprimer quelques fichiers dans distfiles ne pose aucun problème.
2.2) Si des sources sont injectées dans distfiles (celui de Gentoo ou celui du support amovible) autrement que par l'utilisation de remote-fetch, l'exécution de homesweethome supprimera les urls qui ne doivent plus être téléchargées et procédera à l'installation (ou la mise à jour) si tous les fichiers requis sont maintenant présents sur la Gentoo.

J'ai aussi fait pas mal de réécriture. J'ai notamment viré le awk que je ne maîtrise pas (copié depuis un autre script) et ai voulu faire plaisir à Temet. :wink: Mais vla ti pas que je lis maintenant une revendication de kaworu pour encore moins de redondance ! :D J'intégrerai cela ce soir... mais il y a plus important : la gestion de la date pour savoir si oui ou non un nouvel instantanné de l'arbre Portage doit être téléchargé. J'attends vos propositions pour un script capable d'identifier le plus récent dans, par exemple, ce répertoire online. Merci par avance pour votre aide sur ce problème (dur dur d'avancer sur cette question sans passer des heures au laboratoires... sur autre chose que mon travail).

Voilà les scripts :
remote-emerge:
#!/bin/bash
# Distributed under the terms of the GNU General Public License v2
# AUTHOR: Magic Banana

source /etc/make.conf
if [ -z "$MOVINGDIR" ]
    then
    echo "MOVINGDIR must be the name of a directory on an amovible device. Please set this variable in /etc/make.conf. You can, for instance, adapt the following command:
echo 'MOVINGDIR=\"/media/usbdisk/moving-portage\"' >> /etc/make.conf"
    exit
fi
# The default values for PORTDIR and DISTDIR are the one documented in the man page of make.conf
if [ -z "$PORTDIR" ]
    then
    PORTDIR="/usr/portage"
fi
if [ -z "$DISTDIR" ]
    then
    DISTDIR="${PORTDIR}/distfiles"
fi
# For any operation which does not require any fetch, use directly emerge
for arg in $*
  do
  case $arg in
      --clean|-*c*      ) /usr/bin/emerge $* && exit;;
      --depclean        ) /usr/bin/emerge $* && exit;;
      --help|-*h*       ) echo "remote-emerge uses exactly the same syntax as emerge:" && /usr/bin/emerge $* && exit;;
      --info            ) /usr/bin/emerge $* && exit;;
      --metadata        ) /usr/bin/emerge $* && exit;;
      --pretend|-*p*    ) /usr/bin/emerge $* && exit;;
      --prune|-*P*      ) /usr/bin/emerge $* && exit;;
      --regen           ) /usr/bin/emerge $* && exit;;
      --search|-*s*     ) /usr/bin/emerge $* && exit;;
      --searchdesc|-*S* ) /usr/bin/emerge $* && exit;;
      --version|-*V*    ) /usr/bin/emerge $* && exit;;
  esac
done
# Create $MOVINGDIR/urls if not already there
if [ ! -d "$MOVINGDIR/urls" ]
    then
    mkdir -p -m 755 "$MOVINGDIR/urls"
fi
if [ ! -x "$MOVINGDIR/remote-fetch" ]
# First run, no date for the last Portage tree installed
# Create $MOVINGDIR/remote-fetch
    then
    echo '#!/bin/sh
# Distributed under the terms of the GNU General Public License v2
' > "$MOVINGDIR/remote-fetch"
    if [ -z "$GENTOO_MIRRORS" ]
   then
   echo 'GENTOO_MIRRORS="http://distro.ibiblio.org/pub/linux/distributions/gentoo"' >> "$MOVINGDIR/remote-fetch"
    else
   echo "GENTOO_MIRRORS=\"$GENTOO_MIRRORS\"" >> "$MOVINGDIR/remote-fetch"
    fi
    echo '
if [ -d urls ]
    then
    if [ ! -d distfiles ]
        then
        mkdir -m 755 distfiles
    fi
    for URLlist in urls/*
      do
      wget -nc -nd -P distfiles -i "$URLlist"
    done
    rmdir distfiles 2> /dev/null
fi
# Fetch the Portage tree
for mirror in "$GENTOO_MIRRORS"
  do
  wget -nc -nd "$mirror/snapshots/portage-latest.tar.bz2"
done
' >> "$MOVINGDIR/remote-fetch"
    chmod 755 "$MOVINGDIR/remote-fetch"
fi
# Store a newline in a shell variable (needed by the cut command)
newline='
'
tempfile1=`tempfile`
/usr/bin/emerge -fp $* 1> /dev/null 2> "$tempfile1"
tempfile2=`tempfile`
# Strip out fetch-restrict messages, turn spaces into newlines and remove blank lines
cat "$tempfile1" | grep -v '^!!!' | cut -d " " -f 1- --output-delim="$newline" | grep -v '^$' > "$tempfile2"
rm "$tempfile1"
if [ -f "$MOVINGDIR/urls/$*" ]
    then
# This command has been invoked earlier without being satisfied, remove the old urls
    rm "$MOVINGDIR/urls/$*"
fi
# Skip files already in $DISTDIR and write the URLs on the amovible device
last=""
while read url
  do
  if [ "${url##*/}" = "$last" ]
      then
      if [ -n "$isabsent" ]
     then
     echo "$url" >> "$MOVINGDIR/urls/$*"
      fi
  else
      if [ -f "$DISTDIR/${url##*/}" ]
     then
     isabsent=""
      else
     echo "$url" >> "$MOVINGDIR/urls/$*"
     isabsent="t"
      fi
      last="${url##*/}"
  fi
done < "$tempfile2"
rm "$tempfile2"
if [ -f "$MOVINGDIR/urls/$*" ]
    then
    echo "From a machine connected to Internet, please run the script remote-fetch present on your amovible device."
else
    rmdir --ignore-fail-on-non-empty "$MOVINGDIR/urls"
# $DISTDIR already contains everything needed to proceed. Let's do it!
    /usr/bin/emerge $*
fi


homesweethome:
#!/bin/bash
# Distributed under the terms of the GNU General Public License v2
# AUTHOR: Magic Banana

source /etc/make.conf
if [ -z "$MOVINGDIR" ]
    then
    echo "MOVINGDIR must be the name of a directory on an amovible device. Please set this variable in /etc/make.conf. You can, for instance, adapt the following command:
echo 'MOVINGDIR=\"/media/usbdisk/moving-portage\"' >> /etc/make.conf"
    exit
fi
# The default values for PORTDIR and DISTDIR are documented in the man page of make.conf
if [ -z "$PORTDIR" ]
    then
    PORTDIR="/usr/portage"
fi
if [ -z "$DISTDIR" ]
    then
    DISTDIR="${PORTDIR}/distfiles"
fi
if [ -d "$MOVINGDIR/distfiles" ]
    then
    mv $MOVINGDIR/distfiles/* "$DISTDIR"
    rmdir "$MOVINGDIR/distfiles"
# I love clean permissions :
    chmod 644 $DISTDIR/*
fi
for URLlist in $MOVINGDIR/urls/*
  do
  tempfile=`tempfile`
  last=""
  while read url
    do
    if [ "${url##*/}" = "$last" ]
   then
   if [ -n "$isabsent" ]
       then
       echo "$url" >> "$tempfile"
   fi
    else
   if [ -f "$DISTDIR/${url##*/}" ]
       then
       isabsent=""
   else
       echo "$url" >> "$tempfile"
       isabsent="t"
   fi
   last="${url##*/}"
    fi
  done < "$URLlist"
  if [ -s "$tempfile" ]
      then
      mv "$tempfile" "$URLlist" 2> /dev/null
  else
      rm "$tempfile"
      emerge ${URLlist##*/}
      rm "$URLlist"
  fi
done
if [ -d "$MOVINGDIR/urls" ]
    then
    rmdir --ignore-fail-on-non-empty "$MOVINGDIR/urls"
fi
if [ -f "$MOVINGDIR/portage-latest.tar.bz2" ]
    then
# There is a new Portage tree to install
# Remove the old one (but keep the precious disfiles!)
# TODO: Use rsync to gain in performance?
    for dir in $PORTDIR/*
      do
      if [ "$dir" != "$DISTDIR" ]
     then
     rm -r "$dir"
      fi
    done
    tar -xvjf "$MOVINGDIR/portage-latest.tar.bz2" -C /usr
    emerge --metadata
    rm "$MOVINGDIR/portage-latest.tar.bz2"
fi
# TODO: Complete the following ($MOVINGDIR/remote-fetch)
# Store the date of the last tree that has been fetched so that:
# a) it is not fetched more than once a day
# b) it is fetched if the newest snapshot is more recent than the one in $MOVINGDIR
echo '#!/bin/sh
# Distributed under the terms of the GNU General Public License v2
' > "$MOVINGDIR/remote-fetch"
if [ -z "$GENTOO_MIRRORS" ]
    then
    echo 'GENTOO_MIRRORS="http://distro.ibiblio.org/pub/linux/distributions/gentoo"' >> "$MOVINGDIR/remote-fetch"
else
    echo "GENTOO_MIRRORS=\"$GENTOO_MIRRORS\"" >> "$MOVINGDIR/remote-fetch"
fi
echo '
if [ -d urls ]
    then
    if [ ! -d distfiles ]
        then
        mkdir -m 755 distfiles
    fi
    for URLlist in urls/*
      do
      wget -nc -nd -P distfiles -i "$URLlist"
    done
    rmdir distfiles 2> /dev/null
fi
# Fetch the Portage tree
for mirror in "$GENTOO_MIRRORS"
  do
  wget -nc -nd "$mirror/snapshots/portage-latest.tar.bz2"
done
' >> "$MOVINGDIR/remote-fetch"
chmod 755 "$MOVINGDIR/remote-fetch"


Pour toi qui veux tester ces scripts :
0) Fais, pour plus de sûreté, une sauvegarde de /usr/portage :
Sauvegarde de /usr/portage par mesure de précaution:
# cp -r /usr/portage ~

1) Copie les deux scripts dans des fichiers et rend les exécutables (chmod 755)
2) Définis la variable MOVINGDIR (répertoire sur le périphérique amovible) dans /etc/make.conf (si tu le fais pas, le script te le rappellera)

Tout est en place ! Tu peux :
a) Sur la gentoo : utiliser (à plusiseurs reprises si tu le souhaites) remote-emerge avec exactement la même syntaxe que emerge.
b) Sur la machine connectée à Internet : exécuter le script remote-fetch qui est apparu dans $MOVINGDIR.
c) Sur la gentoo : exécuter homesweethome.

Tous les cas d'utilisation décris dans la première contribution de ce thread et dans cette présente contribution peuvent être testés.

EDIT : Commentaires moins longs pour éviter tout problème lors de la copie des scripts pour effectuer des tests
EDIT2 : Une ligne de deboguage était restée :oops:
Back to top
View user's profile Send private message
blasserre
Veteran
Veteran


Joined: 10 Feb 2004
Posts: 1362
Location: Lille, Vlaanderen

PostPosted: Thu Nov 09, 2006 2:58 pm    Post subject: Reply with quote

Magic Banana wrote:
J'attends vos propositions pour un script capable d'identifier le plus récent dans, par exemple, ce répertoire online. Merci par avance pour votre aide sur ce problème (dur dur d'avancer sur cette question sans passer des heures au laboratoires... sur autre chose que mon travail).


c'est loin d'être parfait mais j'ai pondu ceci :
Code:
#!/bin/bash

MOVINGDIR="/tmp"
MIRROR="http://www.die.unipd.it/pub/Linux/distributions/gentoo-sources"

for (( i=0 ; i<10 ; i++ ))
do
    if [ -f $MOVINGDIR/portage-`date -d "$i day ago" +%Y%m%d`.tar.bz2 ]
    then
        echo "no new portage tree, try again later"
        exit 0
    fi

    # evite a la suite de planter si il n'y a jamais eu de download
    touch $MOVINGDIR/portage-2006

    # telecharge le dernier, le renomme et touch un fichier qui empeche de le retelecharger
    echo Try to get portage dated : `date -d "$i day ago" +%Y%m%d`
    wget -nc -nd -P $MOVINGDIR $MIRROR/snapshots/portage-`date -d "$i day ago" +%Y%m%d`.tar.bz2 \
        && mv $MOVINGDIR/portage-`date -d "$i day ago" +%Y%m%d`.tar.bz2 $MOVINGDIR/portage-latest.tar.bz2 \
        && rm $MOVINGDIR/portage-2* \
        && touch $MOVINGDIR/portage-`date -d "$i day ago" +%Y%m%d`.tar.bz2 \
        && echo "portage-`date -d "$i day ago" +%Y%m%d` successfully downloaded :)" \
        && exit 0

done
echo "can't find any portage tree from last ten days :("
exit 1


le touch du milieu est particulièrement immonde :oops: mais ça a l'air de rouler....
reste l'intégration avec les mirrors :( un for dans le for ?
_________________
benj

technicien professionnel, ascendant winner
Back to top
View user's profile Send private message
Magic Banana
Veteran
Veteran


Joined: 13 Dec 2005
Posts: 1912
Location: Belo Horizonte, Minas Gerais, Brasil

PostPosted: Thu Nov 09, 2006 4:30 pm    Post subject: Reply with quote

Code:
for (( i=0 ; i<10 ; i++ ))
   do
   wget -nc -nd -P $MOVINGDIR $MIRROR/snapshots/portage-`date -d "$i day ago" +%Y%m%d`.tar.bz2
done


Merci beaucoup blasserre pour cette partie de ton code. C'est tout ce que je recherchais. C'est pas que le reste ne me plaît pas. C'est juste que dans l'idée de mes deux scripts, remote-fetch est généré à la volée et différemment suivant qu'il est généré pour la première fois ou régénéré (La régénération de script à la volée, ça pourrait presqu'être le titre d'une thèse ! :lol: ). Pour ladite regénération je changerai la condition d'arrêt du for pour y mettre la date du dernier arbre décompressé.

En fait je cherchais compliqué (genre, à partir de la liste de tout ce qui est dans le répertoire en ligne, trouver la dernière date). Merci encore blasserre !

Bon... Je viens d'identifier un nouveau problème lié au cas d'utilisation où le périphérique amovible est trop plein pour mener à terme tous les téléchargements (au hasard, je pense à tetex 3 qui est gourmand en place si l'on a qu'une petite clé USB de 128 Mo... :twisted: ). En fait wget ne vérifie pas, avant de commencer le téléchargement, si le disque destinataire contient suffisamment de place. Pourtant il a conscience de la taille du fichier puisqu'il l'écrit avant de commencer le téléchargement. De plus, une fois le périphérique plein, il garde le fichier à moitié téléchargé...

J'ai mon idée sur comment régler ce problème (et qui fonctionne aussi si l'utilisateur décide, pendant le téléchargement, d'écrire sur le périphérique amovible) :
1) Avant de commencer un téléchargement j'écris dans un fichier $MOVINGDIR/partial_download le nom du fichier à télécharger
2) Je télécharge (l'option -c pour continuer un télèchargement avec wget est ajoutée)
3) Si le téléchargement se finit normalement, je supprime l'entrèe dans $MOVINGDIR/partial_download. Sinon, je la laisse et je sors.
4) Lors de l'exécution de homesweethome, seules les sources qui ne sont pas référencées dans $MOVINGDIR/partial_download sont déplacées vers $DISTDIR

Mon problème se situe au point 3 : Comment savoir si wget a téléchargé le fichier jusqu'au bout ? La man page de cette comande n'indique aucune valeur de sortie... À l'aide !
Back to top
View user's profile Send private message
Il turisto
l33t
l33t


Joined: 12 May 2004
Posts: 968
Location: Battincourt - Belgique

PostPosted: Thu Nov 09, 2006 4:34 pm    Post subject: Reply with quote

si tu fais un

Code:

if wget le_fichier;then
   echo le fichier est down
else
  echo le fichier n'est pas down


ca devrais marcher
Back to top
View user's profile Send private message
Magic Banana
Veteran
Veteran


Joined: 13 Dec 2005
Posts: 1912
Location: Belo Horizonte, Minas Gerais, Brasil

PostPosted: Thu Nov 09, 2006 5:14 pm    Post subject: Reply with quote

Je viens d'essayer. Ça ne fonctionne pas, le script continue dans le then dans les deux cas (fichier totalement téléchargé ou non). J'ai également essayer en vain de mettre la commande entre backquotes... Une autre idée ?
Back to top
View user's profile Send private message
blasserre
Veteran
Veteran


Joined: 10 Feb 2004
Posts: 1362
Location: Lille, Vlaanderen

PostPosted: Thu Nov 09, 2006 6:29 pm    Post subject: Reply with quote

Magic Banana wrote:
Je viens d'essayer. Ça ne fonctionne pas, le script continue dans le then dans les deux cas (fichier totalement téléchargé ou non). J'ai également essayer en vain de mettre la commande entre backquotes... Une autre idée ?


tu peux tenter d'utiliser $? qui te donnera la valeur de sortie de la dernière commande

mais ce que tu veux c'est grosso modo ce que fait mon script non ? la partie toute sale avec les && en cascade ^^

sinon c'est l'option -nc qui te mets dans le caca, remplace la par -N
_________________
benj

technicien professionnel, ascendant winner
Back to top
View user's profile Send private message
Magic Banana
Veteran
Veteran


Joined: 13 Dec 2005
Posts: 1912
Location: Belo Horizonte, Minas Gerais, Brasil

PostPosted: Thu Nov 09, 2006 6:57 pm    Post subject: Reply with quote

Non. C'est totalement un autre problème qui ne concerne pas seulement le snapshot de l'arbre Portage mais tous les fichiers téléchargés. Lorsque le périphérique amovible est plein wget s'arrête en laissant un fichier incomplet.

Je viens d'essayer d'utiliser $? pour récupérer la valeur de sortie de wget. Que le téléchargement se termine ou non, c'est 0.

Il faut donc chercher ailleurs que du côté du retour de wget pour savoir si le téléchargement est complet... Mais où ?
Back to top
View user's profile Send private message
blasserre
Veteran
Veteran


Joined: 10 Feb 2004
Posts: 1362
Location: Lille, Vlaanderen

PostPosted: Thu Nov 09, 2006 7:21 pm    Post subject: Reply with quote

chez moi ça marche :P
Quote:

$ wget -nc -nd -P /media/sdc http://rantanplan/gentoo/distfiles/gettext-1.03.tar.gz ; echo "retour >> $?"
--20:18:00-- http://rantanplan/gentoo/distfiles/gettext-1.03.tar.gz
=> `/media/sdc/gettext-1.03.tar.gz'
Résolution de rantanplan... 192.168.0.6
Connexion vers rantanplan|192.168.0.6|:80...connecté.
requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 4,064 (4.0K) [application/x-gzip]

100%[===================>] 4,064 --.--K/s

20:18:00 (193.79 MB/s) - « /media/sdc/gettext-1.03.tar.gz » sauvegardé [4064/4064]

retour >> 0


$ wget -nc -nd -P /media/sdc http://rantanplan/gentoo/distfiles/OOO_2_0_0-core.tar.bz2 ; echo "retour >> $?"
--20:18:19-- http://rantanplan/gentoo/distfiles/OOO_2_0_0-core.tar.bz2
=> `/media/sdc/OOO_2_0_0-core.tar.bz2'
Résolution de rantanplan... 192.168.0.6
Connexion vers rantanplan|192.168.0.6|:80...connecté.
requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 157,108,531 (150M) [application/x-tar]

6% [=====> ] 10,059,776 30.14M/s


Ne peut écrire dans « /media/sdc/OOO_2_0_0-core.tar.bz2 » (Aucun espace disponible sur le périphérique).
retour >> 1

_________________
benj

technicien professionnel, ascendant winner
Back to top
View user's profile Send private message
Magic Banana
Veteran
Veteran


Joined: 13 Dec 2005
Posts: 1912
Location: Belo Horizonte, Minas Gerais, Brasil

PostPosted: Thu Nov 09, 2006 7:23 pm    Post subject: Reply with quote

Serait-ce une bizzarerie de la Fedora Core 4 que j'utilise au laboratoire ?
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index French All times are GMT
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum