add another idiot to the filter
[buildfarm-server.git] / cgi-bin / pgstatus.pl
old mode 100644 (file)
new mode 100755 (executable)
index d3ba72a..603e15f
@@ -2,6 +2,15 @@
 
 use strict;
 
+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
+BEGIN { $server_time = time; }
+
 use CGI;
 use Digest::SHA1  qw(sha1_hex);
 use MIME::Base64;
@@ -11,10 +20,6 @@ use Data::Dumper;
 use Mail::Send;
 use Safe;
 
-use vars qw($dbhost $dbname $dbuser $dbpass $dbport
-       $all_stat $fail_stat $change_stat $green_stat
-);
-
 require "$ENV{BFConfDir}/BuildFarmWeb.pl";
 
 die "no dbname" unless $dbname;
@@ -74,7 +79,7 @@ $year += 1900; $mon +=1;
 my $date=
     sprintf("%d-%.2d-%.2d_%.2d:%.2d:%.2d",$year,$mon,$mday,$hour,$min,$sec);
 
-if ($ENV{BF_DEBUG} || ($ts > time) || (! $secret) )
+if ($ENV{BF_DEBUG} || ($ts > time) || ($ts + 86400 < time ) || (! $secret) )
 {
     open(TX,">../buildlogs/$animal.$date");
     print TX "sig=$sig\nlogtar-len=" , length($log_archive),
@@ -90,11 +95,20 @@ unless ($ts < time)
 {
     my $gmt = gmtime($ts);
     print "Status: 491 bad ts parameter - $ts ($gmt GMT) is in the future.\n",
-    "Context-Type: text/plain\n\n bad ts parameter - $ts ($gmt GMT) is in the future\n";
+    "Content-Type: text/plain\n\n bad ts parameter - $ts ($gmt GMT) is in the future\n";
        $db->disconnect;
     exit;
 }
 
+unless ($ts + 86400 > time)
+{
+    my $gmt = gmtime($ts);
+    print "Status: 491 bad ts parameter - $ts ($gmt GMT) is more than 24 hours ago.\n",
+     "Content-Type: text/plain\n\n bad ts parameter - $ts ($gmt GMT) is more than 24 hours ago.\n";
+    $db->disconnect;
+    exit;
+}
+
 unless ($secret)
 {
        print 
@@ -159,7 +173,56 @@ unless ($sconf =~ s/.*(\$Script_Config)/$1/ms )
 }
 my $client_conf = $container->reval("$sconf;");
 
-my @config_flags = @{ $client_conf->{config_opts} || [] };
+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} )
+{
+       @config_flags = ();
+}
+elsif (ref $client_conf->{config_opts} eq 'HASH')
+{
+       # 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' )
+{
+       @config_flags = @{$client_conf->{config_opts}};
+}
+
 if (@config_flags)
 {
     @config_flags = grep {! m/=/ } @config_flags;
@@ -188,7 +251,8 @@ $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(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->execute;
@@ -258,6 +322,12 @@ $row=$sth->fetchrow_arrayref;
 my ($os, $compiler,$arch) = @$row;
 $sth->finish;
 
+
+$db->begin_work;
+$db->do("truncate dashboard_mat");
+$db->do("insert into dashboard_mat select * from dashboard_mat_data");
+$db->commit;
+
 $db->disconnect;
 
 print "Content-Type: text/plain\n\n";
@@ -268,8 +338,10 @@ my $client_events = $client_conf->{mail_events};
 
 if ($ENV{BF_DEBUG})
 {
+       my $client_time = $client_conf->{current_ts};
     open(TX,">>../buildlogs/$animal.$date");
     print TX "\n",Dumper(\$client_conf),"\n";
+       print TX "server time: $server_time, client time: $client_time\n" if $client_time;
     close(TX);
 }