Skip to content

Writing a Crawler Plugin

Subclass crawlers.plugins.base.BaseCrawlerPlugin and implement run(). A scheduled plugin returns after one scan. A daemon plugin owns its loop and uses its configured interval.

from crawlers.plugins.base import BaseCrawlerPlugin


class ExampleCrawler(BaseCrawlerPlugin):
    def run(self):
        for event in self.get_queryset(index="security"):
            if "example" in event.data.lower():
                self.create_finding(
                    event,
                    rule_name="Example rule",
                    description="Example text found in event data",
                    severity="low",
                )

get_queryset() uses the instance's db_alias. create_finding() applies realert_cooldown, stores the finding, and invokes configured alert plugins. Pass only supported severities: low, medium, high, or critical. MITRE tactic and technique strings are optional.

Register the fully qualified class path in CRAWLER_PLUGINS, then add at least one instance in CRAWLER_CONFIGS. The instance name must match the plugin name used by the loader. Choose type="scheduled" for bounded work or type="daemon" for a plugin that loops internally.

Test queryset selection, finding content, cooldown behavior, database aliases, and alert invocation. Run a configured instance once before service mode:

python manage.py run_crawlers --plugin example_crawler --settings SIEMatic.settings.crawler

Plugins must tolerate empty querysets and log actionable errors without including event secrets or credentials.