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('