/[dehs]/trunk/dehs_pg.php
ViewVC logotype

Contents of /trunk/dehs_pg.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 17 - (show annotations) (download)
Tue Jun 29 02:15:08 2004 UTC (8 years, 10 months ago) by evaso-guest
File size: 30138 byte(s)
Some important various features and bugsfix
1 #!/usr/bin/php4 -q
2 <?
3 /*
4
5 Originally written by Stefano Fabri <bluefuture@nospam@email.it>
6 Copyright 2004, Stefano Fabri
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22 // stabilire una connessione
23 #ini_set ( "error_reporting", "E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR");
24 ini_set ("html_errors", "off");
25 set_time_limit(0);
26 ini_set ( "memory_limit", "15M");
27 #print_R($_SERVER);
28 require "dehs.config.inc";
29 dir_ctrl($dirs);
30 if (!function_exists('file_get_contents')) {
31 function file_get_contents($filename) {
32 if (!($file = fopen($filename,"r"))) return false;
33 else {
34 $contents = "";
35 do {
36 $data = fread($file, 4096);
37 if (strlen($data) == 0) {
38 break;
39 }
40 $contents .= $data;
41 } while (true);
42 fclose($file);
43 return $contents;
44 }
45 }
46 }
47 if (in_array("-db_add",$argv)) db_add($argv[2]);
48 elseif (in_array("-db_query",$argv)) db_query($argv[2],$argv[3] );
49 elseif (in_array("-keep_diff",$argv)) keep_diff($argv[2]);
50 elseif (in_array("-keep_sources",$argv)) keep_sources();
51 elseif (in_array("-db_popcon",$argv)) db_popcon($argv[2]);
52 elseif (in_array("-keep_popcon",$argv)) keep_popcon($argv[2]);
53 elseif (in_array("-db_upstream",$argv)) db_upstream($argv[2]);
54 elseif (in_array("-update_all",$argv)) update_all();
55 elseif (in_array("-check_db",$argv)) check_db();
56 elseif (in_array("-db_up_error",$argv)) db_up_error();
57 elseif (in_array("-up_changes",$argv)) up_changes($argv[2]);
58 elseif (in_array("-watchf",$argv)) watch_fill($argv[2]);
59 elseif (in_array("-kb_total",$argv)) print "Diff
60 #stat_up_error();
61 #stat_up_error();to download Kb => " . kb_total($argv[2]) . "\n" ;
62 elseif (in_array("-watch_stat",$argv)) watch_stat();
63 else print "Command $argv[1] not found\n";
64 #stat_up_error();
65 function dir_ctrl($dirs) {
66 foreach ($dirs as $dir) {
67 if (!is_dir($dir)) exec("mkdir -m 755 -p $dir") or die('Error creating basic dirs\n');
68 }
69 }
70 function ext_watch ($file,$pkg,$version){
71 if (!file_exists($file)) return "";
72 $zp=gzopen($file,"r") or die("Fail to open $file");
73 while (!gzeof($zp)) {
74 $line = gzgets ($zp,4096);
75 if (preg_match("/\+\+\+\s.+\/debian\/watch/",$line)) {
76 $line = gzgets ($zp,4096);
77 preg_match ("/.+\+\d+\,(\d+)\s/",$line,$watch_lenght);
78 for ($i = 1; $i <= $watch_lenght[1]; $i++) {
79 $line=gzgets ($zp,4096);
80 $watch .=substr($line,1);
81 }
82 break;
83 }
84 }
85 if ($watch!=null) return $watch;
86 else return NULL;
87 }
88 function ftp_cn($login,$password,$ftp_server) {
89 $conn_id = @ftp_connect($ftp_server) or DIE("Error: Cannot contact ftp server $ftp_server\n");
90 // login con user name e password
91 ftp_pasv($conn_id,1);
92 $login_result = ftp_login($conn_id, "anonymous","bo@bo.org");
93 // controllo della connessione
94 if ((!$conn_id) || (!$login_result)) {
95 echo "Ftp connection failed!\n";
96 echo "Failed connection to $ftp_server\n";
97 die();
98 } else {
99 return $conn_id;
100 }
101 }
102 function keep_diff($initial) {
103 global $dirs,$dbconn,$mirrors;
104 check_db();
105 $conn_normal=ftp_cn("anonymous","bo@bo.org",$mirrors['unstable']);
106 $conn_non_us=ftp_cn("anonymous","bo@bo.org",$mirrors["non-US"]);
107 $db = pg_pconnect($dbconn) ;
108 $rsql=pg_exec($db, "SELECT * FROM pkgs WHERE name like '$initial%' AND (md5_diff!=md5_atsource or md5_diff is null)") OR DIE("Error in diff query\n");
109 $total=pg_numrows($rsql);
110 $btotal=byte_total($db,$initial);
111 print "Total Diff to downlaod Kb => " . number_format ($btotal/1024, 2, ",",".") . "\n";
112 while ($res_array=pg_fetch_array($rsql)) {
113 if ($res_array['dist']=='non-US') $conn_id = $conn_non_us;
114 else $conn_id = $conn_normal;
115 if ($localfile=download_diffs($conn_id,$res_array[name],$res_array[version],$res_array['dir'],$res_array[md5_diff],$res_array[md5_atsource],$res_array[bytes],$res_array[dist])) {
116 $watch=ext_watch($localfile,$res_array[name],$res_array[version]);
117 unlink($localfile);
118 if ($watch!=NULL) {
119 $watch= addslashes($watch);
120 pg_exec($db, "UPDATE pkgs SET watch='" . $watch . "', md5_diff='" . $res_array[md5_atsource] . "' where name='" . $res_array[name] . "' AND dist='" . $res_array[dist] ."'") or Die("Query error");
121 }
122 else pg_exec($db, "UPDATE pkgs SET watch=NULL, md5_diff='" . $res_array[md5_atsource] . "' where name='" . $res_array[name] . "' AND dist='" . $res_array[dist] ."'") or Die("Errore nella query");
123 }
124 $btotal=$btotal-$res_array['bytes'];
125 number_format ($btotal/1024, 2, ",",".");
126 print "\rDiffs left => " . $total-- . " Bytes left => " . number_format ($btotal/1024, 2, ",",".") . " - " . $res_array[name];
127 }
128 ftp_quit($conn_normal);
129 ftp_quit($conn_non_us);
130 pg_close($db);
131 return "Fatto\n";
132 }
133 function download_diffs(&$conn_id,$pkg,$version,$directory,$md5_diff,$md5_atsource,$diff_kb,$dist) {
134 global $dirs,$mirrors;
135 $localfile=$dirs[diffs_dir] . "/$pkg" . "_" . "$version.diff.gz";
136 if ($dist=="non-US") $remotefile="/debian-non-US/$directory/$pkg" . "_" . "$version.diff.gz";
137 else $remotefile="/debian/$directory/$pkg" . "_" . "$version.diff.gz";
138 #print "$localfile - $remotefile\n";
139 if (ftp_get($conn_id,$localfile,$remotefile,FTP_BINARY)) {
140 # print "$pkg Diff.gz => Downloaded\n";
141 if(md5_of_file($localfile)==$md5_atsource) {
142 #print "MD5 => OK\n";
143 #unlink($localfile);
144 return $localfile;
145 }
146 }
147 print "Download Diff.gz of package $pkg => Fallito\n";
148 return false;
149 }
150 function db_add($initial=''){
151 global $dirs,$dists,$dbconn;
152 check_db();
153 keep_source();
154 $db = pg_connect($dbconn) or die(pg_errormessage($db));
155 pg_exec($db, "CREATE TEMP TABLE pkgs_atsrc (name text,dist text)") or die('Error creating temp table pkgs_atsrc');
156 pg_exec($db, "CREATE UNIQUE INDEX idxdis on pkgs_atsrc (name,dist)") or die('Error creating index on temp table');
157 pg_exec($db, "CREATE TEMP TABLE bin_atsrc (name text,bin_name text, dist text)") or die('Error creating temp table pkgs_atsrc');
158 pg_exec($db, "CREATE UNIQUE INDEX idxbis on bin_atsrc (name,bin_name,dist)") or die('Error creating index on temp table bin_atsrc');
159 foreach ($dists as $dist=>$sections) {
160 foreach ($sections as $section) {
161 $filename=$dirs[sources_dir] . "/$dist/$section/Sources.gz";
162 print "\nI'm parsing $dist/$section => Sources.gz\n";
163 # 1 Pacchetto - 2 versione - 3 np - 4 Directory - 5 md5
164 $regexp="/Package:\s($initial.*)[^a]Binary:\s(.+)[^a]Version:\s(\d+:)?(.+)[^a]Priority.+Maintainer:.+<([^>]+)>[^a].+Directory:\s(.+)[^a]Files:.+\s(\S+)\s(\d+)\s" . '\1\S+' . "\.diff\.gz/Ssi";
165 $zp = gzopen($filename, "r") or die("Could not open $filename");
166 $extracted="/tmp/$dist_$section_Sources.gz";
167 exec("gzip -c -d $filename > $extracted");
168 $sourcesize=filesize($extracted);
169 if(filesize($filename)>20) {
170 while (!gzeof($zp)) {
171 $line='';
172 while ($line!="\n") {
173 $line = gzgets ($zp,4096) ;
174 $buff1 .= $line;
175 }
176 if (preg_match($regexp,$buff1,$matches)) {
177 # print("Pacchetto => $matches[1]\nVersione => $matches[4]\nDirectory => $matches[5]\nMD5 => $matches[6]\n");
178 # print "REPLACE INTO pkgs (name,version,dir,md5_diff) VALUES ($matches[1],$matches[3],$matches[4],$matches[5])";
179 @pg_exec($db,"INSERT INTO pkgs_atsrc (name,dist) VALUES ('$matches[1]','$dist')") OR DIE("Temp table pkgs_atsrc query error");
180 $rst=@pg_exec($db, "INSERT INTO pkgs (name,version,maint,dir,md5_atsource,bytes,dist,section) VALUES ('$matches[1]','$matches[4]','$matches[5]','$matches[6]','$matches[7]','$matches[8]','$dist','$section')") ;
181 if (!$rst) {
182 $rst=@pg_exec($db, "UPDATE pkgs SET name='$matches[1]',version='$matches[4]',maint='$matches[5]',dir='$matches[6]',md5_atsource='$matches[7]',bytes='$matches[8]',dist='$dist',section='$section' WHERE name='$matches[1]' AND dist='$dist'") OR DIE ("\nDb adding error =>" . pg_errormessage() . "\n");
183 # if ($rst) print "\rUpdated $matches[1]" ." ";
184 }
185 $bin_names=split(",", $matches[2]);
186 foreach ($bin_names as $bin_name) {
187 pg_exec($db,"INSERT INTO bin_atsrc (name,bin_name,dist) VALUES ('$matches[1]','" . trim($bin_name) . "','$dist')") OR DIE("Temp table pkgs_atsrc query error");
188 $rst=@pg_exec($db, "INSERT INTO binpkgs (name,bin_name,dist) VALUES ('$matches[1]','" . trim($bin_name) . "','$dist')") ;
189 # if (!$rst) {
190 # $rst=@pg_exec($db, "UPDATE binpkgs SET name='$matches[1]',bin_name='" . trim($bin_name) . "'") OR DIE("Binary Db adding error =>". pg_errormessage());
191 # if ($rst) print "\rUpdated binpkgs $bin_name ";
192 # }
193 }
194 }
195 else {
196 preg_match("/Package:\s(.+)[^a]Binary/im",$buff1,$matches);
197 #print $matches[1] . "- " . strncmp($initial,$matches[1],strlen($initial)) . "\n";
198 if(strncmp($initial,$matches[1],strlen($initial))<0) break;
199 }
200 $left=$sourcesize-gztell($zp);
201 print "\rSource file Left => $left";
202 $buff1="";
203 unset($matches);
204 # unset($matches);
205 # if (strcmp($init,substr($matches[1],0,strlen($init)))<=0) break;
206 }
207 }
208 gzclose($zp) ;
209 }
210 }
211 clear_db($db);
212 pg_close($db);
213 }
214 function db_query($pkg,$dist) {
215 global $dirs,$dbconn;
216 $db = pg_pconnect($dbconn ) or die(pg_errormessage($db));
217 $rsql=pg_exec($db, "SELECT pkgs.* ,mpop_inst FROM (SELECT name,MAX(binpkgs.pop_inst) AS mpop_inst FROM binpkgs GROUP BY name)
218 AS binpkgs INNER JOIN pkgs ON pkgs.name=binpkgs.name
219 WHERE pkgs.name='$pkg' AND dist='$dist';");
220 if (pg_numrows($rsql)==1) {
221 $res_array=pg_fetch_array($rsql);
222 print "Package=> " . $res_array['name'] . "\n";
223 print "Version => " . $res_array['version'] . "\n";
224 print "Diff MD5 Downloaded => " . $res_array['md5_diff'] . "\n";
225 print "Diff MD5 at Sources => " . $res_array['md5_atsource'] . "\n";
226 print "Distribution => " . $res_array['dist'] . "\n";
227 print "Section => " . $res_array['section'] . "\n";
228 print "KBytes => " . number_format ( $res_array['bytes']/1024, 2, ",",".") . "\n";
229 print "Pop Inst=>" . $res_array['mpop_inst'] . "\n";
230 if ($res_array['watch']) {
231 $uscan_res=uscan_foo($res_array['name'] ,$res_array['version'],$res_array['watch']);
232 print "Version Upstream => " . $uscan_res[0] . "\n";
233 print "Watch => " . $res_array['watch'];
234 print "Watch Warings => " . $uscan_res[1];
235 }
236 else print "Watch => Not present" . "\n";
237 }
238 else echo "Package=> " . $pkg . "\nNot found\n!!";
239 pg_close($db);
240 }
241 function byte_total(&$db,$initial){
242 global $dirs;
243 $rsql=pg_exec ($db,"Select sum(bytes) as totbytes FROM pkgs WHERE name like '$initial%' AND (md5_diff!=md5_atsource or md5_diff is null)");
244 $res_array=pg_fetch_array($rsql);
245 return $res_array[totbytes] ;
246 }
247 function keep_source (){
248 global $dirs,$dists,$mirrors;
249 foreach ($dists as $dist=>$sections) {
250 $server=$mirrors[$dist];
251 $conn_id = ftp_cn("anonymous","bo@bo.org",$server);
252 foreach ($sections as $section) {
253 $localfile=$dirs[sources_dir] . "/$dist/$section/Sources.gz";
254 $remotefile=remote_dist_dir($dist) . "/$dist/$section/source/Sources.gz";
255 $sources_info=md5_source($section,$dist);
256 if (!file_exists ($dirs[sources_dir] . "/$dist/")) mkdir ( $dirs[sources_dir] . "/$dist","755");
257 if (!file_exists ($dirs[sources_dir] . "/$dist/$section")) mkdir ($dirs[sources_dir] . "/$dist/$section","755");
258 if (!file_exists($localfile) OR md5_of_file($localfile)!=$sources_info[md5]) {
259
260 print "Downloading $remotefile Bytes $sources_info[bytes]=> ";
261 if (ftp_get($conn_id,$localfile,$remotefile,FTP_BINARY)) {
262 print "Done\n";
263 if(md5_of_file($localfile)==$sources_info[md5]) print "MD5 => OK\n";
264 }
265 else {
266 unlink("$localfile");
267 print "Fail\n";
268 die ("Error in source file");
269 }
270 }
271 }
272 }
273 ftp_quit($conn_id);
274 }
275 function md5_source($section,$dist) {
276 global $mirrors;
277 $relase=file_get_contents ("ftp://$mirrors[$dist]" . remote_dist_dir($dist) . "/$dist/Release") or die("Failed to check MD5 of sources");
278 preg_match ("/\s([^\s]+)\s+(\d+)\s$section\/source\/Sources\.gz/i", $relase,$matches);
279 return array("md5"=>$matches[1],"bytes"=>$matches[2]);
280 # 183dea9ca3c2e35ffd6cf5eee9501c21 2941637 main/binary-i386/Packages.gz
281 }
282
283 function vers_conv($debvers) {
284 preg_match("/(.+)(ds-|-)/",$debvers,$matches);
285 return $matches[1];
286 }
287 function check_db() {
288 global $dirs,$dbconn;
289 $db = @pg_connect($dbconn) or die(pg_last_notice());
290 if (!pg_table_exists($db,"pkgs")){
291 pg_exec($db, "CREATE TABLE pkgs (id serial PRIMARY KEY,name text,version text,maint text, dir text,watch text,md5_diff text,md5_atsource text,bytes numeric,dist text,section text,up_version text,up_changes text, up_url text,watch_warn text,updated bool, keep_changes bool, wwiz text,wwiz_version text, wwiz_type text)") or die('Error creating table pkgs\n');
292 pg_exec($db, "CREATE UNIQUE INDEX idxname on pkgs (name,dist)") or die('Errore creating index - ' . pg_last_error($db));
293 $sw=true;
294 }
295 if (!pg_table_exists($db,"binpkgs")){
296 pg_exec($db, "CREATE TABLE binpkgs (id serial PRIMARY KEY, name text,bin_name text,dist text, pop_inst numeric,pop_vote numeric, up_error numeric,avg_error_date numeric)") or die('Error creating table binpkgs\n');
297 pg_exec($db, "CREATE UNIQUE INDEX idxbin on binpkgs (name,bin_name,dist)") or die('Errore creating index - ' . pg_last_error($db));
298 $sw=true;
299 }
300 #if (!pg_table_exists($db,"upstream")){
301 # pg_exec($db, "CREATE TABLE upstream (name text,dist text,up_version text,watch_warn text,updated bool)") or die('Errore nel creare la tabella');
302 # pg_exec($db, "CREATE UNIQUE INDEX idxupstrm on upstream (name,dist)") or die('Errore nel creare gli indici ' . pg_last_error($db));
303 # $sw=true;
304 #}
305 pg_close($db);
306 if($sw) return $sw;
307 else return false;
308 }
309 function pg_table_exists (&$dblink, $table) {
310 $sql = "SELECT relname as tbl FROM pg_class WHERE relname = '$table'";
311 if ($res = pg_exec ($dblink, $sql)) {
312 return pg_numrows($res) > 0;
313 } else {
314 return false; // or throw exception
315 }
316 }
317
318
319 function watch_stat() {
320 global $dirs,$dbconn;
321 $db = pg_pconnect($dbconn) or die(pg_errormessage($db));
322 $rsql=pg_exec ($db,"Select count(name) as totwatch FROM pkgs WHERE watch!=''");
323 $tot_watch=pg_fetch_array($rsql);
324 print "Total packages with Watch =>$tot_watch[0]\n";
325 $rsql=pg_exec ($db,"Select count(name) as totwatch FROM pkgs WHERE watch IS NULL");
326 $tot_nowatch=pg_fetch_array($rsql);
327 pg_close($db);
328 print "Totale packages without Watch => $tot_nowatch[0]\n";
329 print "Watch presence rate => " . number_format ($tot_watch[0]/($tot_nowatch[0]+$tot_watch[0])*100, 2, ",",".") . "%\n";
330 }
331 function remote_dist_dir($dist) {
332 if ($dist=="non-US") return "/debian-non-US/dists/unstable/";
333 else return "/debian/dists";
334 }
335 function clear_db(&$db) {
336 #global $dbconn;
337 #if (check_db()) die("Il Database era vuoto\n");
338 #keep_source();
339 #$db = pg_pconnect($dbconn) or die(pg_result_error($db));
340 $sql1= "Delete from binpkgs where id NOT IN
341 (select id FROM binpkgs INNER JOIN bin_atsrc USING (name,bin_name,dist))" ;
342 $sql2= "Delete from pkgs where id NOT IN (select id FROM pkgs INNER JOIN pkgs_atsrc USING (name,dist))" ;
343 #$sql3= "Delete from upstream where name NOT IN
344 # (select name FROM pkgs_atsrc) AND dist NOT IN (select dist FROM pkgs_atsrc)" ;
345 if(pg_exec($db,$sql1) AND pg_exec($db,$sql2)) print "Db clear complete\n";
346 }
347 function db_popcon($initial='') {
348 global $dirs,$dbconn;
349 $db = pg_pconnect($dbconn) or die(pg_errormessage($db));
350 $filename=$dirs[popcon_dir] . "/all-popcon-results.txt.gz";
351 $regexp="/Package:\s($initial\S*)\s+(\d+)\s+(\d+)/iS";
352 $zp = gzopen($filename, "r") or die("Could not open $filename");
353 $tin=time();
354 if(filesize($filename)>20) {
355 #pg_exec($db, "BEGIN TRANSACTION") OR DIE("Impossibile iniziare la transazione");
356 while (!gzeof($zp)) {
357 $line = gzgets ($zp,4096) ;
358 if (preg_match($regexp,$line,$matches)) {
359 #print "\rName => $matches[1] Install => $matches[2] Vote => $matches[3]";
360 @pg_exec($db, "UPDATE binpkgs SET pop_inst='$matches[2]',pop_vote='$matches[3]' WHERE bin_name='$matches[1]'");
361 $processed+=1;
362 $elapsed_time=time()-$tin;
363 if (($elapsed_time % 20)==0 AND $updtime!=$elapsed_time) {
364 $updtime=$elapsed_time;
365 $wprocessed=$processed-$wprocessed;
366 $avg_time=$wprocessed/20;
367 $wprocessed=$processed;
368 $countdown=(34701- $processed)/$avg_time;
369 $last_time=time();
370 }
371 print "\rProcessing Popcon: " . date("i:s",$countdown=$countdown-(time()-$last_time)) . " =>" . (34701-$processed) . " Media $avg_time";
372 $last_time=time();
373 }
374 }
375 #pg_exec($db, "COMMIT") OR DIE("Impossibile commsionare la transazione");
376 }
377 @pg_close($db);
378 }
379 function db_popcon_test() {
380 global $dirs,$dbconn;
381 $db = pg_pconnect($dbconn) or die(pg_errormessage($db));
382 $filename=$dirs[popcon_dir] . "/all-popcon-results.txt.gz";
383 $regexp="/Package:\s(\S+)\s+(\d+)\s+(\d+)/";
384 $zp = gzfile($filename, "r") or die("Could not open $filename");
385 if(filesize($filename)>20) {
386 foreach ($zp as $line) {
387 if (preg_match($regexp,$line,$matches)) {
388 # print "Name => $matches[1] \n Install => $matches[2] \n Vote => $matches[3]\n";
389 print "\r" . $i++;
390 #pg_unbuffered_query($db, "UPDATE binpkgs SET pop_inst='$matches[2]',pop_vote='$matches[3]' WHERE bin_name='$matches[1]'");
391 }
392 }
393 }
394 @pg_close($db);
395 }
396 function file_put_contents($filename, $content, $flags = 0) {
397 if (!($file = fopen($filename,$flags))) return false;
398 else {
399 $n = fwrite($file, $content);
400 fclose($file);
401 return true;
402 }
403 }
404 function keep_popcon() {
405 global $dirs,$dbconn;
406 $localfile=$dirs[popcon_dir] . "/all-popcon-results.txt.gz";
407 $remotefile="http://popcon.debian.org/all-popcon-results.txt.gz";
408 @file_put_contents($localfile,file_get_contents($remotefile),'w') or die("Errore nello scaricare il file popcon\n");
409 }
410 function is_updated ($up_vers,$debian_vers) {
411 if ($up_vers=='') return 0;
412 passthru("dpkg --compare-versions '$up_vers' gt '" . vers_conv($debian_vers) . "'",$great);
413 if ($great==0) return 1;
414 else return 0;
415 }
416 function db_upstream($initial='%') {
417 global $dirs,$dbconn;
418 check_db();
419 $db = pg_connect($dbconn) ;
420 $rsql=pg_exec($db, "SELECT pkgs.name,pkgs.dist,version,watch FROM pkgs WHERE watch is not null AND name LIKE '$initial%' ORDER BY name DESC");
421 $tot=pg_numrows($rsql);
422 while ($res_array=pg_fetch_array($rsql)) {
423 $uscan_res=uscan_foo($res_array['name'],$res_array['version'],$res_array['watch']);
424 if($uscan_res[1] !=null) $uscan_res[1]=addslashes($uscan_res[1]);
425 #print $uscan_res[0] . "\n Name => $res_array[name]\n";
426 $updated=is_updated($uscan_res[0],$res_array[version]);
427 if ($uscan_res[0]!=$res_array[up_version]) ($keep_changes=1);
428 else $keep_changes=0;
429 pg_exec($db, "UPDATE pkgs SET up_version='" . $uscan_res[0] . "',up_url='" . $uscan_res[2] . "', watch_warn='" . $uscan_res[1] . "',keep_changes='$keep_changes', updated='$updated' WHERE name='$res_array[name]' AND dist='$res_array[dist]'") or Die("Error in update pkgs upstream");
430 #print "\rUpdated " . $res_array['name'] . " => $updated Up Version => ". $uscan_res[0];
431 print "\rUpstream left => " . $tot --;
432 # }
433 # else print "Added ". $res_array['name'] ."\n";
434 # if ($great==0) {
435
436 # print "Package=> " . $res_array['name'] . "\n";
437 # print "Version => " . $res_array['version'] . "\n";
438 # print "Upstream Ver=> " . $uscan_res[0] . "\n";
439 #print "Watch warings=> " . $uscan_res[1] . "\n";
440 # }
441 }
442 print "\n";
443 pg_close($db);
444 }
445 function keep_remote ($localfile,$remotefile) {
446 # $url_p = parse_url ($remotefile);
447 # if (isset ($url_p["host"]))
448 # { $host = $url_p["host"]; }
449 # else return false;
450 # preg_match("/(http|ftp)/",$host,$matches);
451 # if ($matches[1]=='http') $fp = fsockopen ($host, 80, $errno, $errstr, 10);
452 # elseif ($matches[1]=='ftp') $fp2 = fsockopen ($host, 21, $errno, $errstr, 10);
453 # if (!$fp AND !$fp2) return false;
454 $rfp = @fopen ($remotefile, "rb");
455 if (!$rfp) {
456 return false;
457 }
458 $lfp = fopen ($localfile, "w");
459 ini_set ( "memory_limit", "100M");
460 while ($data = fread($rfp, 1024*8)) {
461 $bytes+=1024*8;
462 print "Downlaoding $remotefile: $bytes\r";
463 fwrite($lfp, $data);
464 }
465 ini_set ( "memory_limit", "15M");
466 fclose($lfp);
467 fclose($rfp);
468
469 return true;
470 }
471 function up_changes($src_name='%') {
472 global $dbconn;
473 $changes_files=array("CHANGES","NEWS","Changelog","ChangeLog","changelog");
474 $db = pg_connect($dbconn) ;
475 $rsql=pg_exec($db, "SELECT id,up_url FROM pkgs WHERE up_url!='' AND keep_changes='t' AND name LIKE '$src_name%'");
476 $tot=pg_numrows($rsql);
477 while ($res_array=pg_fetch_array($rsql)) {
478 $localfile="/tmp/dehs-" . $res_array[id] . ".tar.gz";
479 #print "I'm downloading $res_array[up_url]\r";
480 $res=keep_remote($localfile,$res_array['up_url']);
481 #print "UPDATE pkgs SET up_changes='', keep_changes='f' WHERE id=$res_array[id]";
482 if (!$res) {
483 pg_exec($db, "UPDATE pkgs SET up_changes='', keep_changes='f' WHERE id=$res_array[id]");
484 $notdown++;
485 $tot--;
486 print "Packages Left: " . $tot-- . " Found: $found Not found: $notfound Not Down: $notdown\r";
487 #print "\n Not Downlaoded: $res_array[up_url]\n";
488 continue;
489 }
490 foreach($changes_files as $filename) {
491 $command="tar -zxOf " . $localfile . " *$filename 2>/dev/null";
492 exec($command,$up_changes,$cmdres);
493 $up_changes=rtrim(implode("\n",$up_changes));
494 if ($cmdres==0 AND strlen($up_changes)>20) {
495 $sw=true;
496 $up_changes=addslashes($up_changes);
497 $conv_res=iconv("ISO-8859-1","UTF-8",$up_changes);
498 if ($conv_res) $up_changes=$conv_res;
499 $up_changes_sql="UPDATE pkgs SET up_changes='$up_changes', keep_changes='f' WHERE id=$res_array[id]";
500 pg_exec($db,$up_changes_sql);
501 #print "\nFounded $filename on $res_array[up_url]\n";
502 $found++;
503 break;
504 }
505 }
506 if (!$sw) {
507 pg_exec($db, "UPDATE pkgs SET up_changes='', keep_changes='f' WHERE id=$res_array[id]");
508 #print "\n Not Founded any on $res_array[up_url]\n";
509 $notfound++;
510 }
511 unlink($localfile);
512 print "Packages Left: " . $tot-- . " Found: $found Not found: $notfound Not Down: $notdown\r";
513 }
514 pg_close($db);
515 }
516 function uscan_foo($name,$version,$watch){
517 $fw=fopen("/tmp/$name" . "_watch","w");
518 fwrite($fw,$watch);
519 fclose($fw);
520 $uscan_res=shell_exec("perl uscan3.pl $name " . vers_conv($version) . " /tmp/$name" . "_watch 2>/dev/null 2>&1");
521 unlink("/tmp/$name" . "_watch");
522 preg_match("/\+\+(.+)\+\+\s\+-(.+)-\+/",$uscan_res, $matches);
523 if ($matches[1]!='') $upstream=$matches[1];
524 else $upstream=null;
525 if ($matches[2]!='') $up_url=$matches[2];
526 else $up_url=null;
527 $uscan_res=preg_replace("/(\+\+.+-\+)/", "", $uscan_res);
528 if ($uscan_res=='') $uscan_res=null;
529 return array($upstream,$uscan_res,$up_url);
530 }
531 function db_up_error() {
532 global $dbconn;
533 check_db();
534 $db = pg_connect($dbconn) ;
535 $bugurl="http://bugs.debian.org/cgi-bin/pkgreport.cgi?which=tag&data=upstream&archive=no&show_list_header=no&pend-exc=done";
536 print "Downloading bugs list =>";
537 $ferrors=file_get_contents($bugurl) or die ("I can't keep error page from bugs.debian.org");
538 print "Done\n";
539 $ferrors=explode("<li>",$ferrors);
540 $totline=count($ferrors);
541 #$errors[]=array();
542 #array_pop($errors);
543 print "Total line => $totline\n";
544 foreach ($ferrors as $line) {
545 # print $line . "\n";
546 $founded=preg_match("/Package:.+<strong>([^<]+)<\/strong><\/a>.+<strong>((\d+)\syear\sand\s|)(\d+)\sdays/sS",$line,$matches);
547 if ($founded) {
548 $errors[$matches[1]][err_tot]++;
549 $errors[$matches[1]][days]+=$matches[3]*365+$matches[4];
550 #if ($matches[3]) print "Anni $matches[3]";
551 #print "Giorni $matches[4]\n";
552 }
553 print "\rLine left => " . $totline--;
554 }
555 #arsort($errors);
556 $total=count($errors);
557 foreach ($errors as $error=>$value) {
558 pg_exec($db, "UPDATE binpkgs SET up_error=" . $value[err_tot] . ",avg_error_date=" . $value[days]/$value[err_tot] . " WHERE bin_name='$error'") or Die("Error in upstream error query");
559 #print "Pkg: $error Errori: $value[err_tot] Average Days: " . $value[days]/$value[err_tot] . "\n";
560 print "\rErrors left => " . $total--;
561 }
562 pg_close($db);
563 }
564 function watch_fill($src_name='%'){
565 global $dirs,$dbconn;
566 $db = pg_pconnect($dbconn) or DIE ("Db error");
567 $checked=$errors=$notfound=$verok=$notmatch=0;
568 $sqlstring="SELECT mpop_inst,name,pkgs.version,pkgs.section,pkgs.dist,tot_up_error, tot_avg_error_date, wwiz_version FROM pkgs INNER JOIN
569 (Select max(pop_inst) as mpop_inst,SUM(up_error) as tot_up_error,AVG(avg_error_date) as tot_avg_error_date,name,dist FROM binpkgs GROUP BY name,dist HAVING max(pop_inst) IS NOT NULL) as binpkgs using(name,dist)
570 WHERE (watch IS NULL OR watch='') AND name LIKE '$src_name%' ORDER BY mpop_inst DESC";
571 $rsql=pg_exec($db, $sqlstring);
572 while ($res_array=pg_fetch_array($rsql)) {
573 if (substr($res_array["name"],0,3)=='lib') $initial=substr($res_array["name"],0,4);
574 else $initial=substr($res_array["name"],0,1);
575 $url="http://packages.debian.org/changelogs/pool/" .
576 $res_array["section"] . "/" .
577 $initial . "/" .
578 $res_array["name"] ."/" .
579 $res_array["name"] . "_" .
580 $res_array["version"] . "/copyright";
581 $contents=@file_get_contents($url) or '';
582 $space='';
583 if (!$contents) {
584 $notfound++;
585 pg_exec($db, "UPDATE pkgs SET wwiz_type='no_cright' where name='" . $res_array[name] . "' AND dist='" . $res_array[dist] ."'");
586 }
587 else {
588 $res=preg_match ('/(sf\.net|sourceforge\.net)/',$contents,$matches);
589 if ($res) $matches[1]="ftp://ftp2.sf.net/pub/sourceforge/" . substr($res_array["name"],0,1) . "/" . substr($res_array["name"],0,2) . "/" . $res_array["name"] . "/";
590 else {
591 unset($matches);
592 $res=preg_match ('/((ftp:\/\/|http:\/\/)\S+(html|htm|\/(?(?=.+(tar|tgz))|[^>\s\)\.\a]+)))/',$contents,$matches);
593 $final=substr($matches[1],-1);
594 if ($matches[3]=="html" or $matches[3]=="htm") $space=' ';
595 if ($final!='/' AND $space!=' ') $matches[1].='/';
596 $matches[1]=preg_replace("/(http:\/\/.+):/",'$1', $matches[1],1);
597 }
598 if (!$res) {
599 $notmatch++;
600 pg_exec($db, "UPDATE pkgs SET wwiz='" . addslashes($contents) . "', wwiz_type='notmatch', up_url='', up_changes='' where name='" . $res_array[name] . "' AND dist='" . $res_array[dist] ."'");
601 }
602 else {
603 $watch="version=2\n" .
604 $matches[1] . $space . $res_array["name"] . "-([\d+\.]+|\d+)\.tar(\.gz|\.bz2) debian uupdate";
605 $uscan_res=uscan_foo($res_array['name'] ,$res_array['version'],$watch);
606 if ($uscan_res[1] AND !$uscan_res[0]) {
607 pg_exec($db, "UPDATE pkgs SET wwiz='" . addslashes($uscan_res[1]) . "', wwiz_type='error', up_url='', up_changes='' where name='" . $res_array[name] . "' AND dist='" . $res_array[dist] ."'");
608 $errors++;
609 }
610 else {
611 $verok++;
612 if ($uscan_res[0]!=$res_array[wwiz_version]) ($keep_changes=1);
613 else $keep_changes=0;
614 pg_exec($db, "UPDATE pkgs SET wwiz='" . addslashes($watch) ."', wwiz_type='watch', wwiz_version='" . $uscan_res[0] . "', up_url='" . $uscan_res[2] . "', keep_changes='$keep_changes' where name='" . $res_array[name] . "' AND dist='" . $res_array[dist] ."'");
615 }
616 }
617 }
618 print "Package checked: " . $checked++ .
619 " OK: $verok Error: $errors Not Matched: $notmatch\r";
620 }
621 print "\nCopyright files not founded: $notfound\n";
622 print "Automatic genereted watch file failure: $errors\n";
623 pg_close($db);
624 }
625 function update_all() {
626 global $email;
627 $intime=gmdate('D, d M Y H:i:s \C\E\S\T',time()+3600*2);
628 db_add();
629 keep_popcon();
630 db_popcon();
631 keep_diff();
632 db_up_error();
633 db_upstream();
634 watch_fill();
635 up_changes();
636 $endtime=gmdate('D, d M Y H:i:s \C\E\S\T',time()+3600*2);
637 $messaggio="Dehs executed successful\nBegin: $intime\nEnd: $endtime";
638 mail($email, "DEHS report", $messaggio,
639 "From: dehs-noreply@{$_SERVER['SERVER_NAME']}\r\n" .
640 "Reply-To: dehs-noreply@{$_SERVER['SERVER_NAME']}\r\n" .
641 "X-Mailer: PHP/" . phpversion());
642 }
643 function md5_of_file($inFile) {
644 if (file_exists($inFile)) {
645 $fd = fopen($inFile, 'r');
646 $fileContents = fread($fd, filesize($inFile));
647 fclose ($fd);
648 return md5($fileContents);
649 } else {
650 return false;
651 }
652 }
653 ?>

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.5