00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 from objects.logic.common.exception import exception
00017 from pysqlite2 import dbapi2 as sqlite
00018 from objects.storage.storageInterface import storageInterface
00019 from objects.logic.common.logger import logger
00020 import time
00021 import shutil
00022 from objects.logic.common.globalStrings import globalStrings
00023
00024 import base64
00025 import os
00026
00027
00028
00029
00030
00031 class sqlite3Impl(storageInterface):
00032
00033 def __init__(self, storageFile):
00034
00035
00036
00037 self.errorCallBackFunc = None
00038
00039 self.cur = None
00040 self.conn = None
00041
00042 self.recID = 0
00043
00044 self.storageFile = storageFile
00045 self.successful = False
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 def createStorage(self):
00060
00061 self.deleteStorage()
00062
00063 try:
00064
00065 shutil.copyfile(globalStrings.traceStorageTemplate, self.storageFile)
00066
00067 except Exception, ex:
00068 strErr = "Could not create trace storage file.\nThere was an error creating physical storage file %s:\n %s" % (self.storageFile, str(ex))
00069 logger.log(__name__ + ": " + strErr)
00070 raise Exception, strErr
00071
00072 self.successful = True
00073
00074 def deleteStorage(self):
00075 try:
00076 os.remove(self.storageFile)
00077 except Exception, ex:
00078 logger.log(__name__ + ": Warning -- Could not delete storage file: " + str(ex))
00079
00080
00081
00082
00083 def open(self):
00084 try:
00085 self.conn = sqlite.connect(self.storageFile)
00086 self.cur = self.conn.cursor()
00087 except Exception, ex:
00088 logger.log(__name__ + ": Could not open sqlite database")
00089 logger.log(ex)
00090
00091 raise ex
00092
00093
00094
00095
00096 def close(self):
00097 try:
00098 if self.cur is not None:
00099 self.cur.close()
00100
00101 if self.conn is not None:
00102 self.conn.close()
00103 except Exception, ex:
00104 logger.log(__name__ + ": Could not close sqlite database")
00105 logger.log(ex)
00106
00107 raise ex
00108
00109
00110
00111
00112
00113 def store(self, decodedPacketDict):
00114
00115 if self.successful == False:
00116 logger.log(__name__ + ": Cannot insert data into the storage database, because there was an error during its creation")
00117 return
00118
00119
00120 if decodedPacketDict == None:
00121 return
00122
00123
00124
00125 try:
00126 netHeader = sqlite.Binary(decodedPacketDict['networkHeader'])
00127 xportHeader = sqlite.Binary(decodedPacketDict['transportHeader'])
00128
00129 netHeader = base64.encodestring(netHeader)
00130 xportHeader = base64.encodestring(xportHeader)
00131
00132 if decodedPacketDict['payload'] != None:
00133 payload = base64.encodestring(decodedPacketDict['payload'])
00134 else:
00135 payload = None
00136
00137
00138 vals = (self.recID, time.time(), decodedPacketDict['sourceIP'],
00139 decodedPacketDict['destIP'], decodedPacketDict['sourcePort'],
00140 decodedPacketDict['destPort'],
00141 decodedPacketDict['netProtocol'], decodedPacketDict['transportProtocol'],
00142 netHeader, xportHeader, payload)
00143
00144 self.cur.execute("""insert into raw_packets
00145 (recID,
00146 timestamp,
00147 srcIP,
00148 dstIP,
00149 srcPort,
00150 dstPort,
00151 inetProtocol,
00152 xportProtocol,
00153 inetRawData,
00154 xportRawData,
00155 appRawData)
00156 values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", vals)
00157
00158 self.recID += 1
00159 except Exception, ex:
00160 logger.log(__name__ + ": There was an error storing packet to database")
00161 logger.log(ex)
00162
00163
00164
00165
00166 def commit(self):
00167 try:
00168 self.conn.commit()
00169 except Exception, ex:
00170 logger.log(__name__ + ": There was an error committing data")
00171 logger.log(ex)
00172 raise ex
00173
00174
00175 def clear(self):
00176 try:
00177 self.open()
00178 self.cur.execute("""delete from raw_packets""")
00179
00180
00181 self.conn.commit()
00182 self.recID = 0
00183
00184 self.close()
00185 except Exception, ex:
00186 logger.log(__name__ + ": Could not clear packet database")
00187 logger.log(ex)
00188 raise ex
00189
00190
00191
00192 def getStorageSizeBytes(self):
00193
00194 try:
00195 statInfo = os.stat(globalStrings.traceStoragePath)
00196 fileSze = statInfo.st_size
00197 return fileSze
00198 except Exception, ex:
00199 logger.log(__name__ + ": There was an error figuring out storage file size")
00200 logger.log(ex)
00201 return 0
00202 else:
00203 return fileSze
00204
00205
00206
00207
00208
00209
00210
00211 def query(self, dstIP, srcPort, dstPort):
00212
00213 try:
00214
00215 self.resultSet = []
00216
00217 vals = (dstIP, dstIP, srcPort, srcPort, dstPort, dstPort)
00218
00219 query = """select timestamp,
00220 srcIP,
00221 dstIP,
00222 srcPort,
00223 dstPort,
00224 inetProtocol,
00225 xportProtocol,
00226 inetRawData, xportRawData, appRawData
00227 from raw_packets
00228 where (srcIP = ? or dstIP = ?)
00229 and ( (srcPort = ? or srcPort = 0) or (dstPort = ? or dstPort = 0))
00230 and ( (srcPort = ? or srcPort = 0) or (dstPort = ? or dstPort = 0))
00231 order by recID asc"""
00232
00233 print query, vals
00234
00235 self.cur.execute(query, vals)
00236
00237 map(self.__decodeAndAppend, self.cur)
00238
00239 return self.resultSet
00240
00241 except Exception, ex:
00242 logger.log(__name__ + ": Could not query database")
00243 logger.log(ex)
00244
00245 raise ex
00246
00247
00248
00249
00250 def __decodeAndAppend(self, row):
00251
00252 ts, srcip, dstip, srcprt, dstprt, inetp, xportp, netHdr, xptHdr, payload = row
00253
00254 netHdr = base64.decodestring(netHdr)
00255 xptHdr = base64.decodestring(xptHdr)
00256
00257 if payload != None:
00258 payload = base64.decodestring(payload)
00259
00260 self.resultSet.append((ts, srcip, dstip, srcprt, dstprt, inetp, xportp, netHdr, xptHdr, payload))
00261
00262
00263
00264
00265