List available layers, or infos on a given layer class or name. :param obj: Packet / packet name to use :param case_sensitive: if obj is a string, is it case sensitive? :param verbose:
(obj=None, # type: Optional[Union[str, Packet, Type[Packet]]]
case_sensitive=False, # type: bool
verbose=False # type: bool
)
| 2446 | |
| 2447 | @conf.commands.register |
| 2448 | def ls(obj=None, # type: Optional[Union[str, Packet, Type[Packet]]] |
| 2449 | case_sensitive=False, # type: bool |
| 2450 | verbose=False # type: bool |
| 2451 | ): |
| 2452 | # type: (...) -> None |
| 2453 | """List available layers, or infos on a given layer class or name. |
| 2454 | |
| 2455 | :param obj: Packet / packet name to use |
| 2456 | :param case_sensitive: if obj is a string, is it case sensitive? |
| 2457 | :param verbose: |
| 2458 | """ |
| 2459 | if obj is None or isinstance(obj, str): |
| 2460 | tip = False |
| 2461 | if obj is None: |
| 2462 | tip = True |
| 2463 | all_layers = sorted(conf.layers, key=lambda x: x.__name__) |
| 2464 | else: |
| 2465 | pattern = re.compile( |
| 2466 | obj, |
| 2467 | 0 if case_sensitive else re.I |
| 2468 | ) |
| 2469 | # We first order by accuracy, then length |
| 2470 | if case_sensitive: |
| 2471 | sorter = lambda x: (x.__name__.index(obj), len(x.__name__)) |
| 2472 | else: |
| 2473 | obj = obj.lower() |
| 2474 | sorter = lambda x: (x.__name__.lower().index(obj), |
| 2475 | len(x.__name__)) |
| 2476 | all_layers = sorted((layer for layer in conf.layers |
| 2477 | if (isinstance(layer.__name__, str) and |
| 2478 | pattern.search(layer.__name__)) or |
| 2479 | (isinstance(layer.name, str) and |
| 2480 | pattern.search(layer.name))), |
| 2481 | key=sorter) |
| 2482 | for layer in all_layers: |
| 2483 | print("%-10s : %s" % (layer.__name__, layer._name)) |
| 2484 | if tip and conf.interactive: |
| 2485 | print("\nTIP: You may use explore() to navigate through all " |
| 2486 | "layers using a clear GUI") |
| 2487 | else: |
| 2488 | try: |
| 2489 | fields = _pkt_ls( |
| 2490 | obj, |
| 2491 | verbose=verbose |
| 2492 | ) |
| 2493 | is_pkt = isinstance(obj, Packet) |
| 2494 | |
| 2495 | for fname, cls, clsne, dflt, long_attrs in fields: |
| 2496 | clsinfo = cls.__name__ + " " + clsne |
| 2497 | print("%-10s : %-35s =" % (fname, clsinfo), end=' ') |
| 2498 | if is_pkt: |
| 2499 | print("%-15r" % (getattr(obj, fname),), end=' ') |
| 2500 | print("(%r)" % (dflt,)) |
| 2501 | for attr in long_attrs: |
| 2502 | print("%-15s%s" % ("", attr)) |
| 2503 | # Restart for payload if any |
| 2504 | if is_pkt: |
| 2505 | obj = cast(Packet, obj) |