demon-cry-base
Базовый класс для OSINT-модулей demon-cry
Установка
pip install demon-cry-base
Использование
Модуль без конфига
Для простых Stateless-модулей можно использовать ModuleConfig напрямую:
from demon_cry_base import BaseModule, ModuleConfig, ModuleParameters
class PingModule(BaseModule):
name = "ping"
description = "Check if host is alive"
category = "utility"
parameters_model = ModuleParameters
async def execute(self, config: ModuleConfig, params: ModuleParameters) -> dict:
return {"status": "ok"}
Создание модуля
from demon_cry_base import BaseModule, ModuleConfig, ModuleParameters
class MyModuleParams(ModuleParameters):
target: str
query: str | None = None
class MyModuleConfig(ModuleConfig):
timeout: int = 30
class MyModule(BaseModule):
name = "my_module"
description = "My OSINT module"
category = "custom"
config_model = MyModuleConfig
parameters_model = MyModuleParams
async def execute(self, config: MyModuleConfig, params: MyModuleParams) -> dict:
return {"result": f"Scanned {params.target}"}
Два источника данных
Каждый модуль работает с двумя потоками данных:
| Config | Parameters | |
|---|---|---|
| Откуда | БД / ядро | Запрос / пользователь |
| Формат | Pydantic-модель (ModuleConfig) |
Pydantic-модель (ModuleParameters) |
| Зачем | Настройки модуля | Входные данные |
| Передаётся | config в execute() |
params в execute() |
Config — настройки из БД
ModuleConfig — это Pydantic-модель. Наследуйте её и добавляйте поля:
class ReconConfig(ModuleConfig):
deep: bool = False
ports: list[int] = [80, 443]
class ApiConfig(ModuleConfig):
api_key: str
rate_limit: int = 100
timeout: int = 30
Затем укажите config_model в модуле. Ядро загрузит конфиг из БД и передаст в execute():
class ReconParams(ModuleParameters):
target: str
class ReconConfig(ModuleConfig):
deep: bool = False
ports: list[int] = [80, 443]
class ReconModule(BaseModule):
name = "recon"
description = "Network reconnaissance"
category = "osint"
config_model = ReconConfig
parameters_model = ReconParams
async def execute(self, config: ReconConfig, params: ReconParams) -> dict:
if config.deep:
...
Parameters — входные данные
ModuleParameters — это Pydantic-модель. Наследуйте её и добавляйте поля:
from typing import Literal
from pydantic import Field
from demon_cry_base import ModuleParameters
class SearchParams(ModuleParameters):
query: str
category: Literal["general", "images", "files", "it", "social media", "news"] = "general"
time_range: Literal["day", "week", "month", "year", "all"] = "all"
max_results: int = Field(default=10, ge=1, le=100, description="Max results to return")
Затем укажите parameters_model в модуле:
class SearchModule(BaseModule):
name = "search"
description = "Web search"
category = "osint"
parameters_model = SearchParams
async def execute(self, config: ModuleConfig, params: SearchParams) -> dict:
# params.query — строка
# params.category — enum
# params.max_results — int с валидацией
...
Паттерны параметров
| Паттерн | Пример |
|---|---|
| Обязательное поле | target: str |
| Optional поле | query: str | None = None |
| Дефолт | timeout: int = 30 |
| Enum-like | category: Literal["a", "b", "c"] = "a" |
| Валидация | max_results: int = Field(default=10, ge=1, le=100) |
| List поле | ports: list[int] = [80, 443] |
Полный пример: модуль с обоими источниками
import asyncio
import aiodns
from typing import Literal
from demon_cry_base import BaseModule, ModuleConfig, ModuleParameters
class DnsLookupParams(ModuleParameters):
domain: str
record_type: list[Literal["A", "AAAA", "MX", "NS", "TXT", "CNAME", "SOA", "PTR"]] = ["A"]
class DnsLookupConfig(ModuleConfig):
name_servers: list[str] = ["1.1.1.1", "8.8.8.8"]
class DnsLookup(BaseModule):
name = "dns_lookup"
description = "Finds DNS records"
category = "network"
config_model = DnsLookupConfig
parameters_model = DnsLookupParams
async def execute(self, config: DnsLookupConfig, params: DnsLookupParams) -> dict:
resolver = aiodns.DNSResolver(nameservers=config.name_servers)
# config — настройки из БД (name_servers)
# params.domain — домен из параметров
# params.record_type — типы записей
...
Metadata
Release files for demon-cry-base 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| demon_cry_base-0.3.1.tar.gz | 3.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| demon_cry_base-0.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 7.6 kB
Release files / demon_cry_base-0.3.1.tar.gz
| Download URL | demon_cry_base-0.3.1.tar.gz |
|---|---|
| Size | 3.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5368dcfe18ff0f5b9501f9de154296136bf3fec010814ca7ac22d70819dd32af
|
|
BLAKE2b-256 checksum How to use checksums |
3bec7e2c74ae111542ded0b96c0099b322a773948192517efc8714bf8a206116
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 10, 2026.
Transparency logRelease files / demon_cry_base-0.3.1-py3-none-any.whl
| Download URL | demon_cry_base-0.3.1-py3-none-any.whl |
|---|---|
| Size | 4.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6b8c6dd061871177839b0201caa4f5fb050716c303fa16c3549218a5deba3a95
|
|
BLAKE2b-256 checksum How to use checksums |
da9fee3245a46a88d9325ef2707f11c46118baa1d24c83e85f98d29ca25afc87
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 10, 2026.
Transparency log