| @@ -6,27 +6,27 @@ | | | @@ -6,27 +6,27 @@ |
6 | # | | 6 | # |
7 | # Create the /usr/pkg/etc/pkg_notify.list file containing the package list | | 7 | # Create the /usr/pkg/etc/pkg_notify.list file containing the package list |
8 | # you want to be informed on, following this format : | | 8 | # you want to be informed on, following this format : |
9 | # | | 9 | # |
10 | # $ cat /usr/pkg/etc/pkg_notify.list | | 10 | # $ cat /usr/pkg/etc/pkg_notify.list |
11 | # wip/foo | | 11 | # wip/foo |
12 | # net/bar | | 12 | # net/bar |
13 | # www/foobar-devel | | 13 | # www/foobar-devel |
14 | # | | 14 | # |
15 | # OR invoke pkg_notify with the package following : | | 15 | # OR invoke pkg_notify with the package following : |
16 | # | | 16 | # |
17 | # $ pkg_notify category/package | | 17 | # $ pkg_notify category/package |
18 | # | | 18 | # |
19 | # $Id: pkg_notify,v 1.2 2014/02/02 10:19:41 wiz Exp $ | | 19 | # $Id: pkg_notify,v 1.3 2016/08/31 21:15:01 wiz Exp $ |
20 | | | 20 | |
21 | use Net::FTP; | | 21 | use Net::FTP; |
22 | use LWP::UserAgent; | | 22 | use LWP::UserAgent; |
23 | use HTTP::Request::Common; | | 23 | use HTTP::Request::Common; |
24 | use Getopt::Std; | | 24 | use Getopt::Std; |
25 | | | 25 | |
26 | use strict; | | 26 | use strict; |
27 | | | 27 | |
28 | # those three are replaced by Makefile | | 28 | # those three are replaced by Makefile |
29 | my $make = "@MAKE@"; | | 29 | my $make = "@MAKE@"; |
30 | my $pkgsrcbase = "@PKGSRCDIR@"; | | 30 | my $pkgsrcbase = "@PKGSRCDIR@"; |
31 | my $localbase = "@PREFIX@"; | | 31 | my $localbase = "@PREFIX@"; |
32 | | | 32 | |
| @@ -55,614 +55,614 @@ my $subvers = ""; | | | @@ -55,614 +55,614 @@ my $subvers = ""; |
55 | # create an alpha to num mapping | | 55 | # create an alpha to num mapping |
56 | my %alnum = map { $_ => ord($_) - ord('a') + 1 } ('a' .. 'z'); | | 56 | my %alnum = map { $_ => ord($_) - ord('a') + 1 } ('a' .. 'z'); |
57 | | | 57 | |
58 | sub dot_strip { | | 58 | sub dot_strip { |
59 | my $out = $_[0]; | | 59 | my $out = $_[0]; |
60 | # clean extremities from dots | | 60 | # clean extremities from dots |
61 | $out =~ s/^[\.\-_]+//; | | 61 | $out =~ s/^[\.\-_]+//; |
62 | $out =~ s/[\.\-_]+$//; | | 62 | $out =~ s/[\.\-_]+$//; |
63 | | | 63 | |
64 | return ($out); | | 64 | return ($out); |
65 | } | | 65 | } |
66 | | | 66 | |
67 | sub beta_strip { | | 67 | sub beta_strip { |
68 | my $out = $_[0]; | | 68 | my $out = $_[0]; |
69 | | | 69 | |
70 | # handle beta - alpha - pre... | | 70 | # handle beta - alpha - pre... |
71 | if ($out =~ /(.*[0-9])([\-\_\.]?)(pre|alpha|beta|gamma|rc)([0-9]*.*)/i) { | | 71 | if ($out =~ /(.*[0-9])([\-\_\.]?)(pre|alpha|beta|gamma|rc)([0-9]*.*)/i) { |
72 | my $pre = $1; | | 72 | my $pre = $1; |
73 | my $dev = lc $3; | | 73 | my $dev = lc $3; |
74 | # remember real versionning | | 74 | # remember real versionning |
75 | $subvers = "$2$3"; | | 75 | $subvers = "$2$3"; |
76 | my $post = $4; | | 76 | my $post = $4; |
77 | # replace pre|alpha|beta... with equiv nums | | 77 | # replace pre|alpha|beta... with equiv nums |
78 | $dev =~ s/([a-z]).*/$alnum{$1}/; | | 78 | $dev =~ s/([a-z]).*/$alnum{$1}/; |
79 | $out = $pre.".00".$dev."00.".$post; | | 79 | $out = $pre.".00".$dev."00.".$post; |
80 | } | | 80 | } |
81 | | | 81 | |
82 | return ($out); | | 82 | return ($out); |
83 | } | | 83 | } |
84 | | | 84 | |
85 | sub ext_strip { | | 85 | sub ext_strip { |
86 | # cleanup versions : | | 86 | # cleanup versions : |
87 | # blah-1.2.3-blah | | 87 | # blah-1.2.3-blah |
88 | # 1.2.3[.-_]pkg -> 1.2.3 | | 88 | # 1.2.3[.-_]pkg -> 1.2.3 |
89 | # devel-1.2.3 -> 1.2.3 | | 89 | # devel-1.2.3 -> 1.2.3 |
90 | my $out = $_[0]; | | 90 | my $out = $_[0]; |
91 | | | 91 | |
92 | # version has no chars, should be fine | | 92 | # version has no chars, should be fine |
93 | if ($out !~ /[a-z]/) { | | 93 | if ($out !~ /[a-z]/) { |
94 | return ($out); | | 94 | return ($out); |
95 | } | | 95 | } |
96 | | | 96 | |
97 | if ($out =~ /^[a-z\-\._]+([0-9\-\._]+)[a-z\-\._]+$/i) { | | 97 | if ($out =~ /^[a-z\-\._]+([0-9\-\._]+)[a-z\-\._]+$/i) { |
98 | # strip (qwerty-)1.2.3(-qwerty) | | 98 | # strip (qwerty-)1.2.3(-qwerty) |
99 | $out = $1; | | 99 | $out = $1; |
100 | } elsif ($out =~ /^([0-9\-\._]+)[\-\._][a-z]+/i) { | | 100 | } elsif ($out =~ /^([0-9\-\._]+)[\-\._][a-z]+/i) { |
101 | # strip 1.2.3(-qwerty) | | 101 | # strip 1.2.3(-qwerty) |
102 | $out = $1; | | 102 | $out = $1; |
103 | } elsif ($out =~ /[a-z]+[\-\._]+([0-9\-\._]+)$/i) { | | 103 | } elsif ($out =~ /[a-z]+[\-\._]+([0-9\-\._]+)$/i) { |
104 | # strip (qwerty-)1.2.3 | | 104 | # strip (qwerty-)1.2.3 |
105 | $out = $1; | | 105 | $out = $1; |
106 | } | | 106 | } |
107 | | | 107 | |
108 | return ($out); | | 108 | return ($out); |
109 | } | | 109 | } |
110 | | | 110 | |
111 | sub is_beta { | | 111 | sub is_beta { |
112 | if ($_[0] =~ /00[0-9]+00/) { | | 112 | if ($_[0] =~ /00[0-9]+00/) { |
113 | return (1); | | 113 | return (1); |
114 | } | | 114 | } |
115 | return (0); | | 115 | return (0); |
116 | } | | 116 | } |
117 | | | 117 | |
118 | sub find_version { | | 118 | sub find_version { |
119 | my @ls = @_; | | 119 | my @ls = @_; |
120 | my $lastvers = ""; | | 120 | my $lastvers = ""; |
121 | my $realdist = ""; | | 121 | my $realdist = ""; |
122 | | | 122 | |
123 | foreach (@ls) { | | 123 | foreach (@ls) { |
124 | my $line = $_; | | 124 | my $line = $_; |
125 | my $wasbad = 0; | | 125 | my $wasbad = 0; |
126 | | | 126 | |
127 | if ($line =~ /([^0-9a-z]$dist|^$dist)([^\/\"<>\@]+)$extract_sufx/) { | | 127 | if ($line =~ /([^0-9a-z]$dist|^$dist)([^\/\"<>\@]+)$extract_sufx/) { |
128 | | | 128 | |
129 | $realdist = $dist.$2.$extract_sufx; | | 129 | $realdist = $dist.$2.$extract_sufx; |
130 | my $lsvers = $2; | | 130 | my $lsvers = $2; |
131 | | | 131 | |
132 | # replace alpha|beta|... with .0[num]0. | | 132 | # replace alpha|beta|... with .0[num]0. |
133 | $lsvers = beta_strip($lsvers); | | 133 | $lsvers = beta_strip($lsvers); |
134 | | | 134 | |
135 | # strip any extension left (bin, pkg, src, devel-...) | | 135 | # strip any extension left (bin, pkg, src, devel-...) |
136 | if ($nicearc) { | | 136 | if ($nicearc) { |
137 | $lsvers = ext_strip($lsvers); | | 137 | $lsvers = ext_strip($lsvers); |
138 | } else { | | 138 | } else { |
139 | # remember archive was bad for next loop | | 139 | # remember archive was bad for next loop |
140 | $wasbad = 1; | | 140 | $wasbad = 1; |
141 | } | | 141 | } |
| | | 142 | |
| | | 143 | # with beta/alpha/... numbered, archive may be nice |
| | | 144 | if (($lsvers !~ /[^0-9\.\-\_]/i) && |
| | | 145 | ($version !~ /[^0-9\.\-\_]/i)) { |
| | | 146 | $nicearc = 1; |
| | | 147 | } |
142 | | | 148 | |
143 | # with beta/alpha/... numbered, archive may be nice | | 149 | # replace every dot-like char (-_) with dots |
144 | if (($lsvers !~ /[^0-9\.\-\_]/i) && | | 150 | $lsvers = dot_strip($lsvers); |
145 | ($version !~ /[^0-9\.\-\_]/i)) { | | | |
146 | $nicearc = 1; | | | |
147 | } | | | |
148 | | | 151 | |
149 | # replace every dot-like char (-_) with dots | | 152 | my $display_lsvers; |
150 | $lsvers = dot_strip($lsvers); | | 153 | if ($subvers ne "") { |
| | | 154 | # archive has an alpha / beta / ... |
| | | 155 | $display_lsvers = $lsvers; |
| | | 156 | $display_lsvers =~ s/(\.00[0-9]+00)/$subvers/; |
| | | 157 | $subvers = ""; |
| | | 158 | } else { |
| | | 159 | $display_lsvers = $lsvers; |
| | | 160 | } |
| | | 161 | |
| | | 162 | # replace [-_] with dot |
| | | 163 | $lsvers =~ s/[\-\_]/./g; |
| | | 164 | $version =~ s/[\-\_]/./g; |
| | | 165 | |
| | | 166 | # replace remaining chars |
| | | 167 | # ex: 3.14a -> 3.14.1, i -> 9 |
| | | 168 | $lsvers = lc $lsvers; |
| | | 169 | $lsvers =~ s/([a-z])/.$alnum{$1}/g; |
| | | 170 | # numberify official version |
| | | 171 | $version = lc $version; |
| | | 172 | $version =~ s/([a-z])/.$alnum{$1}/g; |
| | | 173 | |
| | | 174 | # uniq .'s |
| | | 175 | $lsvers =~ s/\.+/./g; |
| | | 176 | $version =~ s/\.+/./g; |
| | | 177 | |
| | | 178 | if ($debug) { |
| | | 179 | print "comparing $lsvers against $version (nicearc: $nicearc)\n"; |
| | | 180 | } |
| | | 181 | |
| | | 182 | if (($lsvers ne $lastvers) && # already seen |
| | | 183 | # if it's not a nicearc, do basic string comparison |
| | | 184 | # if it is a nicearc, finest / int comparison |
| | | 185 | (($lsvers gt $version) | $nicearc)) { |
| | | 186 | |
| | | 187 | my $greater = 0; |
| | | 188 | |
| | | 189 | if ($nicearc) { # nice archive, has at least major.minor |
| | | 190 | |
| | | 191 | my @pkg_version = split(/[\.\-_]/, $version); |
| | | 192 | my @ls_version = split(/[\.\-_]/, $lsvers); |
| | | 193 | |
| | | 194 | my $i = 0; |
| | | 195 | foreach (@ls_version) { |
| | | 196 | |
| | | 197 | # package version has this member |
| | | 198 | if (defined($pkg_version[$i])) { |
| | | 199 | |
| | | 200 | my $member = $_; |
| | | 201 | |
| | | 202 | # empty member |
| | | 203 | if ($member =~ /^$/) { |
| | | 204 | last; |
| | | 205 | } |
| | | 206 | # archive version has non-num in it, can't compare |
| | | 207 | if ($member =~ /[^0-9]/) { |
| | | 208 | last; |
| | | 209 | } |
| | | 210 | # is this member greater that pkg_version equiv ? |
| | | 211 | if ($member > $pkg_version[$i]) { |
| | | 212 | # if member is beta, version is > |
| | | 213 | if (is_beta($member) && |
| | | 214 | !is_beta($pkg_version[$i])) { |
| | | 215 | last; |
| | | 216 | } |
| | | 217 | $greater = 1; |
| | | 218 | last; |
| | | 219 | } |
| | | 220 | |
| | | 221 | # local package has a superior version, end |
| | | 222 | if ($pkg_version[$i] > $member) { |
| | | 223 | # if version is beta, member is > |
| | | 224 | if (!is_beta($member) && |
| | | 225 | is_beta($pkg_version[$i])) { |
| | | 226 | $greater = 1; |
| | | 227 | } |
| | | 228 | last; |
| | | 229 | } |
151 | | | 230 | |
152 | my $display_lsvers; | | 231 | } else { # package version don't have this sub-number |
153 | if ($subvers ne "") { | | 232 | if (!is_beta($_)) { # avoid beta versions |
154 | # archive has an alpha / beta / ... | | 233 | # aka 1.1.1beta !> 1.1.1 |
155 | $display_lsvers = $lsvers; | | 234 | $greater = 1; |
156 | $display_lsvers =~ s/(\.00[0-9]+00)/$subvers/; | | 235 | } |
157 | $subvers = ""; | | 236 | last; |
158 | } else { | | | |
159 | $display_lsvers = $lsvers; | | | |
160 | } | | 237 | } |
161 | | | 238 | |
162 | # replace [-_] with dot | | 239 | $i++; # increment version member |
163 | $lsvers =~ s/[\-\_]/./g; | | 240 | } # foreach |
164 | $version =~ s/[\-\_]/./g; | | | |
165 | | | | |
166 | # replace remaining chars | | | |
167 | # ex: 3.14a -> 3.14.1, i -> 9 | | | |
168 | $lsvers = lc $lsvers; | | | |
169 | $lsvers =~ s/([a-z])/.$alnum{$1}/g; | | | |
170 | # numberify official version | | | |
171 | $version = lc $version; | | | |
172 | $version =~ s/([a-z])/.$alnum{$1}/g; | | | |
173 | | | | |
174 | # uniq .'s | | | |
175 | $lsvers =~ s/\.+/./g; | | | |
176 | $version =~ s/\.+/./g; | | | |
177 | | | | |
178 | if ($debug) { | | | |
179 | print "comparing $lsvers against $version (nicearc: $nicearc)\n"; | | | |
180 | } | | | |
181 | | | | |
182 | if (($lsvers ne $lastvers) && # already seen | | | |
183 | # if it's not a nicearc, do basic string comparison | | | |
184 | # if it is a nicearc, finest / int comparison | | | |
185 | (($lsvers gt $version) | $nicearc)) { | | | |
186 | | | | |
187 | my $greater = 0; | | | |
188 | | | | |
189 | if ($nicearc) { # nice archive, has at least major.minor | | | |
190 | | | | |
191 | my @pkg_version = split(/[\.\-_]/, $version); | | | |
192 | my @ls_version = split(/[\.\-_]/, $lsvers); | | | |
193 | | | | |
194 | my $i = 0; | | | |
195 | foreach (@ls_version) { | | | |
196 | | | | |
197 | # package version has this member | | | |
198 | if (defined($pkg_version[$i])) { | | | |
199 | | | | |
200 | my $member = $_; | | | |
201 | | | | |
202 | # empty member | | | |
203 | if ($member =~ /^$/) { | | | |
204 | last; | | | |
205 | } | | | |
206 | # archive version has non-num in it, can't compare | | | |
207 | if ($member =~ /[^0-9]/) { | | | |
208 | last; | | | |
209 | } | | | |
210 | # is this member greater that pkg_version equiv ? | | | |
211 | if ($member > $pkg_version[$i]) { | | | |
212 | # if member is beta, version is > | | | |
213 | if (is_beta($member) && | | | |
214 | !is_beta($pkg_version[$i])) { | | | |
215 | last; | | | |
216 | } | | | |
217 | $greater = 1; | | | |
218 | last; | | | |
219 | } | | | |
220 | | | | |
221 | # local package has a superior version, end | | | |
222 | if ($pkg_version[$i] > $member) { | | | |
223 | # if version is beta, member is > | | | |
224 | if (!is_beta($member) && | | | |
225 | is_beta($pkg_version[$i])) { | | | |
226 | $greater = 1; | | | |
227 | } | | | |
228 | last; | | | |
229 | } | | | |
230 | | | | |
231 | } else { # package version don't have this sub-number | | | |
232 | if (!is_beta($_)) { # avoid beta versions | | | |
233 | # aka 1.1.1beta !> 1.1.1 | | | |
234 | $greater = 1; | | | |
235 | } | | | |
236 | last; | | | |
237 | } | | | |
238 | | | 241 | |
239 | $i++; # increment version member | | | |
240 | } # foreach | | | |
241 | | | | |
242 | } | | | |
243 | if ($nicearc == 0) { # not a nice distname | | | |
244 | $greater = 1; | | | |
245 | } | | | |
246 | # strip \'s | | | |
247 | $realdist =~ s/\\//g; | | | |
248 | if ($greater) { | | | |
249 | print "!! seems like there's a new version for $pkgname\n"; | | | |
250 | print "!! [v.$display_lsvers] - from $realdist\n"; | | | |
251 | $lastvers = $lsvers; | | | |
252 | } | | | |
253 | } | | | |
254 | } # if line /arc/ | | | |
255 | if ($wasbad) { # remember, archive was bad | | | |
256 | $nicearc = 0; | | | |
257 | } | | 242 | } |
258 | } # foreach @ls | | 243 | if ($nicearc == 0) { # not a nice distname |
259 | if ($lastvers eq "") { | | 244 | $greater = 1; |
260 | return (0); | | 245 | } |
261 | } else { | | 246 | # strip \'s |
262 | return (1); | | 247 | $realdist =~ s/\\//g; |
| | | 248 | if ($greater) { |
| | | 249 | print "!! seems like there's a new version for $pkgname\n"; |
| | | 250 | print "!! [v.$display_lsvers] - from $realdist\n"; |
| | | 251 | $lastvers = $lsvers; |
| | | 252 | } |
| | | 253 | } |
| | | 254 | } # if line /arc/ |
| | | 255 | if ($wasbad) { # remember, archive was bad |
| | | 256 | $nicearc = 0; |
263 | } | | 257 | } |
| | | 258 | } # foreach @ls |
| | | 259 | if ($lastvers eq "") { |
| | | 260 | return (0); |
| | | 261 | } else { |
| | | 262 | return (1); |
| | | 263 | } |
264 | } | | 264 | } |
265 | | | 265 | |
266 | my $ftp; | | 266 | my $ftp; |
267 | | | 267 | |
268 | sub ftp_connect { | | 268 | sub ftp_connect { |
269 | | | 269 | |
270 | if ($ftp = Net::FTP->new($_[0], Debug => 0, Passive => 1)) { | | 270 | if ($ftp = Net::FTP->new($_[0], Debug => 0, Passive => 1)) { |
271 | | | 271 | |
272 | if ($ftp->login("anonymous",'-anonymous@')) { | | 272 | if ($ftp->login("anonymous",'-anonymous@')) { |
273 | # connected | | 273 | # connected |
274 | return (1); | | 274 | return (1); |
275 | } else { | | 275 | } else { |
276 | if ($debug) { | | 276 | if ($debug) { |
277 | print "Cannot login ", $ftp->message; | | 277 | print "Cannot login ", $ftp->message; |
278 | } | | 278 | } |
279 | return (0); | | 279 | return (0); |
280 | } | | 280 | } |
281 | | | 281 | |
282 | } else { | | 282 | } else { |
283 | if ($debug) { | | 283 | if ($debug) { |
284 | print "Cannot connect to site: $@\n"; | | 284 | print "Cannot connect to site: $@\n"; |
285 | } | | | |
286 | } | | 285 | } |
| | | 286 | } |
287 | } | | 287 | } |
288 | | | 288 | |
289 | my $hadversion = 0; | | 289 | my $hadversion = 0; |
290 | # maximum ftp recursion | | 290 | # maximum ftp recursion |
291 | my $max_recurs = 3; | | 291 | my $max_recurs = 3; |
292 | my $nb_recurs; | | 292 | my $nb_recurs; |
293 | | | 293 | |
294 | sub ftp_ls { | | 294 | sub ftp_ls { |
295 | | | 295 | |
296 | my $path = $_[0]; | | 296 | my $path = $_[0]; |
297 | | | 297 | |
298 | # first connection | | 298 | # first connection |
299 | if (!defined($ftp)) { | | 299 | if (!defined($ftp)) { |
300 | | | 300 | |
301 | my $site = $_[0]; | | 301 | my $site = $_[0]; |
302 | $path = "/"; | | 302 | $path = "/"; |
303 | | | 303 | |
304 | $site =~ s/(ftp:\/\/)([^\/]+)(\/?.*)/$2/; | | 304 | $site =~ s/(ftp:\/\/)([^\/]+)(\/?.*)/$2/; |
305 | $path = $3; | | 305 | $path = $3; |
306 | | | 306 | |
307 | if (!ftp_connect($site)) { | | 307 | if (!ftp_connect($site)) { |
308 | return (0) | | 308 | return (0) |
309 | } | | | |
310 | } | | 309 | } |
| | | 310 | } |
311 | | | 311 | |
312 | if ($nb_recurs > $max_recurs) { | | 312 | if ($nb_recurs > $max_recurs) { |
313 | return (0); | | 313 | return (0); |
314 | } else { | | 314 | } else { |
315 | $nb_recurs++; | | 315 | $nb_recurs++; |
316 | } | | 316 | } |
317 | | | | |
318 | # don't recurse to yourself | | | |
319 | if ($path =~ /\.\ ?\//) { | | | |
320 | return (0); | | | |
321 | } | | | |
322 | | | | |
323 | my @list; | | | |
324 | if (my @ls = $ftp->dir($path)) { | | | |
325 | | | | |
326 | foreach (@ls) { | | | |
327 | chomp; | | | |
328 | | | | |
329 | my $relpath = $_; | | | |
330 | $relpath =~ s/.*[\t\ ](.+)$/$1/; | | | |
331 | | | | |
332 | my $type = substr($_, 0, 1); | | | |
333 | | | 317 | |
334 | # recurse | | 318 | # don't recurse to yourself |
335 | if ($type eq 'd') { | | 319 | if ($path =~ /\.\ ?\//) { |
| | | 320 | return (0); |
| | | 321 | } |
336 | | | 322 | |
337 | ftp_ls("$path/$relpath"); | | 323 | my @list; |
338 | # back from child directory, decrement recursion | | 324 | if (my @ls = $ftp->dir($path)) { |
339 | $nb_recurs--; | | | |
340 | | | 325 | |
341 | } else { | | 326 | foreach (@ls) { |
342 | push(@list, "$relpath"); | | 327 | chomp; |
343 | } | | 328 | |
344 | } | | 329 | my $relpath = $_; |
345 | # could not cwd | | 330 | $relpath =~ s/.*[\t\ ](.+)$/$1/; |
346 | } else { | | 331 | |
347 | if ($debug) { | | 332 | my $type = substr($_, 0, 1); |
348 | print "Cannot change working directory ", $ftp->message; | | 333 | |
349 | } | | 334 | # recurse |
350 | } | | 335 | if ($type eq 'd') { |
351 | | | 336 | |
352 | # remember when we have found something | | 337 | ftp_ls("$path/$relpath"); |
353 | if (find_version(@list)) { | | 338 | # back from child directory, decrement recursion |
354 | $hadversion = 1; | | 339 | $nb_recurs--; |
| | | 340 | |
| | | 341 | } else { |
| | | 342 | push(@list, "$relpath"); |
| | | 343 | } |
355 | } | | 344 | } |
| | | 345 | # could not cwd |
| | | 346 | } else { |
| | | 347 | if ($debug) { |
| | | 348 | print "Cannot change working directory ", $ftp->message; |
| | | 349 | } |
| | | 350 | } |
| | | 351 | |
| | | 352 | # remember when we have found something |
| | | 353 | if (find_version(@list)) { |
| | | 354 | $hadversion = 1; |
| | | 355 | } |
356 | | | 356 | |
357 | return ($hadversion); | | 357 | return ($hadversion); |
358 | } | | 358 | } |
359 | | | 359 | |
360 | sub http_ls { | | 360 | sub http_ls { |
361 | my $ua = LWP::UserAgent->new(agent => 'pkg_notify'); | | 361 | my $ua = LWP::UserAgent->new(agent => 'pkg_notify'); |
362 | | | 362 | |
363 | my @page = ""; | | 363 | my @page = ""; |
364 | my $site = $_[0]; | | 364 | my $site = $_[0]; |
365 | | | 365 | |
366 | my $headers = $ua->head($site); | | 366 | my $headers = $ua->head($site); |
367 | | | 367 | |
368 | if ($headers) { | | 368 | if ($headers) { |
369 | if ($headers->content_type !~ /text/) { | | 369 | if ($headers->content_type !~ /text/) { |
370 | print " * $site is a direct download !\n"; | | 370 | print " * $site is a direct download !\n"; |
371 | return (0); | | 371 | return (0); |
372 | } | | | |
373 | } else { | | | |
374 | print " ** $site has no HTTP headers !\n"; | | | |
375 | return (0); | | | |
376 | } | | 372 | } |
| | | 373 | } else { |
| | | 374 | print " ** $site has no HTTP headers !\n"; |
| | | 375 | return (0); |
| | | 376 | } |
377 | | | 377 | |
378 | my $reply = $ua->get($site); | | 378 | my $reply = $ua->get($site); |
379 | | | | |
380 | if ($reply->is_success) { | | | |
381 | @page = split("\n", $reply->content); | | | |
382 | | | 379 | |
383 | if ($go_subdirs) { | | 380 | if ($reply->is_success) { |
384 | $go_subdirs = 0; | | 381 | @page = split("\n", $reply->content); |
385 | foreach (@page) { | | | |
386 | chomp; | | | |
387 | | | 382 | |
388 | my $pattern = $pathvers; | | 383 | if ($go_subdirs) { |
389 | $pattern =~ s/.*\/([a-z]+)[\/\.\-_0-9]+$/$1/i; | | 384 | $go_subdirs = 0; |
| | | 385 | foreach (@page) { |
| | | 386 | chomp; |
390 | | | 387 | |
391 | if (/$pattern/) { | | 388 | my $pattern = $pathvers; |
| | | 389 | $pattern =~ s/.*\/([a-z]+)[\/\.\-_0-9]+$/$1/i; |
392 | | | 390 | |
393 | my $lsvers = $_; | | 391 | if (/$pattern/) { |
394 | $lsvers =~ s/.*a\ href\=\"([^\"\ ]+?)\".*/$1/i; | | | |
395 | | | 392 | |
396 | # both are / terminated | | 393 | my $lsvers = $_; |
397 | if ($lsvers =~ /[^\/]$/) { | | 394 | $lsvers =~ s/.*a\ href\=\"([^\"\ ]+?)\".*/$1/i; |
398 | $lsvers = $lsvers ."/"; | | | |
399 | } | | | |
400 | if ($pathvers =~ /[^\/]$/) { | | | |
401 | $pathvers = $pathvers ."/"; | | | |
402 | } | | | |
403 | | | 395 | |
404 | $lsvers = "$site/$lsvers"; | | 396 | # both are / terminated |
| | | 397 | if ($lsvers =~ /[^\/]$/) { |
| | | 398 | $lsvers = $lsvers ."/"; |
| | | 399 | } |
| | | 400 | if ($pathvers =~ /[^\/]$/) { |
| | | 401 | $pathvers = $pathvers ."/"; |
| | | 402 | } |
405 | | | 403 | |
406 | if ($lsvers ge $pathvers) { | | 404 | $lsvers = "$site/$lsvers"; |
407 | http_ls($lsvers); | | | |
408 | } | | | |
409 | } | | | |
410 | } # foreach page | | | |
411 | } # if subdirs | | | |
412 | | | 405 | |
413 | if (find_version(@page)) { | | 406 | if ($lsvers ge $pathvers) { |
414 | return (1); | | 407 | http_ls($lsvers); |
415 | } else { | | 408 | } |
416 | return (0); | | | |
417 | } | | 409 | } |
| | | 410 | } # foreach page |
| | | 411 | } # if subdirs |
| | | 412 | |
| | | 413 | if (find_version(@page)) { |
| | | 414 | return (1); |
418 | } else { | | 415 | } else { |
419 | if ($debug) { | | 416 | return (0); |
420 | print $reply->status_line; | | | |
421 | } | | | |
422 | } | | 417 | } |
| | | 418 | } else { |
| | | 419 | if ($debug) { |
| | | 420 | print $reply->status_line; |
| | | 421 | } |
| | | 422 | } |
423 | } | | 423 | } |
424 | | | 424 | |
425 | # read a file and return array | | 425 | # read a file and return array |
426 | sub readfile { | | 426 | sub readfile { |
427 | | | 427 | |
428 | open(FILE, $_[0]) || die "$_[0] not found"; | | 428 | open(FILE, $_[0]) || die "$_[0] not found"; |
429 | my @ret = <FILE>; | | 429 | my @ret = <FILE>; |
430 | close(FILE); | | 430 | close(FILE); |
431 | | | 431 | |
432 | return (@ret); | | 432 | return (@ret); |
433 | } | | 433 | } |
434 | | | 434 | |
435 | # match $match against a whole file | | 435 | # match $match against a whole file |
436 | sub file_rx_check { | | 436 | sub file_rx_check { |
437 | | | 437 | |
438 | my $match = $_[1]; | | 438 | my $match = $_[1]; |
439 | my $flat = join('\n', readfile($_[0])); | | 439 | my $flat = join('\n', readfile($_[0])); |
440 | | | 440 | |
441 | if ($flat =~ /$match/) { | | 441 | if ($flat =~ /$match/) { |
442 | return (1); | | 442 | return (1); |
443 | } else { | | 443 | } else { |
444 | return (0); | | 444 | return (0); |
445 | } | | 445 | } |
446 | } | | 446 | } |
447 | | | 447 | |
448 | my @packages; | | 448 | my @packages; |
449 | | | 449 | |
450 | my %opts; | | 450 | my %opts; |
451 | exit(2) if !getopts('c:', \%opts); | | 451 | exit(2) if !getopts('c:', \%opts); |
452 | $conf = $opts{c} if defined($opts{c}); | | 452 | $conf = $opts{c} if defined($opts{c}); |
453 | if ($#ARGV > -1) { | | 453 | if ($#ARGV > -1) { |
454 | @packages = @ARGV; | | 454 | @packages = @ARGV; |
455 | } else { | | 455 | } else { |
456 | @packages = readfile($conf); | | 456 | @packages = readfile($conf); |
457 | } | | 457 | } |
458 | | | 458 | |
459 | # load MASTER_SORT suffixes | | 459 | # load MASTER_SORT suffixes |
460 | my $master_sort_flat = `cd $pkgsrcbase/pkgtools/pkg_chk && $make show-var VARNAME=MASTER_SORT`; | | 460 | my $master_sort_flat = `cd $pkgsrcbase/pkgtools/pkg_chk && $make show-var VARNAME=MASTER_SORT`; |
461 | chomp($master_sort_flat); | | 461 | chomp($master_sort_flat); |
462 | my @master_sort_list = reverse(split(/[\ \t]+/, $master_sort_flat)); | | 462 | my @master_sort_list = reverse(split(/[\ \t]+/, $master_sort_flat)); |
463 | my @master_list; | | 463 | my @master_list; |
464 | | | 464 | |
465 | sub sort_master_sites { | | 465 | sub sort_master_sites { |
466 | my $m_list = $_[0]; | | 466 | my $m_list = $_[0]; |
467 | my @s_list = (); | | 467 | my @s_list = (); |
468 | | | 468 | |
469 | @master_list = (); | | 469 | @master_list = (); |
470 | | | 470 | |
471 | if ($m_list =~ /$SF_NET/) { | | 471 | if ($m_list =~ /$SF_NET/) { |
472 | # we only want ftp sites from SF | | 472 | # we only want ftp sites from SF |
473 | $m_list =~ s/https?:\/\/[^\t\ \n]+//g; | | 473 | $m_list =~ s/https?:\/\/[^\t\ \n]+//g; |
474 | $m_list =~ s/[\t\ \r\n]+//g; | | 474 | $m_list =~ s/[\t\ \r\n]+//g; |
475 | } | | 475 | } |
476 | | | 476 | |
477 | # graphics/libggi packages-like fix (ftp://blahhttp://bleh): missing space | | 477 | # graphics/libggi packages-like fix (ftp://blahhttp://bleh): missing space |
478 | # this is because of previous SF's char stripping | | 478 | # this is because of previous SF's char stripping |
479 | $m_list =~ s/([^\ ])(ftp\:|http\:|https\:)/$1\ $2/g; | | 479 | $m_list =~ s/([^\ ])(ftp\:|http\:|https\:)/$1\ $2/g; |
480 | | | 480 | |
481 | foreach (@master_sort_list) { | | 481 | foreach (@master_sort_list) { |
482 | if ($m_list =~ /(.*)(http|https|ftp)(\:\/\/[^\t\ ]*$_[^\t\ ]*)(.*)/) { | | 482 | if ($m_list =~ /(.*)(http|https|ftp)(\:\/\/[^\t\ ]*$_[^\t\ ]*)(.*)/) { |
483 | push @s_list, $2.$3; | | 483 | push @s_list, $2.$3; |
484 | $m_list = $1 . $4; | | 484 | $m_list = $1 . $4; |
485 | } | | 485 | } |
486 | } | | 486 | } |
487 | @s_list = reverse @s_list; | | 487 | @s_list = reverse @s_list; |
488 | push @master_list, @s_list; | | 488 | push @master_list, @s_list; |
489 | push @master_list, split(/[\ \t]+/, $m_list); | | 489 | push @master_list, split(/[\ \t]+/, $m_list); |
490 | | | 490 | |
491 | @master_list = reverse @master_list; | | 491 | @master_list = reverse @master_list; |
492 | } | | 492 | } |
493 | | | 493 | |
494 | # used to record last connection | | 494 | # used to record last connection |
495 | my $last_master_host = ""; | | 495 | my $last_master_host = ""; |
496 | | | 496 | |
497 | foreach (@packages) { | | 497 | foreach (@packages) { |
498 | chomp; | | 498 | chomp; |
499 | | | 499 | |
500 | # ignore comments and newlines | | 500 | # ignore comments and newlines |
501 | if (/^[#\n]/) { | | 501 | if (/^[#\n]/) { |
502 | next; | | 502 | next; |
503 | } | | 503 | } |
504 | | | 504 | |
505 | my $pkg = $_; | | 505 | my $pkg = $_; |
506 | my $master_site; | | 506 | my $master_site; |
507 | | | 507 | |
508 | $pkgpath = "$pkgsrcbase/$pkg/"; | | 508 | $pkgpath = "$pkgsrcbase/$pkg/"; |
509 | | | 509 | |
510 | $pkgname = `cd $pkgpath && $make show-var VARNAME=PKGNAME`; | | 510 | $pkgname = `cd $pkgpath && $make show-var VARNAME=PKGNAME`; |
511 | chomp($pkgname); | | 511 | chomp($pkgname); |
512 | | | 512 | |
513 | $pkgversion = $pkgname; | | 513 | $pkgversion = $pkgname; |
514 | $pkgversion =~ s/(.+)\-([0-9a-z_\.]+)$/$2/; | | 514 | $pkgversion =~ s/(.+)\-([0-9a-z_\.]+)$/$2/; |
515 | $pkgname = $1; | | 515 | $pkgname = $1; |
516 | $pkgversion =~ s/nb[0-9]+$//; | | 516 | $pkgversion =~ s/nb[0-9]+$//; |
517 | | | 517 | |
518 | my ($major, $minor) = split(/\./, $pkgversion); | | 518 | my ($major, $minor) = split(/\./, $pkgversion); |
519 | | | 519 | |
520 | chomp($distname = `cd $pkgpath && $make show-var VARNAME=DISTNAME`); | | 520 | chomp($distname = `cd $pkgpath && $make show-var VARNAME=DISTNAME`); |
521 | | | 521 | |
522 | # will we strip version numbers from extensions ? | | 522 | # will we strip version numbers from extensions ? |
523 | my $nostrip = 0; | | 523 | my $nostrip = 0; |
524 | | | 524 | |
525 | $nicearc = 0; | | 525 | $nicearc = 0; |
526 | # nice archive, has a comprehensive versioning | | 526 | # nice archive, has a comprehensive versioning |
527 | if (defined($minor) && ($distname =~ /(.+?)($major[\._]?$minor.*$)/)) { | | 527 | if (defined($minor) && ($distname =~ /(.+?)($major[\._]?$minor.*$)/)) { |
528 | $dist = $1; | | 528 | $dist = $1; |
529 | $version = $2; | | 529 | $version = $2; |
530 | $nicearc = 1; | | 530 | $nicearc = 1; |
531 | # archive appears to only have a major | | 531 | # archive appears to only have a major |
532 | } elsif (defined($major) && ($distname =~ /(.+)($major.*)/)) { | | 532 | } elsif (defined($major) && ($distname =~ /(.+)($major.*)/)) { |
533 | $dist = $1; | | 533 | $dist = $1; |
534 | $version = $2; | | 534 | $version = $2; |
535 | # ok, archive versioning is a pure mess | | 535 | # ok, archive versioning is a pure mess |
536 | # assume version is everything not being PKGNAME | | 536 | # assume version is everything not being PKGNAME |
| | | 537 | } else { |
| | | 538 | $dist = $pkgname; |
| | | 539 | $version = $distname; |
| | | 540 | $version =~ s/$pkgname//; |
| | | 541 | |
| | | 542 | # don't strip extensions |
| | | 543 | $nostrip = 1; |
| | | 544 | } |
| | | 545 | |
| | | 546 | # MASTER_SITES is MASTER_SITE_LOCAL, skip |
| | | 547 | if (file_rx_check("$pkgpath/Makefile", |
| | | 548 | "MASTER_SITES.+MASTER_SITE_LOCAL")) { |
| | | 549 | next; |
| | | 550 | } |
| | | 551 | |
| | | 552 | # extract HOMEPAGE |
| | | 553 | my $homepage = `cd $pkgpath && $make show-var VARNAME=HOMEPAGE`; |
| | | 554 | chomp($homepage); |
| | | 555 | |
| | | 556 | # extract 1st MASTER_SITE from list |
| | | 557 | my $master_flat_list = `cd $pkgpath && $make show-var VARNAME=MASTER_SITES`; |
| | | 558 | chomp($master_flat_list); |
| | | 559 | |
| | | 560 | sort_master_sites($master_flat_list); |
| | | 561 | |
| | | 562 | next_master_site: |
| | | 563 | |
| | | 564 | $master_site = pop @master_list; |
| | | 565 | if (!$master_site) { |
| | | 566 | next; |
| | | 567 | } |
| | | 568 | chomp($master_site); |
| | | 569 | |
| | | 570 | # sourceforge archive |
| | | 571 | if ($master_site =~ /$SF_NET.+\/(.+)\/?$/) { |
| | | 572 | # SF ftp is hashed |
| | | 573 | my $sfpkgdir = $1; |
| | | 574 | my $hash = substr($sfpkgdir, 0, 1)."/".substr($sfpkgdir, 0, 2); |
| | | 575 | $master_site =~ s/(.+sourceforge)\/.*/$1/; |
| | | 576 | $master_site = $master_site."/".$hash."/$sfpkgdir"; |
| | | 577 | } |
| | | 578 | |
| | | 579 | if (($distname eq "") || ($master_site eq "")) { |
| | | 580 | print "missing DISTNAME or MASTER_SITES for package $pkgname\n"; |
| | | 581 | next; |
| | | 582 | } |
| | | 583 | |
| | | 584 | $version = dot_strip($version); |
| | | 585 | |
| | | 586 | my $vers_display = $version; |
| | | 587 | if ($vers_display eq "") { |
| | | 588 | $vers_display = "none"; |
| | | 589 | } |
| | | 590 | |
| | | 591 | $version = beta_strip($version); |
| | | 592 | |
| | | 593 | # strip extensions |
| | | 594 | if ($nostrip == 0) { |
| | | 595 | $version = ext_strip($version); |
| | | 596 | } |
| | | 597 | |
| | | 598 | print "- checking for newer version of $pkg\n"; |
| | | 599 | print " \\ actual distname version: $vers_display\n"; |
| | | 600 | print " \\ master site: $master_site\n"; |
| | | 601 | |
| | | 602 | $extract_sufx = `cd $pkgpath && $make show-var VARNAME=EXTRACT_SUFX`; |
| | | 603 | chomp($extract_sufx); |
| | | 604 | |
| | | 605 | # protect special chars |
| | | 606 | $dist =~ s/([\+\-\[\]\{\}\.\*])/\\$1/g; |
| | | 607 | |
| | | 608 | $go_subdirs = 0; |
| | | 609 | $pathvers = ""; |
| | | 610 | |
| | | 611 | # try HOMEPAGE first |
| | | 612 | my $found = 0; |
| | | 613 | if ($homepage ne "") { |
| | | 614 | print " \\ homepage: $homepage\n"; |
| | | 615 | $found = http_ls($homepage, $distname); |
| | | 616 | } |
| | | 617 | |
| | | 618 | # homepage had no infos, fallback to MASTER_SITES |
| | | 619 | if ($found == 0) { |
| | | 620 | |
| | | 621 | # check if version exists on MASTER_SITES so we strip it |
| | | 622 | # typically ftp://ftp.gnome.org/pub/GNOME/sources/gnome-core/1.4 |
| | | 623 | if ($nicearc) { |
| | | 624 | $pathvers = $version; |
| | | 625 | $pathvers =~ s/([0-9]+[\-_\.][0-9]+)([\-_\.][0-9]+)*/$1/; |
| | | 626 | # strip master_site to parent |
| | | 627 | if ($master_site =~ /(.+)\/[^\/]*$pathvers.*/) { |
| | | 628 | # save full path |
| | | 629 | $pathvers = $master_site; |
| | | 630 | # base directory |
| | | 631 | $master_site = $1; |
| | | 632 | $go_subdirs = 1; |
| | | 633 | } |
| | | 634 | } |
| | | 635 | |
| | | 636 | # ftp master site |
| | | 637 | if ($master_site =~ /^ftp\:\/\//) { |
| | | 638 | $nb_recurs = 0; |
| | | 639 | # do not close / reconnect if new ftp site == last ftp site |
| | | 640 | if (($master_site !~ /$last_master_host/) && defined($ftp)) { |
| | | 641 | $ftp->quit; |
| | | 642 | undef($ftp); |
| | | 643 | } |
| | | 644 | |
| | | 645 | ftp_ls($master_site, $distname); |
| | | 646 | $last_master_host = $master_site; |
| | | 647 | $last_master_host =~ s/(ftp:\/\/[^\/]+).*/$1/; |
| | | 648 | |
| | | 649 | if (!defined($ftp)) { |
| | | 650 | print " /!\\ there was an error while connecting to $master_site\n"; |
| | | 651 | # believe me you prefer see this than a while / break |
| | | 652 | goto next_master_site; |
| | | 653 | } |
| | | 654 | |
| | | 655 | # http master site |
| | | 656 | } elsif ($master_site =~ /^https?\:\/\//) { |
| | | 657 | http_ls($master_site, $distname); |
537 | } else { | | 658 | } else { |
538 | $dist = $pkgname; | | 659 | print "unsupported MASTER_SITES protocol"; |
539 | $version = $distname; | | | |
540 | $version =~ s/$pkgname//; | | | |
541 | | | | |
542 | # don't strip extensions | | | |
543 | $nostrip = 1; | | | |
544 | } | | | |
545 | | | | |
546 | # MASTER_SITES is MASTER_SITE_LOCAL, skip | | | |
547 | if (file_rx_check("$pkgpath/Makefile", | | | |
548 | "MASTER_SITES.+MASTER_SITE_LOCAL")) { | | | |
549 | next; | | | |
550 | } | | | |
551 | | | | |
552 | # extract HOMEPAGE | | | |
553 | my $homepage = `cd $pkgpath && $make show-var VARNAME=HOMEPAGE`; | | | |
554 | chomp($homepage); | | | |
555 | | | | |
556 | # extract 1st MASTER_SITE from list | | | |
557 | my $master_flat_list = `cd $pkgpath && $make show-var VARNAME=MASTER_SITES`; | | | |
558 | chomp($master_flat_list); | | | |
559 | | | | |
560 | sort_master_sites($master_flat_list); | | | |
561 | | | | |
562 | next_master_site: | | | |
563 | | | | |
564 | $master_site = pop @master_list; | | | |
565 | if (!$master_site) { | | | |
566 | next; | | | |
567 | } | | | |
568 | chomp($master_site); | | | |
569 | | | | |
570 | # sourceforge archive | | | |
571 | if ($master_site =~ /$SF_NET.+\/(.+)\/?$/) { | | | |
572 | # SF ftp is hashed | | | |
573 | my $sfpkgdir = $1; | | | |
574 | my $hash = substr($sfpkgdir, 0, 1)."/".substr($sfpkgdir, 0, 2); | | | |
575 | $master_site =~ s/(.+sourceforge)\/.*/$1/; | | | |
576 | $master_site = $master_site."/".$hash."/$sfpkgdir"; | | | |
577 | } | | | |
578 | | | | |
579 | if (($distname eq "") || ($master_site eq "")) { | | | |
580 | print "missing DISTNAME or MASTER_SITES for package $pkgname\n"; | | | |
581 | next; | | | |
582 | } | | | |
583 | | | | |
584 | $version = dot_strip($version); | | | |
585 | | | | |
586 | my $vers_display = $version; | | | |
587 | if ($vers_display eq "") { | | | |
588 | $vers_display = "none"; | | | |
589 | } | | | |
590 | | | | |
591 | $version = beta_strip($version); | | | |
592 | | | | |
593 | # strip extensions | | | |
594 | if ($nostrip == 0) { | | | |
595 | $version = ext_strip($version); | | | |
596 | } | | | |
597 | | | | |
598 | print "- checking for newer version of $pkg\n"; | | | |
599 | print " \\ actual distname version: $vers_display\n"; | | | |
600 | print " \\ master site: $master_site\n"; | | | |
601 | | | | |
602 | $extract_sufx = `cd $pkgpath && $make show-var VARNAME=EXTRACT_SUFX`; | | | |
603 | chomp($extract_sufx); | | | |
604 | | | | |
605 | # protect special chars | | | |
606 | $dist =~ s/([\+\-\[\]\{\}\.\*])/\\$1/g; | | | |
607 | | | | |
608 | $go_subdirs = 0; | | | |
609 | $pathvers = ""; | | | |
610 | | | | |
611 | # try HOMEPAGE first | | | |
612 | my $found = 0; | | | |
613 | if ($homepage ne "") { | | | |
614 | print " \\ homepage: $homepage\n"; | | | |
615 | $found = http_ls($homepage, $distname); | | | |
616 | } | | | |
617 | | | | |
618 | # homepage had no infos, fallback to MASTER_SITES | | | |
619 | if ($found == 0) { | | | |
620 | | | | |
621 | # check if version exists on MASTER_SITES so we strip it | | | |
622 | # typically ftp://ftp.gnome.org/pub/GNOME/sources/gnome-core/1.4 | | | |
623 | if ($nicearc) { | | | |
624 | $pathvers = $version; | | | |
625 | $pathvers =~ s/([0-9]+[\-_\.][0-9]+)([\-_\.][0-9]+)*/$1/; | | | |
626 | # strip master_site to parent | | | |
627 | if ($master_site =~ /(.+)\/[^\/]*$pathvers.*/) { | | | |
628 | # save full path | | | |
629 | $pathvers = $master_site; | | | |
630 | # base directory | | | |
631 | $master_site = $1; | | | |
632 | $go_subdirs = 1; | | | |
633 | } | | | |
634 | } | | | |
635 | | | | |
636 | # ftp master site | | | |
637 | if ($master_site =~ /^ftp\:\/\//) { | | | |
638 | $nb_recurs = 0; | | | |
639 | # do not close / reconnect if new ftp site == last ftp site | | | |
640 | if (($master_site !~ /$last_master_host/) && defined($ftp)) { | | | |
641 | $ftp->quit; | | | |
642 | undef($ftp); | | | |
643 | } | | | |
644 | | | | |
645 | ftp_ls($master_site, $distname); | | | |
646 | $last_master_host = $master_site; | | | |
647 | $last_master_host =~ s/(ftp:\/\/[^\/]+).*/$1/; | | | |
648 | | | | |
649 | if (!defined($ftp)) { | | | |
650 | print " /!\\ there was an error while connecting to $master_site\n"; | | | |
651 | # believe me you prefer see this than a while / break | | | |
652 | goto next_master_site; | | | |
653 | } | | | |
654 | | | | |
655 | # http master site | | | |
656 | } elsif ($master_site =~ /^https?\:\/\//) { | | | |
657 | http_ls($master_site, $distname); | | | |
658 | } else { | | | |
659 | print "unsupported MASTER_SITES protocol"; | | | |
660 | } | | | |
661 | } | | 660 | } |
| | | 661 | } |
662 | | | 662 | |
663 | } # foreach package | | 663 | } # foreach package |
664 | | | 664 | |
665 | # if there was a resient ftp connexion, close it | | 665 | # if there was a resient ftp connexion, close it |
666 | if (defined($ftp)) { | | 666 | if (defined($ftp)) { |
667 | $ftp->quit; | | 667 | $ftp->quit; |
668 | } | | 668 | } |