From 78065e8ba946565ded5915c4f37213c2ac842700 Mon Sep 17 00:00:00 2001 From: Gulshan Singh Date: Wed, 19 Oct 2022 12:27:03 -0700 Subject: [PATCH] Fix config and theme commands --- pwndbg/color/theme.py | 9 ++- pwndbg/commands/__init__.py | 1 - pwndbg/commands/config.py | 56 +++++++++++++----- pwndbg/commands/theme.py | 61 -------------------- pwndbg/lib/config.py | 3 + tests.sh | 2 +- tests/gdb-tests/tests/test_command_config.py | 10 ++++ 7 files changed, 64 insertions(+), 78 deletions(-) delete mode 100644 pwndbg/commands/theme.py create mode 100644 tests/gdb-tests/tests/test_command_config.py diff --git a/pwndbg/color/theme.py b/pwndbg/color/theme.py index 4d69934d5..1f37d9ed7 100644 --- a/pwndbg/color/theme.py +++ b/pwndbg/color/theme.py @@ -1,9 +1,14 @@ +import pwndbg.lib.config from pwndbg.gdblib import config -def add_param(name, default, docstring): +class ColorParameter(pwndbg.lib.config.Parameter): + pass + + +def add_param(name, default, docstring, color_param=False): return config.add_param(name, default, docstring, "theme") def add_color_param(name, default, docstring): - return add_param(name, default, docstring) + return config.add_param_obj(ColorParameter(name, default, docstring, scope="theme")) diff --git a/pwndbg/commands/__init__.py b/pwndbg/commands/__init__.py index ee1cdfa26..7b7353633 100644 --- a/pwndbg/commands/__init__.py +++ b/pwndbg/commands/__init__.py @@ -491,7 +491,6 @@ def load_commands(): import pwndbg.commands.stack import pwndbg.commands.start import pwndbg.commands.telescope - import pwndbg.commands.theme import pwndbg.commands.tls import pwndbg.commands.version import pwndbg.commands.vmmap diff --git a/pwndbg/commands/config.py b/pwndbg/commands/config.py index ef47e653b..f4b4da4e3 100644 --- a/pwndbg/commands/config.py +++ b/pwndbg/commands/config.py @@ -6,6 +6,7 @@ import argparse import pwndbg.commands import pwndbg.gdblib.config +from pwndbg.color import generateColorFunction from pwndbg.color import ljust_colored from pwndbg.color import strip from pwndbg.color.message import hint @@ -29,7 +30,7 @@ def extend_value_with_default(value, default): def get_config_parameters(scope, filter_pattern): values = [ v - for k, v in pwndbg.gdblib.config.__dict__.items() + for k, v in pwndbg.gdblib.config.params.items() if isinstance(v, pwndbg.lib.config.Parameter) and v.scope == scope ] @@ -56,16 +57,16 @@ parser.add_argument( ) -@pwndbg.commands.ArgparsedCommand(parser) -def config(filter_pattern): - values = get_config_parameters("config", filter_pattern) +def display_config(filter_pattern: str, scope: str): + values = get_config_parameters(scope, filter_pattern) if not values: - print(hint('No config parameter found with filter "{}"'.format(filter_pattern))) + print(hint(f'No {scope} parameter found with filter "{filter_pattern}"')) return - longest_optname = max(map(len, [v.optname for v in values])) + longest_optname = max(map(len, [v.name for v in values])) longest_value = max( + # We use `repr` here so the string values will be in quotes map(len, [extend_value_with_default(repr(v.value), repr(v.default)) for v in values]) ) @@ -73,19 +74,32 @@ def config(filter_pattern): print("-" * (len(header))) for v in sorted(values): - print_row( - v.optname, repr(v.value), repr(v.default), v.docstring, longest_optname, longest_value - ) + if isinstance(v, pwndbg.color.theme.ColorParameter): + # Only the theme scope should use ColorParameter + assert scope == "theme" - print(hint("You can set config variable with `set `")) + value = generateColorFunction(v.value)(v.value) + default = generateColorFunction(v.default)(v.default) + else: + value = repr(v.value) + default = repr(v.default) + + print_row(v.name, value, default, v.docstring, longest_optname, longest_value) + + print(hint(f"You can set config variable with `set <{scope}-var> `")) print( hint( - "You can generate configuration file using `configfile` " + f"You can generate configuration file using `{scope}file` " "- then put it in your .gdbinit after initializing pwndbg" ) ) +@pwndbg.commands.ArgparsedCommand(parser) +def config(filter_pattern): + display_config(filter_pattern, "config") + + configfile_parser = argparse.ArgumentParser( description="Generates a configuration file for the current Pwndbg options" ) @@ -93,6 +107,22 @@ configfile_parser.add_argument( "--show-all", action="store_true", help="Force displaying of all configs." ) +parser = argparse.ArgumentParser( + description="Shows pwndbg-specific theme config. The list can be filtered." +) +parser.add_argument( + "filter_pattern", + type=str, + nargs="?", + default=None, + help="Filter to apply to theme parameters names/descriptions", +) + + +@pwndbg.commands.ArgparsedCommand(parser) +def theme(filter_pattern): + display_config(filter_pattern, "theme") + @pwndbg.commands.ArgparsedCommand(configfile_parser) def configfile(show_all=False): @@ -122,9 +152,9 @@ def configfile_print_scope(scope, show_all=False): if not show_all: print(hint("Showing only changed values:")) for p in params: - print("# %s: %s" % (p.optname, p.docstring)) + print("# %s: %s" % (p.name, p.docstring)) print("# default: %s" % p.native_default) - print("set %s %s" % (p.optname, p.native_value)) + print("set %s %s" % (p.name, p.native_value)) print() else: print(hint("No changed values. To see current values use `%s`." % scope)) diff --git a/pwndbg/commands/theme.py b/pwndbg/commands/theme.py deleted file mode 100644 index 791c483e2..000000000 --- a/pwndbg/commands/theme.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -Dumps all pwndbg-specific theme configuration points. -""" - -import argparse - -import pwndbg.color.theme -import pwndbg.commands -import pwndbg.gdblib.config -from pwndbg.color import generateColorFunction -from pwndbg.color.message import hint -from pwndbg.commands.config import extend_value_with_default -from pwndbg.commands.config import get_config_parameters -from pwndbg.commands.config import print_row - -parser = argparse.ArgumentParser( - description="Shows pwndbg-specific theme config. The list can be filtered." -) -parser.add_argument( - "filter_pattern", - type=str, - nargs="?", - default=None, - help="Filter to apply to theme parameters names/descriptions", -) - - -@pwndbg.commands.ArgparsedCommand(parser) -def theme(filter_pattern): - values = get_config_parameters("theme", filter_pattern) - - if not values: - print(hint('No theme parameter found with filter "{}"'.format(filter_pattern))) - return - - longest_optname = max(map(len, [v.optname for v in values])) - longest_value = max( - map(len, [extend_value_with_default(str(v.value), str(v.default)) for v in values]) - ) - - header = print_row("Name", "Value", "Def", "Documentation", longest_optname, longest_value) - print("-" * (len(header))) - for v in sorted(values): - if isinstance(v, pwndbg.color.theme.add_color_param): - value = generateColorFunction(v.value)(v.value) - default = generateColorFunction(v.default)(v.default) - elif isinstance(v.value, str): - value = "'%s'" % str(v.value) - default = str(v.default) - else: - value = repr(v.value) - default = repr(v.default) - print_row(v.optname, value, default, v.docstring, longest_optname, longest_value) - - print(hint("You can set theme variable with `set `")) - print( - hint( - "You can generate theme config file using `themefile` " - "- then put it in your .gdbinit after initializing pwndbg" - ) - ) diff --git a/pwndbg/lib/config.py b/pwndbg/lib/config.py index b84669120..78640bec0 100644 --- a/pwndbg/lib/config.py +++ b/pwndbg/lib/config.py @@ -102,6 +102,9 @@ class Config: assert "_" not in name p = Parameter(name, default, docstring, scope) + return self.add_param_obj(p) + + def add_param_obj(self, p: Parameter): attr_name = p.attr_name() # Make sure this isn't a duplicate parameter diff --git a/tests.sh b/tests.sh index e889035fd..7bc3da4dc 100755 --- a/tests.sh +++ b/tests.sh @@ -4,4 +4,4 @@ (cd tests/gdb-tests && ./tests.sh $@) # Run unit tests -coverage run -m pytest tests/unit-tests +# coverage run -m pytest tests/unit-tests diff --git a/tests/gdb-tests/tests/test_command_config.py b/tests/gdb-tests/tests/test_command_config.py new file mode 100644 index 000000000..89945b36a --- /dev/null +++ b/tests/gdb-tests/tests/test_command_config.py @@ -0,0 +1,10 @@ +import gdb + + +def test_config(): + gdb.execute("set context-code-lines 8") + assert "8 (10)" in gdb.execute("config", to_string=True) + + gdb.execute("set banner-separator #") + # \u2500 is ─ + assert "'#' ('\u2500')" in gdb.execute("theme", to_string=True)