Changeset 9623
- Timestamp:
- Aug 30, 2011, 6:13:57 PM (13 years ago)
- Location:
- src/django_gheat
- Files:
-
- 1 deleted
- 3 edited
- 1 copied
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
src/django_gheat/gheat/management/commands/droidstumbler.py
r9598 r9623 2 2 # -*- coding: utf-8 -*- 3 3 # 4 # Script for importing DroidStumbler .csv files, which takes the best value of5 # each measurement point.6 #7 # Original by Dennis Wagenaar <d.wagenaar@gmail.com>8 #9 4 # Rick van der Zwet <info@rickvanderzwet.nl> 10 5 # 11 from django.core.management import setup_environ12 from django.core.management.base import BaseCommand, CommandError13 from django.db import connection, transaction14 from django.db.utils import IntegrityError15 from _mysql_exceptions import OperationalError16 from optparse import OptionParser, make_option17 from gheat.models import *18 6 import csv 19 import datetime20 import gzip21 7 import logging 22 import os 23 import sys 8 9 from collections import defaultdict 24 10 25 11 logger = logging.getLogger(__name__) 26 12 logger.setLevel(logging.DEBUG) 27 13 28 def bulk_sql(sql_table, sql_values): 29 if len(sql_values) == 0: 30 raise ValueError, "No data to import" 31 32 cursor = connection.cursor() 33 try: 34 # Make sure the special NULL is preserved 35 sql = "INSERT INTO %s VALUES %s" % (sql_table, ','.join(sql_values).replace("'NULL'",'NULL')) 36 count = cursor.execute(sql) 37 transaction.commit_unless_managed() 38 except OperationalError, e: 39 logger.error("%s - %s ", sql_table, sql_values[0]) 40 raise 41 except IntegrityError, e: 42 logger.error("Unable to import - %s" % e) 43 raise 44 return count 45 46 organizations = dict(Organization.objects.all().values_list('name','id')) 47 def get_organization_id_by_ssid(ssid): 48 name = Organization.get_name_by_ssid(ssid) 49 if not name: 50 return 'NULL' 51 else: 52 return int(organizations[name]) 53 54 def import_droidstumbler(filename, meetrondje): 14 def process_csv(fh, counters): 55 15 """ Import all points, return tuple with summary""" 56 16 57 # Open file for reading 58 if filename.endswith('.gz'): 59 fh = gzip.open(filename,'rb') 60 else: 61 fh = open(filename,'rb') 17 # Temponary holders 18 meting_pool = defaultdict(list) 19 ap_pool = {} 20 62 21 csvfile = csv.reader(fh, delimiter=',') 63 64 #Various statistics65 counters = {'meting_added' : 0, 'meting_total' : 0, 'ap_added' : 0, 'ap_total' : 0}66 67 # Temponary holders68 meting_pool = {}69 ap_pool = {}70 22 # Process file, preparing new access points and measurements 71 23 for row in csvfile: … … 87 39 key = (bssid, lat, lon) 88 40 signaal=(100 + int(level)) 89 if meting_pool.has_key(key): 90 meting_pool[key] = max(meting_pool[key], signaal) 91 else: 92 meting_pool[key] = signaal 41 meting_pool[key].append(signaal) 93 42 94 95 # Determine which entries we need to add 96 counters['ap_total'] = len(ap_pool) 97 bssid_list_present = Accespoint.objects.filter(mac__in=ap_pool.keys()).values_list('mac', flat=True) 98 bssid_list_insert = set(ap_pool.keys()) - set(bssid_list_present) 99 100 # Create a bulk import list and import 101 if bssid_list_insert: 102 sql_values = [] 103 for bssid in bssid_list_insert: 104 ssid, encryption = ap_pool[bssid] 105 # Special trick in SSID ts avoid escaping in later stage 106 item = str((bssid.upper(),ssid.replace('%','%%'),encryption,get_organization_id_by_ssid(ssid))) 107 sql_values.append(item) 108 counters['ap_added'] = bulk_sql('gheat_accespoint (`mac`, `ssid`, `encryptie`, `organization_id`)',sql_values) 109 110 # Build mapping for meting import 111 mac2id = {} 112 for mac,id in Accespoint.objects.filter(mac__in=ap_pool.keys()).values_list('mac','id'): 113 mac2id[mac] = int(id) 114 115 sql_values = [] 116 for (bssid,lat,lon),signal in meting_pool.iteritems(): 117 item = str((int(meetrondje.id),mac2id[bssid],float(lat),float(lon),int(signaal))) 118 sql_values.append(item) 119 120 # Bulk Import data if possible 121 if sql_values: 122 counters['meting_added'] = bulk_sql('gheat_meting (`meetrondje_id`, `accespoint_id`, `lat`, `lng`, `signaal`)',sql_values) 123 return counters 124 125 126 class Command(BaseCommand): 127 args = '<csvfile>[.gz] [csvfile2[.gz] [csvfile3[.gz] ...] ' 128 option_list = BaseCommand.option_list + ( 129 make_option('-m', '--meetrondje', dest='meetrondje', default=None), 130 make_option('-g', '--gebruiker', dest='gebruiker', default=os.environ['USER']), 131 make_option('-e', '--email', dest='email', default=os.environ['USER'] + '@example.org'), 132 make_option('-k', '--kaart', dest='kaart', default='onbekend', help="Kaart gebruikt"), 133 make_option('-d', '--datum', dest='datum', default=None, help="Provide date \ 134 in following format: %Y-%m-%d-%H%M%S, by default it will be generated from \ 135 the filename"), 136 ) 137 138 def handle(self, *args, **options): 139 if len(args) == 0: 140 self.print_help(sys.argv[0],sys.argv[1]) 141 raise CommandError("Not all arguments are provided") 142 143 for csv_file in args: 144 # Make sure to check files before we going to do importing at all 145 if not os.path.isfile(csv_file): 146 raise CommandError("csv file '%s' does not exists" % csv_file) 147 logger.info("Processing '%s'" % csv_file) 148 149 # Meetrondje from filename if needed 150 if options['meetrondje'] == None: 151 meetrondje = os.path.basename(csv_file).rstrip('.gz').rstrip('.csv') 152 else: 153 meetrondje = options['meetrondje'] 154 # Date from filename if needed 155 if options['datum'] == None: 156 datum = os.path.basename(csv_file).lstrip('ScanResult-').rstrip('.csv.gz') 157 else: 158 datum = options['datum'] 159 try: 160 datum = datetime.datetime.strptime(datum,'%Y-%m-%d-%H%M%S') 161 except ValueError: 162 raise CommandError("Invalid date '%s'" % options['datum']) 163 164 # Create meetrondje object 165 g, created = Gebruiker.objects.get_or_create(naam=options['gebruiker'] , email=options['email']) 166 a, created = Apparatuur.objects.get_or_create(kaart=options['kaart']) 167 mr, created = MeetRondje.objects.get_or_create(datum=datum , naam=meetrondje , gebruiker=g , apparatuur=a) 168 logger.info('Meetrondje: %s @ %s' % (meetrondje, datum)) 169 if not created: 170 logger.error("Meetrondje '%s' already imported" % mr) 171 sys.exit(1) 172 counters = import_droidstumbler(csv_file,mr) 173 logger.info("summary accespoints: added:%(ap_added)-6s processed:%(ap_total)-6s" % counters) 174 logger.info("summary metingen : added:%(meting_added)-6s processed:%(meting_total)-6s" % counters) 43 return (counters, ap_pool, None, meting_pool) -
src/django_gheat/gheat/management/commands/import_datafile.py
r9619 r9623 2 2 # -*- coding: utf-8 -*- 3 3 # 4 # Script for importing .ns1 files (Netstumber output) 4 # Script for importing various stumble files in a modular fasion: 5 # - .ns1 (Netstumber) 6 # - .gpsxml .netxml (Kismet) 7 # - DroidStumbler-*.csv (DroidStumber) 5 8 # 6 9 # Rick van der Zwet <info@rickvanderzwet.nl> … … 19 22 from collections import defaultdict 20 23 21 from netstumbler import parse_netstumbler 24 import netstumbler 25 import kismet 26 import droidstumbler 22 27 from import_droidstumbler import bulk_sql,get_organization_id_by_ssid 23 28 … … 32 37 return open(file,'rb') 33 38 39 # Prefix/Suffix removal 40 valid_prefix = ['DroidStumbler-', 'Kismet-'] 41 def strip_prefix(filename): 42 for suffix in valid_suffixes: 43 filename = filename.rstrip(suffix) 44 return filename 45 valid_suffixes = ['.gz', '.gpsxml', '.netxml', '.csv', '.ns1'] 46 def strip_suffix(filename): 47 for suffix in valid_suffixes: 48 filename = filename.rstrip(suffix) 49 return filename 50 def strip_file(filename): 51 return strip_suffix(strip_prefix(filename)) 34 52 35 53 … … 93 111 94 112 95 96 def process_netstumber(filename): 97 data = parse_netstumbler(open_file(filename)) 98 99 counters = { 100 'ap_added' : 0, 'ap_total' : 0, 101 'ap_failed' : 0, 'ap_ignored' : 0, 102 'client_added' : 0, 'client_total' : 0, 103 'client_failed' : 0, 'client_ignored' : 0, 104 'meting_added' : 0, 'meting_total' : 0, 105 'meting_failed' : 0, 'meting_ignored' : 0 106 } 107 108 # Temponary holders 109 meting_pool = defaultdict(list) 110 ap_pool = {} 111 112 for ap in data['aps']: 113 # XXX: How is encryption coded? 114 encryption = False 115 ap_pool[ap['BSSID']]= (ap['SSID'], encryption) 116 for point in ap["measurements"]: 117 counters['meting_total'] += 1 118 if point['LocationSource'] == 0: 119 logger.debug("No GPS Coordinates found for BSSID %s @ %s", 120 ap['BSSID'], point['Time']) 121 counters['meting_ignored'] += 1 122 continue 123 # We store all values found, avg or max will be done later on 124 key = (ap['BSSID'], point["Latitude"], point["Longitude"]) 125 126 # Known measurement error 127 if point['Signal'] == -32767: continue 128 129 # XXX: Signal need properly be a relation of signal_dbm and noice_dbm 130 signaal= 100 + point['Signal'] 131 if signaal > 100 or signaal < 0: 132 logger.warning("Signal %s is not valid entry for BSSID %s @ %s", 133 point['Signal'], ap['BSSID'], point['Time']) 134 continue 135 meting_pool[key].append(signaal) 136 137 return (counters, ap_pool, meting_pool) 113 def import_clients(client_pool, counters): 114 # Determine which Wireless Clients to add 115 bssid_list_present = WirelessClient.objects.filter(mac__in=client_pool.keys()).values_list('mac', flat=True) 116 bssid_list_insert = set(client_pool.keys()) - set(bssid_list_present) 117 118 # Create a bulk import list and import 119 if bssid_list_insert: 120 sql_values = [] 121 for bssid in bssid_list_insert: 122 sql_values.append("('%s')" % bssid.upper()) 123 counters['client_added'] = bulk_sql('gheat_wirelessclient (`mac`)',sql_values) 124 125 return counters 126 138 127 139 128 … … 162 151 raise CommandError("Not all arguments are provided") 163 152 164 # Please first the netxml and then the gpsxml files 165 sorted_args = [x for x in args if "ns1" in x] 153 # Please first the netxml and the gpsxml files and the rest 154 sorted_args = [x for x in args if "netxml" in x] +\ 155 [x for x in args if "gpsxml" in x] +\ 156 [x for x in args if "ns1" in x] 166 157 remainder = list(set(args) - set(sorted_args)) 167 158 args = sorted_args + remainder 168 159 logger.debug("Parsing files in the following order: %s", args) 169 160 161 # Make sure the all exists at first 170 162 for filename in args: 171 163 if not os.path.isfile(filename): 172 164 raise CommandError("file '%s' does not exists" % filename) 173 165 174 def process_date(datestr): 175 try: 176 # Kismet-20110805-15-37-30-1 177 return datetime.datetime.strptime(datestr,'%Y%m%d-%H-%M-%S-1') 178 except ValueError: 179 raise CommandError("Invalid date '%s'" % options['datum']) 180 166 167 def get_date(filename): 168 def process_date(datestr): 169 try: 170 # Kismet-20110805-15-37-30-1 171 return datetime.datetime.strptime(datestr,'%Y%m%d-%H-%M-%S-1') 172 except ValueError: 173 raise CommandError("Invalid date '%s'" % options['datum']) 174 if options['datum'] == None: 175 datestr = strip_file(os.path.basename(filename)) 176 datum = process_date(datestr) 177 elif options['datum'] == 'now': 178 datum = datetime.datetime.now() 179 else: 180 datum = process_date(options['datum']) 181 return datum 182 183 def get_meetrondje(meetrondje): 184 # Meetrondje from filename if needed 185 if options['meetrondje'] == None: 186 meetrondje = strip_suffix(os.path.basename(filename)) 187 else: 188 meetrondje = options['meetrondje'] 189 return meetrondje 190 191 # Get Gheat Objects, pre-req 192 g, created = Gebruiker.objects.get_or_create(naam=options['gebruiker'], 193 email=options['email']) 194 a, created = Apparatuur.objects.get_or_create(kaart=options['kaart']) 195 196 # Check if all files are valid 181 197 for filename in args: 182 198 logger.info("Processing '%s'" % filename) 199 mr, created = MeetRondje.objects.get_or_create( 200 datum=get_date(filename), naam=get_meetrondje(filename), 201 gebruiker=g, apparatuur=a) 202 if not created: 203 logger.error("Meetrondje '%s' already imported", mr) 204 continue 205 206 counters = { 207 'ap_added' : 0, 'ap_total' : 0, 208 'ap_failed' : 0, 'ap_ignored' : 0, 209 'client_added' : 0, 'client_total' : 0, 210 'client_failed' : 0, 'client_ignored' : 0, 211 'meting_added' : 0, 'meting_total' : 0, 212 'meting_failed' : 0, 'meting_ignored' : 0 213 } 214 logger.info('Meetrondje: %s', mr) 215 fh = open_file(filename) 183 216 if 'ns1' in filename: 184 if options['datum'] == None: 185 datestr = os.path.basename(filename).lstrip('Kismet-').\ 186 rstrip('.gz').rstrip('.gpsxml').rstrip('.netxml').rstrip('.ns1') 187 datum = process_date(datestr) 188 elif options['datum'] == 'now': 189 datum = datetime.datetime.now() 190 else: 191 datum = process_date(options['datum']) 192 193 # Meetrondje from filename if needed 194 if options['meetrondje'] == None: 195 meetrondje = os.path.basename(filename).rstrip('.gz').rstrip('.ns1') 196 else: 197 meetrondje = options['meetrondje'] 198 199 # Create meetrondje object 200 g, created = Gebruiker.objects.get_or_create(naam=options['gebruiker'], 201 email=options['email']) 202 a, created = Apparatuur.objects.get_or_create(kaart=options['kaart']) 203 mr, created = MeetRondje.objects.get_or_create(datum=datum, 204 naam=meetrondje, gebruiker=g, apparatuur=a) 205 logger.info('Meetrondje: %s @ %s' % (meetrondje, datum)) 206 if not created: 207 logger.error("Meetrondje '%s' already imported" % mr) 208 continue 209 (counters, ap_pool, meting_pool) = process_netstumber(filename) 210 counters = import_accespoints(ap_pool, counters) 211 counters = import_metingen(mr, meting_pool, counters) 212 213 logger.info(("summary metingen : total:%(meting_total)-6s" + 214 "added:%(meting_added)-6s failed:%(meting_failed)-6s" + 215 "ignored:%(meting_ignored)-6s") % counters) 217 (counters, ap_pool, client_pool, meting_pool) = netstumbler.process_ns1(fh, counters) 218 elif 'gpsxml' in filename: 219 (counters, ap_pool, client_pool, meting_pool) = kismet.process_gpsxml(fh, counters) 220 elif 'netxml' in filename: 221 (counters, ap_pool, client_pool, meting_pool) = kismet.process_netxml(fh, counters) 222 elif 'ScanResult' in filename: 223 (counters, ap_pool, client_pool, meting_pool) = droidstumbler.process_csv(fh, counters) 216 224 else: 217 225 raise CommandError("file '%s' format not recognized" % filename) 226 227 if ap_pool: 228 counters = import_accespoints(ap_pool, counters) 229 if client_pool: 230 counters = import_clients(client_pool, counters) 231 if meting_pool: 232 counters = import_metingen(mr, meting_pool, counters) 233 234 logger.info("summary accespoints: total:%(ap_total)-6s added:%(ap_added)-6s failed:%(ap_failed)-6s ignored:%(ap_ignored)-6s" % counters) 235 logger.info("summary client : total:%(client_total)-6s added:%(client_added)-6s failed:%(client_failed)-6s ignored:%(client_ignored)-6s" % counters) 236 logger.info("summary metingen : total:%(meting_total)-6s added:%(meting_added)-6s failed:%(meting_failed)-6s ignored:%(meting_ignored)-6s" % counters) -
src/django_gheat/gheat/management/commands/import_netstumbler.py
r9619 r9623 94 94 95 95 96 def process_n etstumber(filename):96 def process_ns1(filename): 97 97 data = parse_netstumbler(open_file(filename)) 98 98 -
src/django_gheat/gheat/management/commands/kismet.py
r9592 r9623 2 2 # -*- coding: utf-8 -*- 3 3 # 4 # Script for importing .gpsxml and .netxml files (Kismet output)5 #6 4 # Rick van der Zwet <info@rickvanderzwet.nl> 7 5 # 8 from django.core.management.base import BaseCommand,CommandError9 from django.db.utils import IntegrityError10 from optparse import OptionParser, make_option11 from gheat.models import *12 6 from lxml import etree 13 import datetime14 import gzip15 import os16 import sys17 7 import logging 18 8 19 9 from collections import defaultdict 20 10 21 from import_droidstumbler import bulk_sql,get_organization_id_by_ssid22 23 11 logger = logging.getLogger(__name__) 24 12 logger.setLevel(logging.INFO) 25 13 26 # Open files for reading 27 def open_file(file): 28 if file.endswith('.gz'): 29 return gzip.open(file,'rb') 30 else: 31 return open(file,'rb') 32 33 34 35 def import_kismet_netxml(netxml_file): 36 netxml_doc = etree.parse(open_file(netxml_file)) 37 38 counters = { 'ap_added' : 0, 'ap_total' : 0, 'ap_failed' : 0, 'ap_ignored' : 0, 39 'client_added' : 0, 'client_total' : 0, 'client_failed' : 0, 'client_ignored' : 0} 14 def process_netxml(fh,counters): 15 netxml_doc = etree.parse(fh) 40 16 41 17 # Prepare new accespoints and measurements … … 65 41 logger.error('Unknown type %s - %s',bssid, wnetwork.attrib['type']) 66 42 67 68 # Determine which Accespoints to add 69 bssid_list_present = Accespoint.objects.filter(mac__in=ap_pool.keys()).values_list('mac', flat=True) 70 bssid_list_insert = set(ap_pool.keys()) - set(bssid_list_present) 71 72 # Create a bulk import list and import 73 if bssid_list_insert: 74 sql_values = [] 75 for bssid in bssid_list_insert: 76 ssid, encryption = ap_pool[bssid] 77 # Special trick in SSID ts avoid escaping in later stage 78 item = str((bssid.upper(),ssid.replace('%','%%'),encryption,get_organization_id_by_ssid(ssid))) 79 sql_values.append(item) 80 counters['ap_added'] = bulk_sql('gheat_accespoint (`mac`, `ssid`, `encryptie`, `organization_id`)',sql_values) 81 82 # Determine which Wireless Clients to add 83 bssid_list_present = WirelessClient.objects.filter(mac__in=client_pool.keys()).values_list('mac', flat=True) 84 bssid_list_insert = set(client_pool.keys()) - set(bssid_list_present) 85 86 # Create a bulk import list and import 87 if bssid_list_insert: 88 sql_values = [] 89 for bssid in bssid_list_insert: 90 sql_values.append("('%s')" % bssid.upper()) 91 counters['client_added'] = bulk_sql('gheat_wirelessclient (`mac`)',sql_values) 92 93 return counters 43 return (counters, ap_pool, None, None) 94 44 95 45 96 46 97 def import_kismet_gpsxml(gpsxml_file, meetrondje): 98 gpsxml_doc = etree.parse(open_file(gpsxml_file)) 99 100 #Various statistics 101 counters = {'meting_added' : 0, 'meting_total' : 0, 'meting_failed' : 0, 'meting_ignored' :0} 47 def process_gpsxml(fh,counters): 48 gpsxml_doc = etree.parse(fh) 102 49 103 50 bssid_failed = defaultdict(int) … … 130 77 signaal=100 + int(level) 131 78 meting_pool[key].append(signaal) 132 133 bssid_list = [x[0] for x in meting_pool.keys()] 134 # Build mapping for meting import 135 mac2id = {} 136 for mac,id in Accespoint.objects.filter(mac__in=bssid_list).values_list('mac','id'): 137 mac2id[mac] = int(id) 138 139 clients = {} 140 for mac in WirelessClient.objects.filter(mac__in=bssid_list).values_list('mac',flat=True): 141 clients[mac] = True 142 143 sql_values = [] 144 for (bssid,lat,lon),signals in meting_pool.iteritems(): 145 if clients.has_key(bssid): 146 counters['meting_ignored'] += len(signals) 147 elif not mac2id.has_key(bssid): 148 counters['meting_failed'] += len(signals) 149 bssid_failed[bssid] += len(signals) 150 else: 151 item = str((int(meetrondje.id),mac2id[bssid],float(lat),float(lon),max(signals))) 152 sql_values.append(item) 153 154 for bssid,count in sorted(bssid_failed.items(), 155 key=lambda item: item[1], reverse=True): 156 logger.debug("Missing BSSID %s found %3s times", bssid, count) 157 158 if sql_values: 159 counters['meting_added'] = bulk_sql('gheat_meting (`meetrondje_id`, `accespoint_id`, `lat`, `lng`, `signaal`)',sql_values) 160 return counters 161 162 163 class Command(BaseCommand): 164 args = '<gpsxml|netxml>[.gz] [gpsxml2[.gz] gpsxml3[.gz] ...]' 165 option_list = BaseCommand.option_list + ( 166 make_option('-k', '--kaart', dest='kaart', default='onbekend', help="Kaart gebruikt"), 167 make_option('-m', '--meetrondje', dest='meetrondje', default=None), 168 make_option('-g', '--gebruiker', dest='gebruiker', default='username',help='Naam van de persoon die de meting uitgevoerd heeft'), 169 make_option('-e', '--email', dest='email', default='foo@bar.org',help='Email van de persoon die de meting uitgevoerd heeft'), 170 make_option('-d', '--datum', dest='datum', default=None, help="Provide date \ 171 in following format: '%Y%m%d-%H-%M-%S-1', by default it will be generated from \ 172 the filename"), 173 ) 174 175 def handle(self, *args, **options): 176 if len(args) == 0: 177 self.print_help(sys.argv[0],sys.argv[1]) 178 raise CommandError("Not all arguments are provided") 179 180 # Please first the netxml and then the gpsxml files 181 sorted_args = [x for x in args if "netxml" in x] + [x for x in args if "gpsxml" in x] 182 remainder = list(set(args) - set(sorted_args)) 183 args = sorted_args + remainder 184 logger.debug("Parsing files in the following order: %s", args) 185 186 for xml_file in args: 187 if not os.path.isfile(xml_file): 188 raise CommandError("xml file '%s' does not exists" % xml_file) 189 190 for xml_file in args: 191 logger.info("Processing '%s'" % xml_file) 192 if 'netxml' in xml_file: 193 counters = import_kismet_netxml(xml_file) 194 logger.info("summary accespoints: total:%(ap_total)-6s added:%(ap_added)-6s failed:%(ap_failed)-6s ignored:%(ap_ignored)-6s" % counters) 195 logger.info("summary client : total:%(client_total)-6s added:%(client_added)-6s failed:%(client_failed)-6s ignored:%(client_ignored)-6s" % counters) 196 elif 'gpsxml' in xml_file: 197 if options['datum'] == None: 198 datum = os.path.basename(xml_file).lstrip('Kismet-').rstrip('.gz').rstrip('.gpsxml').rstrip('.netxml') 199 else: 200 datum = options['datum'] 201 try: 202 # Kismet-20110805-15-37-30-1 203 datum = datetime.datetime.strptime(datum,'%Y%m%d-%H-%M-%S-1') 204 except ValueError: 205 raise CommandError("Invalid date '%s'" % options['datum']) 206 207 # Meetrondje from filename if needed 208 if options['meetrondje'] == None: 209 meetrondje = os.path.basename(xml_file).rstrip('.gz').rstrip('.gpsxml') 210 else: 211 meetrondje = options['meetrondje'] 212 213 # Create meetrondje object 214 g, created = Gebruiker.objects.get_or_create(naam=options['gebruiker'] , email=options['email']) 215 a, created = Apparatuur.objects.get_or_create(kaart=options['kaart']) 216 mr, created = MeetRondje.objects.get_or_create(datum=datum , naam=meetrondje , gebruiker=g , apparatuur=a) 217 logger.info('Meetrondje: %s @ %s' % (meetrondje, datum)) 218 if not created: 219 logger.error("Meetrondje '%s' already imported" % mr) 220 continue 221 counters = import_kismet_gpsxml(xml_file, mr) 222 logger.info("summary metingen : total:%(meting_total)-6s added:%(meting_added)-6s failed:%(meting_failed)-6s ignored:%(meting_ignored)-6s" % counters) 223 else: 224 raise CommandError("xml file '%s' format not recognized" % xml_file) 79 return (counters, None, None, meting_pool) -
src/django_gheat/gheat/management/commands/netstumbler.py
r9618 r9623 8 8 from struct import unpack 9 9 10 def parse_netstumbler(fh): 10 from collections import defaultdict 11 import logging 12 13 logger = logging.getLogger(__name__) 14 logger.setLevel(logging.INFO) 15 16 def parse_ns1(fh): 11 17 def get_int32(size=1): 12 18 v = unpack('<' + 'i'*size,fh.read(4*size)) … … 103 109 return data 104 110 111 def process_ns1(fh, counters): 112 data = parse_ns1(fh) 113 114 115 # Temponary holders 116 meting_pool = defaultdict(list) 117 ap_pool = {} 118 119 for ap in data['aps']: 120 # XXX: How is encryption coded? 121 encryption = False 122 ap_pool[ap['BSSID']]= (ap['SSID'], encryption) 123 for point in ap["measurements"]: 124 counters['meting_total'] += 1 125 if point['LocationSource'] == 0: 126 logger.debug("No GPS Coordinates found for BSSID %s @ %s", 127 ap['BSSID'], point['Time']) 128 counters['meting_ignored'] += 1 129 continue 130 # We store all values found, avg or max will be done later on 131 key = (ap['BSSID'], point["Latitude"], point["Longitude"]) 132 133 # Known measurement error 134 if point['Signal'] == -32767: continue 135 136 # XXX: Signal need properly be a relation of signal_dbm and noice_dbm 137 signaal= 100 + point['Signal'] 138 if signaal > 100 or signaal < 0: 139 logger.warning("Signal %s is not valid entry for BSSID %s @ %s", 140 point['Signal'], ap['BSSID'], point['Time']) 141 continue 142 meting_pool[key].append(signaal) 143 144 return (counters, ap_pool, None, meting_pool) 105 145 if __name__ == '__main__': 106 146 import sys 107 147 import pprint 108 148 pp = pprint.PrettyPrinter(indent=2) 109 pp.pprint(parse_n etstumbler(open(sys.argv[1],'r')))149 pp.pprint(parse_ns1(open(sys.argv[1],'r'))) -
src/django_gheat/import_scan_data.sh
r9569 r9623 22 22 #Kismet netxml Imports 23 23 FILES="`find $DATAROOT -name '*netxml*' | sort`" 24 [ -n "$FILES" ] && $MANAGE import_ kismet$ARGS $FILES24 [ -n "$FILES" ] && $MANAGE import_common $ARGS $FILES 25 25 26 26 # Import all measure data … … 34 34 #Kismet gpsxml Imports 35 35 FILES="`find $DEVICEDIR -name '*gpsxml*'`" 36 [ -n "$FILES" ] && $MANAGE import_ kismet$ARGS $FILES36 [ -n "$FILES" ] && $MANAGE import_datafile $ARGS $FILES 37 37 38 38 # DroidStumber imports 39 39 FILES=`find $DEVICEDIR -name 'ScanResult-*'` 40 [ -n "$FILES" ] && $MANAGE import_droidstumbler $ARGS $FILES 40 [ -n "$FILES" ] && $MANAGE import_datafile $ARGS $FILES 41 42 # Kismet imports 43 FILES=`find $DEVICEDIR -name '*.ns1'` 44 [ -n "$FILES" ] && $MANAGE import_datafile $ARGS $FILES 41 45 done 42 46 done
Note:
See TracChangeset
for help on using the changeset viewer.