From 3ff1e35cbf0515fbc42a43476e7c8ec1834e8db6 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 20 Jul 2009 03:30:36 +0100 Subject: [PATCH] WIP commod-update-receiver --- pctb/Commods.pm | 12 ++++++-- pctb/commod-update-receiver | 55 +++++++++++++++++++++++++++++++++++++ pctb/master-master.txt | 3 ++ 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/pctb/Commods.pm b/pctb/Commods.pm index 6f3a177..d59529b 100644 --- a/pctb/Commods.pm +++ b/pctb/Commods.pm @@ -10,15 +10,16 @@ BEGIN { our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); $VERSION = 1.00; @ISA = qw(Exporter); - @EXPORT = qw(&parse_masters %oceans %commods + @EXPORT = qw(&parse_masters %oceans %commods %clients &parse_pctb_commodmap %pctb_commodmap @pctb_commodmap); %EXPORT_TAGS = ( ); @EXPORT_OK = qw(); } -our %oceans; # eg $oceans{'Midnight'}{'Ruby'}{'Eta Island'}= $sources +our %oceans; # eg $oceans{'Midnight'}{'Ruby'}{'Eta Island'}= $sources; our %commods; # eg $commods{'Fine black cloth'}= $sources; +our %clients; # eg $clients{'ypp-sc-tools'}= [ qw(last-page) ]; # $sources = 's[l]b'; # 's' = Special Circumstances; 'l' = local ; B = with Bleach @@ -50,6 +51,13 @@ sub parse_master_master1 ($$) { $oceans{$ocean}{$arch}{$_} .= $src; }; }); + } elsif (m/^client (\S+)$/) { + my $client= $1; + $clients{$client}= [ ]; + @ctx= (sub { + my $bug= $_; + push @{ $clients{$client} }, $bug; + }); } elsif (s/^ +//) { my $indent= length $&; die "wrong indent $indent" unless defined $ctx[$indent-1]; diff --git a/pctb/commod-update-receiver b/pctb/commod-update-receiver index 531ff1a..ff28fbb 100755 --- a/pctb/commod-update-receiver +++ b/pctb/commod-update-receiver @@ -37,6 +37,8 @@ use strict (qw(vars)); use POSIX; +use Commods; + $CGI::POST_MAX= 3*1024*1024; $CGI::DISABLE_UPLOADS= 1; @@ -44,3 +46,56 @@ use CGI qw/:standard -private_tempfiles/; setlocale(LC_CTYPE, "en_GB.UTF-8"); +my $re_any= "^(.*)\$"; + +parse_masters(); + +sub fail ($) { + my ($msg) = @_; + print header(-status=>'400 Bad commodity update', + -type=>'text/plain', + -charset=>'us-ascii'); + print "Error: $msg\n"; + exit 0; +} + +sub must_param ($$) { + my ($n,$re)= @_; + my $v= param($n); + fail("missing form parameter $n") unless defined $v; + fail("invalid form parameter $n") unless $v =~ m/$re/; + return $1; +} + +my $clientname= must_param('clientname',$re_any); +my $client= $clients{$clientname}; +fail('unknown client') unless defined $client; + +my $clientfixes= must_param('clientfixes', $re_any); +foreach my $bug (@$client) { + fail("client out of date - missing bugfix \`$bug'") + unless grep { $_ eq $bug } split /\s+/, $clientfixes; +} + +my $cversion= must_param('clientversion', "^(\\d[-+._0-9a-zA-Z]+)\$"); + +my $ocean= must_param('ocean', $re_any); +my $island= must_param('island', $re_any); + +my $arches= $oceans{$ocean}; +fail("unknown ocean") unless $arches; + +my $island_found= 0; +foreach my $islands (values %$arches) { + my $sources= $islands->{$island}; + next unless $sources; + die if $island_found; + $island_found= $sources; +} +fail("unknown island") unless $island_found; + +#foreach my $commod (sort keys %commods) { +# print "$commod\n"; +#} +#STDOUT->error and die $!; +#close STDOUT or die $!; diff --git a/pctb/master-master.txt b/pctb/master-master.txt index b1fe2df..f5087ca 100644 --- a/pctb/master-master.txt +++ b/pctb/master-master.txt @@ -163,3 +163,6 @@ ocean Midnight Iris Island Remora Island Vernal Equinox + +client ypp-sc-tools + lastpage -- 2.30.2