コード例 #1
0
ファイル: checkin.py プロジェクト: imfog/TACTIC-Handler
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()
コード例 #2
0
ファイル: checkin_pipeline.py プロジェクト: 0-T-0/TACTIC
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__()
コード例 #3
0
    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()
コード例 #4
0
ファイル: run_transaction_cmd.py プロジェクト: funic/TACTIC
    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