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=
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;
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",
{
@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) . '}' ;
}
$db->begin_work;
-$db->do("truncate dashboard_mat");
+$db->do("delete from dashboard_mat");
$db->do("insert into dashboard_mat select * from dashboard_mat_data2");
$db->commit;
--- /dev/null
+#!/usr/bin/perl
+
+use strict;
+use Template;
+use Captcha::reCAPTCHA;
+
+use vars qw( $captcha_pubkey );
+require "$ENV{BFConfDir}/BuildFarmWeb.pl";
+
+
+my $c = Captcha::reCAPTCHA->new;
+
+my $captcha = $c->get_html($captcha_pubkey);
+
+
+my $template = new Template({INCLUDE_PATH => '/home/community/pgbuildfarm/templates' });
+
+print "Content-Type: text/html\n\n";
+
+
+$template->process('register-form.tt',{captcha => $captcha});
+
+
+
+
+
use DBI;
use Template;
use CGI;
+use Template;
+use Captcha::reCAPTCHA;
-use vars qw($dbhost $dbname $dbuser $dbpass $dbport $notifyapp);
+use vars qw($dbhost $dbname $dbuser $dbpass $dbport $notifyapp $captcha_pubkey $captcha_privkey);
require "$ENV{BFConfDir}/BuildFarmWeb.pl";
#require "BuildFarmWeb.pl";
<li id="home"><a href="/index.html" title="PostgreSQL BuildFarm Home">Home</a></li>
<li id="status"><a href="/cgi-bin/show_status.pl" title="Current results">Status</a></li>
<li id="members"><a href="/cgi-bin/show_members.pl" title="Platforms tested">Members</a></li>
- <li id="register"><a href="/register.html" title="Join PostgreSQL BuildFarm">Register</a></li>
+ <li id="register"><a href="/cgi-bin/register-form.pl" title="Join PostgreSQL BuildFarm">Register</a></li>
<li id="pgfoundry"><a href="http://pgfoundry.org/projects/pgbuildfarm/">PGFoundry</a></li>
<li id="postgresql.org"><a href="http://www.postgresql.org">PostgreSQL.org</a></li>
</ul>
my $params = $query->Vars;
-my ($os, $osv, $comp, $compv, $arch, $email, $owner) = @{$params}{
- qw(os osv comp compv arch email owner)};
+my ($os, $osv, $comp, $compv, $arch, $email, $owner, $challenge, $response ) = @{$params}{
+ qw(os osv comp compv arch email owner recaptcha_challenge_field recaptcha_response_field)};
+
+my $captcha = Captcha::reCAPTCHA->new;
+my $captcha_ok = $captcha->check_answer
+ (
+ $captcha_privkey,
+ $ENV{'REMOTE_ADDR'},
+ $challenge, $response
+ );
+
-unless ($os && $osv && $comp && $compv && $arch && $email && $owner)
+unless ($os && $osv && $comp && $compv && $arch && $email && $owner && $captcha_ok->{is_valid})
{
print "Content-Type: text/html\n\n",
$header,
- "<p>You need to complete all the form items. <a href=\"/register.html\">Please try again.</a></p>\n",
+ "<p>You need to complete all the form items. <a href=\"/cgi-bin/register-form.pl\">Please try again.</a></p>\n",
$footer;
exit;
}
<li id="home"><a href="/index.html" title="PostgreSQL BuildFarm Home">Home</a></li>
<li id="status"><a href="/cgi-bin/show_status.pl" title="Current results">Status</a></li>
<li id="members"><a href="/cgi-bin/show_members.pl" title="Platforms tested">Members</a></li>
- <li id="register"><a href="/register.html" title="Join PostgreSQL BuildFarm">Register</a></li>
+ <li id="register"><a href="/cgi-bin/register-form.pl" title="Join PostgreSQL BuildFarm">Register</a></li>
<li id="pgfoundry"><a href="http://pgfoundry.org/projects/pgbuildfarm/">PGFoundry</a></li>
</ul>
</div><!-- nav -->
<li id="home"><a href="/index.html" title="PostgreSQL BuildFarm Home">Home</a></li>
<li id="status"><a href="/cgi-bin/show_status.pl" title="Current results">Status</a></li>
<li id="members"><a href="/cgi-bin/show_members.pl" title="Platforms tested">Members</a></li>
- <li id="register"><a href="/register.html" title="Join PostgreSQL BuildFarm">Register</a></li>
+ <li id="register"><a href="/cgi-bin/register-form.pl" title="Join PostgreSQL BuildFarm">Register</a></li>
<li id="pgfoundry"><a href="http://pgfoundry.org/projects/pgbuildfarm/">PGFoundry</a></li>
</ul>
</div><!-- nav -->
<li id="home"><a href="/index.html" title="PostgreSQL BuildFarm Home">Home</a></li>
<li id="status"><a href="/cgi-bin/show_status.pl" title="Status Page">Status</a></li>
<li id="members"><a href="/cgi-bin/show_members.pl" title="Status Page">Members</a></li>
- <li id="register"><a href="/register.html" title="Register">Register</a></li>
+ <li id="register"><a href="/cgi-bin/register-form.pl" title="Register">Register</a></li>
<li id="pgfoundry"><a href="http://pgfoundry.org/projects/pgbuildfarm/">PGFoundry</a></li>
</ul>
</div><!-- nav -->
<li id="home"><a href="/index.html" title="PostgreSQL BuildFarm Home">Home</a></li>
<li id="status"><a href="/cgi-bin/show_status.pl" title="Current results">Status</a></li>
<li id="members"><a href="/cgi-bin/show_members.pl" title="Platforms tested">Members</a></li>
- <li id="register"><a href="/register.html" title="Join PostgreSQL BuildFarm">Register</a></li>
+ <li id="register"><a href="/cgi-bin/register-form.pl" title="Join PostgreSQL BuildFarm">Register</a></li>
<li id="pgfoundry"><a href="http://pgfoundry.org/projects/pgbuildfarm/">PGFoundry</a></li>
</ul>
</div><!-- nav -->
xml => '/img/xml.png',
'thread-safety' => '/img/threads.gif',
'integer-datetimes' = '/img/days.png',
+ git => '/img/git.png',
}
-%]
[%- BLOCK img ; IF flag == 'depend' or flag == 'gnu-ld' ; ; ELSIF flag_imgs.$flag %]<img src="[% flag_imgs.$flag %]" title="[% flag %]" alt="[% flag %]" height="16" width="16" class="inline" align="bottom" /> [% ELSE %][%#
<li id="home"><a href="/index.html" title="PostgreSQL BuildFarm Home">Home</a></li>
<li id="status"><a href="/cgi-bin/show_status.pl" title="Current results">Status</a></li>
<li id="members"><a href="/cgi-bin/show_members.pl" title="Platforms tested">Members</a></li>
- <li id="register"><a href="/register.html" title="Join PostgreSQL BuildFarm">Register</a></li>
+ <li id="register"><a href="/cgi-bin/register-form.pl" title="Join PostgreSQL BuildFarm">Register</a></li>
<li id="pgfoundry"><a href="http://pgfoundry.org/projects/pgbuildfarm/">PGFoundry</a></li>
<li id="postgresql.org"><a href="http://www.postgresql.org">PostgreSQL.org</a></li>
</ul>
<table><tr><th class="head" rowspan="2">Legend</th>
[% FOREACH flagset IN flag_imgs %]
<td><img src="[% flagset.value %]" title="[% flagset.key %]" alt="[% flagset.key %]" height="16" width="16" class="inline" align="center"/> = [% flagset.key %]</td>
-[% IF loop.count == 6 %]</tr><tr>[% END %]
+[% IF loop.count == 7 %]</tr><tr>[% END %]
[% END %]
</tr></table>
<br />
<li id="home"><a href="/index.html" title="PostgreSQL BuildFarm Home">Home</a></li>
<li id="status"><a href="/cgi-bin/show_status.pl" title="Current results">Status</a></li>
<li id="members"><a href="/cgi-bin/show_members.pl" title="Platforms tested">Members</a></li>
- <li id="register"><a href="/register.html" title="Join PostgreSQL BuildFarm">Register</a></li>
+ <li id="register"><a href="/cgi-bin/register-form.pl" title="Join PostgreSQL BuildFarm">Register</a></li>
<li id="pgfoundry"><a href="http://pgfoundry.org/projects/pgbuildfarm/">PGFoundry</a></li>
</ul>
</div><!-- nav -->
</p>
<p>
If you are interested in running a member of the build farm, then please visit
-the <a href="/register.html" title="Register">Registration Page</a>.
+the <a href="/cgi-bin/register-form.pl" title="Register">Registration Page</a>.
We are particularly interested in unusual platforms or combinations of
architecture, operating system and compiler.
</p>
ALTER FUNCTION public.target(t text) OWNER TO pgbuildfarm;
+--
+-- Name: transitions(text, text, text, text, text, text); Type: FUNCTION; Schema: public; Owner: pgbuildfarm
+--
+
+CREATE FUNCTION transitions(text, text, text, text, text, text) RETURNS integer
+ AS $_$
+
+my ($os,$osv,$comp,$compv,$arch,$owner) = @_;
+# count transitions to and from upper case
+my $trans = 1;
+my $counttrans = 0;
+foreach (split "" ,"$os$osv$comp$compv$arch$owner")
+{
+ if (/[A-Z]/)
+ {
+ next if $trans;
+ $trans = 1;
+ $counttrans++;
+ }
+ else
+ {
+ next unless $trans;
+ $trans = 0;
+ $counttrans++;
+ }
+}
+
+return $counttrans;
+
+$_$
+ LANGUAGE plperl;
+
+
+ALTER FUNCTION public.transitions(text, text, text, text, text, text) OWNER TO pgbuildfarm;
+
SET default_tablespace = '';
SET default_with_oids = true;
log_archive bytea,
log_archive_filenames text[],
build_flags text[],
- report_time timestamp with time zone DEFAULT ('now'::text)::timestamp(6) with time zone
+ report_time timestamp with time zone DEFAULT ('now'::text)::timestamp(6) with time zone,
+ scm text,
+ scmurl text
);
sys_owner text NOT NULL,
owner_email text NOT NULL,
status_ts timestamp without time zone DEFAULT (('now'::text)::timestamp(6) with time zone)::timestamp without time zone,
- no_alerts boolean DEFAULT false
+ no_alerts boolean DEFAULT false,
+ sys_notes text,
+ sys_notes_ts timestamp with time zone
);
ALTER TABLE public.dashboard OWNER TO pgbuildfarm;
+--
+-- Name: dashboard_ex; Type: VIEW; Schema: public; Owner: pgbuildfarm
+--
+
+CREATE VIEW dashboard_ex AS
+ SELECT ((timezone('GMT'::text, now()))::timestamp(0) without time zone - b.snapshot) AS when_ago, b.sysname, b.snapshot, b.status, b.stage, b.branch, b.build_flags, s.operating_system, COALESCE(b.os_version, s.os_version) AS os_version, s.compiler, COALESCE(b.compiler_version, s.compiler_version) AS compiler_version, s.architecture, s.sys_notes, (s.sys_notes_ts)::date AS sys_notes_date FROM buildsystems s, (SELECT DISTINCT ON (bs.sysname, bs.branch, bs.report_time) bs.sysname, bs.snapshot, bs.status, bs.stage, bs.branch, bs.build_flags, bs.report_time, p.compiler_version, p.os_version FROM ((build_status bs NATURAL JOIN latest_snapshot m) LEFT JOIN personality p ON (((p.name = bs.sysname) AND (p.effective_date <= bs.report_time)))) WHERE (m.snapshot > (now() - '30 days'::interval)) ORDER BY bs.sysname, bs.branch, bs.report_time, (p.effective_date IS NULL), p.effective_date DESC) b WHERE ((s.name = b.sysname) AND (s.status = 'approved'::text));
+
+
+ALTER TABLE public.dashboard_ex OWNER TO pgbuildfarm;
+
+--
+-- Name: dashboard_mat; Type: TABLE; Schema: public; Owner: pgbfweb; Tablespace:
+--
+
+CREATE TABLE dashboard_mat (
+ sysname text,
+ snapshot timestamp without time zone,
+ status integer,
+ stage text,
+ branch text,
+ build_flags text[],
+ operating_system text,
+ os_version text,
+ compiler text,
+ compiler_version text,
+ architecture text
+);
+
+
+ALTER TABLE public.dashboard_mat OWNER TO pgbfweb;
+
+--
+-- Name: dashboard_mat_data; Type: VIEW; Schema: public; Owner: pgbuildfarm
+--
+
+CREATE VIEW dashboard_mat_data AS
+ SELECT b.sysname, b.snapshot, b.status, b.stage, b.branch, b.build_flags, s.operating_system, COALESCE(b.os_version, s.os_version) AS os_version, s.compiler, COALESCE(b.compiler_version, s.compiler_version) AS compiler_version, s.architecture FROM buildsystems s, (SELECT DISTINCT ON (bs.sysname, bs.branch, bs.report_time) bs.sysname, bs.snapshot, bs.status, bs.stage, bs.branch, bs.build_flags, bs.report_time, p.compiler_version, p.os_version FROM ((build_status bs NATURAL JOIN latest_snapshot m) LEFT JOIN personality p ON (((p.name = bs.sysname) AND (p.effective_date <= bs.report_time)))) WHERE (m.snapshot > (now() - '30 days'::interval)) ORDER BY bs.sysname, bs.branch, bs.report_time, (p.effective_date IS NULL), p.effective_date DESC) b WHERE ((s.name = b.sysname) AND (s.status = 'approved'::text));
+
+
+ALTER TABLE public.dashboard_mat_data OWNER TO pgbuildfarm;
+
+--
+-- Name: dashboard_mat_data2; Type: VIEW; Schema: public; Owner: pgbuildfarm
+--
+
+CREATE VIEW dashboard_mat_data2 AS
+ SELECT b.sysname, b.snapshot, b.status, b.stage, b.branch, CASE WHEN ((b.conf_sum ~ 'use_vpath'::text) AND (b.conf_sum !~ '''use_vpath'' => undef'::text)) THEN (b.build_flags || 'vpath'::text) ELSE b.build_flags END AS build_flags, s.operating_system, COALESCE(b.os_version, s.os_version) AS os_version, s.compiler, COALESCE(b.compiler_version, s.compiler_version) AS compiler_version, s.architecture FROM buildsystems s, (SELECT DISTINCT ON (bs.sysname, bs.branch, bs.report_time) bs.sysname, bs.snapshot, bs.status, bs.stage, bs.branch, bs.build_flags, bs.conf_sum, bs.report_time, p.compiler_version, p.os_version FROM ((build_status bs NATURAL JOIN latest_snapshot m) LEFT JOIN personality p ON (((p.name = bs.sysname) AND (p.effective_date <= bs.report_time)))) WHERE (m.snapshot > (now() - '30 days'::interval)) ORDER BY bs.sysname, bs.branch, bs.report_time, (p.effective_date IS NULL), p.effective_date DESC) b WHERE ((s.name = b.sysname) AND (s.status = 'approved'::text));
+
+
+ALTER TABLE public.dashboard_mat_data2 OWNER TO pgbuildfarm;
+
--
-- Name: failures; Type: VIEW; Schema: public; Owner: pgbuildfarm
--
ALTER INDEX public.bs_sysname_branch_report_idx OWNER TO pgbuildfarm;
+--
+-- Name: build_status_log_snapshot_idx; Type: INDEX; Schema: public; Owner: pgbuildfarm; Tablespace:
+--
+
+CREATE INDEX build_status_log_snapshot_idx ON build_status_log USING btree (snapshot);
+
+
+ALTER INDEX public.build_status_log_snapshot_idx OWNER TO pgbuildfarm;
+
--
-- Name: set_latest_snapshot; Type: TRIGGER; Schema: public; Owner: pgbuildfarm
--
REVOKE ALL ON TABLE buildsystems FROM PUBLIC;
REVOKE ALL ON TABLE buildsystems FROM pgbuildfarm;
GRANT ALL ON TABLE buildsystems TO pgbuildfarm;
-GRANT INSERT,SELECT ON TABLE buildsystems TO pgbfweb;
+GRANT INSERT,SELECT,UPDATE ON TABLE buildsystems TO pgbfweb;
GRANT SELECT ON TABLE buildsystems TO rssfeed;
GRANT SELECT ON TABLE dashboard TO pgbfweb;
+--
+-- Name: dashboard_ex; Type: ACL; Schema: public; Owner: pgbuildfarm
+--
+
+REVOKE ALL ON TABLE dashboard_ex FROM PUBLIC;
+REVOKE ALL ON TABLE dashboard_ex FROM pgbuildfarm;
+GRANT ALL ON TABLE dashboard_ex TO pgbuildfarm;
+GRANT SELECT ON TABLE dashboard_ex TO pgbfweb;
+
+
+--
+-- Name: dashboard_mat; Type: ACL; Schema: public; Owner: pgbfweb
+--
+
+REVOKE ALL ON TABLE dashboard_mat FROM PUBLIC;
+REVOKE ALL ON TABLE dashboard_mat FROM pgbfweb;
+GRANT ALL ON TABLE dashboard_mat TO pgbfweb;
+
+
+--
+-- Name: dashboard_mat_data; Type: ACL; Schema: public; Owner: pgbuildfarm
+--
+
+REVOKE ALL ON TABLE dashboard_mat_data FROM PUBLIC;
+REVOKE ALL ON TABLE dashboard_mat_data FROM pgbuildfarm;
+GRANT ALL ON TABLE dashboard_mat_data TO pgbuildfarm;
+GRANT SELECT ON TABLE dashboard_mat_data TO pgbfweb;
+
+
+--
+-- Name: dashboard_mat_data2; Type: ACL; Schema: public; Owner: pgbuildfarm
+--
+
+REVOKE ALL ON TABLE dashboard_mat_data2 FROM PUBLIC;
+REVOKE ALL ON TABLE dashboard_mat_data2 FROM pgbuildfarm;
+GRANT ALL ON TABLE dashboard_mat_data2 TO pgbuildfarm;
+GRANT SELECT ON TABLE dashboard_mat_data2 TO pgbfweb;
+
+
--
-- PostgreSQL database dump complete
--
atus</a></li>
<li id="members"><a href="/cgi-bin/show_members.pl" title="Platforms tested"
>Members</a></li>
- <li id="register"><a href="/register.html" title="Join PostgreSQL BuildFarm"
+ <li id="register"><a href="/cgi-bin/register-form.pl" title="Join PostgreSQL BuildFarm"
>Register</a></li>
<li id="pgfoundry"><a href="http://pgfoundry.org/projects/pgbuildfarm/">PGFo
undry</a></li>
<li id="home"><a href="/index.html" title="PostgreSQL BuildFarm Home">Home</a></li>
<li id="status"><a href="/cgi-bin/show_status.pl" title="Current results">Status</a></li>
<li id="members"><a href="/cgi-bin/show_members.pl" title="Platforms tested">Members</a></li>
- <li id="register"><a href="/register.html" title="Join PostgreSQL BuildFarm">Register</a></li>
+ <li id="register"><a href="/cgi-bin/register-form.pl" title="Join PostgreSQL BuildFarm">Register</a></li>
<li id="pgfoundry"><a href="http://pgfoundry.org/projects/pgbuildfarm/">PGFoundry</a></li>
</ul>
</div><!-- nav -->
<li id="home"><a href="/index.html" title="PostgreSQL BuildFarm Home">Home</a></li>
<li id="status"><a href="/cgi-bin/show_status.pl" title="Current results">Status</a></li>
<li id="members"><a href="/cgi-bin/show_members.pl" title="Platforms tested">Members</a></li>
- <li id="register"><a href="/register.html" title="Join PostgreSQL BuildFarm">Register</a></li>
+ <li id="register"><a href="/cgi-bin/register-form.pl" title="Join PostgreSQL BuildFarm">Register</a></li>
<li id="pgfoundry"><a href="http://pgfoundry.org/projects/pgbuildfarm/">PGFoundry</a></li>
<li id="postgresql.org"><a href="http://www.postgresql.org">PostgreSQL.org</a></li>
</ul>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+ <title>PostgreSQL BuildFarm Application</title>
+ <link rel="icon" type="image/png" href="/elephant-icon.png" />
+ <link rel="stylesheet" rev="stylesheet" href="/inc/pgbf.css" charset="utf-8" />
+ <style type="text/css"><!--
+ li#register a { color:rgb(17,45,137); background: url(/inc/b/r.png) no-repeat 100% -20px; }
+ li#register { background: url(/inc/b/l.png) no-repeat 0% -20px; }
+ --></style>
+</head>
+<body class="application">
+<div id="wrapper">
+<div id="banner">
+<a href="/index.html"><img src="/inc/pgbuildfarm-banner.png" alt="PostgreSQL BuildFarm" width="800" height="73" /></a>
+<div id="nav">
+<ul>
+ <li id="home"><a href="/index.html" title="PostgreSQL BuildFarm Home">Home</a></li>
+ <li id="status"><a href="/cgi-bin/show_status.pl" title="Current results">Status</a></li>
+ <li id="members"><a href="/cgi-bin/show_members.pl" title="Platforms tested">Members</a></li>
+ <li id="register"><a href="/cgi-bin/register-form.pl" title="Join PostgreSQL BuildFarm">Register</a></li>
+ <li id="pgfoundry"><a href="http://pgfoundry.org/projects/pgbuildfarm/">PGFoundry</a></li>
+</ul>
+</div><!-- nav -->
+</div><!-- banner -->
+<div id="main">
+<h1>Application to join PostgreSQL BuildFarm</h1>
+
+<p>Here is a short description of what is required to join the buildfarm successfully. Please read it carefully
+before submitting this form.</p>
+
+<ul>
+<li> your machine will need to be able to contact <a href="http://www.pgbuildfarm.org">http://www.pgbuildfarm.org</a>
+ either directly or via proxy, and it will need access to a PostgreSQL CVS repository,
+ either the one at postgresql.org or a mirror (you can set up your own mirror using CSVup on a Linux or FreeBSD machine -
+ this is recommended).</li>
+<li> have a working Postgresql build environment for your platform
+ (for Windows this means MSys/MinGW with the libz and libintl stuff, and ideally native Python and Tcl).</li>
+<li> Windows only: you will need a native perl installed as well as the one in the MSys DTK. The one from ActiveState works fine.</li>
+<li> download and unpack the latest release of client code from
+ <a href="http://pgfoundry.org/frs/?group_id=1000040">http://pgfoundry.org/frs/?group_id=1000040</a></li>
+<li> read instructions at
+ <a href="http://pgfoundry.org/docman/view.php/1000040/4/PGBuildFarm-HOWTO.txt">http://pgfoundry.org/docman/view.php/1000040/4/PGBuildFarm-HOWTO.txt</a></li>
+<li> get the software running locally using flags --force --nostatus --nosend</li>
+<li> register your machine on this page</li>
+<li> when you receive credentials, put them in the config file, and schedule regular builds (without those flags)
+ for the branches you want to support - which should be at least HEAD and the most recent stable branch.</li>
+</ul>
+
+<p>There is also some extra information in this
+<a href="http://www.onlamp.com/pub/a/onlamp/2005/02/24/pg_buildfarm.html">article about buildfarm</a> on the O'Reilly network.</p>
+
+<hr />
+
+<p>Please complete all items.</p>
+<p>For Linux, please specify the name and version of the <b>Distribution</b> for the Operating Systems items.
+Do not use the name "Linux". For example, for my test machine the Operating
+Systems is "Fedora Core" and the version is "4".</p>
+<form method="post" action="/cgi-bin/register.pl">
+<table cellspacing="0">
+<tr>
+ <th>Operating System</th>
+ <td><input type="text" name="os" value="" /></td>
+</tr>
+<tr>
+ <th>OS Version</th>
+ <td><input type="text" name="osv" value="" /></td>
+</tr>
+<tr>
+ <th>Compiler</th>
+ <td><input type="text" name="comp" value="" /></td>
+</tr>
+<tr>
+ <th>Compiler Version</th>
+ <td><input type="text" name="compv" value="" /></td>
+</tr>
+<tr>
+ <th>Architecture</th>
+ <td><input type="text" name="arch" value="" /></td>
+</tr>
+<tr>
+ <th>Your name</th>
+ <td><input type="text" name="owner" value="" /></td>
+</tr>
+<tr>
+ <th>Your email address</th>
+ <td><input type="text" name="email" value="" /></td>
+</tr>
+<tr>
+<th colspan="2">[% captcha %]</th>
+</tr>
+<tr>
+ <th class="submit" colspan="2"><input type="submit" /></th>
+</tr>
+</table>
+</form>
+</div><!-- main -->
+<hr />
+<p style="text-align: center;">
+Hosting for the PostgreSQL Buildfarm is generously
+provided by:
+<a href="http://www.commandprompt.com">CommandPrompt,
+The PostgreSQL Company</a>
+</p>
+</div><!-- wrapper -->
+</body>
+</html>
+
+