# Path: appAux.py
# def loadFile(file_fullpath, max_chunk_size = 0):
#     """Abstracts loading a regular file and a file from within a zip archive.
#     Args:
#         file_fullpath (str): Full path to file to load
#         max_chunk_size (int): maximum number of bytes to be read from the file
#     Returns:
#         file_pointer (StringIO): Data read from fileFullPath
#     """
#     global zipCache
#     global zipCache_hits
#     global zipCache_misses
#     logger.debug("Loading file %s" % file_fullpath)
#     if ".zip/" in file_fullpath:
#         m = re.match(r'^((?:.*)\.zip)[\\/](.*)$', file_fullpath)
#         if m:
#             zip_container = m.group(1)
#             if m.lastindex > 1:
#                 file_fullpath_unprocessed = m.group(2)
#                 if '.zip' in file_fullpath_unprocessed:
#                     m = re.match(r'^(.*)(?:\.zip[\\/](.*))*$', file_fullpath_unprocessed)
#                     if m:
#                         zip_container_relative_path = m.group(1)
#                         if m.lastindex > 1:
#                             file_fullpath_unprocessed = m.group(2)
#                         else:
#                             file_fullpath_unprocessed = None
#                     else:
#                         logger.error("Issue extracting container and relative path from ZIP file: %s" % file_fullpath)
#                 else:
#                     zip_container_relative_path = file_fullpath_unprocessed
# 
#                 # If not in the zipCache we add it
#             if zip_container not in zipCache:
#                 zipCache_misses +=1
#                 if zipfile.is_zipfile(loadFile(zip_container)):
#                     zipCache[zip_container] = zipfile.ZipFile(loadFile(zip_container))
#                 else:
#                     logger.error("Invalid ZIP file found: %s" % file_fullpath)
#                     return None
#             else:
#                 zipCache_hits += 1
#                 # print("ZipCache hits / misses: %d/%d" % (zipCache_hits, zipCache_misses))
# 
#             # Extract file_pointer from zip:
#             file_pointer = StringIO(zipCache[zip_container].read(zip_container_relative_path))
#             if max_chunk_size != 0:
#                 file_pointer = StringIO(file_pointer.read(max_chunk_size))
# 
#         else:
#             logger.error("Issue extracting container and relative path from ZIP file: %s" % file_fullpath)
#     else:
#             # Extract file_pointer:
#             input_file = open(file_fullpath, 'rb')
#             if max_chunk_size == 0:
#                 file_pointer = StringIO(input_file.read())
#             else: file_pointer = StringIO(input_file.read(max_chunk_size))
#     assert(file_pointer is not None)
# 
#     logger.debug("Read %d bytes [%s]" % (getFileSize(file_pointer), toHex(file_pointer.read(20))))
#     # Return file pointer to pos 0
#     file_pointer.seek(0, 0)
# 
#     return file_pointer


import settings
import logging
import ntpath
import csv
import sys, os
from ingest import Ingest
from appAux import loadFile
from datetime import datetime
    delimiter = ',',
    quotechar = '"',
    doublequote = True,
    skipinitialspace = True,
    lineterminator = '\r\n',
    quoting = csv.QUOTE_MINIMAL)

class Appcompat_csv(Ingest):
    ingest_type = "appcompat_csv"
    file_name_filter = "(?:.*)(?:\/|\\\)(.*)\.csv$"

    def __init__(self):
        super(Appcompat_csv, self).__init__()

    def checkMagic(self, file_name_fullpath):
        # Check magic
        magic_id = self.id_filename(file_name_fullpath)
        if 'ShimCacheParser CSV' in magic_id:
            file_object = loadFile(file_name_fullpath)
            header = file_object.readline().strip()
            if header == "Last Modified,Last Update,Path,File Size,Exec Flag":
                return True
        return False

    def processFile(self, file_fullpath, hostID, instanceID, rowsData):
        rowNumber = 0
        rowValid = True
        minSQLiteDTS = datetime(1, 1, 1, 0, 0, 0)
        maxSQLiteDTS = datetime(9999, 12, 31, 0, 0, 0)


# Path: appAux.py
# def loadFile(file_fullpath, max_chunk_size = 0):
#     """Abstracts loading a regular file and a file from within a zip archive.
#     Args:
#         file_fullpath (str): Full path to file to load
#         max_chunk_size (int): maximum number of bytes to be read from the file
#     Returns:
#         file_pointer (StringIO): Data read from fileFullPath
#     """
#     global zipCache
#     global zipCache_hits
#     global zipCache_misses
#     logger.debug("Loading file %s" % file_fullpath)
#     if ".zip/" in file_fullpath:
#         m = re.match(r'^((?:.*)\.zip)[\\/](.*)$', file_fullpath)
#         if m:
#             zip_container = m.group(1)
#             if m.lastindex > 1:
#                 file_fullpath_unprocessed = m.group(2)
#                 if '.zip' in file_fullpath_unprocessed:
#                     m = re.match(r'^(.*)(?:\.zip[\\/](.*))*$', file_fullpath_unprocessed)
#                     if m:
#                         zip_container_relative_path = m.group(1)
#                         if m.lastindex > 1:
#                             file_fullpath_unprocessed = m.group(2)
#                         else:
#                             file_fullpath_unprocessed = None
#                     else:
#                         logger.error("Issue extracting container and relative path from ZIP file: %s" % file_fullpath)
#                 else:
#                     zip_container_relative_path = file_fullpath_unprocessed
# 
#                 # If not in the zipCache we add it
#             if zip_container not in zipCache:
#                 zipCache_misses +=1
#                 if zipfile.is_zipfile(loadFile(zip_container)):
#                     zipCache[zip_container] = zipfile.ZipFile(loadFile(zip_container))
#                 else:
#                     logger.error("Invalid ZIP file found: %s" % file_fullpath)
#                     return None
#             else:
#                 zipCache_hits += 1
#                 # print("ZipCache hits / misses: %d/%d" % (zipCache_hits, zipCache_misses))
# 
#             # Extract file_pointer from zip:
#             file_pointer = StringIO(zipCache[zip_container].read(zip_container_relative_path))
#             if max_chunk_size != 0:
#                 file_pointer = StringIO(file_pointer.read(max_chunk_size))
# 
#         else:
#             logger.error("Issue extracting container and relative path from ZIP file: %s" % file_fullpath)
#     else:
#             # Extract file_pointer:
#             input_file = open(file_fullpath, 'rb')
#             if max_chunk_size == 0:
#                 file_pointer = StringIO(input_file.read())
#             else: file_pointer = StringIO(input_file.read(max_chunk_size))
#     assert(file_pointer is not None)
# 
#     logger.debug("Read %d bytes [%s]" % (getFileSize(file_pointer), toHex(file_pointer.read(20))))
#     # Return file pointer to pos 0
#     file_pointer.seek(0, 0)
# 
#     return file_pointer


# Path: Ingest/appcompat_csv.py
import settings
import logging
import ntpath
import csv
import sys, os
from ingest import Ingest
from appAux import loadFile
from datetime import datetime

    delimiter = ',',
    quotechar = '"',
    doublequote = True,
    skipinitialspace = True,
    lineterminator = '\r\n',
    quoting = csv.QUOTE_MINIMAL)

class Appcompat_csv(Ingest):
    ingest_type = "appcompat_csv"
    file_name_filter = "(?:.*)(?:\/|\\\)(.*)\.csv$"

    def __init__(self):
        super(Appcompat_csv, self).__init__()

    def checkMagic(self, file_name_fullpath):
        # Check magic
        magic_id = self.id_filename(file_name_fullpath)
        if 'ShimCacheParser CSV' in magic_id:
            file_object = loadFile(file_name_fullpath)
            header = file_object.readline().strip()
            if header == "Last Modified,Last Update,Path,File Size,Exec Flag":
                return True
        return False

    def processFile(self, file_fullpath, hostID, instanceID, rowsData):
        rowNumber = 0
        rowValid = True
        minSQLiteDTS = datetime(1, 1, 1, 0, 0, 0)
        maxSQLiteDTS = datetime(9999, 12, 31, 0, 0, 0)


        file_object = loadFile(file_fullpath)