diff --git a/Dockerfile b/Dockerfile
index 2eb02c9..7c66bf3 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -9,30 +9,44 @@ RUN apt-get update && apt-get install -y \
libcurl4-openssl-dev python3-dev libssl-dev \
ldap-utils \
libmariadbclient-dev \
+ libpq-dev \
ike-scan unzip default-jdk \
libsqlite3-dev libsqlcipher-dev \
- libpq-dev \
- python3-pip
+ python3-pip python-pip
# cx_oracle
-RUN apt-get update && apt-get install -y libaio1 wget unzip
+RUN apt-get update && apt-get install -y libaio1 wget unzip git
WORKDIR /opt/oracle
-RUN wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip
-RUN unzip instantclient-basiclite-linuxx64.zip
-RUN rm -f instantclient-basiclite-linuxx64.zip
-RUN cd /opt/oracle/instantclient*
-RUN rm -f *jdbc* *occi* *mysql* *README *jar uidrvci genezi adrci
-RUN echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf
-RUN ldconfig
+RUN wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip \
+ && wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-sdk-linuxx64.zip \
+ && unzip instantclient-basiclite-linuxx64.zip \
+ && rm -f instantclient-basiclite-linuxx64.zip \
+ && unzip instantclient-sdk-linuxx64.zip \
+ && rm -f instantclient-sdk-linuxx64.zip \
+ && cd /opt/oracle/instantclient* \
+ && rm -f *jdbc* *occi* *mysql* *README *jar uidrvci genezi adrci \
+ && echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf \
+ && ldconfig
+
+RUN git clone --branch 5.3 https://github.com/oracle/python-cx_Oracle \
+ && cd python-cx_Oracle && export ORACLE_HOME=/opt/oracle/instantclient_19_6 && python2 setup.py build && python2 setup.py install
# xfreerdp (see https://github.com/FreeRDP/FreeRDP/wiki/Compilation)
RUN apt-get update && apt-get install -y ninja-build build-essential git-core debhelper cdbs dpkg-dev autotools-dev cmake pkg-config xmlto libssl-dev docbook-xsl xsltproc libxkbfile-dev libx11-dev libwayland-dev libxrandr-dev libxi-dev libxrender-dev libxext-dev libxinerama-dev libxfixes-dev libxcursor-dev libxv-dev libxdamage-dev libxtst-dev libcups2-dev libpcsclite-dev libasound2-dev libpulse-dev libjpeg-dev libgsm1-dev libusb-1.0-0-dev libudev-dev libdbus-glib-1-dev uuid-dev libxml2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libfaad-dev libfaac-dev \
&& apt-get install -y libavutil-dev libavcodec-dev libavresample-dev
-RUN git clone https://github.com/FreeRDP/FreeRDP/ /tmp/FreeRDP
-WORKDIR /tmp/FreeRDP
+WORKDIR /opt/FreeRDP
+RUN git clone https://github.com/FreeRDP/FreeRDP/ .
RUN cmake -DCMAKE_BUILD_TYPE=Debug -DWITH_SSE2=ON . && cmake --build . && cmake --build . --target install
WORKDIR /opt/patator
-RUN python3 -m pip install patator
+COPY ./requirements.txt ./
+RUN python3 -m pip install -r requirements.txt
+
+RUN sed -e '/cx_Oracle/d' -e 's,pysqlcipher3,pysqlcipher,' requirements.txt | python2 -m pip install -r /dev/stdin
+
+# utils
+RUN apt-get update && apt-get install -y ipython3 ipython iputils-ping iproute2 netcat curl rsh-client telnet vim mlocate nmap
+RUN echo 'set bg=dark' > /root/.vimrc
-ENTRYPOINT ["patator.py"]
+COPY ./patator.py ./
+ENTRYPOINT ["python3", "./patator.py"]
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..df8a123
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,55 @@
+version: "3"
+services:
+ unix:
+ build: testing/unix
+ image: patator-unix-testing
+# ports:
+# - "21:21"
+# - "22:22"
+# - "23:23"
+# - "25:25"
+# - "79:79"
+# - "80:80"
+# - "106:106"
+# - "110:110"
+# - "139:139"
+# - "143:143"
+# - "389:389"
+# - "445:445"
+# - "513:513"
+# - "636:636"
+# - "993:993"
+# - "995:995"
+# - "3306:3306"
+# - "4444:4444"
+# - "5432:5432"
+# - "5900:5900"
+# - "8009:8009"
+# - "8080:8080"
+ volumes:
+ - .:/opt/patator
+
+ oracle:
+ image: oracleinanutshell/oracle-xe-11g
+ environment:
+ - ORACLE_ENABLE_XDB=true
+ ports:
+ - "1521:1521"
+
+ mssql:
+ image: mcr.microsoft.com/mssql/server:2019-latest
+ environment:
+ - ACCEPT_EULA=Y
+ - SA_PASSWORD=Password1
+ ports:
+ - "1433:1433"
+
+ patator:
+ build: .
+ image: patator
+ depends_on:
+ - unix
+ - oracle
+ - mssql
+ volumes:
+ - .:/opt/patator
diff --git a/patator.py b/patator.py
index 28a29b2..ed4eb80 100755
--- a/patator.py
+++ b/patator.py
@@ -714,15 +714,12 @@ class TXTFormatter(logging.Formatter):
def __init__(self, indicatorsfmt):
self.resultfmt = '%(asctime)s %(name)-7s %(levelname)7s - ' + ' '.join('%%(%s)%ss' % (k, v) for k, v in indicatorsfmt) + ' | %(candidate)-34s | %(num)5s | %(mesg)s'
- logging.Formatter.__init__(self, datefmt='%H:%M:%S')
+ super(TXTFormatter, self).__init__(datefmt='%H:%M:%S')
def format(self, record):
if not record.msg or record.msg == 'headers':
fmt = self.resultfmt
- if not all(True if 0x20 <= ord(c) < 0x7f else False for c in record.candidate):
- record.candidate = repr(record.candidate)
-
else:
if record.levelno == logging.DEBUG:
fmt = '%(asctime)s %(name)-7s %(levelname)7s [%(pname)s] %(message)s'
@@ -734,18 +731,30 @@ class TXTFormatter(logging.Formatter):
else:
self._fmt = fmt
- return logging.Formatter.format(self, record)
+ pp = {}
+ for k, v in record.__dict__.items():
+ if k in ['candidate', 'mesg']:
+ pp[k] = repr23(v)
+ else:
+ pp[k] = v
+
+ return super(TXTFormatter, self).format(logging.makeLogRecord(pp))
class CSVFormatter(logging.Formatter):
def __init__(self, indicatorsfmt):
fmt = '%(asctime)s,%(levelname)s,'+','.join('%%(%s)s' % name for name, _ in indicatorsfmt)+',%(candidate)s,%(num)s,%(mesg)s'
- logging.Formatter.__init__(self, fmt, datefmt='%H:%M:%S')
+ super(CSVFormatter, self).__init__(fmt=fmt, datefmt='%H:%M:%S')
def format(self, record):
- for k in ['candidate', 'mesg']:
- record.__dict__[k] = '"%s"' % record.__dict__[k].replace('"', '""')
- return logging.Formatter.format(self, record)
+ pp = {}
+ for k, v in record.__dict__.items():
+ if k in ['candidate', 'mesg']:
+ pp[k] = '"%s"' % v.replace('"', '""')
+ else:
+ pp[k] = v
+
+ return super(CSVFormatter, self).format(logging.makeLogRecord(pp))
class XMLFormatter(logging.Formatter):
def __init__(self, indicatorsfmt):
@@ -757,15 +766,17 @@ class XMLFormatter(logging.Formatter):
'''
- logging.Formatter.__init__(self, fmt, datefmt='%H:%M:%S')
+ super(XMLFormatter, self).__init__(fmt=fmt, datefmt='%H:%M:%S')
def format(self, record):
-
+ pp = {}
for k, v in record.__dict__.items():
if isinstance(v, str):
- record.__dict__[k] = xmlescape(v)
+ pp[k] = xmlescape(v)
+ else:
+ pp[k] = v
- return super(XMLFormatter, self).format(record)
+ return super(XMLFormatter, self).format(logging.makeLogRecord(pp))
class MsgFilter(logging.Filter):
@@ -779,12 +790,12 @@ def process_logs(queue, indicatorsfmt, argv, log_dir, runtime_file, csv_file, xm
ignore_ctrlc()
- try:
- # python3
+ if PY3:
logging._levelToName[logging.ERROR] = 'FAIL'
- except:
- # python2
+ encoding = 'latin1'
+ else:
logging._levelNames[logging.ERROR] = 'FAIL'
+ encoding = None
handler_out = logging.StreamHandler()
handler_out.setFormatter(TXTFormatter(indicatorsfmt))
@@ -801,7 +812,7 @@ def process_logs(queue, indicatorsfmt, argv, log_dir, runtime_file, csv_file, xm
with open(runtime_log, 'a') as f:
f.write('$ %s\n' % ' '.join(argv))
- handler_log = logging.FileHandler(runtime_log)
+ handler_log = logging.FileHandler(runtime_log, encoding=encoding)
handler_log.setFormatter(TXTFormatter(indicatorsfmt))
logger.addHandler(handler_log)
@@ -813,7 +824,7 @@ def process_logs(queue, indicatorsfmt, argv, log_dir, runtime_file, csv_file, xm
with open(results_csv, 'w') as f:
f.write('time,level,%s\n' % ','.join(names))
- handler_csv = logging.FileHandler(results_csv)
+ handler_csv = logging.FileHandler(results_csv, encoding=encoding)
handler_csv.addFilter(MsgFilter())
handler_csv.setFormatter(CSVFormatter(indicatorsfmt))
@@ -835,7 +846,7 @@ def process_logs(queue, indicatorsfmt, argv, log_dir, runtime_file, csv_file, xm
while i < len(argv):
arg = argv[i]
if arg[0] == '-':
- if arg in ('-d', '--debug', '--allow-ignore-failures'):
+ if arg in ('-d', '--debug', '--allow-ignore-failures', '-y'):
f.write('