git://git.exim.org
/
buildfarm-server.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
remove options not used in failures case
[buildfarm-server.git]
/
cgi-bin
/
pgstatus.pl
diff --git
a/cgi-bin/pgstatus.pl
b/cgi-bin/pgstatus.pl
index df499f5fedb6542b972d34e4568257cc17a273ad..9043b325786d48e6d5e53c12fc5f8253ecbbceb0 100755
(executable)
--- a/
cgi-bin/pgstatus.pl
+++ b/
cgi-bin/pgstatus.pl
@@
-1,11
+1,20
@@
#!/usr/bin/perl
#!/usr/bin/perl
+=comment
+
+Copyright (c) 2003-2010, Andrew Dunstan
+
+See accompanying License file for license details
+
+=cut
+
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
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
+ $default_host
);
# force this before we do anything - even load modules
);
# force this before we do anything - even load modules
@@
-18,9
+27,11
@@
use DBI;
use DBD::Pg;
use Data::Dumper;
use Mail::Send;
use DBD::Pg;
use Data::Dumper;
use Mail::Send;
-use Safe;
+use Time::ParseDate;
+use Storable qw(thaw);
require "$ENV{BFConfDir}/BuildFarmWeb.pl";
require "$ENV{BFConfDir}/BuildFarmWeb.pl";
+my $buildlogs = "$ENV{BFConfDir}/buildlogs";
die "no dbname" unless $dbname;
die "no dbuser" unless $dbuser;
die "no dbname" unless $dbname;
die "no dbuser" unless $dbuser;
@@
-44,6
+55,7
@@
my $branch = $query->param('branch');
my $changed_since_success = $query->param('changed_since_success');
my $changed_this_run = $query->param('changed_files');
my $log_archive = $query->param('logtar');
my $changed_since_success = $query->param('changed_since_success');
my $changed_this_run = $query->param('changed_files');
my $log_archive = $query->param('logtar');
+my $frozen_sconf = $query->param('frozen_sconf') || '';
my $content =
"branch=$branch&res=$res&stage=$stage&animal=$animal&".
my $content =
"branch=$branch&res=$res&stage=$stage&animal=$animal&".
@@
-62,6
+74,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);
@@
-74,6
+95,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=
@@
-81,17
+104,19
@@
my $date=
if ($ENV{BF_DEBUG} || ($ts > time) || ($ts + 86400 < time ) || (! $secret) )
{
if ($ENV{BF_DEBUG} || ($ts > time) || ($ts + 86400 < time ) || (! $secret) )
{
- open(TX,">
../
buildlogs/$animal.$date");
+ open(TX,">
$
buildlogs/$animal.$date");
print TX "sig=$sig\nlogtar-len=" , length($log_archive),
"\nstatus=$res\nstage=$stage\nconf:\n$conf\n",
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",
"changed_this_run:\n$changed_this_run\n",
"changed_since_success:\n$changed_since_success\n",
+ "frozen_sconf:$frozen_sconf\n",
"log:\n",$log;
# $query->save(\*TX);
close(TX);
}
"log:\n",$log;
# $query->save(\*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",
@@
-136,7
+161,19
@@
if ($calc_sig ne $sig && $calc_sig2 ne $sig)
# undo escape-proofing of base64 data and decode it
map {tr/$@/+=/; $_ = decode_base64($_); }
# undo escape-proofing of base64 data and decode it
map {tr/$@/+=/; $_ = decode_base64($_); }
- ($log, $conf,$changed_this_run,$changed_since_success,$log_archive);
+ ($log, $conf,$changed_this_run,$changed_since_success,$log_archive, $frozen_sconf);
+
+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;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime($ts);
$year += 1900; $mon +=1;
@@
-145,12
+182,14
@@
my $dbdate=
my $log_file_names;
my @log_file_names;
my $log_file_names;
my @log_file_names;
-my $dirname = "../buildlogs/tmp.$$.unpacklogs";
+my $dirname = "$buildlogs/tmp.$$.unpacklogs";
+
+my $githeadref;
if ($log_archive)
{
my $log_handle;
if ($log_archive)
{
my $log_handle;
- my $archname = "
../
buildlogs/tmp.$$.tgz";
+ my $archname = "
$
buildlogs/tmp.$$.tgz";
open($log_handle,">$archname");
binmode $log_handle;
print $log_handle $log_archive;
open($log_handle,">$archname");
binmode $log_handle;
print $log_handle $log_archive;
@@
-158,26
+197,33
@@
if ($log_archive)
mkdir $dirname;
@log_file_names = `tar -z -C $dirname -xvf $archname 2>/dev/null`;
map {s/\s+//g; } @log_file_names;
mkdir $dirname;
@log_file_names = `tar -z -C $dirname -xvf $archname 2>/dev/null`;
map {s/\s+//g; } @log_file_names;
- my @qnames = @log_file_names;
+ my @qnames =
grep { $_ ne 'githead.log' }
@log_file_names;
map { $_ = qq("$_"); } @qnames;
$log_file_names = '{' . join(',',@qnames) . '}';
map { $_ = qq("$_"); } @qnames;
$log_file_names = '{' . join(',',@qnames) . '}';
+ if (-e "$dirname/githead.log" )
+ {
+ open(my $githead,"$dirname/githead.log");
+ $githeadref = <$githead>;
+ chomp $githeadref;
+ close $githead;
+ }
# unlink $archname;
}
my $config_flags;
# unlink $archname;
}
my $config_flags;
-my $container = new Safe;
-my $sconf = $conf;
-unless ($sconf =~ s/.*(\$Script_Config)/$1/ms )
+my $client_conf;
+if ($frozen_sconf)
{
{
- $
sconf = '$Script_Config={};'
;
+ $
client_conf = thaw $frozen_sconf
;
}
}
-my $client_conf = $container->reval("$sconf;");
if ($min_script_version)
{
$client_conf->{script_version} ||= '0.0';
if ($min_script_version)
{
$client_conf->{script_version} ||= '0.0';
+ my $cli_ver = $client_conf->{script_version} ;
+ $cli_ver =~ s/^REL_//;
my ($minmajor,$minminor) = split(/\./,$min_script_version);
my ($minmajor,$minminor) = split(/\./,$min_script_version);
- my ($smajor,$sminor) = split(/\./,$cli
ent_conf->{script_version}
);
+ my ($smajor,$sminor) = split(/\./,$cli
_ver
);
if ($minmajor > $smajor || ($minmajor == $smajor && $minminor > $sminor))
{
print "Status: 460 script version too low\nContent-Type: text/plain\n\n";
if ($minmajor > $smajor || ($minmajor == $smajor && $minminor > $sminor))
{
print "Status: 460 script version too low\nContent-Type: text/plain\n\n";
@@
-193,15
+239,18
@@
if ($min_script_version)
if ($min_web_script_version)
{
$client_conf->{web_script_version} ||= '0.0';
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});
+ my $cli_ver = $client_conf->{web_script_version} ;
+ $cli_ver =~ s/^REL_//;
+ my ($minmajor,$minminor) = split(/\./,$min_web_script_version);
+ my ($smajor,$sminor) = split(/\./,$cli_ver);
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",
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";
+ "Reported version: $client_conf->{web_script_version}, ",
+ "Minumum version required: $min_web_script_version\n"
+ ;
$db->disconnect;
exit;
}
$db->disconnect;
exit;
}
@@
-227,6
+276,7
@@
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) . '}' ;
}
@@
-237,10
+287,21
@@
my $logst = <<EOSQL;
insert into build_status
(sysname, snapshot,status, stage, log,conf_sum, branch,
changed_this_run, changed_since_success,
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, scm, scmurl)
- values(?,?,?,?,?,?,?,?,?,?,?,?,?)
+ log_archive_filenames , log_archive, build_flags, scm, scmurl,
+ git_head_ref,frozen_conf)
+ values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
EOSQL
;
EOSQL
;
+
+
+# this transaction lets us set log_error_verbosity to terse
+# just for the duration of the transaction. That turns off logging the
+# bind params, so all the logs don't get stuffed on the postgres logs
+
+$db->begin_work;
+$db->do("select set_local_error_terse()");
+
+
$sth=$db->prepare($logst);
$sth->bind_param(1,$animal);
$sth=$db->prepare($logst);
$sth->bind_param(1,$animal);
@@
-257,11
+318,15
@@
$sth->bind_param(10,$log_file_names);
$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(11,undef,{ pg_type => DBD::Pg::PG_BYTEA });
$sth->bind_param(12,$config_flags);
$sth->bind_param(13,$scm);
-$sth->bind_param(13,$scmurl);
+$sth->bind_param(14,$scmurl);
+$sth->bind_param(15,$githeadref);
+$sth->bind_param(16,$frozen_sconf,{ pg_type => DBD::Pg::PG_BYTEA });
$sth->execute;
$sth->finish;
$sth->execute;
$sth->finish;
+
+
my $logst2 = <<EOSQL;
insert into build_status_log
my $logst2 = <<EOSQL;
insert into build_status_log
@@
-279,21
+344,23
@@
my $stage_start = $ts;
foreach my $log_file( @log_file_names )
{
foreach my $log_file( @log_file_names )
{
- my $handle;
- open($handle,"$dirname/$log_file");
- my $mtime = (stat $handle)[9];
- my $stage_interval = $mtime - $stage_start;
- $stage_start = $mtime;
- my $ltext = <$handle>;
- close($handle);
- $ltext =~ s/\x00/\\0/g;
- $sth->execute($animal,$dbdate,$branch,$log_file,$ltext,
- "$stage_interval seconds");
+ next if $log_file =~ /^githead/;
+ my $handle;
+ open($handle,"$dirname/$log_file");
+ my $mtime = (stat $handle)[9];
+ my $stage_interval = $mtime - $stage_start;
+ $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->finish;
$sth->finish;
+$db->commit;
+
my $prevst = <<EOSQL;
select coalesce((select distinct on (snapshot) stage
my $prevst = <<EOSQL;
select coalesce((select distinct on (snapshot) stage
@@
-327,12
+394,23
@@
$row=$sth->fetchrow_arrayref;
my ($os, $compiler,$arch) = @$row;
$sth->finish;
my ($os, $compiler,$arch) = @$row;
$sth->finish;
-
$db->begin_work;
$db->begin_work;
-$db->do("truncate dashboard_mat");
+# prevent occasional duplication by forcing serialization of this operation
+$db->do("lock table dashboard_mat in share row exclusive mode");
+$db->do("delete from dashboard_mat");
$db->do("insert into dashboard_mat select * from dashboard_mat_data");
$db->commit;
$db->do("insert into dashboard_mat select * from dashboard_mat_data");
$db->commit;
+if ($stage ne 'OK')
+{
+ $db->begin_work;
+ # prevent occasional duplication by forcing serialization of this operation
+ $db->do("lock table nrecent_failures in share row exclusive mode");
+ $db->do("delete from nrecent_failures");
+ $db->do("insert into nrecent_failures select bs.sysname, bs.snapshot, bs.branch from build_status bs where bs.stage <> 'OK' and bs.snapshot > now() - interval '90 days'");
+ $db->commit;
+}
+
$db->disconnect;
print "Content-Type: text/plain\n\n";
$db->disconnect;
print "Content-Type: text/plain\n\n";
@@
-344,7
+422,7
@@
my $client_events = $client_conf->{mail_events};
if ($ENV{BF_DEBUG})
{
my $client_time = $client_conf->{current_ts};
if ($ENV{BF_DEBUG})
{
my $client_time = $client_conf->{current_ts};
- open(TX,">>
../
buildlogs/$animal.$date");
+ 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);
print TX "\n",Dumper(\$client_conf),"\n";
print TX "server time: $server_time, client time: $client_time\n" if $client_time;
close(TX);
@@
-407,17
+485,21
@@
my $stat_type = $stage eq 'OK' ? 'Status' : 'Failed at Stage';
my $mailto = [@$all_stat];
push(@$mailto,@$fail_stat) if $stage ne 'OK';
my $mailto = [@$all_stat];
push(@$mailto,@$fail_stat) if $stage ne 'OK';
-my $me = `id -un`; chomp $me;
+my $me = `id -un`; chomp($me);
+
+my $host = `hostname`; chomp ($host);
+$host = $default_host unless ($host =~ m/[.]/ || !defined($default_host));
-my $host = `hostname`; chomp $host;
+my $from_addr = "PG Build Farm <$me\@$host>";
+$from_addr =~ tr /\r\n//d;
my $msg = new Mail::Send;
my $msg = new Mail::Send;
-$msg->set('From',"PG Build Farm <$me\@$host>");
$msg->to(@$mailto);
$msg->bcc(@$bcc_stat) if (@$bcc_stat);
$msg->subject("PGBuildfarm member $animal Branch $branch $stat_type $stage");
$msg->to(@$mailto);
$msg->bcc(@$bcc_stat) if (@$bcc_stat);
$msg->subject("PGBuildfarm member $animal Branch $branch $stat_type $stage");
+$msg->set('From',$from_addr);
my $fh = $msg->open;
print $fh <<EOMAIL;
my $fh = $msg->open;
print $fh <<EOMAIL;
@@
-446,7
+528,6
@@
push(@$mailto,@$green_stat) if ($stage eq 'OK' || $prev_stat eq 'OK');
$msg = new Mail::Send;
$msg = new Mail::Send;
-$msg->set('From',"PG Build Farm <$me\@$host>");
$msg->to(@$mailto);
$msg->bcc(@$bcc_chg) if (@$bcc_chg);
$msg->to(@$mailto);
$msg->bcc(@$bcc_chg) if (@$bcc_chg);
@@
-457,6
+538,7
@@
$stat_type = "New member: $stage" if $prev_stat eq 'NEW';
$stat_type .= " failure" if $stage ne 'OK';
$msg->subject("PGBuildfarm member $animal Branch $branch Status $stat_type");
$stat_type .= " failure" if $stage ne 'OK';
$msg->subject("PGBuildfarm member $animal Branch $branch Status $stat_type");
+$msg->set('From',$from_addr);
$fh = $msg->open;
print $fh <<EOMAIL;
$fh = $msg->open;
print $fh <<EOMAIL;