########################################
# File: dependencyCheckLogging         #
# Date: 03-Apr-2023                    #
# Author: Siva Sajja                   #
# Modified by: Vinay Lakshmaiah        #
########################################

import json
import requests
from pprint import pprint
import argparse
from datetime import datetime
import xml.etree.ElementTree as ET


## Add arguments 
parser = argparse.ArgumentParser(description='arguments')
parser.add_argument('-u', '--url', help='Host URL to be processed ex : http://kibana.io:443')
parser.add_argument('-i', '--userid', help='User ID')
parser.add_argument('-p', '--password', help='Password')
parser.add_argument('-s', '--servicename', help='ServiceName, ex: billing')
parser.add_argument('-c', '--commithash', help='CommitHash, ex: 62f25f3')
parser.add_argument('-f', '--filepath', help='dependency-check-report-pmd.xml file path ex: /path/to/dependency-check-report-pmd.xml')


## Validate command line arguments
args = parser.parse_args()
if not args.url:
    raise Exception('URL not provided')

if not args.userid:
    raise Exception('User ID not provided')

if not args.password:
    raise Exception('Password not provided')

if not args.servicename:
    raise Exception('ServiceName not provided')

if not args.commithash:
    raise Exception('CommitHash not provided')

if not args.filepath:
    raise Exception('filepath not provided')

index = 'dependency_check-'+args.servicename

## set required variables 
url = args.url+"/{}/_doc".format(index)
print("search result ",url)
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
username = args.userid
password = args.password

data_json = {}

# Delete older logs
response = requests.delete(f'{args.url}/{index}', auth=(username, password))

# Check if delete request was successful
if response.status_code == 200:
    print(f"Index '{index}' deleted successfully.")
else:
    print(f"Error deleting index '{index}'.")

## pass dependency-check-report-pmd.xml file path 
tree = ET.parse(args.filepath)
violations = tree.getroot()

## push xml to ES while iterating through violations loop
for value in violations:
    textname=value[0].text
    words = textname.split('|')
    for word in words:
        keyvalue = word.split(':')
        if keyvalue[0].strip() == "Priority":
            if keyvalue[1].strip() == "1":
                data_json[keyvalue[0].strip()] = "Critical"
            elif keyvalue[1].strip() == "2":
                data_json[keyvalue[0].strip()] = "High"
            elif keyvalue[1].strip() == "3":
                data_json[keyvalue[0].strip()] = "Medium"
            else:
                data_json[keyvalue[0].strip()] = "Low"
        else:
            data_json[keyvalue[0].strip()] = keyvalue[1].strip()
    data_json['timestamp'] = datetime.now().isoformat()
    data_json['ServiceName'] =  str(args.servicename)
    data_json['Commit_Hash'] =  str(args.commithash)
    json_object = json.dumps(data_json, indent=4)
    headers = {'Content-Type': 'application/json'}
    response = requests.post(url, data=json_object, auth=(username, password), headers=headers)

    # Check if request is successful
    if response.status_code == 201:
        print("Data successfully sent to Elasticsearch.")
    else:
        print("Error sending data to Elasticsearch."+response)