refuse snapshots older than 10 days
[buildfarm-server.git] / cgi-bin / pgstatus.pl
old mode 100644 (file)
new mode 100755 (executable)
index 1fd437a..f951aee
@@ -5,6 +5,7 @@ use strict;
 use vars qw($dbhost $dbname $dbuser $dbpass $dbport
        $all_stat $fail_stat $change_stat $green_stat
        $server_time
 use vars qw($dbhost $dbname $dbuser $dbpass $dbport
        $all_stat $fail_stat $change_stat $green_stat
        $server_time
+          $min_script_version $min_web_script_version
 );
 
 # force this before we do anything - even load modules
 );
 
 # force this before we do anything - even load modules
@@ -18,6 +19,7 @@ use DBD::Pg;
 use Data::Dumper;
 use Mail::Send;
 use Safe;
 use Data::Dumper;
 use Mail::Send;
 use Safe;
+use Time::ParseDate;
 
 require "$ENV{BFConfDir}/BuildFarmWeb.pl";
 
 
 require "$ENV{BFConfDir}/BuildFarmWeb.pl";
 
@@ -61,6 +63,15 @@ unless ($animal && $ts && $stage && $sig)
        
 }
 
        
 }
 
+unless ($branch =~ /^(HEAD|REL\d+_\d+_STABLE)$/)
+{
+        print
+            "Status: 492 bad branch parameter $branch\nContent-Type: text/plain\n\n",
+            "bad branch parameter $branch\n";
+        exit;
+
+}
+
 
 my $db = DBI->connect($dsn,$dbuser,$dbpass);
 
 
 my $db = DBI->connect($dsn,$dbuser,$dbpass);
 
@@ -73,6 +84,8 @@ $sth->execute($animal);
 my ($secret)=$sth->fetchrow_array();
 $sth->finish;
 
 my ($secret)=$sth->fetchrow_array();
 $sth->finish;
 
+my $tsdiff = time - $ts;
+
 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($ts);
 $year += 1900; $mon +=1;
 my $date=
 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($ts);
 $year += 1900; $mon +=1;
 my $date=
@@ -83,6 +96,7 @@ if ($ENV{BF_DEBUG} || ($ts > time) || ($ts + 86400 < time ) || (! $secret) )
     open(TX,">../buildlogs/$animal.$date");
     print TX "sig=$sig\nlogtar-len=" , length($log_archive),
         "\nstatus=$res\nstage=$stage\nconf:\n$conf\n",
     open(TX,">../buildlogs/$animal.$date");
     print TX "sig=$sig\nlogtar-len=" , length($log_archive),
         "\nstatus=$res\nstage=$stage\nconf:\n$conf\n",
+        "tsdiff:$tsdiff\n",
        "changed_this_run:\n$changed_this_run\n",
        "changed_since_success:\n$changed_since_success\n",
        "log:\n",$log;
        "changed_this_run:\n$changed_this_run\n",
        "changed_since_success:\n$changed_since_success\n",
        "log:\n",$log;
@@ -90,7 +104,7 @@ if ($ENV{BF_DEBUG} || ($ts > time) || ($ts + 86400 < time ) || (! $secret) )
     close(TX);
 }
 
     close(TX);
 }
 
-unless ($ts < time)
+unless ($ts < time + 120)
 {
     my $gmt = gmtime($ts);
     print "Status: 491 bad ts parameter - $ts ($gmt GMT) is in the future.\n",
 {
     my $gmt = gmtime($ts);
     print "Status: 491 bad ts parameter - $ts ($gmt GMT) is in the future.\n",
@@ -137,6 +151,19 @@ if ($calc_sig ne $sig && $calc_sig2 ne $sig)
 map {tr/$@/+=/; $_ = decode_base64($_); } 
     ($log, $conf,$changed_this_run,$changed_since_success,$log_archive);
 
 map {tr/$@/+=/; $_ = decode_base64($_); } 
     ($log, $conf,$changed_this_run,$changed_since_success,$log_archive);
 
+
+if ($log =~/Last file mtime in snapshot: (.*)/)
+{
+    my $snaptime = parsedate($1);
+    if ($snaptime < (time - (10 * 86400)))
+    {
+       print "Status: 493 snapshot too old: $1\nContent-Type: text/plain\n\n";
+       print "snapshot to old: $1\n";
+       $db->disconnect;
+       exit;   
+    }
+}
+
 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime($ts);
 $year += 1900; $mon +=1;
 my $dbdate=
 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime($ts);
 $year += 1900; $mon +=1;
 my $dbdate=
@@ -172,6 +199,40 @@ unless ($sconf =~ s/.*(\$Script_Config)/$1/ms )
 }
 my $client_conf = $container->reval("$sconf;");
 
 }
 my $client_conf = $container->reval("$sconf;");
 
+if ($min_script_version)
+{
+       $client_conf->{script_version} ||= '0.0';
+       my ($minmajor,$minminor) = split(/\./,$min_script_version);
+       my ($smajor,$sminor) = split(/\./,$client_conf->{script_version});
+       if ($minmajor > $smajor || ($minmajor == $smajor && $minminor > $sminor))
+       {
+               print "Status: 460 script version too low\nContent-Type: text/plain\n\n";
+               print 
+                       "Script version is below minimum required\n",
+                       "Reported version: $client_conf->{script_version},",
+                       "Minumum version required: $min_script_version\n";
+               $db->disconnect;
+               exit;
+       }
+}
+
+if ($min_web_script_version)
+{
+       $client_conf->{web_script_version} ||= '0.0';
+       my ($minmajor,$minminor) = split(/\./,$min_script_version);
+       my ($smajor,$sminor) = split(/\./,$client_conf->{script_version});
+       if ($minmajor > $smajor || ($minmajor == $smajor && $minminor > $sminor))
+       {
+               print "Status: 461 web script version too low\nContent-Type: text/plain\n\n";
+               print 
+                       "Web Script version is below minimum required\n",
+                       "Reported version: $client_conf->{web_script_version},",
+                       "Minumum version required: $min_web_script_version\n";
+               $db->disconnect;
+               exit;
+       }
+}
+
 my @config_flags;
 if (not exists $client_conf->{config_opts} )
 {
 my @config_flags;
 if (not exists $client_conf->{config_opts} )
 {
@@ -179,7 +240,9 @@ if (not exists $client_conf->{config_opts} )
 }
 elsif (ref $client_conf->{config_opts} eq 'HASH')
 {
 }
 elsif (ref $client_conf->{config_opts} eq 'HASH')
 {
-       @config_flags = keys %{$client_conf->{config_opts}};
+       # leave out keys with false values
+       @config_flags = grep { $client_conf->{config_opts}->{$_} } 
+           keys %{$client_conf->{config_opts}};
 }
 elsif (ref $client_conf->{config_opts} eq 'ARRAY' )
 {
 }
 elsif (ref $client_conf->{config_opts} eq 'ARRAY' )
 {
@@ -190,16 +253,19 @@ if (@config_flags)
 {
     @config_flags = grep {! m/=/ } @config_flags;
     map {s/\s+//g; $_=qq("$_"); } @config_flags;
 {
     @config_flags = grep {! m/=/ } @config_flags;
     map {s/\s+//g; $_=qq("$_"); } @config_flags;
+    push @config_flags,'git' if $client_conf->{scm} eq 'git';
     $config_flags = '{' . join(',',@config_flags) . '}' ;
 }
 
     $config_flags = '{' . join(',',@config_flags) . '}' ;
 }
 
+my $scm = $client_conf->{scm} || 'cvs';
+my $scmurl = $client_conf->{scm_url};
 
 my $logst = <<EOSQL;
     insert into build_status 
       (sysname, snapshot,status, stage, log,conf_sum, branch,
        changed_this_run, changed_since_success, 
 
 my $logst = <<EOSQL;
     insert into build_status 
       (sysname, snapshot,status, stage, log,conf_sum, branch,
        changed_this_run, changed_since_success, 
-       log_archive_filenames , log_archive, build_flags)
-    values(?,?,?,?,?,?,?,?,?,?,?,?)
+       log_archive_filenames , log_archive, build_flags, scm, scmurl)
+    values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)
 EOSQL
 ;
 $sth=$db->prepare($logst);
 EOSQL
 ;
 $sth=$db->prepare($logst);
@@ -214,8 +280,11 @@ $sth->bind_param(7,$branch);
 $sth->bind_param(8,$changed_this_run);
 $sth->bind_param(9,$changed_since_success);
 $sth->bind_param(10,$log_file_names);
 $sth->bind_param(8,$changed_this_run);
 $sth->bind_param(9,$changed_since_success);
 $sth->bind_param(10,$log_file_names);
-$sth->bind_param(11,$log_archive,{ pg_type => DBD::Pg::PG_BYTEA });
+#$sth->bind_param(11,$log_archive,{ pg_type => DBD::Pg::PG_BYTEA });
+$sth->bind_param(11,undef,{ pg_type => DBD::Pg::PG_BYTEA });
 $sth->bind_param(12,$config_flags);
 $sth->bind_param(12,$config_flags);
+$sth->bind_param(13,$scm);
+$sth->bind_param(14,$scmurl);
 
 $sth->execute;
 $sth->finish;
 
 $sth->execute;
 $sth->finish;
@@ -244,6 +313,7 @@ foreach my $log_file( @log_file_names )
   $stage_start = $mtime;
   my $ltext = <$handle>;
   close($handle);
   $stage_start = $mtime;
   my $ltext = <$handle>;
   close($handle);
+  $ltext =~ s/\x00/\\0/g;
   $sth->execute($animal,$dbdate,$branch,$log_file,$ltext, 
                "$stage_interval seconds");
 }
   $sth->execute($animal,$dbdate,$branch,$log_file,$ltext, 
                "$stage_interval seconds");
 }
@@ -284,6 +354,11 @@ $row=$sth->fetchrow_arrayref;
 my ($os, $compiler,$arch) = @$row;
 $sth->finish;
 
 my ($os, $compiler,$arch) = @$row;
 $sth->finish;
 
+$db->begin_work;
+$db->do("delete from dashboard_mat");
+$db->do("insert into dashboard_mat select * from dashboard_mat_data");
+$db->commit;
+
 $db->disconnect;
 
 print "Content-Type: text/plain\n\n";
 $db->disconnect;
 
 print "Content-Type: text/plain\n\n";