Пример #1
0
 def __init__(self, loader: TsharkConfig=None, **kwargs) -> None:
     super().__init__(df_name=kwargs.get("dest"), **kwargs)
     # if loader == None:
     self.loader = loader or TsharkConfig()
     completer_method = functools.partial(cmd2.Cmd.path_complete, path_filter=lambda path: os.path.isfile(path))
     setattr(self, ATTR_CHOICES_CALLABLE,
             ChoicesCallable(is_method=True, is_completer=True, to_call=completer_method,))
Пример #2
0
 def __init__(
     self,
     name: str,
     protocol: Protocol,
     loader=None,
     **kwargs
 ) -> None:
     """
     """
     self.loader = loader or TsharkConfig()
     self.protocol = protocol
     DataframeAction.__init__(self, df_name=name, **kwargs)
Пример #3
0
def main():

    # https://docs.python.org/3/library/argparse.html#module-argparse
    # http://tricksntweaks.blogspot.be/2013/05/advance-argument-parsing-in-python.html
    parser = argparse.ArgumentParser(
        description='Generate MPTCP stats & plots',
        fromfile_prefix_chars='@',
    )
    parser.add_argument('--relative',
                        action="store_true",
                        help="set to export relative TCP seq number")
    parser.add_argument('--tshark',
                        dest="tshark_exe",
                        action="store",
                        default="tshark",
                        help="Path to shark binary")
    parser.add_argument(
        '--profile',
        dest="tshark_exe",
        action="store",
        default=None,
        help="Wireshark profile which contains many options to customize output"
    )

    # TODO tshark.py devrait plutot accepter des streams
    # argparse.FileType('r')
    # parser.add_argument('xpconfig', default="tests.ini", action="store", type=str,  help="Config filename. Describe experiment settings")

    # parser.add_argument('inputPcap', action="store", help="src IP")

    pcap_parser = argparse.ArgumentParser(
        description='Expecting pcap file as input',
        add_help=False,
    )
    pcap_parser.add_argument('inputPcap', action="store", help="Input pcap")

    subparsers = parser.add_subparsers(dest="subparser_name",
                                       title="Subparsers",
                                       help='sub-command help')

    subparser_csv = subparsers.add_parser('pcap2csv',
                                          parents=[pcap_parser],
                                          help='Converts pcap to a csv file')
    # subparser_csv.add_argument('inputPcap', action="store", help="Input pcap")
    subparser_csv.add_argument('--output',
                               "-o",
                               action="store",
                               help="csv filename")
    subparser_csv.add_argument('--filter',
                               "-f",
                               action="store",
                               help="Filter",
                               default="")
    subparser_csv.add_argument(
        'fields_filename',
        type=argparse.FileType('r'),
        action="store",
        help="json file mapping name to their wireshark name")

    # List MPTCP connections and subflows
    sp_csv2sql = subparsers.add_parser(
        'csv2sql', help='Imports csv file to an sqlite database')
    sp_csv2sql.add_argument('inputCsv', action="store", help="Input Csv")
    sp_csv2sql.add_argument('output',
                            nargs="?",
                            action="store",
                            help="db filename")

    sp_pcap2sql = subparsers.add_parser(
        'pcap2sql', help='Converts pcap to an sqlite database')
    sp_pcap2sql.add_argument('inputPcap', action="store", help="Input pcap")
    sp_pcap2sql.add_argument('output',
                             nargs="?",
                             action="store",
                             help="db filename")

    args = parser.parse_args(sys.argv[1:])

    exporter = TsharkConfig(tshark_exe, profile=args.profile)
    # exporter.tcp_relative_seq = args.relative if args.relative else True
    exporter.tcp_relative_seq = args.relative
    # exporter.fields_to_export = fields_to_export

    log.debug("Relative #seq = %s" % exporter.tcp_relative_seq)
    if args.subparser_name == "pcap2csv":
        inputFilename = args.inputPcap
        outputFilename = args.output if args.output else get_basename(
            inputFilename, "csv")
        fields_to_export = load_fields_to_export_from_file(
            args.fields_filename)
        exporter.filter = args.filter
        print(fields_to_export)
        exporter.export_pcap_to_csv(inputFilename, outputFilename,
                                    fields_to_export)
    elif args.subparser_name == "csv2sql":
        inputFilename = args.inputCsv
        outputFilename = get_basename(inputFilename, "sqlite")
        convert_csv_to_sql(inputFilename, outputFilename, "connections")
    elif args.subparser_name == "pcap2sql":
        inputFilename = args.inputPcap
        outputFilename = get_basename(inputFilename, "sqlite")
        exporter.export_pcap_to_sql(inputFilename, outputFilename)
    else:
        parser.print_help()
Пример #4
0
    def __init__(self, cfg: MpTcpAnalyzerConfig, stdin=sys.stdin, **kwargs) -> None:
        """
        Args:
            cfg (MpTcpAnalyzerConfig): A valid configuration

        Attributes:
            prompt (str): Prompt seen by the user, displays currently loaded pcpa
            config: configution to get user parameters
            data:  dataframe currently in use
        """

        self.shortcuts.update({
            'lc': 'list_connections',
            'ls': 'list_subflows',
            'lr': 'list_reinjections'
        })
        super().__init__(completekey='tab', stdin=stdin)
        self.prompt = FG_COLORS['blue'] + "Ready>"  + color_off
        self.data = None  # type: pd.DataFrame
        self.config = cfg
        self.tshark_config = TsharkConfig(
            delimiter=cfg["mptcpanalyzer"]["delimiter"],
            profile=cfg["mptcpanalyzer"]["wireshark_profile"],
        )

        # cmd2 specific initialization
        self.abbrev = True  # when no ambiguities, run the command
        self.allow_cli_args = True  # disable autoload of transcripts
        self.allow_redirection = True  # allow pipes in commands
        self.default_to_shell = False
        self.debug = True  # for now
        self.set_posix_shlex = True  # need cmd2 >= 0.8

        #  Load Plots
        ######################
        # you can  list available plots under the namespace
        # https://pypi.python.org/pypi/entry_point_inspector
        # https://docs.openstack.org/stevedore/latest/reference/index.html#stevedore.extension.ExtensionManager
        # mgr = driver.DriverManager(
        self.plot_mgr = extension.ExtensionManager(
            namespace='mptcpanalyzer.plots',
            invoke_on_load=True,
            verify_requirements=True,
            invoke_args=(self.tshark_config,),
            # invoke_kwds
            propagate_map_exceptions=True,
            on_load_failure_callback=self.stevedore_error_handler
        )

        self.cmd_mgr = extension.ExtensionManager(
            namespace='mptcpanalyzer.cmds',
            invoke_on_load=True,
            verify_requirements=True,
            invoke_args=(),
            propagate_map_exceptions=False,
            on_load_failure_callback=self.stevedore_error_handler
        )

        #  do_plot parser
        ######################
        # not my first choice but to accomodate cmd2 constraints
        # see https://github.com/python-cmd2/cmd2/issues/498
        subparsers = MpTcpAnalyzerCmdApp.plot_parser.add_subparsers(dest="plot_type",
            title="Subparsers", help='sub-command help',)
        subparsers.required = True  # type: ignore

        def register_plots(ext, subparsers):
            """Adds a parser per plot"""
            # check if dat is loaded
            parser = ext.obj.default_parser()
            assert parser, "Forgot to return parser"
            subparsers.add_parser(ext.name, parents=[parser], add_help=False)

        self.plot_mgr.map(register_plots, subparsers)
        # # will raise NoMatches when no plot available

        # if loading commands from a file, we disable prompt not to pollute output
        if stdin != sys.stdin:
            log.info("Disabling prompt because reading from stdin")
            self.use_rawinput = False
            self.prompt = ""
            self.intro = ""

        """
        The optional arguments stdin and stdout specify the input and
        output file objects that the Cmd instance or subclass instance will
        use for input and output. If not specified, they will default to
        sys.stdin and sys.stdout.
        """
        print("WARNING: mptcpanalyzer may require a custom wireshark. "
            "Check github for mptcp patches streaming.")