Skip to content
Merged
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
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uv.lock binary merge=uv-lock
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -99,3 +99,4 @@ ENV/
inventory.yaml
*.bak
/bin/*
.venv
36 changes: 36 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,3 +139,39 @@ Clone the Broker repository and install locally with `uv pip install "broker[de
Copy the example settings file to `broker_settings.yaml` and edit it.

To run Broker outside of its base directory, specify the directory with the `BROKER_DIRECTORY` environment variable.

### Handling uv.lock conflicts

This project treats `uv.lock` as a binary file to suppress large diffs. To automatically resolve conflicts in this file, you can configure a custom merge driver:

```bash
git config merge.uv-lock.name "Generate uv.lock"
git config merge.uv-lock.driver "uv lock"
```


# API Usage
TODO: Flesh this out

## Using Broker as a Library

When using Broker as a library in your Python code, you control logging configuration:

```python
import logging

# Configure logging for your application
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)

# Optionally, control Broker's log level specifically
logging.getLogger('broker').setLevel(logging.DEBUG)

# Now import and use Broker
from broker import Broker
broker = Broker()
```

Broker uses the standard Python logging hierarchy under the `broker.*` namespace.
3 changes: 2 additions & 1 deletion broker/binds/beaker.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
"""A wrapper around the Beaker CLI."""

import json
import logging
from pathlib import Path
import subprocess
import time
from xml.etree import ElementTree as ET

from logzero import logger
logger = logging.getLogger(__name__)

from broker import helpers
from broker.exceptions import BeakerBindError
Expand Down
3 changes: 2 additions & 1 deletion broker/binds/foreman.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
"""Foreman provider implementation."""

import logging
import time

from logzero import logger
logger = logging.getLogger(__name__)
import requests

from broker import exceptions
Expand Down
3 changes: 2 additions & 1 deletion broker/binds/ssh2.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@
"""

from contextlib import contextmanager
import logging
from pathlib import Path

from logzero import logger
logger = logging.getLogger(__name__)
from ssh2 import sftp as _sftp
from ssh2.exceptions import SocketSendError
from ssh2.session import Session as _Session
Expand Down
3 changes: 2 additions & 1 deletion broker/binds/utils.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
"""Module providing base SSH methods and classes."""

import logging
import socket

from logzero import logger
logger = logging.getLogger(__name__)

from broker import exceptions

Expand Down
19 changes: 11 additions & 8 deletions broker/broker.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,16 @@

from concurrent.futures import ThreadPoolExecutor, as_completed
from contextlib import contextmanager
import logging

from logzero import logger

from broker import exceptions, helpers, logger as broker_logger
from broker import exceptions, helpers
from broker.hosts import Host
from broker.logging import setup_logging
from broker.providers import PROVIDER_ACTIONS, PROVIDERS, _provider_imports
from broker.settings import clone_global_settings

logger = logging.getLogger(__name__)

# load all the provider class so they are registered
for _import in _provider_imports:
__import__(f"broker.providers.{_import}", globals(), locals(), [], 0)
Expand Down Expand Up @@ -58,11 +60,11 @@ def __init__(self, broker_settings=None, **kwargs):
if broker_settings:
logger.debug(f"Using local settings object: {self._settings.to_dict()}")
if "logging" in broker_settings:
broker_logger.setup_logzero(
level=broker_settings.logging.console_level,
formatter=kwargs.pop("broker_log_formatter", None),
setup_logging(
console_level=broker_settings.logging.console_level,
file_level=broker_settings.logging.file_level,
path=broker_settings.logging.get("file_path"),
log_path=broker_settings.logging.log_path,
structured=broker_settings.logging.structured,
)
else:
logger.debug("Using global settings.")
Expand All @@ -73,7 +75,8 @@ def __init__(self, broker_settings=None, **kwargs):
# if a nick was specified, pull in the resolved arguments
if "nick" in kwargs:
nick = kwargs.pop("nick")
kwargs = helpers.merge_dicts(kwargs, helpers.resolve_nick(nick, self._settings))
# Merge nick resolution with kwargs; kwargs takes precedence over nick values
kwargs = helpers.merge_dicts(helpers.resolve_nick(nick, self._settings), kwargs)
logger.debug(f"kwargs after nick resolution {kwargs=}")
# Allow users to more simply pass a host class instead of a dict
if "host_class" in kwargs:
Expand Down
Loading