#To define a particular parameter, replace the 'parameterName' inside itsm.getParameter('parameterName') with that parameter's name

import os
import shutil
import zipfile
import _winreg
import random
import string
import ctypes
import platform
import ssl
import re

def downloadFile(DownTo, fromURL, Ext=None):
    import urllib2
    try:
        fileName = fromURL.split('/')[-1]
        if Ext:
            DownTo = os.path.join(DownTo, fileName+Ext)
        else:
            DownTo = os.path.join(DownTo, fileName)
        request = urllib2.Request(fromURL, headers={'User-Agent' : "Magic Browser"})
        try:
            gcontext = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
            parsed = urllib2.urlopen(request,context=gcontext)
        except:
            parsed = urllib2.urlopen(request)
        with open(DownTo, 'wb') as f:
            f.write(parsed.read())
        if os.path.isfile(DownTo):
            return (DownTo)
    except:
        return 'Please Check %s or %s'%(fromURL, DownTo)


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)
                
def filezip(src_path,dest_path):
	with disable_file_system_redirection():
		with zipfile.ZipFile(src_path,"r") as zip_ref:
			zip_ref.extractall(dest_path)
			print 'file successfully unzipped'

def Download(path, URL):
    import urllib2
    import os
    print "Download started"
    fileName ="ccsetup561.exe"
    fp = os.path.join(path, fileName)
    request = urllib2.Request(URL, headers={'User-Agent' : "Magic Browser"})
    context = ssl._create_unverified_context()
    parsed = urllib2.urlopen(request,context=context)
    if os.path.exists(path):
        print "Path already exists"
    if not os.path.exists(path):
        os.makedirs(path)
        print "Path created"
    with open(fp, 'wb') as f:
        while True:
            chunk=parsed.read(100*1000*1000)
            if chunk:
                f.write(chunk)
            else:
                break
    print "The file downloaded successfully in specified path"
    return fp

def ecmd(CMD, r=False):  
    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 r:
        return ret
    else:            
        if ret==0:
            return out
        else:
            return ret

def deleteall(path):
    import shutil
    for root, dirs, files in os.walk(path, topdown=False):
        for name in files:
            f=os.path.join(root,name)
            try:
                os.remove(f)
            except:
                pass
        for name in dirs:
            p=os.path.join(root,name)
            try:
                shutil.rmtree(p)
            except:
                pass
    return '%s %s Cleared'%(path, str(20*'.'))

osdrive=os.environ['SYSTEMDRIVE']
i=0
fnlist=''
while True:
    tmp=str(random.randint(0,10))+random.choice(list(string.ascii_lowercase))
    fnlist+=tmp
    if i==3:
        break
    i+=1
os_temp=os.path.join(osdrive, os.sep, fnlist)
ecmd('mkdir %s'%(os_temp))
##--------------------------------------------------
print '.. Clears all Windows Temp Files ..'
print deleteall(os.environ['TEMP'])
rootpath=os.path.join(osdrive, os.sep, 'Users')
for namedirs in os.listdir(rootpath):
    if os.path.isdir(os.path.join(rootpath, namedirs)):
        temp_path=os.path.join(rootpath, namedirs, 'AppData', 'Local', 'Temp')
        if os.path.isdir(temp_path):
            print deleteall(temp_path)
##--------------------------------------------------
print '\n.. Clears all Internet Temp Files ..'
kill_firefox='taskkill /f /im firefox.exe'
kill_chrome='taskkill /f /im chrome.exe'
kill_ie='taskkill /f /im iexplore.exe'
kill_edge='taskkill /f /im msedge.exe'
try:
    ecmd(kill_firefox)
    ecmd(kill_chrome)
    ecmd(kill_ie)
    ecmd(kill_edge)
except:
    pass
for namedirs in os.listdir(rootpath):
    if os.path.isdir(os.path.join(rootpath, namedirs)):
        chrome_path=os.path.join(rootpath, namedirs, 'AppData', 'Local', 'Google', 'Chrome', 'User Data', 'Default', 'Cache')
        if os.path.isdir(chrome_path):
            print deleteall(chrome_path)
        firefox_path=os.path.join(rootpath, namedirs, 'AppData', 'Local', 'Mozilla', 'Firefox', 'Profiles')
        if os.path.isdir(firefox_path):
            print deleteall(firefox_path)
        edge_path=os.path.join(rootpath, namedirs, 'AppData', 'Local','Packages')    
        if os.path.isdir(edge_path):
            for i in os.listdir(edge_path):
                if re.findall("Microsoft.MicrosoftEdge_\w+",i)!=[]:
                    val=i
            new_edge_path=os.path.join(rootpath, namedirs, 'AppData', 'Local','Packages',val,'AC','Temp')
            print deleteall(new_edge_path)
    
ie_cache="RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8 "
ie=ecmd(ie_cache, True)
if ie==0:
    print 'IE Cache %s Cleared'%(20*'.')
else:
    print '%s %d Error on IE Cache'%(20*'.', ie)
##--------------------------------------------------
print '\n.. Disk Cleaning ..'
dc=ecmd('cleanmgr /sagerun:64', True)
if dc==0:
    print 'Disk %s Cleaned-up'%(20*'.')
else:
    print '%s %d Error on Disk Cleans-up'%(20*'.', dc)

AppName = "CCleaner"
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

import os
if CheckApp(AppName):
    print AppName+' is installed'
else:
    print AppName+' is not installed'

    #if 'PROGRAMW6432' in os.environ.keys():
    #    curl='https://patchportal.one-us.comodo.com/portal/packages/spm/CCleaner/x64/ccsetup561.exe'
    #else:
    #    curl='https://patchportal.one-us.comodo.com/portal/packages/spm/CCleaner/x86/ccsetup561.exe'
    curl='https://script-downloads.itarian.com/CCleaner/ccsetup587.exe'
    try:
        print "Downoading CCleaner" 
        fs = Download(os_temp, curl)
        print "Installing CCleaner"        
        cc=ecmd('"%s" /S'%fs, True)

    except Exception as e:
        print e
    
try:
    if 'PROGRAMW6432' in os.environ.keys():
        cc=ecmd('"C:\Program Files\CCleaner\CCleaner64.exe" /auto', True)
    else:
        cc=ecmd('"C:\Program Files\CCleaner\CCleaner.exe" /auto', True)
    if cc==0:
        print 'System %s Cleaned-up'%(20*'.')
    else:
        print '%s %d Error on System Cleans-up'%(20*'.', cc)

    print "Uninstallation of CCleaner has started"
    if os.path.isfile(r'%s\Program Files\CCleaner\uninst.exe'%osdrive):
        os.popen(r'"%s\Program Files\CCleaner\uninst.exe"/S'%osdrive).read()
        print "Uninstallation of CCleaner has finished"
        
except Exception as e:
        print e

##--------------------------------------------------
print '\n.. Defragmenting ..'

#if 'PROGRAMW6432' in os.environ.keys():
#    url='https://patchportal.one.comodo.com/portal/packages/spm/Auslogics Disk Defrag/x64/disk-defrag-setup_8.0.20.0.exe'
#else:
#    url='https://patchportal.one-us.comodo.com/portal/packages/spm/Auslogics Disk Defrag/x86/disk-defrag-setup_8.0.21.0.exe'
url='https://script-downloads.itarian.com/Auslogics_Disk_Defragmentation/auslogics-disk-defrag-setup.exe'    
ps=downloadFile(os_temp, url)
if os.path.exists(ps):
    p=downloadFile(os_temp, url)
else:
    print ps
    p = ''
if ecmd('"%s" /SP- /SUPPRESSMSGBOXES /VERYSILENT'%p, True)==0:
    ecmd('taskkill /f /im DiskDefrag.exe')
    if 'PROGRAMW6432' in os.environ.keys():
        command_path=os.path.join(os.environ['PROGRAMFILES(X86)'], 'Auslogics', 'Disk Defrag', 'cdefrag.exe')
        uninstall_path=os.path.join(os.environ['PROGRAMFILES(X86)'], 'Auslogics', 'Disk Defrag', 'unins000.exe')
    else:
        command_path=os.path.join(os.environ['PROGRAMFILES'], 'Auslogics', 'Disk Defrag', 'cdefrag.exe')
        uninstall_path=os.path.join(os.environ['PROGRAMFILES'], 'Auslogics', 'Disk Defrag', 'unins000.exe')
    code={0:'Success', 1:'Error defragmenting one or more disks.', 2:'Administrator access rights are required to defragment disks.', 3:'The command line parameters are invalid.', 4:'Defragmentation was cancelled by user.', 5:'Unsupported Windows version.', 6:'Error creating log file.', 7:'Another instance is already running.', 8:'Low free space on the disk.', 9:'The computer has been turned off or rebooted.'}
    print 'Defragmenting %s %s'%(20*'.', code[ecmd('"%s" -all -quiet -f'%command_path, True)])
    ecmd('"%s" /VERYSILENT /SUPPRESSMSGBOXES'%uninstall_path)
    pp=os.sep.join(command_path.split(os.sep)[:3])
    if os.path.isdir(pp):
        try:
            shutil.rmtree(pp)
        except:
            pass 
    os.remove(p)

##--------------------------------------------------
print '\n.. Fixing Disk Errors (All Unremovable Disks) ..'
dl=ecmd('wmic logicaldisk where drivetype=3 get name')
dls=[i.strip() for i in dl.split('\n') if i.strip()][1:]
df=ecmd('for %%i in (%s) do echo y | chkdsk %%i /f'%(' '.join(dls)), True)
if df==0 or df==3:
    for i in dls:
        if i==os.getenv('SYSTEMDRIVE'):
            print 'Disk Error Fixing %s Will Start on Booting the Computer for %s (OS Drive)'%(20*'.', i)
        else:
            print 'Disk Error Fixing %s Completed for %s'%(20*'.', i)
else:
    print '%s %d Error on Fixing Disk Errors'%(20*'.', df)
##--------------------------------------------------
print '\n.. Clear Printer Spool (Queuing Printer Jobs) ..'
sp=ecmd('net stop spooler', True)
if sp==0:
    cl=ecmd('del %systemroot%\System32\spool\printers\* /Q', True)
    if cl==0:
        print 'Printer Spool %s Cleared'%(20*'.')
    else:
        print '%s %d Error on Printer Spool Cleaning'%(20*'.', cl)
    ecmd('net start spooler')
##--------------------------------------------------
df=ecmd('ipconfig /flushdns', True)
if df==0:
    print '\nDNS Cache %s Cleared'%(20*'.')
else:
    print '\n%s %d Error on DNS Cache Clearing'%(20*'.', df)
ir=ecmd('ipconfig /release', True)
if ir==0:
    print 'IP %s Released'%(20*'.')
else:
    print '%s %d Error on IP Release'%(20*'.', ir)
ire=ecmd('ipconfig /renew', True)
if ire==0:
    print 'IP %s Renewed'%(20*'.')
else:
    print '%s %d Error on IP Renew'%(20*'.', ire)
rc=ecmd('rd /s /q %systemdrive%\$Recycle.bin', True)
if rc==0:
    print 'Recycle Bin %s Cleared'%(20*'.')
##--------------------------------------------------


keyVal = r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore'

os_type = ecmd('systeminfo | findstr "Server"')

if os_type:
    pass

else:
    if 'PROGRAMFILES(X86)' in os.environ.keys():
        key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,keyVal, 0, _winreg.KEY_WOW64_64KEY|_winreg.KEY_ALL_ACCESS)
        _winreg.SetValueEx(key, "SystemRestorePointCreationFrequency", 0,_winreg.REG_DWORD,0)
        
    else:
        key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,keyVal, 0, _winreg.KEY_ALL_ACCESS)
        _winreg.SetValueEx(key, "SystemRestorePointCreationFrequency", 0,_winreg.REG_DWORD,0)


if ecmd('WMIC /Namespace:\\root\default Path SystemRestore Call CreateRestorePoint "BY COMODO ITSM %DATE% %TIME%", 100, 12', True)==0:
    print ecmd('POWERSHELL Get-ComputerRestorePoint')

try:
    if os.path.exists(keyVal):
        _winreg.DeleteValue(key, 'SystemRestorePointCreationFrequency')
        _winreg.CloseKey(key)

except:
    pass

print '\n.. Smart Check for all Disk Drives ..'
print ecmd('wmic diskdrive get status')
shutil.rmtree(os_temp)


