diff --git a/.gitignore b/.gitignore index b0b8eda..f37f297 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -*config.toml +*.toml *.json __pycache__/ *.log diff --git a/config.toml.example b/config.toml.example index 59bb7a0..1ea5daf 100644 --- a/config.toml.example +++ b/config.toml.example @@ -1,3 +1,27 @@ +[fortraPlatform] +selectedPlatform = "dev" + +[fortraPlatform.dev] +idp = "https://foundation.foundation-dev.cloudops.fortradev.com/idp/realms/products/protocol/openid-connect/token" +efc_url = "https://efc.efc-dev.cloudops.fortradev.com" +tenant_id = "" +client_id = "eft-event-generator-confidential" +secret = "" + +[fortraPlatform.stage] +idp = "https://foundation.foundation-stage.cloudops.fortradev.com/idp/realms/products/protocol/openid-connect/token" +efc_url = "https://efc.efc-stage.cloudops.fortradev.com" +tenant_id = "" +client_id = "eft-event-generator-confidential" +secret = "" + +[fortraPlatform.prod] +idp ="https://foundation.foundation-prod.cloudops.fortradev.com/idp/realms/products/protocol/openid-connect/token" +efc_url = "https://efc.efc-prod.cloudops.fortradev.com" +tenant_id = "" +client_id = "eft-event-generator-confidential" +secret = "" + [database] driver = "ODBC Driver 18 for SQL Server" server = "192.168.x.x" @@ -6,32 +30,33 @@ user = "a" password = "a" query = """DECLARE @stopTime DATETIME2 SET @stopTime = DATEADD(DAY, -30, GETDATE()) -SELECT [ProtocolCommandID] - ,p.[Time_stamp] - ,[RemoteIP] - ,[RemotePort] - ,[LocalIP] - ,[LocalPort] - ,[Protocol] - ,[SiteName] - ,[Command] - ,[CommandParameters] - ,[FileName] - ,[VirtualFolderName] - ,[PhysicalFolderName] - ,[IsInternal] - ,[FileSize] - ,[TransferTime] - ,[BytesTransferred] - ,[ResultID] - ,p.[TransactionID] - ,[Description] - ,[Actor] +SELECT p.[ProtocolCommandID] + ,t.[Time_stamp] + ,p.[RemoteIP] + ,p.[RemotePort] + ,p.[LocalIP] + ,p.[LocalPort] + ,p.[Protocol] + ,p.[SiteName] + ,p.[Command] + ,p.[CommandParameters] + ,p.[FileName] + ,p.[VirtualFolderName] + ,p.[PhysicalFolderName] + ,p.[IsInternal] + ,p.[FileSize] + ,p.[TransferTime] + ,p.[BytesTransferred] + ,p.[ResultID] + ,t.[TransactionID] + ,p.[Description] + ,p.[Actor] ,t.ParentTransactionID ,t.TransactionObject ,t.NodeName ,t.TransactionGUID - FROM [EFTDB].[dbo].[tbl_ProtocolCommands] p Full JOIN tbl_Transactions t ON (p.TransactionID = t.TransactionID) + ,a.Protocol user_type + FROM [EFTDB].[dbo].[tbl_Transactions] t Full JOIN tbl_ProtocolCommands p ON (t.TransactionID = p.TransactionID) Full join tbl_Authentications a ON (t.TransactionID = a.TransactionID) WHERE p.Time_stamp > @stopTime""" [immutables] @@ -41,7 +66,10 @@ product_name = "EFT" product_version ="8.1.0.9" [output] +pushToplatform = true +dumpTojson = true filename ="./data.json" +token = "./.token" [logging] use_log = true diff --git a/inex.py b/inex.py index 4ac30ba..d9f75f0 100644 --- a/inex.py +++ b/inex.py @@ -10,6 +10,7 @@ from inexDataProcessing import processData import json import decimal import requests +import inexEncoder class Inex: def __init__(self): @@ -23,6 +24,7 @@ class Inex: self.tl = tomllib self.os = os self.j = json + self.e = inexEncoder.Encoder if self.os.path.exists('./config.toml'): config_file_path = './config.toml' @@ -46,6 +48,8 @@ class Inex: self.productVersion = self.config["immutables"]["product_version"] self.tokenFilepath = self.config["output"]["token"] self.selectedPlatform = self.config["fortraPlatform"]["selectedPlatform"] + self.writeJsonfile = self.config["output"]["dumpTojson"] + self.pushToplatform = self.config["output"]["pushToplatform"] if "dev" in self.selectedPlatform.lower(): self.platformConfig = self.config["fortraPlatform"]["dev"] @@ -53,34 +57,28 @@ class Inex: self.platformConfig = self.config["fortraPlatform"]["stage"] if "prod" in self.selectedPlatform.lower(): self.platformConfig = self.config["fortraPlatform"]["prod"] - print(self.platformConfig) + # print(self.platformConfig) #Setup logging inexLog(self) # create the connection to the database - # self.cursor = self.ic.connectDatabase(self, self.db, self.dbDriver, self.dbServer, self.dbDatabase, self.dbUser, self.dbPassword) + self.cursor = self.ic.connectDatabase(self, self.db, self.dbDriver, self.dbServer, self.dbDatabase, self.dbUser, self.dbPassword) - # self.data = self.ic.databaseQuery(self, self.cursor, self.dbQuery) + self.data = self.ic.databaseQuery(self, self.cursor, self.dbQuery) - # self.modifiedData = processData(self.data, dataTemplate, prd_instance_id=self.prdInstanceID,\ - # product_guid=self.productGUID,product_name=self.productName,product_version=self.productVersion) + self.modifiedData = processData(self.data, dataTemplate, prd_instance_id=self.prdInstanceID,\ + product_guid=self.productGUID,product_name=self.productName,product_version=self.productVersion) - # # TODO: move this to its own function - # if self.useLog: - # self.il.warning(f"Writing to '{self.outputFile}'.") + if self.pushToplatform: + inexConnect.fortraEFC.pushPayload(self) - # with open(self.outputFile, "w") as f: - # json.dump(self.modifiedData, f, indent = 2, cls=Encoder) - -# TODO: Move this class to it's own file -class Encoder(json.JSONEncoder): - def default(self, o): - if isinstance(o, decimal.Decimal): - return int(o) - if isinstance(o, datetime.datetime): - return str(o) - return super().default(o) + # TODO: move this to its own function + if self.useLog: + self.il.warning(f"Writing to '{self.outputFile}'.") + if self.writeJsonfile: + with open(self.outputFile, "w") as f: + self.j.dump(self.modifiedData, f, indent = 2, cls=self.e) # Run if __name__== "__main__": diff --git a/inexConnect.py b/inexConnect.py index c36fed0..0ea9542 100644 --- a/inexConnect.py +++ b/inexConnect.py @@ -42,21 +42,32 @@ def databaseQuery(self, cursor, query, args=()): return r class fortraEFC: - def __init__(self): + def getToken(self): + self.tokenData = self.r.post(self.platformConfig["idp"], data={"grant_type":"client_credentials",\ + "client_id": self.platformConfig["client_id"],\ + "client_secret": self.platformConfig["secret"],}) + def writeToken(self): + fortraEFC.getToken(self) + with open(self.tokenFilepath, "w") as f: + self.j.dump(self.tokenData.json(), f, indent = 2) + + def readToken(self): if self.os.path.exists(self.tokenFilepath): with open(self.tokenFilepath, 'rb') as t: - self.token = self.j.load(t) - print(self.token["access_token"]) + self.tokenData = self.j.load(t) + # print(self.tokenData["access_token"]) + else: + fortraEFC.writeToken(self) - def saveToken(self): - with open(self.tokenFilepath, "w") as f: - self.j.dump(self.tokenData, f, indent = 2) - - def getToken(self): - self.tokenData = self.r.post(self.platformConfig["idp"], headers={"client_id": self.platformConfig["client_id"],"client_secret": self.platformConfig["secret"]}) - def pushPayload(self): - url = f'{self.host}/api/v1/unity/data/{self.tenant_id}/machine_event' - pushPayloadResponse = self.r.post(self.platformConfig["efc_url"], headers={'Authorization': f'bearer {self.token["access_token"]}'},\ - payload=self.modifiedData) - return pushPayloadResponse.status_code \ No newline at end of file + fortraEFC.readToken(self) + try: + url = f'{self.platformConfig["efc_url"]}/api/v1/unity/data/{self.platformConfig["tenant_id"]}/machine_event' + pushPayloadResponse = self.r.post(url, headers={'Authorization': f'bearer {self.tokenData["access_token"]}'},\ + json=self.j.dumps(self.modifiedData,indent = 2, cls=self.e)) + return pushPayloadResponse.status_code + except self.r.exceptions.HTTPError as errh: + print ("Http Error:",errh) + if "401" in errh: + fortraEFC.writeToken(self) + fortraEFC.pushPayload(self) \ No newline at end of file diff --git a/inexDataProcessing.py b/inexDataProcessing.py index 2b7c2ee..00ceddd 100644 --- a/inexDataProcessing.py +++ b/inexDataProcessing.py @@ -28,7 +28,7 @@ def processData(data, template, **kwargs): user_type=identifyUserType(row.get('user_type')),\ user_domain=row.get('SiteName'),\ user_name=row.get('Actor'),\ - utype=row.get('TransactionObject'))) + utype=identifyUtype(row.get('TransactionObject')))) return processedData def identifyUserType(obj): @@ -38,4 +38,18 @@ def identifyUserType(obj): else: return "User" else: - return None \ No newline at end of file + return None +def identifyUtype(obj): + user_logged_on = [] + file_deleted = [] + file_uploaded = [] + file_downloaded = [] + + if obj in user_logged_on: + return "user_logged_on" + if obj in file_deleted: + return "file_deleted" + if obj in file_uploaded: + return "file_uploaded" + if obj in file_downloaded: + return "file_downloaded" \ No newline at end of file diff --git a/inexEncoder.py b/inexEncoder.py new file mode 100644 index 0000000..09ee3a9 --- /dev/null +++ b/inexEncoder.py @@ -0,0 +1,11 @@ +import json +import decimal +import datetime + +class Encoder(json.JSONEncoder): + def default(self, o): + if isinstance(o, decimal.Decimal): + return int(o) + if isinstance(o, datetime.datetime): + return int(o.timestamp() * 1000) + return super().default(o) \ No newline at end of file diff --git a/test.py b/test.py index 1d193f6..fb702bc 100644 --- a/test.py +++ b/test.py @@ -1,5 +1,12 @@ +import datetime + def connectDatabase(driver, server, database, user, password): connectionString = f'DRIVER={{{driver}}};SERVER={server};DATABASE={database};UID={user};PWD={password};TrustServerCertificate=yes' print(connectionString) -a = connectDatabase("ODBC Driver 18 for SQL Server","b","c","d","e") \ No newline at end of file +# a = connectDatabase("ODBC Driver 18 for SQL Server","b","c","d","e") + +def converttimestamp(t): + print(int(t.timestamp()* 1000)) + +a = converttimestamp(datetime.datetime(2024, 7, 23, 14, 26, 38, 214000)) \ No newline at end of file