#To define a particular parameter, replace the 'parameterName' inside itsm.getParameter('parameterName') with that parameter's name
v=1 #(Provide values for v as per the requirement i.e, v = 1 or 2 or 3
##option v=1, for deleting the orphaned files
##option v=2, for moving the orphaned files to the default location i.e, "C:\\Program Files (x86)\\HomeDev\\PatchCleaner\\PatchCleanerBackup" or "C:\\Program Files\\HomeDev\\PatchCleaner\\PatchCleanerBackup"
##option v=3, for moving the orphaned files to the specified location , i.e, path_extract='C:\ProgramData' for value v=3,
##Note:
##Provide path_extract location,for v=3

path_extract='C:\ProgramData'

import urllib
import os
import ssl
import shutil
import subprocess
import time
import threading
import time
import urllib2

ssl._create_default_https_context = ssl._create_unverified_context
temp_path=os.environ['PROGRAMDATA']+r'\c1_temp'

if not os.path.exists(temp_path):
    os.makedirs(temp_path)

def ExecuteCMD(CMD, OUT = False):
    import ctypes
    class disable_file_system_redirection:
        _disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection
        _revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection
        def __enter__(self):
            self.old_value = ctypes.c_long()
            self.success = self._disable(ctypes.byref(self.old_value))
        def __exit__(self, type, value, traceback):
            if self.success:
                self._revert(self.old_value)
    from subprocess import PIPE, Popen
    with disable_file_system_redirection():
        OBJ = Popen(CMD, shell = True, stdout = PIPE, stderr = PIPE)
        out, err = OBJ.communicate()
        RET = OBJ.returncode
        if RET == 0:
            if OUT == True:
                if out != '':
                    return True
                else:
                    return True
            else:
                return True
            return False

def CheckApp(AppName):
    import _winreg
    import os
    AppName = AppName.lower()
    def DNDS(rtkey, pK, kA):
        ln = []
        lv = []
        try:
            oK = _winreg.OpenKey(rtkey, pK, 0, kA)
            i = 0
            while True:
                try:
                    bkey = _winreg.EnumKey(oK, i)
                    vkey = os.path.join(pK, bkey)
                    oK1 = _winreg.OpenKey(rtkey, vkey, 0, kA)
                    try:
                        tls = []
                        DN, bla = _winreg.QueryValueEx(oK1, 'DisplayName')
                        DV, bla = _winreg.QueryValueEx(oK1, 'DisplayVersion')
                        _winreg.CloseKey(oK1)
                        ln.append(DN)
                        lv.append(DV)
                    except:
                        pass
                    i += 1
                except:
                    break
            _winreg.CloseKey(oK)
            return zip(ln, lv)
        except:
            return zip(ln, lv)

    rK = _winreg.HKEY_LOCAL_MACHINE
    sK = r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'
    openedKey = _winreg.OpenKey(rK, sK, 0, _winreg.KEY_READ)
    arch, bla = _winreg.QueryValueEx(openedKey, 'PROCESSOR_ARCHITECTURE')
    arch = str(arch)
    _winreg.CloseKey(openedKey)

    if arch == 'AMD64':
        fList = DNDS(_winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', _winreg.KEY_WOW64_32KEY | _winreg.KEY_READ)
        fList.extend(DNDS(_winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', _winreg.KEY_WOW64_64KEY | _winreg.KEY_READ))
        fList.extend(DNDS(_winreg.HKEY_CURRENT_USER, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', _winreg.KEY_WOW64_32KEY | _winreg.KEY_READ))
        fList.extend(DNDS(_winreg.HKEY_CURRENT_USER, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', _winreg.KEY_WOW64_64KEY | _winreg.KEY_READ))
    else:
        fList = DNDS(_winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', _winreg.KEY_READ)
        fList.extend(DNDS(_winreg.HKEY_CURRENT_USER, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', _winreg.KEY_READ))
    fList = set(fList)

    lr = []
    rs = 0
    for i in fList:
        a, b = i
        if AppName in a.lower():
            lr.append('success: {} is installed'.format(a))
            lr.append('{:<25}{:5}'.format(a, b))
            rs += 1
        else:
            rs += 0
    if rs:
        return True
    return False


val=CheckApp('PatchCleaner')
val1=CheckApp('7-Zip')

def CheckApp_1(AppName):
    import _winreg
    import os
    AppName = AppName.lower()
    def DNDS(rtkey, pK, kA):
        ln = []
        lv = []
        lu = []
        try:
            oK = _winreg.OpenKey(rtkey, pK, 0, kA)
            i = 0
            while True:
                try:
                    bkey = _winreg.EnumKey(oK, i)
                    vkey = os.path.join(pK, bkey)
                    oK1 = _winreg.OpenKey(rtkey, vkey, 0, kA)
                    try:
                        tls = []
                        DN, bla = _winreg.QueryValueEx(oK1, 'DisplayName')
                        DV, bla = _winreg.QueryValueEx(oK1, 'DisplayVersion')
                        DU, bla = _winreg.QueryValueEx(oK1, 'UninstallString')
                        _winreg.CloseKey(oK1)
                        ln.append(DN)
                        lv.append(DV)
                        lu.append(DU)
                    except:
                        pass
                    i += 1
                except:
                    break
            _winreg.CloseKey(oK)
            return zip(ln, lv, lu)
        except:
            return zip(ln, lv, lu)

    rK = _winreg.HKEY_LOCAL_MACHINE
    sK = r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'
    openedKey = _winreg.OpenKey(rK, sK, 0, _winreg.KEY_READ)
    arch, bla = _winreg.QueryValueEx(openedKey, 'PROCESSOR_ARCHITECTURE')
    arch = str(arch)
    _winreg.CloseKey(openedKey)

    if arch == 'AMD64':
        fList = DNDS(_winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', _winreg.KEY_WOW64_32KEY | _winreg.KEY_READ)
        fList.extend(DNDS(_winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', _winreg.KEY_WOW64_64KEY | _winreg.KEY_READ))
        fList.extend(DNDS(_winreg.HKEY_CURRENT_USER, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', _winreg.KEY_WOW64_32KEY | _winreg.KEY_READ))
        fList.extend(DNDS(_winreg.HKEY_CURRENT_USER, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', _winreg.KEY_WOW64_64KEY | _winreg.KEY_READ))
    else:
        fList = DNDS(_winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', _winreg.KEY_READ)
        fList.extend(DNDS(_winreg.HKEY_CURRENT_USER, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', _winreg.KEY_READ))
    fList = set(fList)

    lr = []
    rs = 0
    for i in fList:
        a, b, c = i
        if '7-Zip' in a:
            return c


def patch_cleaner(temp_path):
    URL='http://script-downloads.comodo.com/PatchCleaner/PatchCleaner_1.4.2.0.exe'
    if os.path.exists(temp_path):
        fn = 'PatchCleaner_1.4.2.0.exe'
        fp = os.path.join(temp_path, fn)
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
        context = ssl._create_unverified_context()
        request = urllib2.Request(URL, headers=headers)
        req = urllib2.urlopen(request,context=context)
        try:
            with open(fp, 'wb') as f:
                try:
                    while True:
                        chunk = req.read(100*1000*1000)
                        if chunk:
                            f.write(chunk)
                        else:
                            break
                    time.sleep(20)
                except Exception as e:
                    print e
        except Exception as e:
            print e
    else:
        return 'No path: '+temp_path+' is exist'
    

if 'PROGRAMW6432' in os.environ.keys():
    URL=r'http://script-downloads.comodo.com/7-zip/7z1805-x64.exe'

else:
    URL=r'http://script-downloads.comodo.com/7-zip/7z1805.exe'

if 'PROGRAMW6432' in os.environ.keys():
    app_path=r"C:\\Program Files (x86)\\HomeDev\\PatchCleaner"
    app_path_1=r"C:\\Program Files (x86)\\HomeDev\\PatchCleaner\\PatchCleanerBackup"

else:
    app_path=r"C:\\Program Files\\HomeDev\\PatchCleaner"
    app_path_1=r"C:\Program Files)\\HomeDev\\PatchCleaner\\PatchCleanerBackup"


def extract(temp_path, URL, sCMD='/S'):
    if os.path.exists(temp_path):
        fn = '7zip.exe'
        fp = os.path.join(temp_path, fn)
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
        context = ssl._create_unverified_context()
        request = urllib2.Request(URL, headers=headers)
        req = urllib2.urlopen(request,context=context)
        try:
            with open(fp, 'wb') as f:
                try:
                    while True:
                        chunk = req.read(100*1000*1000)
                        if chunk:
                            f.write(chunk)
                        else:
                            break
                except Exception as e:
                    print e
        except Exception as e:
            print e
        try:
            os.popen(fp+' '+sCMD).read()
            return 'Great! Successfully Installed'
        except Exception as e:
            return e
    else:
        return 'No path: '+temp_path+' is exist'

if val == False:
    print "Patch Cleaner not installed in your endpoint..."
    patch_cleaner(temp_path)
    
if val1 == True:
    if os.path.exists('C:\\Program Files (x86)\\7-Zip'):
        zip_path='C:\\Program Files (x86)\\7-Zip'
    else:
        zip_path='C:\\Program Files\\7-Zip'

if val1 == False:
    extract(temp_path, URL, sCMD='/S')
    if os.path.exists('C:\\Program Files (x86)\\7-Zip'):
        zip_path='C:\\Program Files (x86)\\7-Zip'
    else:
        zip_path='C:\\Program Files\\7-Zip'

src_files=os.listdir(zip_path)
for fileName in src_files:
    full_file_name = os.path.join(zip_path, fileName)
    if (os.path.isfile(full_file_name)):
        shutil.copy(full_file_name, temp_path)

os.chdir(temp_path)
cmd=os.popen('7z.exe  x PatchCleaner_1.4.2.0.exe -aoa').read()

if os.path.isfile('C:\ProgramData\c1_temp\PatchCleaner.msi'):
    os.chdir(temp_path)
    os.popen('msiexec /i PatchCleaner.msi /qn')
    
val_1=CheckApp('PatchCleaner')
def start_patch_process():
    if val_1 == True:
        app=app_path+'\PatchCleaner.exe'
        print "PatchCleaner installed and operation will be performing as per the request..."
        if v == 1:
            print "Deleting orphaned Files.."
            os.chdir(app_path)
            cmd='"'+app+'"'+' /d'
        if v == 2:
            print "Moving files to default location as: "+app_path_1
            os.chdir(app_path)
            cmd='"'+app+'"'+' /m'
        if v == 3:
            print "Moving file to specified location as: "+path_extract
            os.chdir(app_path)
            cmd='"'+app+'"'+' /m '+ path_extract
        
        try:
            ping = subprocess.Popen(str(cmd))

        except:
            print "There is no orphaned Files in your endpoint..."
            pass


def stop_patch_process():
    time.sleep(90)
    ExecuteCMD('taskkill /IM PatchCleaner.exe /F')
    val_2=CheckApp('7-Zip')

    if val1 and val_2 is True:
        pass

    else:
        v=CheckApp_1('7-Zip')
        silent=" /S"
        v1=str(v)+silent
        ping = subprocess.Popen(str(v1))

    try:
        shutil.rmtree(temp_path)
    except:
        pass


if __name__ == "__main__":
    t1 = threading.Thread(target=start_patch_process) 
    t2 = threading.Thread(target=stop_patch_process) 
    t1.start() 
    t2.start()
    t1.join()
    t2.join()
