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
$ 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
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:
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,
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)$/) {
$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)$/) {
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);
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)");
&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"