def main(args): usage = "USAGE: checkin.py <search_type> <code> [context] <path>\n" usage += "example: python checkin.py beat Sc01.Bt01 .\\test\\image.png" context = "publish" # TODO: lots of assumptions here if len(args) == 2: # assume code and file path are equivalent code = args[1] file_path = args[1] elif len(args) == 3: code = args[1] file_path = args[2] elif len(args) == 4: code = args[1] context = args[2] file_path = args[3] else: print usage return search_type = args[0] server = TacticServerStub() # do the actual work server.start("Checked in file [%s] to [%s] - [%s]" % (file_path, search_type, code)) try: # query all of the search_types to simplify argument if search_type.find("/") == -1: columns = ["search_type"] results = server.query("sthpw/search_object", columns=columns) for result in results: test = result.get("search_type") if test.endswith("/%s" % search_type): search_type = test break else: raise Exception("Search type [%s] not found" % search_type) search_key = server.build_search_key(search_type, code) # upload the file server.upload_file(file_path) # checkin the uploaded file result = server.simple_checkin(search_key, context, file_path) except Exception as e: server.abort() print "ERROR: ", e.__str__() else: server.finish()
def main(args): usage = "USAGE: checkin.py <search_type> <code> [context] <path>\n" usage += "example: python checkin.py beat Sc01.Bt01 .\\test\\image.png" context = "publish" # TODO: lots of assumptions here if len(args) == 2: # assume code and file path are equivalent code = args[1] file_path = args[1] elif len(args) == 3: code = args[1] file_path = args[2] elif len(args) == 4: code = args[1] context = args[2] file_path = args[3] else: print usage return search_type = args[0] server = TacticServerStub() # do the actual work server.start("Checked in file [%s] to [%s] - [%s]" % (file_path, search_type, code) ) try: # query all of the search_types to simplify argument if search_type.find("/") == -1: columns = ["search_type"] results = server.query("sthpw/search_object", columns=columns) for result in results: test = result.get("search_type") if test.endswith("/%s" % search_type): search_type = test break else: raise Exception("Search type [%s] not found" % search_type) search_key = server.build_search_key(search_type, code) # upload the file server.upload_file(file_path) # checkin the uploaded file result = server.simple_checkin(search_key, context, file_path) except Exception, e: server.abort() print "ERROR: ", e.__str__()
def execute(self): transaction_code = self.kwargs.get("transaction_code") job = self.kwargs.get("job") job_code = '' if job: job_code = job.get_code() print("Executing sync job [%s] ... "% job_code) if not transaction_code: raise TacticException("WARNING: No transaction_code provided") server_code = self.kwargs.get("server") if not server_code: raise TacticException("WARNING: No server defined") server = Search.get_by_code("sthpw/sync_server", server_code) if not server: raise TacticException("ERROR: No server with code [%s] defined" % server_code) host = server.get_value("host") site = server.get_value("site", no_exception=True) # file mode is usually determined by the server file_mode = self.kwargs.get("file_mode") if not file_mode: file_mode = server.get_value("file_mode", no_exception=True) if not file_mode: file_mode = 'upload' # sync mode is usually determined by the server sync_mode = self.kwargs.get("sync_mode") if not sync_mode: sync_mode = server.get_value("sync_mode", no_exception=True) if not sync_mode or sync_mode == 'default': # defautl is xmlrpc sync_mode = "xmlrpc" project_code = self.kwargs.get("project_code") #project_code = 'admin' if not project_code: raise TacticException("WARNING: Project code is not supplied") # get info for remote server definition ticket = server.get_value("ticket") if not ticket: raise TacticException("ERROR: No authorization ticket specified for server [%s]" % server_code) user = None password = None # grab data passed into it search = Search("sthpw/transaction_log") search.add_filter("code", transaction_code) log = search.get_sobject() if not log: print("WARNING: No transaction_log [%s] exists" % transaction_code) return # provide an opportunity to filter out the transaction log # If a server is a complete copy, then no filter is necessary message, transaction_xml = self.filter_transaction( log, server ) if not transaction_xml.get_nodes("transaction/*"): print("No actions in transaction passed security ... skipping sync to [%s]" % server.get_code()) job = self.kwargs.get("job") job.set_value("error_log", message) job.commit() return import zlib, binascii #transaction_data = Common.process_unicode_string(transaction_xml) transaction_data = transaction_xml.to_string() if isinstance(transaction_data, unicode): transaction_data = transaction_data.encode('utf-8') length_before = len(transaction_data) compressed = zlib.compress(transaction_data) ztransaction_data = binascii.hexlify(compressed) ztransaction_data = "zlib:%s" % ztransaction_data length_after = len(ztransaction_data) print("transaction log recompress: ", "%s%%" % int(float(length_after)/float(length_before)*100), "[%s] to [%s]" % (length_before, length_after)) # reset the transaction log sobject with the new xml. This # should be harmless because it is never commited log.set_value("transaction", ztransaction_data) # NOTE: not really a command. Just a set of actions cmd = TransactionFilesCmd(transaction_xml=transaction_xml) paths = cmd.execute() from pyasm.search import TableDataDumper # drop the transaction into a folder if sync_mode == 'file': base_dir = server.get_value("base_dir", no_exception=True) if not base_dir: base_dir = Config.get_value("checkin", "win32_dropbox_dir") if not base_dir: raise Exception("Must define a base_dir for sync_mode=file") ticket = server.get_value("ticket") self.handle_file_mode(base_dir, transaction_code, paths, log, transaction_xml, ticket) return # xmlrpc mode from tactic_client_lib import TacticServerStub remote_server = TacticServerStub( protocol='xmlrpc', site=site, server=host, project=project_code, user=user, password=password, ticket=ticket ) # if the mode is undo, then execute an undo if sync_mode == 'undo': remote_server.undo(transaction_id=log.get_code(), is_sync=True) else: # upload all of the files try: if file_mode == 'upload': for path in paths: if os.path.isdir(path): print("upload dir: ", path) remote_server.upload_directory(path) else: print("upload file: ", path) remote_server.upload_file(path) #print("ping: ", remote_server.ping()) remote_server.execute_transaction(log.get_data(), file_mode=file_mode) except Exception as e: print("Error sending remote command [%s]" % str(e)) job = self.kwargs.get("job") job.set_value("error_log", str(e)) #job.set_value("state", "error") job.commit() # print the stacktrace import traceback tb = sys.exc_info()[2] stacktrace = traceback.format_tb(tb) stacktrace_str = "".join(stacktrace) print("-"*50) print(stacktrace_str) print("Error: ", str(e)) print("-"*50) raise job = self.kwargs.get("job") job.set_value("error_log", "") job.commit()
def execute(my): print "Executing sync job ..." transaction_code = my.kwargs.get("transaction_code") if not transaction_code: raise TacticException("WARNING: No transaction_code provided") server_code = my.kwargs.get("server") if not server_code: raise TacticException("WARNING: No server defined") server = Search.get_by_code("sthpw/sync_server", server_code) if not server: raise TacticException("ERROR: No server with code [%s] defined" % server_code) host = server.get_value("host") file_mode = my.kwargs.get("file_mode") if not file_mode: file_mode = 'upload' # mode can default|undo mode = my.kwargs.get("sync_mode") if not mode: mode = server.get_value("sync_mode", no_exception=True) if not mode or mode == 'default': mode = "xmlrpc" project_code = my.kwargs.get("project_code") #project_code = 'admin' if not project_code: raise TacticException("WARNING: Project code is not supplied") # get info for remote server definition ticket = server.get_value("ticket") if not ticket: raise TacticException("ERROR: No authorization ticket specified for server [%s]" % server_code) user = None password = None # grab data passed into it search = Search("sthpw/transaction_log") search.add_filter("code", transaction_code) log = search.get_sobject() if not log: print "WARNING: No transaction_log [%s] exists" % transaction_code return # provide an opportunity to filter out the transaction log # If a server is a complete copy, then no filter is necessary message, transaction_xml = my.filter_transaction( log, server ) if not transaction_xml.get_nodes("transaction/*"): print "No actions in transaction passed security ... skipping sync to [%s]" % server.get_code() job = my.kwargs.get("job") job.set_value("error_log", message) job.commit() return # reset the transaction log sobject with the new xml. This # should be harmless because it is never commited log.set_value("transaction", transaction_xml.to_string()) # NOTE: not really a command. Just a set of actions cmd = TransactionFilesCmd(transaction_xml=transaction_xml) paths = cmd.execute() from pyasm.search import TableDataDumper # drop the transaction into a folder if mode == 'file': base_dir = server.get_value("base_dir", no_exception=True) if not base_dir: base_dir = Config.get_value("checkin", "win32_dropbox_dir") if not base_dir: raise Exception("Must define a base_dir for sync_mode=file") ticket = server.get_value("ticket") my.handle_file_mode(base_dir, transaction_code, paths, log, transaction_xml, ticket) return # xmlrpc mode from tactic_client_lib import TacticServerStub remote_server = TacticServerStub( protocol='xmlrpc', server=host, project=project_code, user=user, password=password, ticket=ticket ) # if the mode is undo, then execute an undo if mode == 'undo': print "mode = undo" remote_server.undo(transaction_id=log.get_code(), is_sync=True) else: # upload all of the files try: if file_mode == 'upload': for path in paths: if os.path.isdir(path): print "upload dir: ", path remote_server.upload_directory(path) else: print "upload file: ", path remote_server.upload_file(path) #print "ping: ", remote_server.ping() remote_server.execute_transaction(log.get_data(), file_mode=file_mode) except Exception, e: print "Error sending remote command [%s]" % str(e) job = my.kwargs.get("job") job.set_value("error_log", str(e)) #job.set_value("state", "error") job.commit() # print the stacktrace import traceback tb = sys.exc_info()[2] stacktrace = traceback.format_tb(tb) stacktrace_str = "".join(stacktrace) print "-"*50 print stacktrace_str print "Error: ", str(e) print "-"*50 raise