From b99e2f9531a0d06479d6e05fbd54816a07559469 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Fri, 24 Jul 2009 17:23:01 +0100 Subject: [PATCH] wip commod-update-receiver --- pctb/Commods.pm | 16 +++++++-- pctb/commod-update-receiver | 71 ++++++++++++++++++++++++++----------- pctb/master-master.txt | 2 +- 3 files changed, 66 insertions(+), 23 deletions(-) diff --git a/pctb/Commods.pm b/pctb/Commods.pm index d59529b..e695f15 100644 --- a/pctb/Commods.pm +++ b/pctb/Commods.pm @@ -11,7 +11,8 @@ BEGIN { $VERSION = 1.00; @ISA = qw(Exporter); @EXPORT = qw(&parse_masters %oceans %commods %clients - &parse_pctb_commodmap %pctb_commodmap @pctb_commodmap); + &parse_pctb_commodmap %pctb_commodmap @pctb_commodmap + &get_our_version); %EXPORT_TAGS = ( ); @EXPORT_OK = qw(); @@ -51,7 +52,7 @@ sub parse_master_master1 ($$) { $oceans{$ocean}{$arch}{$_} .= $src; }; }); - } elsif (m/^client (\S+)$/) { + } elsif (m/^client (\S+.*\S)$/) { my $client= $1; $clients{$client}= [ ]; @ctx= (sub { @@ -108,4 +109,15 @@ sub parse_pctb_commodmap () { return 1; } +sub get_our_version ($) { + my ($prefix); + { + no strict (qw(refs)); + ${ "${prefix}name" }= 'ypp-sc-tools yarrg'; + ${ "${prefix}fixes" }= 'lastpage'; + ${ "${prefix}version" }= `git-describe --tags HEAD`; + $? and die $?; + } +} + 1; diff --git a/pctb/commod-update-receiver b/pctb/commod-update-receiver index 2c409f4..90c9c4b 100755 --- a/pctb/commod-update-receiver +++ b/pctb/commod-update-receiver @@ -63,13 +63,13 @@ 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/; + fail("invalid form parameter $n ($re)") unless $v =~ m/$re/; return $1; } my $clientname= must_param('clientname',$re_any); my $clientinfo= $clients{$clientname}; -fail('unknown client') unless defined $client; +fail('unknown client') unless defined $clientinfo; my $clientfixes= must_param('clientfixes', "^([-0-9a-z ]*)\$"); my @clientfixes= sort grep { m/./ } split /\s+/, $clientfixes; @@ -79,7 +79,7 @@ foreach my $bug (@$clientinfo) { unless grep { $_ eq $bug } @clientfixes; } -my $cversion= must_param('clientversion', "^(\\d[-+._0-9a-zA-Z]+)\$"); +my $clientversion= must_param('clientversion', "^(\\d[-+._0-9a-zA-Z]+)\$"); my $ocean= must_param('ocean', $re_any); my $island= must_param('island', $re_any); @@ -96,25 +96,49 @@ foreach my $islands (values %$arches) { } fail("unknown island") unless $island_found; +my $timestamp= must_param('timestamp', "^([1-9]\\d{1,20})\$"); +my $now= time; defined $now or die $!; +fail("clock skew") if $timestamp >= $now; + die if $ocean =~ m/\=/; die if $island =~ m/\=/; -$datafile= must_param('data',"^(deduped\\.tsv\\.gz)\$"); -$indatafh= upload('data'); fail("data is not a file") unless defined $datafh; +my $indatafh= upload('data'); +defined $indatafh or fail("data is not a file"); +my $datafile= must_param('data',"^(deduped\\.tsv\\.gz)\$"); our %done; -my $content= MIME::Entity->build(Type => 'multipart/mixed', - Boundary => '=', - Charset => 'utf-8'); +my $mcontent= MIME::Entity->build(To => 'yarrg-commod-updates', + Type => 'multipart/mixed', + Boundary => '=', + Charset => 'utf-8'); + +our ($servername,$serverversion,$serverfixes); +get_our_version('::server'); my $clientspec= "$clientname $clientversion $clientfixes"; -foreach $vn (qw(ocean island - clientspec - clientname clientversion clientfixes)) { +my $serverspec= "$servername $serverversion $serverfixes"; + +foreach my $vn (qw(ocean island timestamp + clientspec clientname clientversion clientfixes + serverspec servername serverversion serverfixes)) { + my $mpart= MIME::Entity->build(Type => 'text/plain', + Charset => 'utf-8', + Disposition => 'inline', + Data => $$vn); + $mcontent->add_part($mpart); +} -while (<$datafh>) { +my $gunzchild= open(GZ, "-|") or die $!; +if (!$gunzchild) { + open STDIN, "<&=", $indatafh or die $!; + execlp 'gunzip'; die $!; +} + +while () { !m/\P{IsPrint}/ or die bad_data('nonprinting char(s)'); + !m/\\/ or bad_data('data contains backslashes'); my @v= split /\t/; @v==6 or bad_data('wrong number of fields'); my ($commod,$stall) = @v; @@ -122,17 +146,24 @@ while (<$datafh>) { $stall =~ m/^\p{IsUpper}/ or bad_data("stall not capitalised"); !exists $done{$commod,$stall} or bad_data("repeated data"); $done{$commod,$stall}= 1; - foreach my $f (@v[2..5]) { + foreach my $i (2..5) { + my $f= $v[$i]; $f =~ m/^(0|[1-9][0-9]{0,5}|\>1000)$/ or bad_data("bad field"); - ($v % 1) or ($v !~ m/\>/) or bad_data("> in price"); + ($i % 1) or ($f !~ m/\>/) or bad_data("> in price"); } } +GZ->error and die $!; +$?=0; close GZ; $? and fail("gunzip for check failed code $?"); +my $mdatafile= MIME::Entity->build(Type => 'application/octet-streak', + Disposition => 'attachment', + Encoding => 'base64', + File => $datafile); +$mcontent->add_part($mdatafile); +open M, "|/usr/sbin/sendmail -t -oi -oee -odq" + or fail("fork sendmail failed! ($!)"); +$mcontent->print(\*M); - -#foreach my $commod (sort keys %commods) { -# print "$commod\n"; -#} -#STDOUT->error and die $!; -#close STDOUT or die $!; +M->error and fail("write sendmail failed! ($!)"); +$?=0; close M; $? and fail("sendmail failed code $?"); diff --git a/pctb/master-master.txt b/pctb/master-master.txt index f5087ca..3753a43 100644 --- a/pctb/master-master.txt +++ b/pctb/master-master.txt @@ -164,5 +164,5 @@ ocean Midnight Remora Island Vernal Equinox -client ypp-sc-tools +client ypp-sc-tools yarr lastpage -- 2.30.2