import os import shutil import subprocess import _winreg import time import glob # --------------------------------------------------------- # Safe folder deletion # --------------------------------------------------------- def safe_rmtree(path): try: if os.path.exists(path): shutil.rmtree(path, ignore_errors=True) except: pass # --------------------------------------------------------- # Safe delete matching files # --------------------------------------------------------- def safe_delete(pattern): try: for f in glob.glob(pattern): try: os.remove(f) except: pass except: pass # --------------------------------------------------------- # Delete registry key tree # --------------------------------------------------------- def delete_reg_tree(root, path): try: key = _winreg.OpenKey(root, path, 0, _winreg.KEY_ALL_ACCESS) except: return while True: try: sub = _winreg.EnumKey(key, 0) delete_reg_tree(root, path + "\\" + sub) except: break try: _winreg.CloseKey(key) except: pass try: _winreg.DeleteKey(root, path) except: pass # --------------------------------------------------------- # Remove Opera uninstall keys # --------------------------------------------------------- def remove_opera_reg_entries(): locations = [ r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", r"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" ] for root in (_winreg.HKEY_LOCAL_MACHINE, _winreg.HKEY_CURRENT_USER): for base in locations: try: key = _winreg.OpenKey(root, base) except: continue i = 0 while True: try: sub = _winreg.EnumKey(key, i) i += 1 except: break sub_path = base + "\\" + sub try: sk = _winreg.OpenKey(root, sub_path) try: name, _ = _winreg.QueryValueEx(sk, "DisplayName") except: _winreg.CloseKey(sk) continue _winreg.CloseKey(sk) if "Opera" in name: delete_reg_tree(root, sub_path) except: pass try: _winreg.CloseKey(key) except: pass # --------------------------------------------------------- # Check if Opera still exists # --------------------------------------------------------- def opera_exists(): # Check folders folders = [ r"C:\Program Files\Opera", r"C:\Program Files (x86)\Opera", os.path.expandvars(r"%LOCALAPPDATA%\Programs\Opera") ] for f in folders: if os.path.exists(f): return True # Check uninstall entries locations = [ r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", r"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" ] for root in (_winreg.HKEY_LOCAL_MACHINE, _winreg.HKEY_CURRENT_USER): for base in locations: try: key = _winreg.OpenKey(root, base) except: continue i = 0 while True: try: sub = _winreg.EnumKey(key, i) i += 1 except: break try: sk = _winreg.OpenKey(root, base + "\\" + sub) try: name, _ = _winreg.QueryValueEx(sk, "DisplayName") except: _winreg.CloseKey(sk) continue _winreg.CloseKey(sk) if "Opera" in name: return True except: pass try: _winreg.CloseKey(key) except: pass return False # --------------------------------------------------------- # FORCE UNINSTALL (NO UAC, NO GUI, 100% SILENT) # --------------------------------------------------------- def spm_uninstall(dir, args): # Kill Opera processes try: subprocess.call("taskkill /IM opera.exe /F", shell=True) except: pass try: subprocess.call("taskkill /IM launcher.exe /F", shell=True) except: pass try: subprocess.call("taskkill /IM opera_autoupdate.exe /F", shell=True) except: pass # Remove installation folders safe_rmtree(r"C:\Program Files\Opera") safe_rmtree(r"C:\Program Files (x86)\Opera") safe_rmtree(os.path.expandvars(r"%LOCALAPPDATA%\Programs\Opera")) # Remove Desktop shortcuts safe_delete(r"C:\Users\Public\Desktop\*Opera*.lnk") try: users = r"C:\Users" for u in os.listdir(users): safe_delete(os.path.join(users, u, "Desktop", "*Opera*.lnk")) except: pass # Remove Start Menu shortcuts safe_delete(r"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\*Opera*.lnk") try: users = r"C:\Users" for u in os.listdir(users): path = os.path.join( users, u, r"AppData\Roaming\Microsoft\Windows\Start Menu\Programs" ) safe_delete(os.path.join(path, "*Opera*.lnk")) except: pass # Remove registry uninstall entries remove_opera_reg_entries() time.sleep(3) # FINAL RESULT if opera_exists(): print "retcode1retcode" else: print "retcode0retcode" # --------------------------------------------------------- # INSTALL # --------------------------------------------------------- def spm_install(dir, args): try: os.chdir(dir) subprocess.check_call(args.split()) print "retcode0retcode" except subprocess.CalledProcessError as e: print "retcode" + str(e.returncode) + "retcode" # --------------------------------------------------------- # UPDATE # --------------------------------------------------------- def spm_update(dir, args): try: os.chdir(dir) subprocess.check_call(args.split()) print "retcode0retcode" except subprocess.CalledProcessError as e: print "retcode" + str(e.returncode) + "retcode"