add --partial
[build.git] / fedora-mirror.sh
1 #!/bin/bash
2 # this can help you create/update your fedora mirror
3
4 COMMAND=$(basename $0)
5 LOGDIR=/var/log/fedora-mirror
6 DATE=$(date '+%Y-%m-%d-%H-%M')
7 LOG=${LOGDIR}/${DATE}.log
8
9 dry_run=
10 verbose=-i
11 log=
12 skip_core=true
13 root=/mirror/
14
15
16 us_fedora_url=rsync://mirrors.kernel.org/fedora
17 eu_fedora_url=rsync://mirror1.hs-esslingen.de/fedora/linux
18
19 default_distroname="f35"
20 all_distronames="f33 f35"
21
22 global_arch="x86_64"
23
24 # use EU mirror
25 fedora_url=$eu_fedora_url
26
27 function mirror_distro_arch () {
28     distroname=$1; shift
29     arch=$1; shift
30
31     distroname=$(echo $distroname | tr '[A-Z]' '[a-z]')
32     case $distroname in
33     f*)
34         distroindex=$(echo $distroname | sed -e "s,f,,g")
35         distro="Fedora"
36         rsyncurl=$fedora_url
37         ;;
38     *)
39         echo "WARNING -- Unknown distribution $distroname -- skipped"
40         return 1
41         ;;
42     esac
43
44     excludelist="debug/ iso/ ppc/ source/"
45     options=""
46     [ -n "$(rsync --help | grep no-motd)" ] && options="$options --no-motd"
47     options="$options $dry_run $verbose"
48     options="$options -aH --numeric-ids"
49     options="$options --delete --delete-excluded"
50     options="$options --partial"
51     for e in $excludelist; do
52         options="$options --exclude $e"
53     done
54
55     echo ">>>>>>>>>>>>>>>>>>>> distroname=$distroname arch=$arch rsyncurl=$rsyncurl"
56     [ -n "$verbose" ] && echo "rsync options=$options"
57
58     paths=""
59     [ -z "$skip_core" ] && paths="releases/$distroindex/Everything/$arch/os/"
60     if [ "$distroindex" -le 27 ]; then
61         paths="$paths updates/$distroindex/$arch/"
62         localpath=fedora
63     else
64         paths="$paths updates/$distroindex/Everything/$arch/ updates/$distroindex/Modular/$arch/"
65         localpath=fedora
66     fi
67
68     for repopath in $paths; do
69         echo "===== $distro -> $distroindex $repopath"
70         [ -z "$dry_run" ] && mkdir -p ${root}/${localpath}/${repopath}
71         command="rsync $options ${rsyncurl}/${repopath} ${root}/${localpath}/${repopath}"
72         echo $command
73         $command
74     done
75
76     echo "<<<<<<<<<<<<<<<<<<<< $distroname $arch"
77
78     return $RES
79 }
80
81 function usage () {
82     echo "Usage: $COMMAND [-n] [-v] [-l] [-c] [-e|-s|-u rsyncurl] [-f distroname|-F]"
83     echo "Options:"
84     echo " -n : dry run"
85     echo " -v : turn off verbose"
86     echo " -l : turns on autologging in $LOGDIR"
87     echo " -c : also sync core repository (releases)"
88     echo " -s : uses US mirror $us_fedora_url"
89     echo " -e : uses EU mirror $eu_fedora_url"
90     echo " -u <url> : use this (rsync) for fedora (default is $fedora_url)"
91     echo " -f distroname - default is $default_distroname"
92     echo " -F : do on all distros $all_distronames"
93     exit 1
94 }
95
96 function run () {
97     RES=0
98     for distroname in $distronames ; do
99         for arch in $archs; do
100             mirror_distro_arch "$distroname" "$arch" || RES=1
101         done
102     done
103     return $RES
104 }
105
106 function main () {
107     distronames=""
108     archs="$global_arch"
109     while getopts "nvlcu:sef:Fh" opt ; do
110     case $opt in
111         n) dry_run=--dry-run ;;
112         v) verbose= ;;
113         l) log=true ;;
114         c) skip_core= ;;
115         u) fedora_url=$OPTARG ;;
116         s) fedora_url=$us_fedora_url ;;
117         e) fedora_url=$eu_fedora_url ;;
118         f) distronames="$distronames $OPTARG" ;;
119         F) distronames="$distronames $all_distronames" ;;
120         h|*) usage ;;
121     esac
122     done
123     shift $(($OPTIND-1))
124     [[ -n "$@" ]] && usage
125     [ -z "$distronames" ] && distronames=$default_distroname
126
127     # auto log : if specified
128     if [ -n "$log" ] ; then
129         mkdir -p $LOGDIR
130         run &> $LOG
131     else
132         run
133     fi
134     if [ "$?" == 0 ]; then
135         # report to fedora's infra
136         # can't get the config right...
137         #/usr/bin/report_mirror
138         exit 0
139     else
140         exit 1
141     fi
142 }
143
144 main "$@"