Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions gef.py
Original file line number Diff line number Diff line change
Expand Up @@ -9854,6 +9854,14 @@ def __init__(self) -> None:
plugins_dir = GefSetting("", str, "Autoload additional GEF commands from external directory", hooks={"on_write": [GefSetting.no_spaces, ]})
plugins_dir.add_hook("on_changed", [lambda _, new_val: GefSetting.must_exist(new_val), lambda _, new_val: self.load_extra_plugins(new_val), ])
gef.config["gef.extra_plugins_dir"] = plugins_dir
venv_path = GefSetting("", str, "Path to the virtualenv used by GEF", hooks={
"on_write": [GefSetting.no_spaces, ],
"on_changed": [
lambda _, new_val: GefSetting.must_exist(new_val),
lambda _, new_val: self.load_virtualenv(new_val),
]
})
gef.config["gef.virtualenv_path"] = venv_path
gef.config["gef.disable_color"] = GefSetting(False, bool, "Disable all colors in GEF")
gef.config["gef.tempdir"] = GefSetting(GEF_TEMP_DIR, pathlib.Path, "Directory to use for temporary/cache content", hooks={"on_write": [GefSetting.no_spaces, GefSetting.create_folder_tree]})
gef.config["gef.show_deprecation_warnings"] = GefSetting(True, bool, "Toggle the display of the `deprecated` warnings")
Expand Down Expand Up @@ -9943,6 +9951,21 @@ def load_plugins_from_directory(plugin_directory: pathlib.Path):
dbg(f"Loading extra plugins from directory={directory}")
return load_plugins_from_directory(directory)


def load_virtualenv(self, new_path: Optional[pathlib.Path] = None):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure if this makes sense as a method here

path = new_path or gef.config["gef.virtualenv_path"]
if not path:
return

if not isinstance(path, pathlib.Path):
path = pathlib.Path(path)

activate_script_path = path/"bin/activate_this.py"
assert activate_script_path.is_file()

exec(activate_script_path.read_text(), {"__file__": activate_script_path})


@property
def loaded_command_names(self) -> Iterable[str]:
print("obsolete loaded_command_names")
Expand Down Expand Up @@ -11717,6 +11740,9 @@ def target_remote_posthook():
gef.gdb.load()
gef.gdb.show_banner()

# load venv
gef.gdb.load_virtualenv()

# load config
gef.gdb.load_extra_plugins()

Expand Down
27 changes: 27 additions & 0 deletions tests/config/virtualenv.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
"""
virtualenv config test module
"""

from tests.base import RemoteGefUnitTestGeneric
from os import system
from tempfile import mktemp


class VirtualenvConfig(RemoteGefUnitTestGeneric):
"""virtualenv config test module"""

def setUp(self) -> None:
venv_path = mktemp()
system(f"virtualenv {venv_path}")
system(f"{venv_path}/bin/pip install numpy")

self.venv_path = venv_path

return super().setUp()

def test_conf_venv(self):
gdb = self._gdb
gdb.execute(f"gef config gef.virtualenv_path {self.venv_path}")

res = gdb.execute("pi __import__('numpy').test()", to_string=True)
assert "NumPy version" in res
Loading