1
0
Fork 0

Melchior FRANZ:

Yesterday night it occurred to me that the current handling of missing METAR
strings isn't good enough:

- in case of missing METAR strings, don't re-send the last successful string,
  but the last successful string sent to *this* client. (If one client is
  running in virtual December, it won't be happy about dropped in summer
  weather.)

- fix a bug that allowed -vc notation (options -v and -c), but broke a lot of
  other notations (-b/var/tmp). Only -v can now be accumulated again, as
  in -vvvv.
This commit is contained in:
ehofman 2005-01-31 18:18:25 +00:00
parent 964349e401
commit 5a5b67bab1
2 changed files with 14 additions and 16 deletions

View file

@ -4,7 +4,7 @@
metarproxy is a caching proxy server for METAR data strings written in
Perl. It can be used from the FlightGear flight simulator to:
Perl. It can be used to:
- provide METAR data for machines without internet connection
- centralize METAR fetching: one machine in a network runs the proxy, all
@ -129,7 +129,7 @@ Ranges are allowed, too:
$ metarproxy --download 0-2 ... download first three hours after
midnight GMT
These three methods can be use in combination:
These three methods can be used in combination:
$ metarproxy --download 6h 0-2 4
@ -176,7 +176,7 @@ stored in the cache. Additionally, you can specify one or more files
with station IDs:
$ metarproxy --record --file=$FG_HOME/station-list
$ metarproxy --record EDDM --file=tmp/Austria --file=/tmp/Hungary
$ metarproxy --record EDDM --file=/tmp/Austria --file=/tmp/Hungary
These files simply contain station IDs separated by spaces in one
or more lines:
@ -232,7 +232,8 @@ All you need to do is point FlightGear to the metar proxy and let
it run at a simulated time for which you actually have cached METAR
data:
$ fgfs --proxy=localhost:5509 --start-date-lat=2005:01:12:12:00:00
$ fgfs --enable-real-weather-fetch --proxy=localhost:5509 \
--start-date-lat=2005:01:12:12:00:00
FlightGear will then fetch the metar data from the proxy as if it
were weather.noaa.gov. If no appropriate data set is found at all,

View file

@ -113,12 +113,6 @@ sub parse_options()
while (1) {
$_ = $ARGV[0];
defined $_ or last;
# dissolve glued together short options (e.g. -cvv)
if (/^-([^-]{2,})$/) {
shift @ARGV;
map { unshift @ARGV, "-$_" } split //, $1;
next;
}
if (!/^-/) {
push @ITEMS, $_;
} elsif (/^(-d|--download)$/) {
@ -148,8 +142,10 @@ sub parse_options()
$PROXY = &argument($2, $4);
defined $PROXY or &fatal("--proxy option lacks <host> definition");
&log($BULK, "set option --proxy: '$PROXY'");
} elsif (/^(-v|--verbose)$/) {
} elsif (/^--verbose$/) {
$VERBOSITY++;
} elsif (/^-(v+)$/) {
$VERBOSITY += length($1);
} elsif (/^(-q|--quiet)$/) {
$VERBOSITY = 0;
} elsif (/^(-h|--help)$/) {
@ -390,6 +386,7 @@ sub serve()
my $server = IO::Socket::INET->new(Proto => 'tcp', LocalPort => $PORT, Listen => SOMAXCONN, Reuse => 1);
$server or &fatal("cannot setup server ($!)");
&log($BULK, "server $0 accepting clients on port $PORT");
my %last_metar;
while (my $client = $server->accept()) {
$client->autoflush(1);
@ -425,9 +422,9 @@ sub serve()
if ($age <= $METAR_MAX_AGE) {
&log($BULK, "found (" . int($age / 60) . " min old)");
$metar =~ s/\s*$//s;
$METAR_DEFAULT = $metar;
$METAR_DEFAULT =~ s/.*\015?\012[A-Z0-9]{4}\s+[0-9]{6}Z\s+//s;
&log($DEBUG, "setting default to '$METAR_DEFAULT'");
$last_metar{$addr} = $metar;
$last_metar{$addr} =~ s/.*\015?\012[A-Z0-9]{4}\s+[0-9]{6}Z\s+//s;
&log($DEBUG, "setting default for [$addr] to '$last_metar{$addr}'");
$metar =~ s/\015?\012/\015\012/g;
} else {
&log($INFO, "found, but too old (" . int($age / 60) . " min)");
@ -441,8 +438,8 @@ sub serve()
&log($INFO, "sending last successful data again");
$metar = sprintf "%04d/%02d/%02d %02d:%02d\015\012",
$year, $mon, $day, $hour, $min;
$metar .= sprintf "$icao %02d%02d%02dZ $METAR_DEFAULT",
$day, $hour, $min;
$metar .= sprintf "$icao %02d%02d%02dZ ", $day, $hour, $min;
$metar .= $last_metar{$addr} || $METAR_DEFAULT;
}
print $client "Content-Type: text/plain\015\012"
. "X-MetarProxy: nasse Maus\015\012"