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