예제 #1
0
 def load_markov(filename):
     """markovオブジェクトを作成し、filenameから読み込みをおこなう"""
     markov = Markov()
     try:
         markov.load(filename)
     except IOError as e:
         print(format_error(e))
     return markov
예제 #2
0
 def load_random(filename):
     """filenameをランダム辞書として読み込みリストを返す"""
     try:
         with open(filename, encoding='utf-8') as f:
             return [l for l in f.read().splitlines() if l]
     except IOError as e:
         print(format_error(e))
         return ['こんにちは']
예제 #3
0
 def load_pattern(filename):
     """filenameをパターン辞書として読み込み、リストを返す。"""
     try:
         with open(filename, encoding='utf-8') as f:
             return [
                 Dictionary.make_pattern(l) for l in f.read().splitlines()
                 if l
             ]
     except IOError as e:
         print(format_error(e))
         return []
예제 #4
0
def message_history(args):
    '''Prints the selected sessions' history records at index args[0]'''
    _ensure_sessions_selected('history')

    index = -1
    if len(args) == 1:
        try:
            index = -int(args[0])
        except ValueError:
            raise errors.BadArgsError(
                'history', 'history[ <index>]'
            )

    if index > history_length:
        raise errors.BadArgsError(
            'history', 'Selected record does not exist in the history'
        )

    results = []
    for tag in selected_sessions:
        # Output header
        results.append('~~~ Scimitar - Session: {} ~~~'.format(tag))
        try:
            ind_rec, cout, tout, lout = sessions_history[tag][index]
            if ind_rec:
                # Check the type of indicator
                if ind_rec[0] == mi.indicator_error:
                    results.append(format_error(ind_rec[1]))
                elif ind_rec[0] == mi.indicator_exit:
                    session_manager.remove(tag)
                    sessions_history.remove(tag)
                    results.append(format_error('Session {} died.', tag))
                else:
                    results.append(cout)
            else:
                results.append(''.join([cout, tout, lout]))
        except IndexError:
            results.append(format_error('Scimitar: Record does not exist'))
    return modes.debugging, '\n'.join(results)
예제 #5
0
    def _collect_exec_results(tasks):
        '''Wait until threads finish and then collect the results.'''
        # If sessions died during execution collect them
        session_casualties = []
        # Results
        results = []

        # Go through the results
        for tag, task in tasks.iteritems():
            task.join()
            try:
                mi_response = task.report()
                # Add it to message history stash
                sessions_history[tag].append(mi_response)
                # Output header
                results.append('~~~ Scimitar - Session: {} ~~~'.format(tag))
                ind_rec, cout, tout, lout = mi_response
                # Check the type of indicator
                # Error
                if ind_rec[0] == mi.indicator_error:
                    results.append(format_error(ind_rec[1]))
                # Exit
                elif ind_rec[0] == mi.indicator_exit:
                    session_manager.remove(tag)
                    sessions_history.remove(tag)
                    results.append(format_error('Session {} died.', tag))
                # Connected, Success, etc
                else:
                    results.append(cout)
            # When the session is dead
            except console.SessionDiedError:
                # It is not a session we can work with in future
                session_manager.remove(tag)
                sessions_history.remove(tag)
                selected_sessions.remove(tag)
                # Add this session to casualty list
                session_casualties += [tag]
        return results, session_casualties
예제 #6
0
 def load_template(filename):
     """filenameをテンプレート辞書として読み込み、ハッシュを返す"""
     templates = defaultdict(lambda: [])
     try:
         with open(filename, encoding='utf-8') as f:
             for line in f:
                 count, template = line.strip().split('\t')
                 if count and template:
                     count = int(count)
                     templates[count].append(template)
         return templates
     except IOError as e:
         print(format_error(e))
         return templates
예제 #7
0
 def lint_error(path, line, col, errname, errdesc):
     _lint_results['warnings'] = _lint_results['warnings'] + 1
     print util.format_error(conf_['output-format'], path, line, col,
                                   errname, errdesc)
예제 #8
0
 def lint_error(path, line, col, errname, errdesc):
     _lint_results['warnings'] = _lint_results['warnings'] + 1
     print util.format_error(conf_['output-format'], path, line, col,
                             errname, errdesc)
예제 #9
0
def gdb_exec(cmd):
    '''Runs the provided user command cmd on all selected sessions.'''

    class RemoteCommandExecutingThread(threading.Thread):
        '''This thread type is responsible for running commands on terminal'''

        def __init__(self, term, cmd):
            super(RemoteCommandExecutingThread, self).__init__()
            self.term = term
            self.cmd = cmd
            self.error = None
            self.result = None

        def run(self):
            '''Start the execution'''
            try:
                self._run()
            except Exception as e:
                self.error = e

        def _run(self):
            # Send the command
            gdb_response = self.term.query(self.cmd)
            # In case GDB dies 
            if gdb_response in (r'^exit', r'^kill'):
                raise console.SessionDiedError
            else:
                self.result = mi.parse(gdb_response)

        def report(self):
            if self.error:
                raise self.error
            return self.result

    def _sanitize_gdb_command(cmd):
        '''Explicitly tell GDB that this is not an MI command following. Tries to
        differentiate between control signals and commands.'''
        if cmd and not repr_str_dict.has_key(cmd[0]):
            return ['-interpreter-exec', 'console'] + cmd
        return cmd

    def _parallel_exec_async(cmd, tag, target_sessions):
        '''Start running the provided cmd per each target session in separate
        thread '''
        tasks = {}
        for tag in target_sessions:
            # Get the session
            cs = session_manager.get(tag)
            exctr = RemoteCommandExecutingThread(cs, ' '.join(cmd))
            exctr.start()
            tasks[tag] = exctr
        return tasks

    def _collect_exec_results(tasks):
        '''Wait until threads finish and then collect the results.'''
        # If sessions died during execution collect them
        session_casualties = []
        # Results
        results = []

        # Go through the results
        for tag, task in tasks.iteritems():
            task.join()
            try:
                mi_response = task.report()
                # Add it to message history stash
                sessions_history[tag].append(mi_response)
                # Output header
                results.append('~~~ Scimitar - Session: {} ~~~'.format(tag))
                ind_rec, cout, tout, lout = mi_response
                # Check the type of indicator
                # Error
                if ind_rec[0] == mi.indicator_error:
                    results.append(format_error(ind_rec[1]))
                # Exit
                elif ind_rec[0] == mi.indicator_exit:
                    session_manager.remove(tag)
                    sessions_history.remove(tag)
                    results.append(format_error('Session {} died.', tag))
                # Connected, Success, etc
                else:
                    results.append(cout)
            # When the session is dead
            except console.SessionDiedError:
                # It is not a session we can work with in future
                session_manager.remove(tag)
                sessions_history.remove(tag)
                selected_sessions.remove(tag)
                # Add this session to casualty list
                session_casualties += [tag]
        return results, session_casualties

    #
    # gdb_exec starts here
    #

    # Ensure there are selected sessions
    _ensure_sessions_selected('gdb:cmd(?)')
    # Make sure selected sessions are valid
    _ensure_valid_sessions_selected('gdb:cmd(?)')

    # GDB launch command
    cmd = _sanitize_gdb_command(cmd)

    # Threads that run the command
    tasks = _parallel_exec_async(cmd, tag, selected_sessions)

    # Wait for all commands to finish
    session_casualties, results = _collect_exec_results(tasks)

    # In case we had dead sessions the command has essentially failed.
    if session_casualties:
        results.append(
            format_error(
                'Session(s) {} died.', ', '.join(session_casualties)
            )
        )
    return modes.debugging, '\n'.join(results)
예제 #10
0
 def lint_error(path, line, col, errname, errdesc):
     _lint_results["warnings"] = _lint_results["warnings"] + 1
     print util.format_error(conf_["output-format"], path, line, col, errname, errdesc)