source: src/django_gheat/gheat/management/commands/import_kismet.py@ 9158

Last change on this file since 9158 was 9158, checked in by rick, 14 years ago

New netstumber import, based on gpsxml and netxml input files.

  • Property svn:executable set to *
File size: 3.7 KB
Line 
1#!/usr/bin/env python
2#
3# Script for importing .gpsxml and .netxml files (Kismet output)
4#
5
6from django.core.management.base import BaseCommand,CommandError
7from optparse import OptionParser, make_option
8from gheat.models import *
9from lxml import etree
10import datetime
11import os
12import sys
13
14def import_file(gpsxml_file, netxml_file, meetrondje, gebruiker, email):
15 gpsxml_doc = etree.parse(gpsxml_file)
16 netxml_doc = etree.parse(netxml_file)
17
18 points = gpsxml_doc.findall('gps-point')
19 wnetworks = netxml_doc.findall('wireless-network')
20
21 # TODO: Source source is variable entitity, based on mesurement
22 kaart = 'deadcode'
23 gebruiker, created = Gebruiker.objects.get_or_create(naam=gebruiker , email=email)
24 apparatuur, created = Apparatuur.objects.get_or_create(antenne='test' , kaart=kaart)
25 # TODO: Date is set to import date, but should pick the date from the netxml file
26 mr = MeetRondje.objects.create(datum=datetime.datetime.now(),
27 naam=meetrondje , gebruiker=gebruiker , apparatuur=apparatuur)
28
29 # Create all accesspoints and for caching validation purposes store them
30 # locally as well
31 ap_cache = {}
32 ap_ignore = []
33 print "#INFO: Going to import %s accesspoints" % len(wnetworks)
34 for wnetwork in wnetworks:
35 bssid = wnetwork.find('BSSID').text
36 # Only store access points
37 if wnetwork.attrib['type'] != "infrastructure":
38 ap_ignore.append(bssid)
39 continue
40
41 enc = (wnetwork.find('SSID/encryption') != None)
42 ssid_node = wnetwork.find('SSID/essid[@cloaked="false"]')
43 ssid = ssid_node.text if ssid_node != None else 'hidden'
44
45 ap, created = Accespoint.objects.get_or_create(mac=bssid, ssid=ssid, encryptie=enc)
46 ap_cache[bssid] = ap
47
48 count = 0
49 #XXX: This is not effient at all, try to wrap it into a a bulk insert would
50 # be much more effient as for example: http://djangosnippets.org/snippets/2362/
51 print "#INFO: Going to import %s points" % len(points)
52 for point in points:
53 # XXX: Filter this in the beginning with XPath, but etree does not support that (yet).
54 if point.attrib['bssid'] in ['GP:SD:TR:AC:KL:OG','00:00:00:00:00:00']:
55 continue
56 if point.attrib['bssid'] in ap_ignore:
57 continue
58 ap = ap_cache[point.attrib['bssid']]
59
60 # XXX: Signal need properly be a relation of signal_dbm and noice_dbm
61 signaal = 100 + int(point.attrib['signal_dbm'])
62
63 meting,created = Meting.objects.get_or_create(meetrondje=mr, accespoint=ap,
64 latitude=point.attrib['lat'], longitude=point.attrib['lon'],
65 signaal=signaal)
66 # Give some feedback to the user
67 if created:
68 count += 1
69 if (count % 1000) == 0:
70 print count,
71 elif (count % 100) == 0:
72 print ".",
73
74class Command(BaseCommand):
75 args = '<gpsxml> <netxml>'
76 option_list = BaseCommand.option_list + (
77 make_option('-m', '--meetrondje', dest='meetrondje', default='rondje',help='Naam van het meetrondje'),
78 make_option('-g', '--gebruiker', dest='gebruiker', default='username',help='Naam van de persoon die de meting uitgevoerd heeft'),
79 make_option('-e', '--email', dest='email', default='foo@bar.org',help='Email van de persoon die de meting uitgevoerd heeft'),
80 )
81
82 # TODO: Condider netxml file to be the gpsxml file with diffent suffix.
83 def handle(self, *args, **options):
84 try:
85 (gpsxml_file, netxml_file) = args
86 except ValueError:
87 self.print_help(sys.argv[0],sys.argv[1])
88 raise CommandError("Not all arguments are provided")
89 if not os.path.isfile(gpsxml_file):
90 raise CommandError("gpsxml file '%s' does not exists" % gpsxml_file)
91 if not os.path.isfile(netxml_file):
92 raise CommandError("netxml file '%s' does not exists" % netxml_file)
93
94 import_file(gpsxml_file, netxml_file ,options['meetrondje'],options['gebruiker'],options['email'])
Note: See TracBrowser for help on using the repository browser.