diff --git a/patator.py b/patator.py
index 12b7006..3beeab3 100755
--- a/patator.py
+++ b/patator.py
@@ -613,13 +613,13 @@ class TXTFormatter(logging.Formatter):
logging.Formatter.__init__(self, datefmt='%H:%M:%S')
def format(self, record):
- if record.msg:
+ if not record.msg or record.msg == 'headers':
+ self._fmt = self.resultfmt
+ else:
if record.levelno == 10: # DEBUG
self._fmt = '%(asctime)s %(name)-7s %(levelname)7s [%(threadName)s] %(message)s'
else:
self._fmt = '%(asctime)s %(name)-7s %(levelname)7s - %(message)s'
- else:
- self._fmt = self.resultfmt
return logging.Formatter.format(self, record)
@@ -652,15 +652,13 @@ class Output:
def __init__(self, indicatorsfmt, argv, log_dir, auto_log):
+ self.log_dir = None
self.indicatorsfmt = indicatorsfmt
- self.cmdline = ' '.join(argv)
if auto_log:
self.log_dir = create_time_dir(log_dir or '/tmp/patator', auto_log)
elif log_dir:
self.log_dir = create_dir(log_dir)
- else:
- self.log_dir = None
handler_out = logging.StreamHandler()
handler_out.setFormatter(TXTFormatter(self.indicatorsfmt))
@@ -668,10 +666,31 @@ class Output:
logger.addHandler(handler_out)
if self.log_dir:
+ runtime_log = os.path.join(self.log_dir, 'RUNTIME.log')
+ results_csv = os.path.join(self.log_dir, 'RESULTS.csv')
+ results_xml = os.path.join(self.log_dir, 'RESULTS.xml')
+
+ with open(runtime_log, 'a') as f:
+ f.write('$ %s\n' % ' '.join(argv))
+
+ names = [name for name, _ in self.indicatorsfmt] + ['candidate', 'num', 'mesg']
- handler_log = logging.FileHandler(os.path.join(self.log_dir, 'RUNTIME.log'))
- handler_csv = logging.FileHandler(os.path.join(self.log_dir, 'RESULTS.csv'))
- handler_xml = logging.FileHandler(os.path.join(self.log_dir, 'RESULTS.xml'))
+ if not os.path.exists(results_csv):
+ with open(results_csv, 'w') as f:
+ f.write('time,level,%s\n' % ','.join(names))
+
+ if not os.path.exists(results_xml):
+ with open(results_xml, 'w') as f:
+ f.write('\n\n')
+
+ else: # remove "\n"
+ with open(results_xml, 'r+') as f:
+ f.seek(-11, 2)
+ f.truncate(f.tell())
+
+ handler_log = logging.FileHandler(runtime_log)
+ handler_csv = logging.FileHandler(results_csv)
+ handler_xml = logging.FileHandler(results_xml)
handler_csv.addFilter(MsgFilter())
handler_xml.addFilter(MsgFilter())
@@ -686,23 +705,12 @@ class Output:
def headers(self):
- if self.log_dir:
- with open(os.path.join(self.log_dir, 'RUNTIME.log'), 'a') as f:
- f.write('$ %s\n' % self.cmdline)
-
names = [name for name, _ in self.indicatorsfmt] + ['candidate', 'num', 'mesg']
logger.info(' '*77)
- logger.info(None, extra=dict((n, n) for n in names))
+ logger.info('headers', extra=dict((n, n) for n in names))
logger.info('-'*77)
- if self.log_dir:
- with open(os.path.join(self.log_dir, 'RESULTS.xml'), 'w') as f:
- f.write('\n\n')
-
- with open(os.path.join(self.log_dir, 'RESULTS.csv'), 'w') as f:
- f.write('time,level,%s\n' % ','.join(names))
-
def log_result(self, typ, resp, candidate, num):
results = [(name, value) for (name, _), value in zip(self.indicatorsfmt, resp.indicators())]
@@ -716,7 +724,7 @@ class Output:
def save(self, resp, num):
if self.log_dir:
filename = '%d_%s' % (num, ':'.join(map(str, resp.indicators())))
- with open('%s/%s.txt' % (self.log_dir, filename), 'w') as f:
+ with open('%s.txt' % os.path.join(self.log_dir, filename), 'w') as f:
f.write(resp.dump())
def __del__(self):
@@ -2331,7 +2339,7 @@ class SMB_login(TCP_Cache):
available_options += TCP_Cache.available_options
class Response(Response_Base):
- logformat = '%-8s %-4s %6s | %-34s | %5s | %s'
+ indicatorsfmt = [('code', -8), ('size', -4), ('time', 6)]
# ripped from medusa smbnt.c
error_map = {
@@ -2898,7 +2906,7 @@ class Oracle_login:
available_actions = ()
class Response(Response_Base):
- logformat = '%-9s %-4s %6s | %-34s | %5s | %s'
+ indicatorsfmt = [('code', -9), ('size', -4), ('time', 6)]
def execute(self, host, port='1521', user='', password='', sid=''):
dsn = cx_Oracle.makedsn(host, port, sid)