import subprocess, os, time, sys, os.path, shutil, re try: log_file = open('sb-update.log', 'w') except: print "Unable to open sb-update.log, not saving output" log_file = None def log(string): if log_file: log_file.write(string+'\n') print string def isProcRunning(pid): """See if a pid is running or not""" tasklist_cmd = 'tasklist /FI "PID eq '+str(pid)+'" /FO CSV' p = subprocess.Popen(tasklist_cmd, stdout=subprocess.PIPE) out, err = p.communicate() results = out.split('\r\n') regex = '".*\\.exe","'+str(pid)+'",("[^"]*",?){3}' for cur_line in results: if re.match(regex, cur_line, re.I): return True return False if len(sys.argv) < 3: log("Invalid call.") sys.exit() try: # this should be retrieved from sys.args pid = sys.argv[1] # process to re-launch sb_executable = sys.argv[2:] sb_closed = False # try 15 times to make sure it's closed for i in range(15): isRunning = isProcRunning(pid) if isRunning: time.sleep(5) continue else: sb_closed = True break if not sb_closed: log("SickGear didn't close, unable to update. You'll have to manually restart it.") sys.exit() sb_root = os.path.dirname(sb_executable[0]) sb_update_dir = os.path.join(sb_root, 'sb-update') # do the update if applicable if os.path.isdir(sb_update_dir): # find update dir name update_dir_contents = os.listdir(sb_update_dir) if len(update_dir_contents) != 1: log("Invalid update data, update failed.") sys.exit() content_dir = os.path.join(sb_update_dir, update_dir_contents[0]) # copy everything from sb_update_dir to sb_root for dirname, dirnames, filenames in os.walk(content_dir): dirname = dirname[len(content_dir)+1:] for curfile in filenames: if curfile == 'updater.exe': continue old_path = os.path.join(content_dir, dirname, curfile) new_path = os.path.join(sb_root, dirname, curfile) if os.path.isfile(new_path): os.remove(new_path) os.renames(old_path, new_path) if os.path.isdir(sb_update_dir): shutil.rmtree(sb_update_dir) # re-launch SB p = subprocess.Popen(sb_executable, cwd=os.getcwd()) except Exception, e: log("Exception while updating: "+str(e)) raise if log_file: log_file.close()