Collector framework to collect data from running Dwellir server nodes.
Project description
Dwellir Harvester
An extensible Python tool to collect metadata from local blockchain nodes and output a JSON file that conforms to a shared JSON Schema.
All timestamps use RFC 3339 / ISO 8601 with timezone.
System Requirements
- Python 3.9 or higher
- Systemd (for running as a service)
Installation
From Source
-
Clone the repository:
git clone https://github.com/your-org/dwellir-harvester.git cd dwellir-harvester
-
Create and activate a virtual environment:
python3 -m venv .venv source .venv/bin/activate # On Windows: .venv\Scripts\activate
-
Install the package in development mode:
pip install -e .
System-wide Installation
For production use, you can install the package system-wide:
sudo pip install .
Quick Start
Run a Single Collection
# Run with the safe default "host" collector (basic system information)
dwellir-harvester collect host null --output out.json
Run the Daemon
The harvester can run as a daemon that periodically collects data and serves it via HTTP:
# Start the daemon (runs in foreground)
dwellir-harvester-daemon
By default, the daemon:
- Runs on
0.0.0.0:18080 - Collects data every 5 minutes
- Uses the "host" collector
- Validates output against the schema
Secure the Daemon with Tokens
The daemon can require a bearer token for all endpoints. Auth is disabled by default; set tokens to enable it.
- Single or multiple tokens via CLI:
dwellir-harvester-daemon --auth-token secret1 --auth-token secret2
- Environment variable:
DAEMON_AUTH_TOKENS=secret1,secret2 dwellir-harvester-daemon
- Token file (JSON/YAML list of
{ "token": "...", "label": "client-name", "enabled": true }):dwellir-harvester-daemon --auth-token-file /path/tokens.json # or DAEMON_AUTH_TOKEN_FILE=/path/tokens.json dwellir-harvester-daemon
Requests must send Authorization: Bearer <token> (or X-Auth-Token). Invalid/missing tokens get 401 Unauthorized with WWW-Authenticate: Bearer.
Tip: Put the token file somewhere readable by the daemon user, and omit raw secrets from logs—only labels are logged on failures.
Configuration
Command Line Arguments
usage: dwellir-harvester-daemon [-h] [--collectors COLLECTORS [COLLECTORS ...]] [--host HOST] [--port PORT] [--debug]
[--interval INTERVAL] [--schema SCHEMA] [--auth-token AUTH_TOKENS] [--auth-token-file AUTH_TOKEN_FILE]
[--no-validate] [--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
Dwellir Harvester Daemon
options:
-h, --help show this help message and exit
--collectors COLLECTORS [COLLECTORS ...]
List of collectors to run (default: ['host'])
--host HOST Host to bind the HTTP server to (default: 0.0.0.0)
--port PORT Port to run the HTTP server on (default: 18080)
--interval INTERVAL Collection interval in seconds (default: 300)
--schema SCHEMA Path to JSON schema file (defaults to bundled schema)
--auth-token AUTH_TOKENS
Bearer token to require for HTTP access (can be specified multiple times)
--auth-token-file AUTH_TOKEN_FILE
Path to JSON/YAML file containing token entries: [{"token": "...", "label": "...", "enabled": true}]
--no-validate Disable schema validation
--debug Enable debug logging
--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
Logging level (default: INFO)
Environment Variables
DATA_DIR: Directory to store data files (default:/var/lib/dwellir-harvester)LOG_LEVEL: Logging level (default:INFO)PORT: HTTP server port (default:18080)INTERVAL: Collection interval in seconds (default:300)COLLECTORS: Space-separated list of collectors to run (default:host)VALIDATE: Enable/disable schema validation (default:true)DEBUG: Enable debug logging (default:false)DAEMON_AUTH_TOKENS: Comma-separated list of bearer tokensDAEMON_AUTH_TOKEN_FILE: Path to token file (JSON/YAML list of{token,label,enabled})
Running as a Systemd Service
-
Install the service using the provided script:
sudo scripts/install-service.sh -
The service will be installed with default settings. You can customize it by editing:
sudo nano /etc/dwellir-harvester/config
-
Start and enable the service:
sudo systemctl start dwellir-harvester sudo systemctl enable dwellir-harvester
-
Check the status:
systemctl status dwellir-harvester
-
View logs:
journalctl -u dwellir-harvester -f
Available Collectors
host- Collects basic system information (default)null- A dummy collectordummychain- Collects data from a dummychain (snap install dummychain --edge)
API Endpoints
GET /metadata- Get the latest collected dataGET /healthz- Health check endpoint
Development
Setting Up for Development
-
Clone the repository and install development dependencies:
git clone https://github.com/your-org/dwellir-harvester.git cd dwellir-harvester python -m venv .venv source .venv/bin/activate pip install -e ".[dev]"
-
Run tests:
pytest
-
Run linters:
black . isort . mypy .
Adding a New Collector
- Create a new Python file in
src/dwellir_harvester/collectors/ - Implement a class using the Dummycollector
BlockchainCollectoror NullcollectorGenericCollector - Add it to
__all__incollectors/__init__.py
License
MIT
HTTP API
The daemon exposes a small HTTP API on 0.0.0.0:<service.port> (default :18080).
Endpoints
GET /healthz→ plain text"ok"if the daemon is serving.GET /metadata→ the latest JSON document (200) or{"error":"metadata not found"}(404).
curl examples
# Health
curl -s http://127.0.0.1:18080/healthz
# Current metadata (pretty-print)
curl -s http://127.0.0.1:18080/metadata | jq .
If you changed the port via
service.port, replace18080in the examples.
Testing
python -m pip install -e .
pip install pytest
pytest -q
Build & publish (Python package)
# build
python3 -m pip install build twine
python3 -m build # creates dist/*.tar.gz and dist/*.whl
# upload to TestPyPI first (recommended)
python3 -m twine upload -r testpypi dist/*
# Install from testpypi
python3 -m venv .venv
source .venv/bin/activate
# Pull in deps from real, this is needed only on testpypi
pip3 install jsonschema>=4.25.1 psutil>=7.1.3 requests>=2.32.5
# Install from testpypi
pip3 install --index-url https://test.pypi.org/simple/ --no-deps dwellir-harvester
# then to PyPI
python3 -m twine upload dist/*
Notes
- The framework fills
metadata.last_collect_attempt_at,metadata.last_collect_status, andmetadata.last_successful_collect_atautomatically. - Collectors should only return the
blockchainandworkloadportions. - For recoverable issues, raise
CollectorPartialErrorwith warnings; the run will be markedpartialand still emit output. - For unrecoverable issues, raise
CollectorFailedError. - The
nullcollector is intended for smoke tests, CI, and “no local client” deployments.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dwellir_harvester-0.0.2.tar.gz.
File metadata
- Download URL: dwellir_harvester-0.0.2.tar.gz
- Upload date:
- Size: 34.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
65d4fec5e84f685400405ea7717364959fd504cc9d90af0fe7f98f28c5f16e54
|
|
| MD5 |
7faa40dcd654f8cfe6ccd72fa72f470c
|
|
| BLAKE2b-256 |
6cdfbbb1e1ac72e35d017755afa110f19b88d7a226453ba71c9599d81706132d
|
File details
Details for the file dwellir_harvester-0.0.2-py3-none-any.whl.
File metadata
- Download URL: dwellir_harvester-0.0.2-py3-none-any.whl
- Upload date:
- Size: 38.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
de2a7bdf5a8cad8352ace7eda6f143ccdb3b9ce71d5659618c1802bea04e9bd7
|
|
| MD5 |
e55443eccf2a626843cc5790be580a7c
|
|
| BLAKE2b-256 |
0a5379c77c74473718ec7ec507be151783c07fc0c770807a7a2748832154144b
|