From a19a7c8ebfe9459a0d5521c5ba3366658b24989f Mon Sep 17 00:00:00 2001 From: Todd Lyons Date: Fri, 18 Oct 2013 15:28:44 -0700 Subject: [PATCH] Working version 0.1 --- .gitignore | 1 + bf-alerts.pl | 6 +- cgi-bin/eximstatus.pl | 22 +- cgi-bin/register.pl | 2 +- cgi-bin/show_failures.pl | 26 +- cgi-bin/show_members.pl | 4 +- cgi-bin/show_stage_log.pl | 4 +- cgi-bin/show_status.pl | 4 +- htdocs/exim-blue-ld-60x60.png | Bin 0 -> 6829 bytes htdocs/img/gnutls_icon.gif | Bin 0 -> 481 bytes htdocs/img/mysql_logo.png | Bin 0 -> 810 bytes htdocs/inc/eximbuildfarm-banner.png | Bin 0 -> 6071 bytes htdocs/index.html | 6 +- schema/.gitignore | 1 + schema/bfwebdb.sql | 226 ++++----- schema/bfwebdb_v8.sql | 723 ++++++++++++++++++++++++++++ schema/missing.sql | 17 + templates/page.tt | 11 +- templates/register-form.tt | 19 +- templates/status.tt | 26 +- 20 files changed, 925 insertions(+), 173 deletions(-) create mode 100644 htdocs/exim-blue-ld-60x60.png create mode 100644 htdocs/img/gnutls_icon.gif create mode 100644 htdocs/img/mysql_logo.png create mode 100644 htdocs/inc/eximbuildfarm-banner.png create mode 100644 schema/.gitignore create mode 100644 schema/bfwebdb_v8.sql create mode 100644 schema/missing.sql diff --git a/.gitignore b/.gitignore index 27cd24b..386ea2b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ BuildFarmWeb.pl +buildlogs/ diff --git a/bf-alerts.pl b/bf-alerts.pl index 09ac2c2..8c93210 100755 --- a/bf-alerts.pl +++ b/bf-alerts.pl @@ -198,7 +198,7 @@ my $me = `id -un`; chomp $me; my $host = `hostname`; chomp ($host); $host = $default_host unless ($host =~ m/[.]/ || !defined($default_host)); -my $from_addr = "PG Build Farm <$me\@$host>"; +my $from_addr = "Exim BuildFarm <$me\@$host>"; $from_addr =~ tr /\r\n//d; @@ -232,7 +232,7 @@ foreach my $clearme (@need_cleared) # $sth->finish; $msg->to($mailto); - $msg->subject("PGBuildfarm member $animal Branch $branch Alert cleared"); + $msg->subject("Exim BuildFarm member $animal Branch $branch Alert cleared"); my $fh = $msg->open; print $fh "\n\n$text\n"; $fh->close; @@ -261,7 +261,7 @@ foreach my $needme (@need_alerts) $msg->to($mailto); - $msg->subject("PGBuildfarm member $animal Branch $branch " . + $msg->subject("Exim BuildFarm member $animal Branch $branch " . "Alert notification"); my $fh = $msg->open; print $fh "\n\n$text\n"; diff --git a/cgi-bin/eximstatus.pl b/cgi-bin/eximstatus.pl index b57655c..7e7b900 100755 --- a/cgi-bin/eximstatus.pl +++ b/cgi-bin/eximstatus.pl @@ -24,7 +24,7 @@ use CGI; use Digest::SHA1 qw(sha1_hex); use MIME::Base64; use DBI; -use DBD::mysql; +use DBD::Pg; use Data::Dumper; use Mail::Send; use Time::ParseDate; @@ -36,7 +36,7 @@ my $buildlogs = "$ENV{BFConfDir}/buildlogs"; die "no dbname" unless $dbname; die "no dbuser" unless $dbuser; -my $dsn="dbi:mysql:dbname=$dbname"; +my $dsn="dbi:Pg:dbname=$dbname"; $dsn .= ";host=$dbhost" if $dbhost; $dsn .= ";port=$dbport" if $dbport; @@ -320,7 +320,7 @@ EOSQL my $sqlres; $db->begin_work; -$db->do("select set_local_error_terse()"); +#$db->do("select set_local_error_terse()"); $sth=$db->prepare($logst); @@ -335,13 +335,13 @@ $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::mysql::PG_BYTEA }); -$sth->bind_param(11,undef,{ pg_type => DBD::mysql::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->bind_param(15,$githeadref); -$sth->bind_param(16,$frozen_sconf,{ pg_type => DBD::mysql::PG_BYTEA }); +$sth->bind_param(16,$frozen_sconf,{ pg_type => DBD::Pg::PG_BYTEA }); $sqlres = $sth->execute; @@ -528,7 +528,7 @@ my $me = `id -un`; chomp($me); my $host = `hostname`; chomp ($host); $host = $default_host unless ($host =~ m/[.]/ || !defined($default_host)); -my $from_addr = "PG Build Farm <$me\@$host>"; +my $from_addr = "Exim Build Farm <$me\@$host>"; $from_addr =~ tr /\r\n//d; my $msg = new Mail::Send; @@ -536,13 +536,13 @@ my $msg = new Mail::Send; $msg->to(@$mailto); $msg->bcc(@$bcc_stat) if (@$bcc_stat); -$msg->subject("PGBuildfarm member $animal Branch $branch $stat_type $stage"); +$msg->subject("Exim BuildFarm member $animal Branch $branch $stat_type $stage"); $msg->set('From',$from_addr); my $fh = $msg->open; print $fh <subject("PGBuildfarm member $animal Branch $branch Status $stat_type"); +$msg->subject("Exim BuildFarm member $animal Branch $branch Status $stat_type"); $msg->set('From',$from_addr); $fh = $msg->open; print $fh <set('From',$from_addr); $msg->to(@$notifyapp); -$msg->subject('New Buildfarm Application'); +$msg->subject('New BuildFarm Application'); my $fh = $msg->open; print $fh "\n\nName: $dummyname\n", "OS: $os: $osv\n", diff --git a/cgi-bin/show_failures.pl b/cgi-bin/show_failures.pl index 48f0e97..bfa38e9 100755 --- a/cgi-bin/show_failures.pl +++ b/cgi-bin/show_failures.pl @@ -71,7 +71,7 @@ my $all_members = $db->selectcol_arrayref($get_all_members); my $get_all_stages = qq{ - select distinct stage + select distinct build_status.stage from build_status join nrecent_failures using (sysname,snapshot,branch) @@ -109,18 +109,18 @@ while (my $row = $sth->fetchrow_hashref) next if (@branches && ! grep {$_ eq $row->{branch} } @branches); $row->{build_flags} =~ s/^\{(.*)\}$/$1/; $row->{build_flags} =~ s/,/ /g; - # enable-integer-datetimes is now the default - if ($row->{branch} eq 'HEAD' || $row->{branch} gt 'REL8_3_STABLE') - { - $row->{build_flags} .= " --enable-integer-datetimes " - unless ($row->{build_flags} =~ /--(en|dis)able-integer-datetimes/); - } - # enable-thread-safety is now the default - if ($row->{branch} eq 'HEAD' || $row->{branch} gt 'REL8_5_STABLE') - { - $row->{build_flags} .= " --enable-thread-safety " - unless ($row->{build_flags} =~ /--(en|dis)able-thread-safety/); - } +## # enable-integer-datetimes is now the default +## if ($row->{branch} eq 'HEAD' || $row->{branch} gt 'REL8_3_STABLE') +## { +## $row->{build_flags} .= " --enable-integer-datetimes " +## unless ($row->{build_flags} =~ /--(en|dis)able-integer-datetimes/); +## } +## # enable-thread-safety is now the default +## if ($row->{branch} eq 'HEAD' || $row->{branch} gt 'REL8_5_STABLE') +## { +## $row->{build_flags} .= " --enable-thread-safety " +## unless ($row->{build_flags} =~ /--(en|dis)able-thread-safety/); +## } $row->{build_flags} =~ s/--((enable|with)-)?//g; $row->{build_flags} =~ s/libxml/xml/; $row->{build_flags} =~ s/\S+=\S+//g; diff --git a/cgi-bin/show_members.pl b/cgi-bin/show_members.pl index d45acd6..6c7ea90 100755 --- a/cgi-bin/show_members.pl +++ b/cgi-bin/show_members.pl @@ -41,13 +41,13 @@ my $statement = q{ select name, operating_system, os_version, compiler, compiler_version, owner_email, sys_notes_ts::date AS sys_notes_date, sys_notes, architecture as arch, ARRAY( - select branch || ':' || + select branch || E':' || extract(days from now() - l.snapshot) from latest_snapshot l where l.sysname = s.name order by branch <> 'HEAD', branch desc ) as branches, - ARRAY(select compiler_version || '\t' || os_version || '\t' || effective_date + ARRAY(select compiler_version || E'\t' || os_version || E'\t' || effective_date from personality p where p.name = s.name order by effective_date diff --git a/cgi-bin/show_stage_log.pl b/cgi-bin/show_stage_log.pl index 8110995..fc40fa6 100755 --- a/cgi-bin/show_stage_log.pl +++ b/cgi-bin/show_stage_log.pl @@ -79,8 +79,8 @@ if ($system && $logdate && $stage) print "Content-Type: text/plain\n\nSnapshot: $logdate\n\n", $logtext, "-------------------------------------------------\n\n", - "Hosting for the PostgreSQL Buildfarm is generously ", - "provided by: CommandPrompt, The PostgreSQL Company"; + "Hosting for the Exim BuildFarm is generously ", + "provided by: Todd Lyons"; } diff --git a/cgi-bin/show_status.pl b/cgi-bin/show_status.pl index 187925f..ac947c8 100755 --- a/cgi-bin/show_status.pl +++ b/cgi-bin/show_status.pl @@ -22,7 +22,7 @@ my $query = new CGI; my @members = $query->param('member'); map { s/[^a-zA-Z0-9_ -]//g; } @members; -my $dsn="dbi:mysql:dbname=$dbname"; +my $dsn="dbi:Pg:dbname=$dbname"; $dsn .= ";host=$dbhost" if $dbhost; $dsn .= ";port=$dbport" if $dbport; @@ -50,7 +50,7 @@ my $statement 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 literal 0 HcmV?d00001 diff --git a/htdocs/inc/eximbuildfarm-banner.png b/htdocs/inc/eximbuildfarm-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..a022bf8af15692a04a43bd323135e521ad887293 GIT binary patch literal 6071 zcmaJ_cRXC()>fmXj1nS|7^6h=K02d?=%Pkvl)>Pj^a9bw_0|#4ZfLFJJ>>n1)&=g^+ zttD;m0T;0SgAqW&Jqc_gB3T8br>(uK0|IF0-~@A*18vtefq*cm9LPjmTS(he*})m6 z{?yyy@lzc``=_qh9+ z5W$-_)KS_%MeX0d2$mek8G-PW78LaN_ZRRN74YzO5)_t_lKP_|BEnBV@cRU~BW#iU z?mp~)E2ud5*n7h~5ik#T;2%X>I}cxk9EcFBYeKHe4ITzfy$4?fhI6_sE5DLUubP@X$^NDgsr>1gNBM6h`<+s!JyJ$aaA=X zadEIHSVBoySXER?LL4FmmK0W2l~Pg>Q4;-|tKwnr3wLlw{LO{_mn->?+&_f?_at~$ zaqx!uIY8CCJ>bB<1}qKx=UBx5QSaYe=s(9I@sC_VLNJ1VruBbK^WR;B+WFJ`Ptg*L z|CGIhJE7LS2}M0?#n(%CSBUhq3{}t17whVhr)HNfFVE)Ys+6BpU0$9T!RmW^F)J%I z6U&>ImwVCKOimW8 zV5e_`F&7s<&(G&BFSkrgRQ&zTvDn)E{hkM+dSa?E_m%RcWyH_U`q$U%&(DWvri)&u zMpRV1+}|HLKc9LU*Z+OCqib?KHX$=EZDfDH$sbh`7-%!ObZ~Le1J*Auubrl0(tle% zW02DRwSRYPYJBb2Vp5V19zV0W)tZxo@(JtO+h54YczO-!r>P0q*xHYcb=lo*JU(uN zIy#)3Oo%GDyZ9B<)#d*F-OMKqrxQpyJ|1CWVw{<&^a|%fqq$>mZ?AKB*h6$!>*u56rRL_eH<%7Qe(vC)v$!~VcekUk zaxuPiGc?38A;G(%w${?p+&+0dJRG*UStq7b(cS%?OD-uWez?1*d;>SIyj)$?xP-?q zZ*EV`%+#l(_@AD3?Cdmn1vevull}a>Mn`K~x<*}}_3rPt;&4qoYDMlL{Wo}Ch34Zd zJsZ=~{P=}rSmkn59~m7Sv^YNPuK)HUuegSpP2TtQ5C8zcVyko=8);~$Sy}J;NA?^Y z9WAWx;C2o_ckEyqw;TFa++Oyzj_sASE%bliw~p*e`?}?yHt3Z%z=o{)GPE3CK6ZH6 z@+1MP>EC*Gw(99=oL$mW+cIcrsi9y}^5H|!`FSfcx?ec7PF^o{dOGj)6gx25(K9r$ zy^UuUM+4l;9Q?lN>Oyo3%zy9K$j*+%V!J+KK9y88ZEVyoF60wI zi!LuOP2;f|zAfVyUrLFHXxTJWAcn{p+&dZzdXvTwWqLJx;2kX>nGAFEOET`9^4t*B zd?0oBi)u`WF({K{iTqL7lG~j-Ri8;xVq*=no$pvr%~<_Vg{7)~B#mBh{l3)`J3lYK zm4(}E_Y?d|deq0!93F*AjpAJEb@g7&kUD$*e$eM)txrpm!MA_w>11hUN0=6(Jl-4-lQQpy)MnNlhNAcxAO@Jww440s*2S$Ml_4)Fh!-Z%297W�SnTmwo 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 Exim BuildFarm - +