| 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 |
?>
|