]>
Commit | Line | Data |
---|---|---|
1 | #!/bin/sh | |
2 | # Update GeoIP packages to new version provided by MaxMind. | |
3 | # | |
4 | # Author: Elan Ruusamäe <glen@pld-linux.org> | |
5 | # 2012-07-04 Created initial version | |
6 | # 2014-03-04 Rewritten to be smarter when checking for updates avoiding full download if no changes. | |
7 | ||
8 | set -e | |
9 | ||
10 | update=false | |
11 | status=false | |
12 | while [ $# -gt 0 ]; do | |
13 | case "$1" in | |
14 | update|-u|-update|--update) | |
15 | update=true | |
16 | shift | |
17 | ;; | |
18 | status|-s|-status|--status) | |
19 | status=true | |
20 | shift | |
21 | ;; | |
22 | *) | |
23 | break | |
24 | ;; | |
25 | esac | |
26 | done | |
27 | ||
28 | # get file DATE in GMT timezone | |
29 | filedate() { | |
30 | local file="$1" | |
31 | TZ=GMT stat -c '%y' "$file" | awk '{print $1}' | |
32 | } | |
33 | ||
34 | # get package, no sources | |
35 | get_package() { | |
36 | local pkg=$1 out | |
37 | out=$(builder -g -ns $pkg 2>&1) || echo "$out" | |
38 | } | |
39 | ||
40 | update_urls() { | |
41 | local specfile=$1 t fn z | |
42 | # update urls | |
43 | t=$(mktemp) | |
44 | builder -su $specfile > $t 2>/dev/null | |
45 | while read url; do | |
46 | # take output filename (anything after last slash) | |
47 | fn=${url##*/} | |
48 | # remove querystring for mtime match to work | |
49 | url=${url%\?*} | |
50 | test -e "$fn" && z= || unset z | |
51 | curl ${z+-z "$fn"} -o "$fn" "$url" -R -s | |
52 | done < $t | |
53 | rm -f $t | |
54 | } | |
55 | ||
56 | # set version to $version in $specfile and build the package | |
57 | update_version() { | |
58 | local specfile="$1" version="$2" out | |
59 | ||
60 | # update version | |
61 | sed -i -e " | |
62 | s/^\(Version:[ \t]\+\)[.0-9]\+\$/\1$version/ | |
63 | s/^\(Release:[ \t]\+\)[.0-9]\+\$/\11/ | |
64 | " $specfile | |
65 | ||
66 | # update md5 | |
67 | out=$(md5 -p1 $specfile 2>&1) || echo "$out" | |
68 | ||
69 | # build it | |
70 | out=$(builder -bb $specfile 2>&1) || echo "$out" | |
71 | } | |
72 | ||
73 | # get version from package files | |
74 | # set $version variable | |
75 | version_from_files() { | |
76 | local pkg=$1 dt4 dt6 | |
77 | case "$pkg" in | |
78 | xtables-geoip) | |
79 | dt4=$(filedate *.zip | tr -d -) | |
80 | dt6=$(filedate *.gz | tr -d -) | |
81 | if [ "$dt4" -gt "$dt6" ]; then | |
82 | version=$dt4 | |
83 | else | |
84 | version=$dt6 | |
85 | fi | |
86 | ;; | |
87 | GeoIP-db-City) | |
88 | dt4=$(filedate GeoLiteCity-*.dat.xz | tr - .) | |
89 | dt6=$(filedate GeoLiteCityv6-*.dat.gz | tr - .) | |
90 | if [ "$(echo $dt4 | tr -d .)" -gt "$(echo $dt6 | tr -d .)" ]; then | |
91 | version=$dt4 | |
92 | else | |
93 | version=$dt6 | |
94 | fi | |
95 | ;; | |
96 | GeoIP-db-Country) | |
97 | dt4=$(filedate GeoIP-*.dat.gz | tr - .) | |
98 | dt6=$(filedate GeoIPv6-*.dat.gz | tr - .) | |
99 | if [ "$(echo $dt4 | tr -d .)" -gt "$(echo $dt6 | tr -d .)" ]; then | |
100 | version=$dt4 | |
101 | else | |
102 | version=$dt6 | |
103 | fi | |
104 | ;; | |
105 | *) | |
106 | version=$(filedate *.gz | tr - .) | |
107 | ;; | |
108 | esac | |
109 | } | |
110 | ||
111 | dir=$(dirname "$0") | |
112 | APPDIR=$(d=$0; [ -L "$d" ] && d=$(readlink -f "$d"); dirname "$d") | |
113 | PATH=$APPDIR:$PATH | |
114 | cd "$dir" | |
115 | ||
116 | pkgs='GeoIP-db-City GeoIP-db-Country GeoIP-db-IPASNum xtables-geoip' | |
117 | for pkg in ${*:-$pkgs}; do | |
118 | $status && continue | |
119 | ||
120 | get_package $pkg | |
121 | cd $pkg | |
122 | specfile=*.spec | |
123 | ||
124 | update_urls $specfile | |
125 | version_from_files $pkg | |
126 | oldvers=$(awk '/^Version:[ ]+/{print $NF}' $specfile) | |
127 | if [ "$oldvers" != "$version" ]; then | |
128 | update_version $specfile $version | |
129 | fi | |
130 | cd .. | |
131 | done | |
132 | ||
133 | # report each package git status | |
134 | for pkg in ${*:-$pkgs}; do | |
135 | cd $pkg | |
136 | git status --porcelain | |
137 | cd .. | |
138 | done |