summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAvery Pennarun <apenwarr@gmail.com>2010-05-08 16:11:24 -0400
committerAvery Pennarun <apenwarr@gmail.com>2010-05-08 16:14:36 -0400
commit384d0e7c1d637c4c36eb3e4d31d538bc9420d987 (patch)
tree37700447d830963f534db4c4f482e84f2d734d9f
parent5a4a2ab7f92e644f3e3ab9bcf2d6d14cce4c80cf (diff)
hostwatch: watch "netstat -n" for IP addresses.
The list of active sessions might tell us about some hostnames on the local networks, which we can then add to our subnet list.
-rw-r--r--hostwatch.py38
1 files changed, 31 insertions, 7 deletions
diff --git a/hostwatch.py b/hostwatch.py
index e9928d9..1584171 100644
--- a/hostwatch.py
+++ b/hostwatch.py
@@ -4,6 +4,7 @@ if not globals().get('skip_imports'):
from helpers import *
POLL_TIME = 60*15
+NETSTAT_POLL_TIME = 30
CACHEFILE=os.path.expanduser('~/.sshuttle.hosts')
@@ -54,7 +55,8 @@ def read_host_cache():
def found_host(hostname, ip):
hostname = re.sub(r'\..*', '', hostname)
hostname = re.sub(r'[^-\w]', '_', hostname)
- if ip.startswith('127.') or hostname == 'localhost':
+ if (ip.startswith('127.') or ip.startswith('255.')
+ or hostname == 'localhost'):
return
oldip = hostnames.get(hostname)
if oldip != ip:
@@ -65,7 +67,7 @@ def found_host(hostname, ip):
def _check_etc_hosts():
- debug1(' > hosts\n')
+ debug2(' > hosts\n')
for line in open('/etc/hosts'):
line = re.sub(r'#.*', '', line)
words = line.strip().split()
@@ -74,14 +76,14 @@ def _check_etc_hosts():
ip = words[0]
names = words[1:]
if _is_ip(ip):
- debug2('< %s %r\n' % (ip, names))
+ debug3('< %s %r\n' % (ip, names))
for n in names:
check_host(n)
found_host(n, ip)
def _check_revdns(ip):
- debug1(' > rev: %s\n' % ip)
+ debug2(' > rev: %s\n' % ip)
try:
r = socket.gethostbyaddr(ip)
debug3('< %s\n' % r[0])
@@ -92,7 +94,7 @@ def _check_revdns(ip):
def _check_dns(hostname):
- debug1(' > dns: %s\n' % hostname)
+ debug2(' > dns: %s\n' % hostname)
try:
ip = socket.gethostbyname(hostname)
debug3('< %s\n' % ip)
@@ -102,7 +104,24 @@ def _check_dns(hostname):
pass
+def _check_netstat():
+ debug2(' > netstat\n')
+ argv = ['netstat', '-n']
+ try:
+ p = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=null)
+ content = p.stdout.read()
+ p.wait()
+ except OSError, e:
+ log('%r failed: %r\n' % (argv, e))
+ return
+
+ for ip in re.findall(r'\d+\.\d+\.\d+\.\d+', content):
+ debug3('< %s\n' % ip)
+ check_host(ip)
+
+
def _check_smb(hostname):
+ return
global _smb_ok
if not _smb_ok:
return
@@ -159,6 +178,7 @@ def _check_smb(hostname):
def _check_nmb(hostname, is_workgroup, is_master):
+ return
global _nmb_ok
if not _nmb_ok:
return
@@ -226,6 +246,7 @@ def hw_main(seed_hosts):
read_host_cache()
_enqueue(_check_etc_hosts)
+ _enqueue(_check_netstat)
check_host('localhost')
check_host(socket.gethostname())
check_workgroup('workgroup')
@@ -236,10 +257,13 @@ def hw_main(seed_hosts):
while 1:
now = time.time()
for t,last_polled in queue.items():
+ (op,args) = t
if not _stdin_still_ok(0):
break
- if now - last_polled > POLL_TIME:
- (op,args) = t
+ maxtime = POLL_TIME
+ if op == _check_netstat:
+ maxtime = NETSTAT_POLL_TIME
+ if now - last_polled > maxtime:
queue[t] = time.time()
op(*args)
try: