X-Git-Url: https://git.exim.org/buildfarm-server.git/blobdiff_plain/7696f262f27714edbcf520399a61be1dc7e3e158..16db57b0d5eabfddda72405d5462012e35ee672e:/cgi-bin/pgstatus.pl diff --git a/cgi-bin/pgstatus.pl b/cgi-bin/pgstatus.pl old mode 100644 new mode 100755 index d3ba72a..f951aee --- a/cgi-bin/pgstatus.pl +++ b/cgi-bin/pgstatus.pl @@ -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; @@ -10,10 +19,7 @@ use DBD::Pg; use Data::Dumper; use Mail::Send; use Safe; - -use vars qw($dbhost $dbname $dbuser $dbpass $dbport - $all_stat $fail_stat $change_stat $green_stat -); +use Time::ParseDate; require "$ENV{BFConfDir}/BuildFarmWeb.pl"; @@ -57,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); @@ -69,16 +84,19 @@ $sth->execute($animal); 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= 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), "\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; @@ -86,15 +104,24 @@ if ($ENV{BF_DEBUG} || ($ts > time) || (! $secret) ) 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", - "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 @@ -124,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); + +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= @@ -159,21 +199,73 @@ 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; map {s/\s+//g; $_=qq("$_"); } @config_flags; + push @config_flags,'git' if $client_conf->{scm} eq 'git'; $config_flags = '{' . join(',',@config_flags) . '}' ; } +my $scm = $client_conf->{scm} || 'cvs'; +my $scmurl = $client_conf->{scm_url}; my $logst = <prepare($logst); @@ -188,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(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(13,$scm); +$sth->bind_param(14,$scmurl); $sth->execute; $sth->finish; @@ -218,6 +313,7 @@ foreach my $log_file( @log_file_names ) $stage_start = $mtime; my $ltext = <$handle>; close($handle); + $ltext =~ s/\x00/\\0/g; $sth->execute($animal,$dbdate,$branch,$log_file,$ltext, "$stage_interval seconds"); } @@ -258,6 +354,11 @@ $row=$sth->fetchrow_arrayref; 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"; @@ -268,8 +369,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); }