import os import subprocess import time import _winreg def get_scribus_uninstallers(): key_path = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" roots = [ (_winreg.HKEY_LOCAL_MACHINE, 0), (_winreg.HKEY_LOCAL_MACHINE, _winreg.KEY_WOW64_32KEY), (_winreg.HKEY_LOCAL_MACHINE, _winreg.KEY_WOW64_64KEY), (_winreg.HKEY_CURRENT_USER, 0), (_winreg.HKEY_CURRENT_USER, _winreg.KEY_WOW64_32KEY), (_winreg.HKEY_CURRENT_USER, _winreg.KEY_WOW64_64KEY) ] uninstallers = [] for root, view in roots: try: reg = _winreg.OpenKey( root, key_path, 0, _winreg.KEY_READ | view ) except: continue i = 0 while True: try: subkey = _winreg.EnumKey(reg, i) i += 1 except: break try: app = _winreg.OpenKey( root, key_path + "\\" + subkey, 0, _winreg.KEY_READ | view ) try: name = _winreg.QueryValueEx( app, "DisplayName" )[0] except: name = "" if name and "scribus" in name.lower(): try: uninstall = _winreg.QueryValueEx( app, "UninstallString" )[0] except: uninstall = "" if uninstall and uninstall not in uninstallers: uninstallers.append(uninstall) _winreg.CloseKey(app) except: pass try: _winreg.CloseKey(reg) except: pass return uninstallers def uninstall_scribus(): uninstallers = get_scribus_uninstallers() if not uninstallers: print "No existing Scribus installation found." return True # Close Scribus if running subprocess.call( "taskkill /F /T /IM scribus.exe", shell=True ) time.sleep(3) for uninstall in uninstallers: # Remove existing quotes first uninstall = uninstall.strip().strip('"') # Correctly quote paths containing spaces command = '"' + uninstall + '" /S' print "Uninstalling Scribus: " + command try: result = subprocess.call( command, shell=True ) except: print "Unable to execute Scribus uninstaller." return False if result not in [0, 3010, 1641]: print "Scribus uninstall failed: " + str(result) return False print "Scribus uninstall completed." # Give uninstaller time to update registry time.sleep(5) # Verify if get_scribus_uninstallers(): print "Scribus is still installed." return False print "All old Scribus versions removed." return True def spm_install(dir, args): try: os.chdir(dir) result = subprocess.call( args, cwd=dir, shell=True ) print "retcode" + str(result) + "retcode" except: print "retcode1retcode" def spm_uninstall(dir, args): if uninstall_scribus(): print "retcode0retcode" else: print "retcode1retcode" def spm_update(dir, args): print "Starting Scribus update..." # ----------------------------------------- # Remove old Scribus version(s) # ----------------------------------------- if not uninstall_scribus(): print "Old Scribus version could not be removed." print "New version will not be installed." print "retcode1retcode" return # ----------------------------------------- # Install new Scribus version # ----------------------------------------- time.sleep(3) try: os.chdir(dir) print "Installing new Scribus version..." result = subprocess.call( args, cwd=dir, shell=True ) if result in [0, 3010, 1641]: print "New Scribus version installed successfully." print "retcode0retcode" else: print "New Scribus installation failed: " + str(result) print "retcode" + str(result) + "retcode" except: print "New Scribus installation failed." print "retcode1retcode"