f11-ready
[build.git] / vbuild-fedora-mirror.sh
1 #!/bin/bash
2 # this can help you create/update your fedora mirror
3 # $Id$
4
5 COMMAND=$(basename $0)
6 LOGDIR=/var/log/fedora-mirroring
7 DATE=$(date '+%Y-%m-%d-%H-%M')
8 LOG=${LOGDIR}/${DATE}.log
9
10 dry_run=
11 verbose=
12 log=
13 skip_core=
14 root=/mirror/
15
16
17 hozac_url=http://rpm.hozac.com/dhozac/centos/5/vserver
18
19 us_fedora_url=rsync://mirrors.kernel.org/fedora
20 us_centos_url=rsync://mirrors.rit.edu/centos
21 us_epel_url=rsync://rsync.gtlib.gatech.edu/fedora-epel
22
23 # ircam's fedora8 repo has been turned off
24 #eu_fedora_url=rsync://mirrors.ircam.fr/fedora-linux
25 eu_fedora_url=rsync://mirror.ovh.net/download.fedora.redhat.com/linux
26 eu_centos_url=rsync://mirrors.ircam.fr/CentOS
27 eu_epel_url=rsync://mirrors.ircam.fr/fedora-epel
28
29 jp_fedora_url="jp_fedora_url-needs-to-be-defined"
30 jp_centos_url="jp_centos_url-needs-to-be-defined"
31 jp_epel_url="jp_epel_url-needs-to-be-defined"
32
33 default_distroname="centos5"
34 all_distronames="f8 f10 f11 centos5.2 centos5.3 epel5"
35 default_arch="i386"
36 all_archs="i386 x86_64"
37
38 case $(hostname) in 
39     *.fr|*.de|*.uk)
40         fedora_url=$eu_fedora_url ; centos_url=$eu_centos_url ; epel_url=$eu_epel_url ;;
41     *.jp)
42         fedora_url=$jp_fedora_url ; centos_url=$jp_centos_url ; epel_url=$jp_epel_url ;;
43     *)
44         fedora_url=$us_fedora_url ; centos_url=$us_centos_url ; epel_url=$us_epel_url ;;
45 esac
46
47 function mirror_distro_arch () {
48     distroname=$1; shift
49     arch=$1; shift
50
51     LFTP=0
52
53     distroname=$(echo $distroname | tr '[A-Z]' '[a-z]')
54     case $distroname in
55         fc*[1-6])
56             distroindex=$(echo $distroname | sed -e "s,fc,,g")
57             distro="Fedora Core"
58             rsyncurl=$fedora_url
59             ;;
60         f*[7-9]|f1?)
61             distroindex=$(echo $distroname | sed -e "s,f,,g")
62             distro="Fedora"
63             rsyncurl=$fedora_url
64             ;;
65         centos[4-5]|centos[4-5].[0-9])
66             distroindex=$(echo $distroname | sed -e "s,centos,,g")
67             distro="CentOS"
68             rsyncurl=$centos_url
69             ;;
70         epel5)
71             distroindex=5
72             distro=epel
73             rsyncurl=$epel_url
74             ;;
75         hozac)
76             distroindex=5
77             distro="hozac"
78             rsyncurl=$hozac_url
79             ;;
80         *)
81             echo "WARNING -- Unknown distribution $distroname -- skipped"
82             return 1
83             ;;
84     esac
85
86     excludelist="debug/ iso/ ppc/ source/"
87     options="--archive --compress --delete --delete-excluded $dry_run $verbose"
88     lftp_options="--delete $dry_run $verbose"
89     [ -n "$(rsync --help | grep no-motd)" ] && options="$options --no-motd"
90     for e in $excludelist; do
91         options="$options --exclude $e"
92         lftp_options="$lftp_options --exclude $e"
93     done
94
95     echo ">>>>>>>>>>>>>>>>>>>> root=$root distroname=$distroname arch=$arch rsyncurl=$rsyncurl"
96     [ -n "$verbose" ] && echo "rsync options=$options"
97
98     RES=1
99     paths=""
100     case $distro in
101         [Ff]edora*)
102             case $distroindex in
103                 2|4|6)
104                     [ -z "$skip_core" ] && paths="core/$distroindex/$arch/os/"
105                     paths="$paths core/updates/$distroindex/$arch/ extras/$distroindex/$arch/"
106                     RES=0
107                     ;;
108                 7|8|9|1?)
109                     [ -z "$skip_core" ] && paths="releases/$distroindex/Everything/$arch/os/"
110                     paths="$paths updates/$distroindex/$arch/"
111                     # f8 and f9 have the additional newkey repo
112                     case $distroindex in 
113                         8|9) paths="$paths updates/$distroindex/${arch}.newkey/" ;;
114                     esac
115                     RES=0
116                     ;;
117             esac
118             localpath=fedora
119             ;;
120     
121         CentOS*)
122             case $distroindex in
123                 5*)
124                     [ -z "$skip_core" ] && paths="$distroindex/os/$arch/"
125                     paths="$paths $distroindex/updates/$arch/"
126                     RES=0
127                     ;;
128             esac
129             localpath=centos
130             ;;
131
132         epel*)
133             case $distroindex in
134                 5)
135                     paths="$paths $distroindex/$arch/"
136                     RES=0
137                     ;;
138             esac
139             localpath=epel
140             ;;
141
142         hozac*)
143             case $distroindex in
144                 5)
145                     # leave off trailing '/'
146                     paths="$paths $arch"
147                     RES=0
148                     LFTP=1
149                     ;;
150             esac
151             localpath=dhozac
152             ;;
153
154     esac
155
156     if [ "$RES" = 1 ] ; then
157         echo "DISTRIBUTION $distro $distroindex CURRENTLY UNSUPPORTED - skipped"
158     else
159         for repopath in $paths; do
160             echo "===== $distro -> $distroindex $repopath"
161             [ -z "$dry_run" ] && mkdir -p ${root}/${localpath}/${repopath}
162             if [ "$LFTP" = 1 ]; then
163                 command="lftp -c mirror $lftp_options ${rsyncurl}/${repopath} ${root}/${localpath}/${repopath}"
164             else
165                 command="rsync $options ${rsyncurl}/${repopath} ${root}/${localpath}/${repopath}"
166             fi
167             echo $command
168             $command
169         done
170     fi
171
172     echo "<<<<<<<<<<<<<<<<<<<< $distroname $arch"
173
174     return $RES 
175 }
176
177 function usage () {
178     echo "Usage: $COMMAND [-n] [-v] [-c] [-r root] [-u|U rsyncurl] [-e|-j] [-f distroname|-F] [-a arch|-A]"
179     echo "Defaults to -r $root -f $default_distroname -a $default_arch"
180     echo "Default urls : $fedora_url $centos_url"
181     echo "Options:"
182     echo " -n : dry run"
183     echo " -v : verbose"
184     echo " -l : turns on autologging in $LOGDIR"
185     echo " -c : skips core repository"
186     echo " -r root (default is $root)"
187     echo " -u rsyncurl for fedora (default is $fedora_url)"
188     echo " -U rsyncurl for centos (default is $centos_url)"
189     echo " -E rsyncurl for epel (default is $epel_url)"
190     echo " -s : uses standard (US) mirrors $us_fedora_url $us_centos_url $us_epel_url"
191     echo " -e : uses European mirrors $eu_fedora_url $eu_centos_url $eu_epel_url"
192     echo " -j : uses Japanese mirrors $jp_fedora_url $jp_centos_url $jp_epel_url"
193     echo " -f distroname - use vserver convention, e.g. f8 or centos5"
194     echo " -F : for distroname in $all_distronames"
195     echo " -a arch - use yum convention"
196     echo " -A : for arch in $all_archs"
197     exit 1
198 }
199
200 function run () {
201     RES=0
202     for distroname in $distronames ; do 
203         for arch in $archs; do 
204             mirror_distro_arch "$distroname" "$arch" || RES=1
205         done
206     done
207     return $RES
208 }
209
210 function main () {
211     distronames=""
212     archs=""
213     while getopts "nvlcr:u:U:E:sejf:Fa:Ah" opt ; do
214         case $opt in
215             n) dry_run=--dry-run ;;
216             v) verbose=--verbose ;;
217             l) log=true ;;
218             c) skip_core=true ;;
219             r) root=$OPTARG ;;
220             u) fedora_url=$OPTARG ;;
221             U) centos_url=$OPTARG ;;
222             E) epel_url=$OPTARG ;;
223             s) fedora_url=$us_fedora_url ; centos_url=$us_centos_url ; epel_url=$us_epel_url;;
224             e) fedora_url=$eu_fedora_url ; centos_url=$eu_centos_url ; epel_url=$eu_epel_url ;;
225             j) fedora_url=$jp_fedora_url ; centos_url=$jp_centos_url ; epel_url=$jp_epel_url ;;
226             f) distronames="$distronames $OPTARG" ;;
227             F) distronames="$distronames $all_distronames" ;;
228             a) archs="$archs $OPTARG" ;;
229             A) archs="$archs $all_archs" ;;
230             h|*) usage ;;
231         esac
232     done
233     [ -z "$distronames" ] && distronames=$default_distroname
234     [ -z "$archs" ] && archs=$default_arch
235
236     # auto log : if specified
237     if [ -n "$log" ] ; then
238         mkdir -p $LOGDIR
239         run &> $LOG
240     else
241         run
242     fi
243     exit $?
244 }
245
246 main "$@"