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