#!/usr/bin/perl -wT use strict; use warnings; use utf8; use JSON; use MediaWiki::API; use Text::Unidecode; binmode STDERR, ':utf8'; $ENV{HOME} =~ m!\A(/.+)\Z!; my $HOME = $1; my $DEBUG = (defined($ENV{DEBUG}) && $ENV{DEBUG} =~ m!\A(\d+)\Z!) ? $1 : 0; my $nodes; sub debug { return unless $_[0] <= $DEBUG; shift; print STDERR join(" ",@_), "\n"; } my $mw = MediaWiki::API->new( { api_url => 'http://freifunk.in-kiel.de/mediawiki/api.php' } ); sub handle_node { my($node) = @_; my($title,$name,$gps,$mac,$vpn,$fastd,$fn,$f); debug(2, "title:", $node->{title}); $node->{title} =~ m!\ANodes/([ \w-]+)\Z! && ($title = $1); unless (defined($title)) { debug(1, "no valid title:", $node->{title}); next; } ($name = lc(unidecode($title))) =~ s/\s/_/g; unless ($name =~ /\A[0-9a-z_-]+\Z/) { debug(1, "invalid name:", $name); next; } my $tmp = $mw->get_page({ title => $node->{title} }) || die $mw->{error}->{code} . ': ' . $mw->{error}->{details}; $tmp = $tmp->{'*'}; debug(4, "tmp:", $tmp); return unless $tmp =~ m!{{Node\s*(\|.+?)}}!sm; $tmp = $1; debug(5, "tmp:", $tmp); my %fields = (Node => split /^\|(\w+)\s*=\s*/m, $tmp, -1); foreach my $k (qw/GPS MAC VPN FASTD/) { next unless defined $fields{$k}; $fields{$k} =~ s/\A\s+//mg; $fields{$k} =~ s/\s+\Z//mg; debug(3, ">>>",$k, " = ", $fields{$k}, "<<<"); } (defined($fields{GPS})) && ($fields{GPS} gt "") && ($fields{GPS} =~ m!\A(\d{1,3}\.\d+)[\., /]+(\d{1,2}\.\d+)\Z!) && ($gps = "$1 $2"); (defined($fields{MAC})) && ($fields{MAC} gt "") && ($fields{MAC} =~ /\A(([0-9A-Fa-f]{2}:?){5}([0-9A-Fa-f]{2}))\Z/) && ($mac = lc($1)); # && ($mac =~ s/\A([0-9a-f]{2}:?){5}([0-9a-f]{2})\Z/$1:$2:$3:$4:$5:$6/e); (defined($fields{VPN})) && ($fields{VPN} gt "") && ($vpn = $fields{VPN}); # deactivated 2014-06-05 wonka #(defined($fields{FASTD})) && ($fields{FASTD} gt "") && ($fields{FASTD} =~ /\Akey\s*"[0-9a-f]{64}";\Z/m) && ($fastd = $fields{FASTD}) && ($fastd =~ s/key\s*"/key "/g); if (defined($fastd)) { $fn = "/etc/fastd/ffki/peers/$name"; unless (-f $fn) { open($f,">",$fn); binmode $f, ':utf8'; print $f $fastd."\n"; close($f); } } if (defined ($mac)) { my $node; $node->{'name'} = $title if defined $title; $node->{'gps'} = $gps if defined $gps; $node->{'vpn'} = 'true' if defined $vpn; $nodes->{$mac} = $node; } } sub handle_nodes { my ($ref) = @_; foreach my $node (@$ref) { &handle_node($node); } } $mw->list ( { action => 'query', list => 'embeddedin', einamespace => 0, eilimit => 'max', eifilterredir => 'nonredirects', eititle => 'Template:Node' }, { max => 'max', hook => \&handle_nodes } ) || die $mw->{error}->{code} . ': ' . $mw->{error}->{details}; open(my $f,">","/opt/ffmap-backend/json/aliases.json.new"); print $f encode_json($nodes); close($f); rename "/opt/ffmap-backend/json/aliases.json.new", "/opt/ffmap-backend/json/aliases.json"; __END__