Skip to content

Instantly share code, notes, and snippets.

@nemesifier
Last active December 29, 2015 16:18
Show Gist options
  • Save nemesifier/c1d7cb31831461b61ec0 to your computer and use it in GitHub Desktop.
Save nemesifier/c1d7cb31831461b61ec0 to your computer and use it in GitHub Desktop.
Automatic Ninux WHOIS resolution signal for django-netjsongraph https://github.com/interop-dev/django-netjsongraph
import socket
from django.db.models.signals import pre_save
from django.dispatch import receiver
from django_netjsongraph.models import Node
def whois(query, hostname='chi.ninux.org'):
"""
Retrieve node information from Ninux.org WHOIS service
"""
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((hostname, 43))
s.send('{0}\r\n'.format(query).encode('utf8'))
response = ''
while True:
d = s.recv(4096)
response += d.decode('utf8')
if not d:
break
s.close()
fields = {}
for line in response.split('\n'):
if ':' not in line or line.startswith('%'):
continue
parts = line.split(': ')
key = parts[0].strip()
value = ''.join(parts[1:]).strip()
if value in ['-', 'xxx', '', '--', '---']:
continue
fields[key] = value
return fields
@receiver(pre_save, sender=Node, dispatch_uid='resolve_node')
def resolve_node(sender, instance, **kwargs):
whois_fields = whois(instance.netjson_id)
# determine label
label_keys = ['node', 'posizione-zona', 'map-server', 'name']
for key in label_keys:
label = whois_fields.get(key)
if label:
instance.label = label
break
# store interesting properties for visualization purposes
interesting_keys = ['posizione-zona',
'technical-contact',
'name',
'essid',
'apparato']
for key in interesting_keys:
if key in whois_fields:
instance.properties[key] = whois_fields[key]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment