blob: c42822cf7175af5d75a0ff82863c923e109086e1 [file] [log] [blame]
//
// CollectBy.cpp
// TestTB
//
// Created by Terrin Eager on 3/17/13.
//
//
#include <iostream>
#include "bjtypes.h"
#include "DNSFrame.h"
#include "bjstring.h"
#include "LLRBTree.h"
#include "CollectBy.h"
//////////////////////
// Collection
void Collection::Init(BJ_COLLECTBY_TYPE collectByList[])
{
CollectByAbstract* pLastCollectBy = nullptr;
for (int i=0; i<20 && collectByList[i] != CBT_NOT_SET;i++)
{
m_CollectByList[i] = collectByList[i];
if (i==0)
{
m_pHeaderCollectBy = Factory(m_CollectByList[i]);
pLastCollectBy = m_pHeaderCollectBy;
m_pFirstCollectBy = pLastCollectBy->Factory();
}
else
{
pLastCollectBy->pNext = Factory(m_CollectByList[i]);
pLastCollectBy = pLastCollectBy->pNext;
}
}
}
void Collection::ProcessFrame(CDNSFrame* pFrame)
{
m_pFirstCollectBy->Collect(pFrame,m_pHeaderCollectBy->pNext);
}
void Collection::ExportCollection(BJString sFileName)
{
FILE* hFile = fopen(sFileName.GetBuffer(),"w");
if (hFile == NULL)
{
printf("file open failed %s\n",sFileName.GetBuffer());
return;
}
// Export Header Line
CollectByAbstract *collectBy = m_pHeaderCollectBy;
BJString sHeader;
while (collectBy)
{
if (sHeader.GetBufferLength() != 0)
sHeader += ",";
sHeader += collectBy->GetTitle();
collectBy = collectBy->pNext;
}
fprintf(hFile, "%s\n",sHeader.GetBuffer());
m_pFirstCollectBy->Export(hFile,"");
fclose(hFile);
}
CollectByAbstract* Collection::Factory(BJ_COLLECTBY_TYPE type)
{
switch (type)
{
case CBT_NOT_SET:
return NULL;
case CBT_SERVICE:
return new CollectByService();
case CBT_REQUEST_RESPONDS:
return new CollectByRequestResponds();
case CBT_SAME_DIFF_SUBNET:
return new CollectBySameSubnetDiffSubnet();
case CBT_IP_ADDRESS_TYPE:
return new CollectByIPAddressType();
case CBT_PACKET:
return new CollectByPacketCount();
default:
return NULL;
}
}
/////////////
// CollectByService
void CServiceNode::Export(FILE* hFile,BJString sPrevColumns)
{
if (pNext)
{
BJString sTemp = sPrevColumns;
if (sPrevColumns.GetBufferLength())
sTemp += ",";
sTemp += m_Key;
pNext->Export(hFile,sTemp);
}
if (m_rbLeft)
dynamic_cast<CServiceNode*>(m_rbLeft)->Export(hFile,sPrevColumns);
if (m_rbRight)
dynamic_cast<CServiceNode*>(m_rbRight)->Export(hFile,sPrevColumns);
}
void CollectByService::Collect(CDNSFrame* pFrame,CollectByAbstract* nextCollectBy)
{
for (int dnsItemsIndex =0; dnsItemsIndex < pFrame->GetQuestionCount()+pFrame->GetAnswerCount();dnsItemsIndex++)
{
BJString RecordName;
CDNSRecord* pDNSRecord = pFrame->GetDnsRecord(dnsItemsIndex);
if (pDNSRecord == NULL)
continue;
pDNSRecord->GetDnsRecordName(RecordName,0,99);
if (RecordName.Contains("_kerberos."))
{
RecordName = "_kerberos.";
}
else
pDNSRecord->GetDnsRecordName(RecordName, (pDNSRecord->m_RecType == 12)?0:1,99);
if (pDNSRecord->m_RecType == 12)
{
if (RecordName.Contains(".ip6.arpa."))
RecordName = "*.ip6.arpa.";
else if (RecordName.Contains(".arpa."))
RecordName = "*.arpa.";
}
if (pDNSRecord->m_RecType == 1)
RecordName = "A";
if (pDNSRecord->m_RecType == 28)
RecordName = "AAAA";
if (pDNSRecord->m_RecType == 255)
{
if (RecordName.Contains(".ip6.arpa."))
RecordName = "ANY *.ip6.arpa.";
else if (RecordName.Contains(".arpa."))
RecordName = "ANY *.arpa.";
else
RecordName = "Any";
}
if (RecordName.Contains("_sub."))
{
pDNSRecord->GetDnsRecordName(RecordName,2,99); /// skip first label and _sub. label
}
CServiceNode *pNode= m_Cache.FindwithAddRecord(&RecordName);
if ((pNode->pNext == NULL) && nextCollectBy)
pNode->pNext = nextCollectBy->Factory();
if (pNode->pNext)
pNode->pNext->Collect(pFrame,nextCollectBy?nextCollectBy->pNext:NULL);
}
}
void CollectByService::Export(FILE* hFile,BJString sPrevColumns)
{
// loop thur list
CServiceNode *pNode = m_Cache.GetRoot();
if (pNode)
pNode->Export(hFile,sPrevColumns);
}
/////////////
// CollectByRequestResponds
void CollectByRequestResponds::Collect(CDNSFrame* pFrame,CollectByAbstract* nextCollectBy)
{
if (pFrame->IsQueryFrame())
{
if (pRequestNext == NULL)
pRequestNext = nextCollectBy->Factory();
pRequestNext->Collect(pFrame, nextCollectBy?nextCollectBy->pNext:NULL);
}
else
{
if (pRespondsNext == NULL)
pRespondsNext = nextCollectBy->Factory();
pRespondsNext->Collect(pFrame, nextCollectBy?nextCollectBy->pNext:NULL);
}
}
void CollectByRequestResponds::Export(FILE* hFile,BJString sPrevColumns)
{
if (pRequestNext)
{
BJString sTemp = sPrevColumns;
if (sPrevColumns.GetBufferLength())
sTemp += ",";
sTemp += "Request";
pRequestNext->Export(hFile,sTemp);
}
if (pRespondsNext)
{
BJString sTemp = sPrevColumns;
if (sPrevColumns.GetBufferLength())
sTemp += ",";
sTemp += "Responds";
pRespondsNext->Export(hFile,sTemp);
}
}
/////////////
// CollectByIPAddressType
void CollectByIPAddressType::Collect(CDNSFrame* pFrame,CollectByAbstract* nextCollectBy)
{
if (pFrame->m_SourceIPAddress.IsIPv4())
{
if (pIPv4Next == NULL)
pIPv4Next = nextCollectBy->Factory();
pIPv4Next->Collect(pFrame, nextCollectBy?nextCollectBy->pNext:NULL);
}
if (pFrame->m_SourceIPAddress.IsIPv6())
{
if ((pIPv6Next == NULL) && nextCollectBy)
pIPv6Next = nextCollectBy->Factory();
if (pIPv6Next)
pIPv6Next->Collect(pFrame, nextCollectBy?nextCollectBy->pNext:NULL);
}
}
void CollectByIPAddressType::Export(FILE* hFile,BJString sPrevColumns)
{
if (pIPv4Next)
{
BJString sTemp = sPrevColumns;
if (sPrevColumns.GetBufferLength())
sTemp += ",";
sTemp += "IPv4";
pIPv4Next->Export(hFile,sTemp);
}
if (pIPv6Next)
{
BJString sTemp = sPrevColumns;
if (sPrevColumns.GetBufferLength())
sTemp += ",";
sTemp += "IPv6";
pIPv6Next->Export(hFile,sTemp);
}
}
/////////////
// CollectBySameSubnetDiffSubnet:
// static
bool CollectBySameSubnetDiffSubnet::bSameSubnet = true;
void CollectBySameSubnetDiffSubnet::Collect(CDNSFrame* pFrame,CollectByAbstract* nextCollectBy)
{
if (bSameSubnet)
{
if (pSameSubnetNext == NULL)
pSameSubnetNext = nextCollectBy->Factory();
pSameSubnetNext->Collect(pFrame, nextCollectBy?nextCollectBy->pNext:NULL);
}
else
{
if (pDiffSubnetNext == NULL)
pDiffSubnetNext = nextCollectBy->Factory();
pDiffSubnetNext->Collect(pFrame, nextCollectBy?nextCollectBy->pNext:NULL);
}
}
void CollectBySameSubnetDiffSubnet::Export(FILE* hFile,BJString sPrevColumns)
{
if (pSameSubnetNext)
{
BJString sTemp = sPrevColumns;
if (sPrevColumns.GetBufferLength())
sTemp += ",";
sTemp += "SameSubnet";
pSameSubnetNext->Export(hFile,sTemp);
}
if (pDiffSubnetNext)
{
BJString sTemp = sPrevColumns;
if (sPrevColumns.GetBufferLength())
sTemp += ",";
sTemp += "WrongSubnet";
pDiffSubnetNext->Export(hFile,sTemp);
}
}
/////////////
// CollectByPacketCount
// staticCollectByPacketCount
BJ_INT64 CollectByPacketCount::nFrameIndex = 0;
void CollectByPacketCount::Collect(CDNSFrame* ,CollectByAbstract* )
{
if (nFrameIndex != nLastFrameIndex)
{
nFrameCount++;
nLastFrameIndex = nFrameIndex;
}
}
void CollectByPacketCount::Export(FILE* hFile,BJString sPrevColumns)
{
fprintf(hFile,"%s,%llu\n",sPrevColumns.GetBuffer(),nFrameCount);
}