Files
x11ma/script/test/rsync.py
2020-12-01 10:10:53 +01:00

141 lines
5.3 KiB
Python

####################################################################################################
# Utilities for synchronizing folders with rsync
# On RH7 (not SL6)
# Change permission of the account, otherwise SSH keys are not accepted:
# ~/.ssh from drwxr-S--- to drwx----
# ~ : from drwxrws--- to drwxr-s---
####################################################################################################
import sys
import os
import os.path
import shutil
from startup import exec_cmd, log
RSYNC_GENERATE_USER_KEY = True
def rsync(src, dest, key):
#cmd = 'rsync -e "ssh -i ' + key + ' -o LogLevel=quiet" --chmod=ug=rwx --verbose --modify-window=1 --times --recursive ' + src + ' ' + dest
#ret = exec_cmd(cmd)
cmd = 'rsync -e "ssh -i ' + key + '" --chmod=ug=rwx --verbose --modify-window=1 --times --recursive ' + src + ' ' + dest
ret = exec_cmd(cmd, False)
lines = ret.split("\n")
lines = filter(lambda x: x != "", lines)
if len(lines)<3:
print "Invalid return from rsync:\n", ret
raise Exception ("Invalid format")
#files = lines[1:-2]
files = []
head,tail=os.path.split(src)
for l in lines:
f = os.path.join(head,l)
if os.path.exists(f):
files.append(f)
try:
stats = lines[-2].replace(",", "").replace(".", "")
stats = [int(s) for s in stats.split() if s.isdigit()]
bytes_sent, bytes_received = stats[0], stats[1]
except:
print "Invalid statistics from rsync:\n", ret
bytes_sent, bytes_received = None, None
return files, bytes_sent, bytes_received
def sync_user_data(user, src, dest, host= "localhost", remove_local_folder=False, remove_local_files=False, do_log=True, do_print=True):
try:
if do_log:
log("Start synchronizing %s to %s:%s" % (src, user, dest), False )
key = os.path.expanduser("~/.ssh/" + ("ke" if RSYNC_GENERATE_USER_KEY else "id_rsa"))
if not os.path.isfile(key):
raise Exception ("Invalid key file")
dest = "'" + dest.replace(" ", "\ ") + "'"
dest = user + "@" + host + ":" + dest
files, bytes_sent, bytes_received = rsync(src,dest,key)
msg = "Transferred " + str(bytes_sent) + " bytes to " + user + ": "
for f in files:
msg = msg + "\n" + f
if do_log:
log(msg, False)
if do_print:
print msg
if remove_local_folder:
if do_log:
log("Removing folder: " + src)
shutil.rmtree(src)
elif remove_local_files:
for f in files:
if not os.path.samefile(f, src):
if os.path.isfile(f):
if do_log:
log("Removing file: " + f)
os.remove(f)
elif os.path.isdir(f):
if do_log:
log("Removing folder: " + f)
shutil.rmtree(f)
except:
msg = "Error transferring user data to " + user + ": " + str(sys.exc_info()[1])
if do_log:
log(msg, False)
if do_print:
print >> sys.stderr, msg
return msg
def remove_user_key(do_print=True):
cmd = "rm ~/.ssh/ke;"
cmd = cmd + "rm ~/.ssh/ke.pub"
if do_print:
print exec_cmd(cmd, False)
def reset_user_key(do_print=True):
remove_user_key(do_print)
cmd = "ssh-keygen -N '' -f ~/.ssh/ke -t rsa;"
if do_print:
print exec_cmd(cmd)
def authorize_user(user, aux_file = os.path.expanduser("~/.rsync.tmp"), fix_permissions=True, do_print=True):
if (os.path.isfile(aux_file)):
os.remove(aux_file)
with open(aux_file, "w") as fh:
fh.write("Cannot access file: " + aux_file)
os.chmod(aux_file, 0o777)
success_msg = 'Success transfering authorization key for: ' + user
cmd = 'echo Authorizing: ' + user + ";"
cmd = cmd + 'echo Invalid user or password > ' + aux_file + ";"
cmd = cmd + "export PK_SUCCESS=FAILURE;"
if RSYNC_GENERATE_USER_KEY:
reset_user_key(do_print)
cmd = cmd + "export PK=`cat ~/.ssh/ke.pub`;"
else:
cmd = cmd + "export PK=`cat ~/.ssh/id_rsa.pub`;"
cmd = cmd + 'su - ' + user + ' bash -c "'
cmd = cmd + 'echo $PK >> .ssh/authorized_keys;'
#cmd = cmd + 'sort .ssh/authorized_keys | uniq > .ssh/authorized_keys.uniq;'
#cmd = cmd + 'mv .ssh/authorized_keys.uniq .ssh/authorized_keys;'
if fix_permissions:
cmd = cmd + 'chmod g-w ~' + ";"
cmd = cmd + 'echo ' + success_msg + ";"
cmd = cmd + 'echo ' + success_msg + " > " + aux_file + ";"
cmd = cmd + '"'
#xterm_options = '-hold -T "Authentication" -into 44040199' #Get Winfow ID with 'wmctrl -lp'
xterm_options = '-T "Authentication" -fa monaco -fs 14 -bg black -fg green -geometry 80x15+400+100'
try:
ret = exec_cmd("xterm " + xterm_options + " -e '" + cmd + "'")
with open (aux_file, "r") as myfile:
ret=myfile.read()
#;if [ "$depth" -eq "1" ]; then echo ' + success_msg + '; fi')
if not success_msg in ret:
raise Exception (ret)
except:
if RSYNC_GENERATE_USER_KEY:
remove_user_key(do_print)
raise Exception ("Error authenticating user: " + str(sys.exc_info()[1]))
finally:
if (os.path.isfile(aux_file)):
os.remove(aux_file)
return ret