import os import subprocess import time import _winreg def get_scribus_uninstallers(): uninstall_key = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" locations = [ (_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 locations: try: reg = _winreg.OpenKey( root, uninstall_key, 0, _winreg.KEY_READ | view ) except: continue index = 0 while True: try: subkey = _winreg.EnumKey(reg, index) index += 1 except: break try: app_key = _winreg.OpenKey( root, uninstall_key + "\\" + subkey, 0, _winreg.KEY_READ | view ) try: display_name = _winreg.QueryValueEx( app_key, "DisplayName" )[0] except: display_name = "" if display_name and "scribus" in display_name.lower(): try: uninstall_string = _winreg.QueryValueEx( app_key, "UninstallString" )[0] except: uninstall_string = "" if uninstall_string: if uninstall_string not in uninstallers: uninstallers.append(uninstall_string) _winreg.CloseKey(app_key) except: pass try: _winreg.CloseKey(reg) except: pass return uninstallers def uninstall_old_scribus(): uninstallers = get_scribus_uninstallers() if not uninstallers: print "No old Scribus version found." return True # Close Scribus subprocess.call( "taskkill /F /T /IM scribus.exe", shell=True ) time.sleep(3) for uninstall in uninstallers: # Remove existing quotes uninstall = uninstall.strip().strip('"') # Correct command for paths containing spaces command = '"' + uninstall + '" /S' print "Uninstalling Scribus: " + command try: process = subprocess.Popen( command, shell=True ) # IMPORTANT: # Wait until uninstaller completely finishes result = process.wait() except: print "Unable to execute Scribus uninstaller." return False print "Uninstaller return code: " + str(result) if result not in [0, 3010, 1641]: print "Scribus uninstall failed." return False print "Scribus uninstaller completed." # Give Windows time to update registry/files time.sleep(10) # Verify old Scribus is really removed for retry in range(6): remaining = get_scribus_uninstallers() if not remaining: print "Old Scribus version removed successfully." return True print "Old Scribus still detected. Waiting..." time.sleep(5) print "Old Scribus version could not be removed." return False def spm_install(dir, args): try: os.chdir(dir) print "Starting Scribus installation..." result = subprocess.call( args, cwd=dir, shell=True ) print "retcode" + str(result) + "retcode" except: print "retcode1retcode" def spm_uninstall(dir, args): try: if uninstall_old_scribus(): print "retcode0retcode" else: print "retcode1retcode" except: print "retcode1retcode" def spm_update(dir, args): print "Starting Scribus update..." # ----------------------------------------- # Step 1: Remove old Scribus # ----------------------------------------- if not uninstall_old_scribus(): print "Old Scribus version could not be removed." print "New version installation cancelled." print "retcode1retcode" return # ----------------------------------------- # Step 2: Extra wait # ----------------------------------------- time.sleep(5) # ----------------------------------------- # Step 3: Install new Scribus # ----------------------------------------- try: os.chdir(dir) print "Installing new Scribus version..." print "Install command: " + args 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." print "Return code: " + str(result) print "retcode" + str(result) + "retcode" except: print "New Scribus installation failed." print "retcode1retcode"