// License: BSD/LGPL
// Copyright (C) 2011 Thomas d'Otreppe
using System;
namespace WirelessPanda.Readers
{
public class KismetCsvReader : Reader
{
///
/// Date format (Same format for Kismet CSV and NetXML)
///
protected override string DATE_FORMAT
{
get
{
return "ddd MMM dd HH:mm:ss yyyy";
}
}
///
/// Date format (Same format for Kismet CSV and NetXML)
///
protected override string ALT_DATE_FORMAT
{
get
{
return "ddd MMM d HH:mm:ss yyyy";
}
}
///
/// Reader type
///
public override string ReaderType
{
get
{
return "Kismet CSV";
}
}
///
/// Constructor
///
/// Filename (doesn't need to exist now but MUST when using Read() )
public KismetCsvReader(string filename) : base(filename) { }
///
/// Read/Update the content of the file
///
/// true if successful
/// Airodump-ng CSV format unknown
public override bool Read()
{
// Reset parsing status
this.ParseSuccess = false;
// Get the content of the file
string[] content = this.getStrippedFileContent();
// Check if this is really a kismet CSV file
if (content.Length == 0)
{
throw new FormatException("Empty file");
}
this.ParseSuccess = (content[0] == "Network;NetType;ESSID;BSSID;Info;Channel;Cloaked;Encryption;Decrypted;MaxRate;MaxSeenRate;Beacon;LLC;Data;Crypt;Weak;Total;Carrier;Encoding;FirstTime;LastTime;BestQuality;BestSignal;BestNoise;GPSMinLat;GPSMinLon;GPSMinAlt;GPSMinSpd;GPSMaxLat;GPSMaxLon;GPSMaxAlt;GPSMaxSpd;GPSBestLat;GPSBestLon;GPSBestAlt;DataSize;IPType;IP;");
if (!this.ParseSuccess)
{
throw new FormatException("Not a Kismet CSV file");
}
// Parse content
for (int i = 1; i < content.Length && !string.IsNullOrEmpty(content[i]); i++)
{
string [] splitted = content[i].Split(';');
// Check if there are enough elements
if (splitted.Length < 39)
{
continue;
}
AccessPoint ap = new AccessPoint();
// Skip first element which is the network number (if someone cares about it, email me)
ap.NetworkType = splitted[1].Trim();
ap.ESSID = splitted[2].Trim();
ap.ESSIDLength = (byte)splitted[2].Length;
ap.BSSID = splitted[3].Trim();
ap.Info = splitted[4].Trim();
ap.Channel = int.Parse(splitted[5]);
ap.Cloaked = (splitted[6].Trim().ToLower() == "yes");
ap.Encryption = splitted[7].Trim();
ap.Decrypted = (splitted[8].Trim().ToLower() == "yes");
ap.MaxRate = double.Parse(splitted[9]);
ap.MaxSeenRate = double.Parse(splitted[10]);
ap.Beacon = ulong.Parse(splitted[11]);
ap.LLC = ulong.Parse(splitted[12]);
ap.DataFrames = ulong.Parse(splitted[13]);
ap.Crypt = ulong.Parse(splitted[14]);
ap.Weak = ulong.Parse(splitted[15]);
ap.Total = ulong.Parse(splitted[16]);
ap.Carrier = splitted[17].Trim();
ap.Encoding = splitted[18].Trim();
ap.FirstTimeSeen = this.parseDateTime(splitted[19]);
ap.LastTimeSeen = this.parseDateTime(splitted[20]);
ap.BestQuality = int.Parse(splitted[21]);
ap.BestSignal = int.Parse(splitted[22]);
ap.BestNoise = int.Parse(splitted[23]);
ap.MinLocation = new Coordinates(splitted[24], splitted[25], splitted[26], splitted[27]);
ap.MaxLocation = new Coordinates(splitted[28], splitted[29], splitted[30], splitted[31]);
ap.BestLocation = new Coordinates(splitted[32], splitted[33], splitted[34], "");
ap.DataSize = ulong.Parse(splitted[35]);
ap.IPType = int.Parse(splitted[36]);
ap.IP = splitted[37].Replace(" ", "");
this.addAccessPoint(ap);
}
// No need to link stations and access points together since there are only access points.
return true;
}
}
}