2014-03-10 01:18:05 -04:00
|
|
|
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:
|
2014-05-23 08:37:22 -04:00
|
|
|
log("SickRage didn't close, unable to update. You'll have to manually restart it.")
|
2014-03-10 01:18:05 -04:00
|
|
|
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()
|