#!/bin/bash
# Generateur Depot
# Version 0.5d - 24 Juin 2008
# Script sous Licence GPL
# Copyleft 2008 - OmBreNoiRe - http://wiki.ombrenoire.net

################### VALEURS A MODIFIER ######################
# Ce que vous voulez :)
origine="Debian - OmBreNoiRe.net"

# L'adresse http ou se trouve le depot
# Exemple : "debian.ombrenoire.net"
# ou encore "debian.ombrenoire.net/mondepot/"
label="debian.ombrenoire.net"

# Les distributions prisent en charge (separees par 1 espace)
# NB : Il faut que pour chaque distribution, un repertoire
# du meme nom existe a la racine du site.
# Exemple : "sarge etch lenny"
suite="sarge etch"

# Les architectures prises en charge
architectures="i386 all source"

# Components (normalement vous n'avez pas a modifier)
components="main"

#############################################################
##############CODE (NE PAS MODIFIER SANS RAISON)#############
#############################################################

# Si le nombre de parametre n'est pas 1, on affiche l'usage
if [ $# -ne 1 ]
then
    nom=`echo $0 | sed 's/^..//g'`
    echo Usage : $nom \<racine de votre site\> 1>&2
    echo Exemple : $nom /var/www/depot
    exit 1
fi

# On demande la passphrase
echo "Quel est votre passphrase pour la cle GnuPG ?"
stty -echo
read motdepasse
stty echo
touch testgpg.tmp

# On test la passphrase avant de lancer le script
retgpg=`echo $motdepasse | gpg --sign -ba -o testgpg.tmp.gpg --quiet --no-tty --passphrase-fd 0 testgpg.tmp 2>/dev/null ; echo $?`
if [ $retgpg -ne 0 ]
then
    echo ERREUR : la passphrase est incorrecte.
    rm -r testgpg.tmp
    exit 2
fi
rm -f testgpg.tmp testgpg.tmp.gpg

# on va dans le repertoire racine du site (par exemple /var/www/depot)
cd $1
racine=$PWD

# on test si tous les elements de $suite sont bien des repertoires
for rep in $suite
do
  if [ ! -d $racine/$rep ]
  then
      echo "ERREUR : la distribution \"$rep\" n'existe pas, veuillez corriger la variable \"suite\""
      exit 3
  fi
done

# on cree le fichier apt-ftpconfig.tmp.distrib (1 par distrib)
for distrib in $suite
do
echo "
APT::FTPArchive::Release {
  Origin                \"$origine\";
  Label                 \"$label\";
  Suite                 \"$distrib\";
  Architectures         \"$architectures\";
  Components            \"$components\";
}
" > apt-ftpconfig.tmp.$distrib
done

# on efface tous les fichiers (recursif) qui vont etre generes
for rep in $suite
do
  find $rep -name "Release*" -type f -print0 | xargs -0 /bin/rm -f
  find $rep -name "Sources*" -type f -print0 | xargs -0 /bin/rm -f
  find $rep -name "Packages*" -type f -print0 | xargs -0 /bin/rm -f
done

rm -f lst_packages_indiv.tmp 2>/dev/null
rm -f lst_sources_indiv.tmp 2>/dev/null
rm -f add-sources.list.* 2>/dev/null

echo Generation du depot...
# on lance les commandes dans les repertoires de deuxieme niveau (par exemple /var/www/depot/etch/6wall)
lasuite=`echo $suite | sed 's/ /\/|\\.\//g' | sed 's/^/(\\.\//g' | sed 's/$/\/)/g'`
for rep in `find . -depth -maxdepth 2 -mindepth 2 -type d | grep -E $lasuite | grep -v '^\./\..*$' | sed 's/^..//g'`
do
  distrib=`echo $rep | sed 's/\/.*//g'`
  cd $racine/$rep
  apt-ftparchive packages . 2>/dev/null | gzip -f9 > Packages.gz
  zcat Packages.gz | bzip2 > Packages.bz2
  zcat Packages.gz > Packages
  apt-ftparchive sources . 2>/dev/null | gzip -f9 > Sources.gz
  zcat Sources.gz | bzip2 > Sources.bz2
  zcat Sources.gz > Sources
  apt-ftparchive -c $racine/apt-ftpconfig.tmp.$distrib release . > Release.tmp ; mv Release.tmp Release
  echo $motdepasse | gpg --sign -ba -o Release.gpg  --quiet --no-tty --passphrase-fd 0 Release 2>/dev/null
  # on verifie si Packages et Sources n'est pas vide et on affiche la ligne sur /etc/apt/sources.list correspondant
  nbsources=`find . -maxdepth 1 -name "Sources" -size +0c | wc -l`
  nbpackages=`find . -maxdepth 1 -name "Packages" -size +0c | wc -l`
  if [ $nbpackages -ne 0 ]
  then
      echo deb http://$label/$rep ./ >> $racine/lst_packages_indiv.tmp
  fi
  if [ $nbsources -ne 0 ]
  then
      echo \#deb-src http://$label/$rep ./ >> $racine/lst_sources_indiv.tmp
  fi
done

# # on lance les commandes dans les repertoires de deuxieme niveau (par exemple /var/www/depot/etch/6wall)
cd $racine
for rep in $suite
do
  apt-ftparchive packages $rep/ 2>/dev/null | gzip -f9 > $rep/Packages.gz
  zcat $rep/Packages.gz | bzip2 > $rep/Packages.bz2
  zcat $rep/Packages.gz > $rep/Packages
  apt-ftparchive sources $rep/ 2>/dev/null | gzip -f9 > $rep/Sources.gz
  zcat $rep/Sources.gz | bzip2 > $rep/Sources.bz2
  zcat $rep/Sources.gz > $rep/Sources
  apt-ftparchive -c $racine/apt-ftpconfig.tmp.$rep release $rep/ > $rep/Release.tmp ; mv $rep/Release.tmp $rep/Release
  echo $motdepasse | gpg --sign -ba -o $rep/Release.gpg --quiet --no-tty --passphrase-fd 0 $rep/Release 2>/dev/null
  nbsources=`find $rep -maxdepth 1 -name "Sources" -size +0c | wc -l`
  nbpackages=`find $rep -maxdepth 1 -name "Packages" -size +0c | wc -l`
  # Si le repertoire courant n'a pas de paquets (sources et binaires), on efface les fichiers inutiles
  if [ $nbpackages -eq 0 ] && [ $nbsources -eq 0 ]
  then
      find $rep -name "Release*" -type f -print0 | xargs -0 /bin/rm -f
      find $rep -name "Sources*" -type f -print0 | xargs -0 /bin/rm -f
      find $rep -name "Packages*" -type f -print0 | xargs -0 /bin/rm -f 
  fi
  # Si pour le $rep de cette distribution il a bien des paquets
  if [ $nbpackages -ne 0 ] || [ $nbsources -ne 0 ]
  then
      echo Generation de $racine/add-sources.list.$rep...
      echo \# [PAQUET INDIVIDUEL] > add-sources.list.$rep
  fi
  if [ $nbpackages -ne 0 ]
  then
      cat $racine/lst_packages_indiv.tmp | grep /$rep/ >> add-sources.list.$rep
  fi
  if [ $nbsources -ne 0 ]
  then
      echo  >> add-sources.list.$rep
      cat $racine/lst_sources_indiv.tmp | grep /$rep/ >> add-sources.list.$rep
  fi
  if [ $nbpackages -ne 0 ] || [ $nbsources -ne 0 ]
  then
      echo >> add-sources.list.$rep
      echo >> add-sources.list.$rep
      echo \# [TOUS LES PAQUETS DISPONIBLES] >> add-sources.list.$rep
  fi
  if [ $nbpackages -ne 0 ]
  then
      echo deb http://$label $rep/ >> add-sources.list.$rep
  fi
  if [ $nbsources -ne 0 ]
  then
      echo \#deb-src http://$label $rep/ >> add-sources.list.$rep
  fi
  rm -f $racine/apt-ftpconfig.tmp.$rep
done
rm -f $racine/lst_packages_indiv.tmp
rm -f $racine/lst_sources_indiv.tmp

exit 0
