#!/bin/bash #Copyright 2004, William Stearns #Released under the GPL #Version 1.0 Usage () { echo "Usage:" echo "$0 /full/path/to/top/level/yum/ arch [arch]... [module]... [urltop]..." echo echo '/full/path/to/top/level/yum/ is the top level, writable, directory' echo 'where all files will live.' echo echo 'arch is one of fc_1_i386, fc_2_i386, fc_1_x86_64, fc_2_x86_64, or ' echo 'allarch.' echo echo 'module is one of atrpms, ccrma, core, dag, freshrpms, updates,' echo 'wstearns, or allmodules.' echo echo 'urltop is the start of the URL clients would need to type in to get to' echo 'these files, such as ftp://ftp.server/pub/ , http://web.server/mirror/ ,' echo 'or file:///mnt/nfsmirror/yum/ . Whatever you specify should have the' echo 'fedora directory immediately inside it. Multiple entries are fine; ' echo 'the most preferred url should come first and continue to less preferred' echo 'urls.' } randomof () { #Returns one of the parameters on the command line, picked at random #Sample call: echo `randomof Alan Bob Charlie Dave` declare -a ParamArray ParamCount=0 while [ -n "$1" ]; do ParamCount=$[ $ParamCount + 1 ] ParamArray[$ParamCount]="$1" shift done if [ "$ParamCount" -eq 0 ]; then #echo "No params to choose from" >&2 return fi RandChoice=$[ $RANDOM % $ParamCount + 1 ] #echo Returning $RandChoice out of $ParamCount >&2 echo "${ParamArray[$RandChoice]}" } requireutil () { while [ -n "$1" ]; do if ! type -path "$1" >/dev/null 2>/dev/null ; then echo Missing utility "$1". Please install it. >&2 return 1 #False, app is not available. fi shift done return 0 #True, app is there. } #End of requireutil requireutil cat createrepo mkdir rm rsync yum-arch || exit 1 if [ -z "$1" ]; then Usage exit 1 fi while [ -n "$1" ]; do case "$1" in allarch) fc_1_i386='fc_1_i386' fc_2_i386='fc_2_i386' fc_1_x86_64='fc_1_x86_64' fc_2_x86_64='fc_2_x86_64' ;; allmodules) ModList="atrpms ccrma core freshrpms updates wstearns" ;; fc_1_i386) fc_1_i386='fc_1_i386' ;; fc_2_i386) fc_2_i386='fc_2_i386' ;; fc_1_x86_64) fc_1_x86_64='fc_1_x86_64' ;; fc_2_x86_64) fc_2_x86_64='fc_2_x86_64' ;; atrpms|ccrma|core|dag|freshrpms|updates|wstearns) ModList="$ModList $1" ;; fedora) ModList="$ModList core updates" fc_1_i386='fc_1_i386' fc_2_i386='fc_2_i386' fc_1_x86_64='fc_1_x86_64' fc_2_x86_64='fc_2_x86_64' ;; file://*|http://*|ftp://*) URLTop="$URLTop $1" ;; /*) if [ -z "$TopDir" ]; then TopDir="$1" else echo "One of \"$TopDir\" or \"$1\" is unknown, or top level directory" echo "is being defined twice. Exiting." exit 1 fi ;; *) echo "Unknown param $1. Exiting" exit 1 ;; esac shift done if [ -z "$fc_1_i386$fc_2_i386$fc_1_x86_64$fc_2_x86_64" ]; then echo "No architecture specified. To get all, specify \"allarch\" on the command line. Exiting." exit 1 fi if [ -z "$URLTop" ]; then URLTop="file://$TopDir" fi if [ -z "$ModList" ]; then ModList="atrpms ccrma core dag freshrpms updates wstearns" fi echo "Requested modules: $ModList" echo "Requested architectures: $fc_1_i386 $fc_2_i386 $fc_1_x86_64 $fc_2_x86_64" echo "Top Level directory: $TopDir (also accessible as $URLTop)" if [ ! -d $TopDir ]; then mkdir --parents "$TopDir" fi if ! cd "$TopDir" ; then echo "Failed to changed to Top Level directory $TopDir. Exiting." exit 1 fi LOCKFILE=$TopDir/yum-pull.lock [ -f "$LOCKFILE" ] && exit 0 trap "rm -f $LOCKFILE" EXIT touch $LOCKFILE renice +15 -p $$ >/dev/null 2>&1 #Do not re-enable --delete without testing. At one point, any --delete wiped out the other respositories. It _shouldn't_ now. #RsyncParams=" -a -q -L -H --exclude='*.src.rpm' --exclude=debug/ --exclude=headers/ --exclude=repodata/ --exclude=SRPMS --delete --delete-after " RsyncParams=" -a -q -L -H --exclude='*.src.rpm' --exclude=debug/ --exclude=headers/ --exclude=repodata/ --exclude=SRPMS " for ModuleName in $ModList ; do cd "$TopDir" echo "Downloading files for $ModuleName" case "$ModuleName" in atrpms) SubDirs='*/*/*/*/atrpms' URLBottom='fedora/linux/$releasever/$basearch/atrpms' Name='Fedora Linux $releasever - $basearch - atrpms' #It appears x86_64 is only available on fc2. [ -n "$fc_1_i386" ] && mkdir -p "$TopDir"/fedora/linux/1/i386/$ModuleName/packages/ [ -n "$fc_2_i386" ] && mkdir -p "$TopDir"/fedora/linux/2/i386/$ModuleName/packages/ #[ -n "$fc_1_x86_64" ] && mkdir -p "$TopDir"/fedora/linux/1/x86_64/$ModuleName/packages/ [ -n "$fc_2_x86_64" ] && mkdir -p "$TopDir"/fedora/linux/2/x86_64/$ModuleName/packages/ Source=`randomof 'rsync.hrz.tu-chemnitz.de::ftp/pub/linux/ATrpms/'` echo "Pulling from $Source" [ -n "$fc_1_i386" ] && rsync $RsyncParams $Source/fedora/1/en/i386/RPMS.at-good/* "$TopDir/fedora/linux/1/i386/$ModuleName/packages/" [ -n "$fc_1_i386" ] && rsync $RsyncParams $Source/fedora/1/en/i386/RPMS.at-stable/* "$TopDir/fedora/linux/1/i386/$ModuleName/packages/" # [ -n "$fc_1_i386" ] && rsync $RsyncParams $Source/fedora/1/en/i386/RPMS.at-bleeding/* "$TopDir/fedora/linux/1/i386/$ModuleName/packages/" # [ -n "$fc_1_i386" ] && rsync $RsyncParams $Source/fedora/1/en/i386/RPMS.at-testing/* "$TopDir/fedora/linux/1/i386/$ModuleName/packages/" [ -n "$fc_2_i386" ] && rsync $RsyncParams $Source/fedora/2/en/i386/RPMS.at-good/* "$TopDir/fedora/linux/2/i386/$ModuleName/packages/" [ -n "$fc_2_i386" ] && rsync $RsyncParams $Source/fedora/2/en/i386/RPMS.at-stable/* "$TopDir/fedora/linux/2/i386/$ModuleName/packages/" # [ -n "$fc_2_i386" ] && rsync $RsyncParams $Source/fedora/2/en/i386/RPMS.at-bleeding/* "$TopDir/fedora/linux/2/i386/$ModuleName/packages/" # [ -n "$fc_2_i386" ] && rsync $RsyncParams $Source/fedora/2/en/i386/RPMS.at-testing/* "$TopDir/fedora/linux/2/i386/$ModuleName/packages/" [ -n "$fc_2_x86_64" ] && rsync $RsyncParams $Source/fedora/2/en/x86_64/RPMS.at-good/* "$TopDir/fedora/linux/2/x86_64/$ModuleName/packages/" [ -n "$fc_2_x86_64" ] && rsync $RsyncParams $Source/fedora/2/en/x86_64/RPMS.at-stable/* "$TopDir/fedora/linux/2/x86_64/$ModuleName/packages/" # [ -n "$fc_2_x86_64" ] && rsync $RsyncParams $Source/fedora/2/en/x86_64/RPMS.at-bleeding/* "$TopDir/fedora/linux/2/x86_64/$ModuleName/packages/" # [ -n "$fc_2_x86_64" ] && rsync $RsyncParams $Source/fedora/2/en/x86_64/RPMS.at-testing/* "$TopDir/fedora/linux/2/x86_64/$ModuleName/packages/" ;; ccrma) SubDirs='*/*/*/*/ccrma' URLBottom='fedora/linux/$releasever/$basearch/ccrma' Name='Fedora Linux $releasever - $basearch - ccrma' #No apparent x86_64 at the moment [ -n "$fc_1_i386" ] && mkdir -p "$TopDir"/fedora/linux/1/i386/$ModuleName/packages/ [ -n "$fc_2_i386" ] && mkdir -p "$TopDir"/fedora/linux/2/i386/$ModuleName/packages/ #[ -n "$fc_1_x86_64" ] && mkdir -p "$TopDir"/fedora/linux/1/x86_64/$ModuleName/packages/ #[ -n "$fc_2_x86_64" ] && mkdir -p "$TopDir"/fedora/linux/2/x86_64/$ModuleName/packages/ [ -n "$fc_1_i386" ] && rsync $RsyncParams ftp.upjs.sk::ftp/pub/mirrors/planet.ccrma/1/i386/* "$TopDir/fedora/linux/1/i386/$ModuleName/packages/" [ -n "$fc_2_i386" ] && rsync $RsyncParams ftp.upjs.sk::ftp/pub/mirrors/planet.ccrma/2/i386/* "$TopDir/fedora/linux/2/i386/$ModuleName/packages/" ;; core) SubDirs='*/*/*/*/core' URLBottom='fedora/linux/$releasever/$basearch/core' Name='Fedora Linux $releasever - $basearch - core' [ -n "$fc_1_i386" ] && mkdir -p "$TopDir"/fedora/linux/1/i386/$ModuleName/packages/ [ -n "$fc_2_i386" ] && mkdir -p "$TopDir"/fedora/linux/2/i386/$ModuleName/packages/ [ -n "$fc_1_x86_64" ] && mkdir -p "$TopDir"/fedora/linux/1/x86_64/$ModuleName/packages/ [ -n "$fc_2_x86_64" ] && mkdir -p "$TopDir"/fedora/linux/2/x86_64/$ModuleName/packages/ Source=`randomof 'mirror.linux.duke.edu::fedora-linux-core/' 'distro.ibiblio.org::fedora-linux-core/' 'mirror.hiwaay.net::fedora-linux-core/' 'rpmfind.net::linux/fedora/core/' 'rsync.gtlib.cc.gatech.edu::fedora-linux-core/'` echo "Pulling from $Source" [ -n "$fc_1_i386" ] && rsync $RsyncParams "$Source/1/i386/os/Fedora/RPMS/" "$TopDir/fedora/linux/1/i386/$ModuleName/packages/" [ -n "$fc_2_i386" ] && rsync $RsyncParams "$Source/2/i386/os/Fedora/RPMS/" "$TopDir/fedora/linux/2/i386/$ModuleName/packages/" [ -n "$fc_1_x86_64" ] && rsync $RsyncParams "$Source/1/x86_64/os/Fedora/RPMS/" "$TopDir/fedora/linux/1/x86_64/$ModuleName/packages/" [ -n "$fc_2_x86_64" ] && rsync $RsyncParams "$Source/2/x86_64/os/Fedora/RPMS/" "$TopDir/fedora/linux/2/x86_64/$ModuleName/packages/" ;; dag) SubDirs='*/*/*/*/dag' URLBottom='fedora/linux/$releasever/$basearch/dag' Name='Fedora Linux $releasever - $basearch - dag' #x86_64 is fc2 only [ -n "$fc_1_i386" ] && mkdir -p "$TopDir"/fedora/linux/1/i386/$ModuleName/packages/ [ -n "$fc_2_i386" ] && mkdir -p "$TopDir"/fedora/linux/2/i386/$ModuleName/packages/ #[ -n "$fc_1_x86_64" ] && mkdir -p "$TopDir"/fedora/linux/1/x86_64/$ModuleName/packages/ [ -n "$fc_2_x86_64" ] && mkdir -p "$TopDir"/fedora/linux/2/x86_64/$ModuleName/packages/ Source=`randomof 'apt.sw.be::pub/freshrpms/pub/dag/' 'ftp.heanet.ie::mirrors/ftp.freshrpms.net/pub/dag/'` echo "Pulling from $Source" [ -n "$fc_1_i386" ] && rsync $RsyncParams "$Source/fedora/1/en/i386/RPMS.dag/" "$TopDir/fedora/linux/1/i386/$ModuleName/packages/" [ -n "$fc_2_i386" ] && rsync $RsyncParams "$Source/fedora/2/en/i386/RPMS.dag/" "$TopDir/fedora/linux/2/i386/$ModuleName/packages/" [ -n "$fc_2_x86_64" ] && rsync $RsyncParams "$Source/fedora/2/en/x86_64/RPMS.dag/" "$TopDir/fedora/linux/2/x86_64/$ModuleName/packages/" ;; freshrpms) SubDirs='*/*/*/*/freshrpms' URLBottom='fedora/linux/$releasever/$basearch/freshrpms' Name='Fedora Linux $releasever - $basearch - freshrpms' [ -n "$fc_1_i386" ] && mkdir -p "$TopDir"/fedora/linux/1/i386/$ModuleName/packages/ [ -n "$fc_2_i386" ] && mkdir -p "$TopDir"/fedora/linux/2/i386/$ModuleName/packages/ [ -n "$fc_1_x86_64" ] && mkdir -p "$TopDir"/fedora/linux/1/x86_64/$ModuleName/packages/ [ -n "$fc_2_x86_64" ] && mkdir -p "$TopDir"/fedora/linux/2/x86_64/$ModuleName/packages/ Source=`randomof 'rsync.freshrpms.net::freshrpms/' 'apt.sw.be::pub/freshrpms/pub/freshrpms/' 'ftp.heanet.ie::mirrors/ftp.freshrpms.net/pub/freshrpms/'` echo "Pulling from $Source" [ -n "$fc_1_i386" ] && rsync $RsyncParams "$Source/fedora/linux/1/*/*.rpm" "$TopDir/fedora/linux/1/i386/$ModuleName/packages/" --exclude='*.x86_64.*' [ -n "$fc_2_i386" ] && rsync $RsyncParams "$Source/fedora/linux/2/*/*.rpm" "$TopDir/fedora/linux/2/i386/$ModuleName/packages/" --exclude='*.x86_64.*' [ -n "$fc_1_x86_64" ] && rsync $RsyncParams "$Source/fedora/linux/1/*/*.rpm" "$TopDir/fedora/linux/1/x86_64/$ModuleName/packages/" --exclude='*.i386.*' [ -n "$fc_2_x86_64" ] && rsync $RsyncParams "$Source/fedora/linux/2/*/*.rpm" "$TopDir/fedora/linux/2/x86_64/$ModuleName/packages/" --exclude='*.i386.*' #rsync $RsyncParams rsync.freshrpms.net::freshrpms/redhat "$TopDir"/ ;; updates) SubDirs='*/*/*/*/updates' URLBottom='fedora/linux/$releasever/$basearch/updates' Name='Fedora Linux $releasever - $basearch - updates' [ -n "$fc_1_i386" ] && mkdir -p "$TopDir"/fedora/linux/1/i386/$ModuleName/packages/ [ -n "$fc_2_i386" ] && mkdir -p "$TopDir"/fedora/linux/2/i386/$ModuleName/packages/ [ -n "$fc_1_x86_64" ] && mkdir -p "$TopDir"/fedora/linux/1/x86_64/$ModuleName/packages/ [ -n "$fc_2_x86_64" ] && mkdir -p "$TopDir"/fedora/linux/2/x86_64/$ModuleName/packages/ Source=`randomof 'mirror.linux.duke.edu::fedora-linux-core/' 'distro.ibiblio.org::fedora-linux-core/' 'mirror.hiwaay.net::fedora-linux-core/' 'rpmfind.net::linux/fedora/core/' 'rsync.gtlib.cc.gatech.edu::fedora-linux-core/'` echo "Pulling from $Source" [ -n "$fc_1_i386" ] && rsync $RsyncParams "$Source/updates/1/i386/" "$TopDir/fedora/linux/1/i386/$ModuleName/packages/" [ -n "$fc_2_i386" ] && rsync $RsyncParams "$Source/updates/2/i386/" "$TopDir/fedora/linux/2/i386/$ModuleName/packages/" [ -n "$fc_1_x86_64" ] && rsync $RsyncParams "$Source/updates/1/x86_64/" "$TopDir/fedora/linux/1/x86_64/$ModuleName/packages/" [ -n "$fc_2_x86_64" ] && rsync $RsyncParams "$Source/updates/2/x86_64/" "$TopDir/fedora/linux/2/x86_64/$ModuleName/packages/" ;; wstearns) SubDirs='*/*/*/*/wstearns' URLBottom='fedora/linux/$releasever/$basearch/wstearns' Name='Fedora Linux $releasever - $basearch - wstearns' [ -n "$fc_1_i386" ] && mkdir -p "$TopDir"/fedora/linux/1/i386/$ModuleName/packages/ [ -n "$fc_2_i386" ] && mkdir -p "$TopDir"/fedora/linux/2/i386/$ModuleName/packages/ [ -n "$fc_1_x86_64" ] && mkdir -p "$TopDir"/fedora/linux/1/x86_64/$ModuleName/packages/ [ -n "$fc_2_x86_64" ] && mkdir -p "$TopDir"/fedora/linux/2/x86_64/$ModuleName/packages/ [ -n "$fc_1_i386" ] && rsync $RsyncParams zaphod.stearns.org::wstearns/yum/fedora/linux/1/i386/wstearns/packages/*.rpm "$TopDir/fedora/linux/1/i386/$ModuleName/packages/" [ -n "$fc_2_i386" ] && rsync $RsyncParams zaphod.stearns.org::wstearns/yum/fedora/linux/2/i386/wstearns/packages/*.rpm "$TopDir/fedora/linux/2/i386/$ModuleName/packages/" [ -n "$fc_1_x86_64" ] && rsync $RsyncParams zaphod.stearns.org::wstearns/yum/fedora/linux/1/x86_64/wstearns/packages/*.rpm "$TopDir/fedora/linux/1/x86_64/$ModuleName/packages/" [ -n "$fc_2_x86_64" ] && rsync $RsyncParams zaphod.stearns.org::wstearns/yum/fedora/linux/2/x86_64/wstearns/packages/*.rpm "$TopDir/fedora/linux/2/x86_64/$ModuleName/packages/" ;; *) echo "Unknown module $ModuleName" ;; esac echo "Module $ModuleName pulled, creating repository information." for OneDir in "$TopDir"/$SubDirs ; do #echo "checking headers for $OneDir" if [ -d "$OneDir" ]; then rm -rf "$OneDir/headers" "$OneDir/newheaders" "$OneDir/.oldheaders" yum-arch -q "$OneDir" createrepo -q "$OneDir" fi done echo "Repository headers created for $ModuleName, creating yum.conf.addme." echo >"$TopDir/yum.conf.addme.$ModuleName" echo "[$ModuleName]" >>"$TopDir/yum.conf.addme.$ModuleName" echo "name=$Name" >>"$TopDir/yum.conf.addme.$ModuleName" echo -n "baseurl=" >>"$TopDir/yum.conf.addme.$ModuleName" for OneTop in $URLTop ; do echo "$URLTop/$URLBottom" >>"$TopDir/yum.conf.addme.$ModuleName" done echo >>"$TopDir/yum.conf.addme.$ModuleName" echo "Yum.conf.addme created for $ModuleName" done cat "$TopDir"/yum.conf.addme.* >"$TopDir"/yum.conf.addme if [ -x /usr/bin/freedups ]; then echo Hardlinking duplicate files to save space. #This saves 2.7G on a fc 1/2 i386/x86_64 full mirror of all modules freedups -a -d "$TopDir" else echo No freedups found, install freedups rpm to save disk space. fi #No access allowed to fedora mirror 'linux.nssl.noaa.gov::fedora/core/' #mirror.physics.ncsu.edu::whitebox/ #mirror.dulug.duke.edu