Preloads all BBOT modules. This function recursively iterates through each file in the module directories and preloads each BBOT module to gather its meta-information and dependencies. Args: module_dir (str or Path): Directory containing BBOT modules to be prelo
(self, module_dirs=None)
| 115 | return file.suffix.lower() == ".py" and file.stem not in ["base", "__init__"] |
| 116 | |
| 117 | def preload(self, module_dirs=None): |
| 118 | """Preloads all BBOT modules. |
| 119 | |
| 120 | This function recursively iterates through each file in the module directories |
| 121 | and preloads each BBOT module to gather its meta-information and dependencies. |
| 122 | |
| 123 | Args: |
| 124 | module_dir (str or Path): Directory containing BBOT modules to be preloaded. |
| 125 | |
| 126 | Returns: |
| 127 | dict: A dictionary where keys are the names of the preloaded modules and |
| 128 | values are their respective preloaded data. |
| 129 | |
| 130 | Examples: |
| 131 | >>> preload("/path/to/bbot_modules/") |
| 132 | { |
| 133 | "module1": {...}, |
| 134 | "module2": {...}, |
| 135 | ... |
| 136 | } |
| 137 | """ |
| 138 | new_modules = False |
| 139 | if module_dirs is None: |
| 140 | module_dirs = self.module_dirs |
| 141 | |
| 142 | for module_dir in module_dirs: |
| 143 | if module_dir in self._module_dirs_preloaded: |
| 144 | log.debug(f"Already preloaded modules from {module_dir}") |
| 145 | continue |
| 146 | |
| 147 | log.debug(f"Preloading modules from {module_dir}") |
| 148 | new_modules = True |
| 149 | for module_file in list_files(module_dir, filter=self.file_filter): |
| 150 | module_name = module_file.stem |
| 151 | module_file = module_file.resolve() |
| 152 | |
| 153 | # try to load from cache |
| 154 | module_cache_key = (str(module_file), tuple(module_file.stat())) |
| 155 | preloaded = self.preload_cache.get(module_name, {}) |
| 156 | cache_key = preloaded.get("cache_key", ()) |
| 157 | if preloaded and module_cache_key == cache_key: |
| 158 | log.debug(f"Preloading {module_name} from cache") |
| 159 | else: |
| 160 | log.debug(f"Preloading {module_name} from disk") |
| 161 | if module_dir.name == "modules": |
| 162 | namespace = "bbot.modules" |
| 163 | else: |
| 164 | namespace = f"bbot.modules.{module_dir.name}" |
| 165 | try: |
| 166 | preloaded = self.preload_module(module_file) |
| 167 | if preloaded is None: |
| 168 | continue |
| 169 | module_type = "scan" |
| 170 | if module_dir.name in ("output", "internal"): |
| 171 | module_type = str(module_dir.name) |
| 172 | |
| 173 | disable_auto_module_deps = preloaded.get("disable_auto_module_deps", False) |
| 174 |
no test coverage detected