From f62a5cd1fb55d09298875af72ceda262c3eef410 Mon Sep 17 00:00:00 2001 From: Felix Steghofer Date: Thu, 19 Oct 2017 22:07:30 +0200 Subject: [PATCH] added ability to run in docker --- .../Technical Trends in Phishing Attacks.pdf | Bin 0 -> 69961 bytes src/DoresA/Dockerfile | 7 +++ src/DoresA/db.py | 46 ++++++++++++++---- src/DoresA/docker-compose.yml | 31 ++++++++++++ src/DoresA/iterate_db.py | 16 ++++++ src/DoresA/serialize_logs_to_db.py | 18 +++---- 6 files changed, 99 insertions(+), 19 deletions(-) create mode 100644 literature/Technical Trends in Phishing Attacks.pdf create mode 100644 src/DoresA/Dockerfile create mode 100644 src/DoresA/docker-compose.yml create mode 100644 src/DoresA/iterate_db.py diff --git a/literature/Technical Trends in Phishing Attacks.pdf b/literature/Technical Trends in Phishing Attacks.pdf new file mode 100644 index 0000000000000000000000000000000000000000..96790c1e6da12b0867f3ecffeba545a1a5d5575f GIT binary patch literal 69961 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 Toca_a**Jz8T3ZkG9cK7nJBV|f literal 0 HcmV?d00001 diff --git a/src/DoresA/Dockerfile b/src/DoresA/Dockerfile new file mode 100644 index 0000000..8adcf82 --- /dev/null +++ b/src/DoresA/Dockerfile @@ -0,0 +1,7 @@ +FROM python:3 +ENV PYTHONUNBUFFERED 1 +RUN mkdir /app +WORKDIR /app +ADD requirements.txt /app/ +RUN pip install -r requirements.txt +ADD . /app/ \ No newline at end of file diff --git a/src/DoresA/db.py b/src/DoresA/db.py index fd4dfc9..bb8349b 100644 --- a/src/DoresA/db.py +++ b/src/DoresA/db.py @@ -1,19 +1,46 @@ import MySQLdb as mariadb import time +import os from pymongo import MongoClient -mongo_client = MongoClient('localhost', 27017) -mongo_db = mongo_client.doresa -pdns_logs_mongo = mongo_db.pdns_logs +mongodb_host = 'localhost' +mongodb_db_name = 'doresa' +# mongodb_collection_name = 'pdns_logs' +mongodb_collection_name = 'may' # tmp TODO remove + +sql_host = 'localhost' +sql_db_name = 'doresa' +sql_user_name = 'doresa' +sql_pw = '3qfACEZzbXY4b' +# sql_table_name = 'pdns_logs' +sql_table_name = 'pdns_logs_test' -sql_connection = mariadb.connect(user='doresa', passwd='3qfACEZzbXY4b', db='doresa') +if 'MYSQL_HOST' in os.environ: + sql_host = os.environ['MYSQL_HOST'] + +if 'MYSQL_DATABASE' in os.environ: + sql_db_name = os.environ['MYSQL_DATABASE'] + +if 'MYSQL_USER' in os.environ: + sql_user_name = os.environ['MYSQL_USER'] + +if 'MYSQL_PASSWORD' in os.environ: + sql_pw = os.environ['MYSQL_PASSWORD'] + + +mongo_client = MongoClient(mongodb_host, 27017) +mongo_db = mongo_client[mongodb_db_name] +pdns_logs_mongo = mongo_db[mongodb_collection_name] + + +sql_connection = mariadb.connect(host=sql_host, user=sql_user_name, passwd=sql_pw, db=sql_db_name) sql_cursor = sql_connection.cursor() def mariadb_insert_log(csv_entry): - insert_sql = 'INSERT INTO pdns_logs (timestamp, domain, type, record, ttl) VALUES (%s, %s, %s, %s, %s)' + insert_sql = 'INSERT INTO ' + sql_table_name + ' (timestamp, domain, type, record, ttl) VALUES (%s, %s, %s, %s, %s)' values = (convert_timestamp_to_sql_datetime(float(csv_entry[0])), csv_entry[1], csv_entry[2], csv_entry[3], csv_entry[4]) @@ -22,7 +49,7 @@ def mariadb_insert_log(csv_entry): def mariadb_insert_logs(csv_entries): - inserts_sql = 'INSERT INTO pdns_logs (timestamp, domain, type, record, ttl) VALUES ' + inserts_sql = 'INSERT INTO ' + sql_table_name + ' (timestamp, domain, type, record, ttl) VALUES ' for i in range(len(csv_entries) - 1): inserts_sql += '(%s, %s, %s, %s, %s), ' @@ -39,14 +66,13 @@ def mariadb_insert_logs(csv_entries): def mariadb_get_logs(from_time, to_time): - get_logs_from_to = 'SELECT * FROM pdns_logs WHERE timestamp BETWEEN \'{}\' and \'{}\';'.format(from_time, to_time) + get_logs_from_to = 'SELECT * FROM ' + sql_table_name + ' WHERE timestamp BETWEEN \'{}\' and \'{}\';'.format(from_time, to_time) sql_connection.query(get_logs_from_to) return sql_connection.use_result() def mariadb_create_table(): - create_table = """ - CREATE TABLE pdns_logs ( + create_table = 'CREATE TABLE IF NOT EXISTS ' + sql_table_name + """ ( id INTEGER AUTO_INCREMENT PRIMARY KEY, timestamp DATETIME, domain VARCHAR(255), @@ -84,5 +110,7 @@ def close(): mongo_client.close() +mariadb_create_table() + if __name__ == "__main__": exit() diff --git a/src/DoresA/docker-compose.yml b/src/DoresA/docker-compose.yml new file mode 100644 index 0000000..db6f28c --- /dev/null +++ b/src/DoresA/docker-compose.yml @@ -0,0 +1,31 @@ +version: '3' + +services: + mariadb: + container_name: mariadb + image: mariadb + restart: unless-stopped + ports: + - "3306:3306" + environment: + MYSQL_ROOT_PASSWORD: jDGb3CvbsmBSB + MYSQL_DATABASE: doresa + MYSQL_USER: doresa + MYSQL_PASSWORD: 3qfACEZzbXY4b + + app: + build: . + container_name: app + restart: unless-stopped + command: python3 serialize_logs_to_db.py + volumes: + - .:/app + - ./data:/data + environment: + MYSQL_HOST: mariadb + MYSQL_DATABASE: doresa + MYSQL_USER: doresa + MYSQL_PASSWORD: 3qfACEZzbXY4b + DATA_PATH: + depends_on: + - mariadb diff --git a/src/DoresA/iterate_db.py b/src/DoresA/iterate_db.py new file mode 100644 index 0000000..364eda9 --- /dev/null +++ b/src/DoresA/iterate_db.py @@ -0,0 +1,16 @@ +import db +import datetime + + +def test(): + f = '%Y-%m-%d %H:%M:%S' + results = db.mariadb_get_logs(datetime.date(2017, 4, 7).strftime(f), datetime.date(2017, 4, 8).strftime(f)) + + row = results.fetch_row(how=1) + while row: + print(row[0]['domain']) + row = results.fetch_row(how=1) + + +if __name__ == "__main__": + test() diff --git a/src/DoresA/serialize_logs_to_db.py b/src/DoresA/serialize_logs_to_db.py index 26cb22f..d23229a 100644 --- a/src/DoresA/serialize_logs_to_db.py +++ b/src/DoresA/serialize_logs_to_db.py @@ -4,25 +4,23 @@ import glob import time import datetime import pandas +import os from progress.bar import Bar import db -analysis_start_date = datetime.date(2017, 4, 7) -analysis_days_amount = 3 +analysis_start_date = datetime.date(2017, 5, 1) +analysis_days_amount = 31 +# pdns_logs_path = 'data/' +pdns_logs_path = '/run/media/felix/ext/2017.05/' # tmp TODO remove # e.g. analysis_days = ['2017-04-07', '2017-04-08', '2017-04-09'] analysis_days = [(analysis_start_date + datetime.timedelta(days=x)).strftime('%Y-%m-%d') for x in range(analysis_days_amount)] -# mongodb - -# mariadb - - def main(): - check_duplicates() + # check_duplicates() TODO readd start = time.time() distinct_ttl_count = {} @@ -51,7 +49,7 @@ def main(): # batch mode (batches of 1000 entries) for log_entries in batch(all_rows, 1000): db.mariadb_insert_logs(log_entries) - # db.mongodb_insert_logs(log_entries) + db.mongodb_insert_logs(log_entries) # single mode # for log_entry in reader: @@ -100,7 +98,7 @@ def get_log_files_for_hours_of_day(date): slots_amount = 24 for slot in range(slots_amount): - slot_files[slot] = glob.glob('data/*' + date + '_' + ('%02d' % slot) + '*.csv.gz') + slot_files[slot] = glob.glob(pdns_logs_path + '*' + date + '_' + ('%02d' % slot) + '*.csv.gz') return slot_files