update for Feature #61

This commit is contained in:
Miroslav Stampar 2010-09-24 13:19:35 +00:00
parent ff419f7384
commit 48e0261e68
4 changed files with 44 additions and 23 deletions

View File

@ -30,7 +30,9 @@ from lib.core.common import dataToDumpFile
from lib.core.common import dataToStdout from lib.core.common import dataToStdout
from lib.core.common import getUnicode from lib.core.common import getUnicode
from lib.core.data import conf from lib.core.data import conf
from lib.core.data import kb
from lib.core.data import logger from lib.core.data import logger
from lib.core.replication import Replication
class Dump: class Dump:
""" """
@ -44,10 +46,7 @@ class Dump:
self.__outputFP = None self.__outputFP = None
def __write(self, data, n=True): def __write(self, data, n=True):
if n: text = "%s%s" % (data, "\n" if n else " ")
text = "%s\n" % data
else:
text = "%s " % data
dataToStdout(text) dataToStdout(text)
self.__outputFP.write(text) self.__outputFP.write(text)
@ -269,10 +268,12 @@ class Dump:
dumpFileName = "%s%s%s.csv" % (dumpDbPath, os.sep, table) dumpFileName = "%s%s%s.csv" % (dumpDbPath, os.sep, table)
dumpFP = codecs.open(dumpFileName, "wb", conf.dataEncoding) dumpFP = codecs.open(dumpFileName, "wb", conf.dataEncoding)
count = int(tableValues["__infos__"]["count"]) count = int(tableValues["__infos__"]["count"])
separator = "" separator = str()
field = 1 field = 1
fields = len(tableValues) - 1 fields = len(tableValues) - 1
replication = None
rtable = None
columns = tableValues.keys() columns = tableValues.keys()
columns.sort(key=lambda x: x.lower()) columns.sort(key=lambda x: x.lower())
@ -286,6 +287,14 @@ class Dump:
separator += "+" separator += "+"
self.__write("Database: %s\nTable: %s" % (db, table)) self.__write("Database: %s\nTable: %s" % (db, table))
if conf.replicate:
replication = Replication("%s%s%s.sqlite" % (conf.outputPath, os.sep, db))
cols = list(columns)
if "__infos__" in cols:
cols.remove("__infos__")
rtable = replication.createTable(table, cols, True)
if count == 1: if count == 1:
self.__write("[1 entry]") self.__write("[1 entry]")
else: else:
@ -315,6 +324,7 @@ class Dump:
for i in range(count): for i in range(count):
field = 1 field = 1
values = []
for column in columns: for column in columns:
if column != "__infos__": if column != "__infos__":
@ -325,6 +335,7 @@ class Dump:
if re.search("^[\ *]*$", value): if re.search("^[\ *]*$", value):
value = "NULL" value = "NULL"
values.append(value)
maxlength = int(info["length"]) maxlength = int(info["length"])
blank = " " * (maxlength - len(value)) blank = " " * (maxlength - len(value))
self.__write("| %s%s" % (value, blank), n=False) self.__write("| %s%s" % (value, blank), n=False)
@ -336,6 +347,9 @@ class Dump:
field += 1 field += 1
if conf.replicate:
rtable.insert(values)
self.__write("|") self.__write("|")
if not conf.multipleTargets: if not conf.multipleTargets:
@ -349,6 +363,9 @@ class Dump:
logger.info("Table '%s.%s' dumped to CSV file '%s'" % (db, table, dumpFileName)) logger.info("Table '%s.%s' dumped to CSV file '%s'" % (db, table, dumpFileName))
if conf.replicate:
logger.info("Table '%s.%s' dumped to sqlite3 file '%s'" % (db, table, replication.dbpath))
def dbColumns(self, dbColumns, colConsider, dbs): def dbColumns(self, dbColumns, colConsider, dbs):
for column in dbColumns.keys(): for column in dbColumns.keys():
if colConsider == "1": if colConsider == "1":

View File

@ -158,6 +158,7 @@ optDict = {
"updateAll": "boolean", "updateAll": "boolean",
"batch": "boolean", "batch": "boolean",
"cleanup": "boolean", "cleanup": "boolean",
"replicate": "boolean",
"verbose": "integer" "verbose": "integer"
}, },
} }

View File

@ -68,11 +68,11 @@ class Replication:
else: else:
self.parent.cursor.execute('CREATE TABLE %s (%s)' % (self.name, ','.join(colname for colname in self.columns))) self.parent.cursor.execute('CREATE TABLE %s (%s)' % (self.name, ','.join(colname for colname in self.columns)))
def insert(self, rows): def insert(self, values):
""" """
This function is used for inserting row(s) into current table. This function is used for inserting row(s) into current table.
""" """
self.parent.cursor.executemany('INSERT INTO %s VALUES (?,?,?,?,?)' % self.name, rows) self.parent.cursor.execute('INSERT INTO %s VALUES (%s)' % (self.name, ','.join(['?']*len(values))), values)
def select(self, condition=None): def select(self, condition=None):
""" """
@ -90,11 +90,11 @@ class Replication:
TEXT = DataType('TEXT') TEXT = DataType('TEXT')
BLOB = DataType('BLOB') BLOB = DataType('BLOB')
def createTable(self, tblname, columns=None): def createTable(self, tblname, columns=None, typeless=False):
""" """
This function creates Table instance with current connection settings. This function creates Table instance with current connection settings.
""" """
return Table(self, tblname, columns) return Replication.Table(parent=self, name=tblname, columns=columns, typeless=typeless)
def dropTable(self, tblname): def dropTable(self, tblname):
""" """

View File

@ -457,6 +457,9 @@ def cmdLineParser():
help="Clean up the DBMS by sqlmap specific " help="Clean up the DBMS by sqlmap specific "
"UDF and tables") "UDF and tables")
miscellaneous.add_option("--replicate", dest="replicate", action="store_true",
help="Replicate dumped data into a sqlite database")
# Hidden and/or experimental options # Hidden and/or experimental options
parser.add_option("--profile", dest="profile", action="store_true", parser.add_option("--profile", dest="profile", action="store_true",
help=SUPPRESS_HELP) help=SUPPRESS_HELP)