#!/usr/bin/awk -f { PRINT_CLIENTS = 1; PRINT_DATES = 0; } function getTag(tagname, line) { match(line, sprintf("<%s[^>]*>", tagname)) aStart = RSTART + RLENGTH match(line, sprintf("", tagname)) aEnd = RSTART-aStart return substr(line, aStart, aEnd) } function getAttr(attrname, line) { patt = sprintf("%s=\"[^\"]*\"", attrname) match(line, patt) line = substr(line, RSTART, RLENGTH) return substr(line, length(attrname)+3, length(line)-length(attrname)-3) } function xmlDateToISODate(date) { months["Jan"] = 1; months["Feb"] = 2; months["Mar"] = 3; months["Apr"] = 4; months["May"] = 5; months["Jun"] = 6; months["Jul"] = 7; months["Aug"] = 8; months["Sep"] = 9; months["Oct"] = 10; months["Nov"] = 11; months["Dec"] = 12; month = months[substr(date, 5, 3)]; return sprintf("%d-%.2d-%.2d %s", substr(date, 21, 4), month, substr(date, 9, 2), substr(date, 12, 8)) } // { aStartTime = xmlDateToISODate(getAttr("start-time", $0)) aEndTime = xmlDateToISODate(getAttr("end-time", $0)) print sprintf("Detection %s - %s", aStartTime, aEndTime) if (PRINT_DATES == 1) print " # SSID / IP MAC / BSSID Ch. Rate Encryption Seen Type" else print " # SSID / IP MAC / BSSID Ch. Rate Encryption Type" } # Begin of network // { # Clear network vars nSSID = ""; nChannel = 0; nMAC = "AA:BB:CC:DD:EE:FF"; nEncryption = ""; nMaxRate = ""; nIPRange = ""; nNumber = getAttr("number", $0) nType = getAttr("type", $0) nFirstSeen = xmlDateToISODate(getAttr("first-time", $0)) nLastSeen = xmlDateToISODate(getAttr("last-time", $0)) for (i in nClients) delete nClients[i] } // { nSSID = getTag("SSID", $0) } // { nMAC = getTag("BSSID", $0) } // { nChannel = getTag("channel", $0) } // { nMaxRate = sprintf("%sM", getTag("maxrate", $0)) } // { nIPRange = getTag("ip-range", $0) } // { aEncryption = getTag("encryption", $0) if (nEncryption == "") nEncryption = aEncryption else nEncryption = sprintf("%s/%s", nEncryption, aEncryption) } # End of network /<\/wireless-network>/ { if (PRINT_DATES == 1) print sprintf(" %.2d %-30s [%-17s] %-2d %-6s %-25s %s - %s %s", nNumber, nSSID, nMAC, nChannel, nMaxRate, nEncryption, nFirstSeen, nLastSeen, nType) else print sprintf(" %.2d %-30s [%-17s] %-2d %-6s %-25s %s", nNumber, nSSID, nMAC, nChannel, nMaxRate, nEncryption, nType) if (PRINT_CLIENTS == 1) { x = 1 for (i in nClients) { print nClients[x] x++ } } } # Begin of client // { # Clear client vars cNumber = getAttr("number", $0) cType = getAttr("type", $0) cFirstSeen = xmlDateToISODate(getAttr("first-time", $0)) cLastSeen = xmlDateToISODate(getAttr("last-time", $0)) cMAC = "AA:BB:CC:DD:EE:FF" cMaxRate = "" cIP = "None" cEncryption = "" } // { cMAC = getTag("client-mac", $0) } // { cMaxRate = sprintf("%sM", getTag("client-maxrate", $0)) } // { cIP = getTag("client-ip-address", $0) } // { aEncryption = getTag("client-encryption", $0) if (cEncryption == "") cEncryption = aEncryption else cEncryption = sprintf("%s/%s", cEncryption, aEncryption) } # End of client /<\/wireless-client>/ { if (PRINT_DATES == 1) cClient = sprintf(" %.3d %-30s %-17s %-6s %-25s %s - %s %s", cNumber, cIP, cMAC, cMaxRate, cEncryption, cFirstSeen, cLastSeen, cType) else cClient = sprintf(" %.3d %-30s %-17s %-6s %-25s %s", cNumber, cIP, cMAC, cMaxRate, cEncryption, cType) nClients[cNumber] = cClient } END { #print "Parse end." }