#!/usr/bin/perl -w use strict; # first (and only) argument should be a port number to look for my $testPort = $ARGV[0] || die "Usage: tor-exitpoint \n"; # fetch tor server list from server # this server was listed on the report page: # http://www.noreply.org/tor-running-routers/ open(TOR, "wget -q http://tor.noreply.org:9030/ -O - |") || die "Can't open wget: $!"; # parse rules for each server.. my $state = 1; my $routerName; my $routerIP; while() { chomp; if($state == 1 && m#^router (.*) (\d+\.\d+.\d+.\d+)#) { #print "found router id line \"$_\"\n"; # found router list $routerName = $1; $routerIP = $2; $state = 2; } elsif( $state == 2 && m#^(reject|accept) \*:(.*)# ) { # $2 is port or port range (eg "110" or "1-1000") my $type = $1; my $startport = $2; my $endport = $2; if($startport =~ m#(\d+)-(\d+)#) { $startport = $1; $endport = $2; } if($startport eq "*" || ( $startport <= $testPort && $endport >= $testPort )) { # rule matches #print "rule \"$_\" matches port $testPort\n"; if($type eq "reject") { print "$routerName ($routerIP) rejects $testPort ($_)\n"; $state = 1; } else { print "$routerName ($routerIP) accepts $testPort ($_)\n"; $state = 1; } } } } close(TOR);