"""
RSync Library
"""
from tools import which,TRUE,FALSE
from log4py import Logger
from os import environ,spawnv,P_WAIT
from string import count,split,join
RERR_SYNTAX = 1 # Syntax or usage error
RERR_PROTOCOL = 2 # Protocol incompatibility
RERR_FILESELECT = 3 # Errors selecting input/output files, dirs
RERR_UNSUPPORTED = 4 # Requested action not supported: an attempt was made to manipulate 64-bit files on a platform that cannot support them; or an option was speciifed that is supported by the client and not by the server.
RERR_SOCKETIO = 10 # Error in socket IO
RERR_FILEIO = 11 # Error in file IO
RERR_STREAMIO = 12 # Error in rsync protocol data stream
RERR_MESSAGEIO = 13 # Errors with program diagnostics
RERR_IPC = 14 # Error in IPC code
RERR_SIGNAL = 20 # Received SIGUSR1 or SIGINT
RERR_WAITCHILD = 21 # Some error returned by waitpid()
RERR_MALLOC = 22 # Error allocating core memory buffers
RERR_TIMEOUT = 30 # Timeout in data send/receive
RERR = {RERR_SYNTAX: "Syntax or usage error",
RERR_PROTOCOL: "Protocol incompatibility",
RERR_FILESELECT: "Errors selecting input/output files, dirs",
RERR_UNSUPPORTED: "Requested action not supported: an attempt was made to manipulate 64-bit files on a platform that cannot support them; or an option was speciifed that is supported by the client and not by the server.",
RERR_SOCKETIO: "Error in socket IO",
RERR_FILEIO: "Error in file IO",
RERR_STREAMIO: "Error in rsync protocol data stream",
RERR_MESSAGEIO: "Errors with program diagnostics",
RERR_IPC: "Error in IPC code",
RERR_SIGNAL: "Received SIGUSR1 or SIGINT",
RERR_WAITCHILD: "Some error returned by waitpid()",
RERR_MALLOC: "Error allocating core memory buffers",
RERR_TIMEOUT: "Timeout in data send/receive"}
class rsync:
compress = FALSE # compress file data
recursive = FALSE # recurse into directories
links = FALSE # copy symlinks as symlinks
times = FALSE # preserve times
delete = FALSE # delete files that don't exist on the sending side
archive = FALSE # archive mode
proxy = "" # Web Proxy
username = "" # Username
password = "" # Password
def __init__(self):
self.__rsync_logger = Logger().get_instance(self)
self.__rsync_command = which("rsync")
if (self.__rsync_command == ""):
self.__rsync_logger.error("rsync executable not found.")
def set_source(self, hostname, directory, username = ""):
self.__rsync_source = ""
if (username != ""):
self.__rsync_source = "%s@" % username
if (count(directory, "/") == 1):
directory = directory[1:]
self.__rsync_source = "%s::%s" % (hostname, directory)
else:
self.__rsync_source = "%s:%s" % (hostname, directory)
def set_target(self, directory):
self.__rsync_target = "%s" % directory
def arguments(self):
""" Returns a list of all arguments defined by the class attributes. """
args = []
if (self.compress): args.append("--compress")
if (self.recursive): args.append("--recursive")
if (self.links): args.append("--links")
if (self.times): args.append("--times")
if (self.delete): args.append("--delete")
if (self.archive): args.append("--archive")
args.append(self.__rsync_source)
args.append(self.__rsync_target)
self.__rsync_logger.debug("Command arguments: %s" % join(args))
return args
def executable(self):
""" Returns the full path to the rsync executable. """
return self.__rsync_command
def execute(self, show_output = TRUE):
if (self.proxy != ""):
environ["RSYNC_PROXY"] = self.proxy
if (self.username != ""):
environ["USER"] = self.username
if (self.password != ""):
environ["RSYNC_PASSWORD"] = self.password
args = self.arguments()
if (show_output == FALSE):
args.insert(0, "--quiet")
self.__rsync_logger.debug("Executing: %s %s" % (self.__rsync_command, join(args)))
return spawnv(P_WAIT, self.__rsync_command, args)
|