Contributing to BOA
Everything flows through the public omega8cc GitHub organisation. omega8cc is the effective upstream for the whole stack — the Ægir components (Hostmaster, Provision, Hosting, hosting_tasks_extra) and Drush are fully diverged forks, so never route a patch or an issue through a pre-fork queue (aegir-project drupal.org queues, drush-ops): it will only get redirected.
Where to file
| Channel | Use |
|---|---|
| github.com/omega8cc/boa/issues | The only active tracker, for the whole stack — including bugs whose fix lands in one of the fork repos. Maintainers route from here. |
| gitter.im/omega8cc/boa | Chat; questions that are not yet a reproducible bug. |
| drupal.org Barracuda, drupal.org Octopus | Deprecated legacy queues. Search them for prior art; never file there. |
Search the active queue (and the legacy ones) for a duplicate before filing. Reports that ignore the guidelines below are closed unread — that is stated policy, not a threat.
What a useful bug report contains
The boa info Gist is mandatory. Every bug report must link a
Gist with the output of boa info, run as root on
the affected box. The generator is _display_info() in aegir/tools/bin/boa
(function at boa:2384, dispatched from the info) case at boa:3038, which
calls _check_virt then _display_info). It emits:
- host/CPU/disk basics (dmidecode manufacturer,
nproc, root-fs usage), plus a loud warning block on bare metal or unsupported virtualisation; - component versions as terse tags —
SKY,CSF,NGX,PHP,DBV,RDS,PXY,SSH,SSL,CRL, … (boa:2579+); - effective config echo tags (
_DBS,_DNS,_PHP-family,_XTR, …); - the
_XSYuptime/load/kernel/GRUB/RAM/disk report and the_XSEkey-services uptime report; - the tail of the upgrade history:
tail --lines=5 /var/log/barracuda_log.txt.
Mode variants, from the _mOde branch (boa:2816-2825):
| Command | Output |
|---|---|
boa info |
Summary above + last 5 barracuda_log.txt entries |
boa info more |
Same, with barracuda_log.txt entries for the current and previous year |
boa info full |
Whole /var/log/barracuda_log.txt (works, but not advertised in boa help) |
boa info report octopus |
Per-instance report: hosted-site count per Octopus, _PHP_CLI_VERSION/_PHP_FPM_VERSION from /root/.oN.octopus.cnf, Percona incompatibility findings from /var/log/boa/core/incompatible-*.log |
boa info report backups |
tail --lines=19 /var/log/boa/*.archive.log |
boa info report both |
PHP versions across all instances + the backups tail |
Beyond the Gist, include:
- the exact command sequence that triggered the problem, verbatim;
- virtualisation system and hosting provider (name + URL) — the same context
_check_virtreports; - whether a fresh install of the same release reproduces it (install/upgrade bugs usually do; this rules out config drift);
- for upgrade failures: re-run with
_DEBUG_MODE=YESin/root/.barracuda.cnffirst (defaultNO,lib/settings/barracuda.sh.cnf:338) — it switches on thePROC:/DEBUGtracing throughout the lib functions.
Where the logs are
| Path | What it is |
|---|---|
/var/log/barracuda_log.txt |
One line per completed Barracuda run: date / OS / virt / Barracuda version-serial / Nginx / PHP-MI / FPM / CLI / DB server-version — appended by _barracuda_log_update() (lib/functions/helper.sh.inc:1273). This is what boa info tails and what the version-series checks read. |
/var/backups/barracuda_log.txt |
Duplicate copy of the same line, written in the same call (helper.sh.inc:1307). |
/var/backups/barracuda-install-<yymmdd-HHMMSS>.log / …-install-errors-… |
Per-run stdout/stderr capture of a first install. _LOG_INFO/_LOG_ERRR are set in lib/settings/barracuda.sh.cnf:1666-1670 (_vBs="/var/backups", BARRACUDA.sh.txt:191); install vs upgrade is decided by the presence of /var/aegir/.drush/hm.alias.drushrc.php. The _mrun wrapper tees command output into them silently (helper.sh.inc:114-133). Mode 600. |
/var/backups/barracuda-upgrade-<yymmdd-HHMMSS>.log / …-upgrade-errors-… |
Same pair for upgrade runs. Attach the newest pair (Gist, not inline) for any failed Barracuda run. |
/var/log/boa/ |
Runtime and SKYNET activity logs, including core/incompatible-*.log and the *.archive.log files the report modes read. |
/var/xdrago/monitor/log/ |
Self-healing monitor and abuse-guard logs. |
Octopus runs do not write /var/backups/octopus-* equivalents — the Octopus
side exports _LOG_INFO="" (lib/settings/octopus.sh.cnf:1142), so its output
stays on the console (or wherever the chosen {output} mode sends it).
Gist etiquette
- Never paste logs or
boa infooutput inline in the issue — the tool itself prints the instruction after every default run (boa:2827-2833): link a Gist, and name your hosting provider alongside it. _display_info()does not sanitise for you. The output carries the server hostname context, Octopus instance user names, kernel and full GRUB command line, partition layout, and the OS/virt fingerprint of every upgrade since install. Audit before posting; use a secret Gist when in doubt.- One issue per bug. A Gist can hold multiple files — put
boa infoand the failing run'sbarracuda-upgrade-errors-*.login the same Gist rather than opening two issues.
Pull requests
Target the repo's default branch — that is where all development lands:
| Repo | PR target |
|---|---|
omega8cc/boa |
5.x-dev |
omega8cc/provision |
5.x-dev |
omega8cc/hosting |
5.x-dev |
omega8cc/hostmaster |
5.x-dev |
omega8cc/hosting_tasks_extra |
5.x-dev |
omega8cc/drush |
8-boa-micro |
Never target the release lines (5.x-lts, 5.x-pro, or any -base/-edge
branch) — those are maintainer-managed promotion branches. A PR against a
release line will be closed or retargeted, not merged.
Mechanics that get a PR merged instead of reworked:
- One logical change per PR, single-concern commits. Promotion to the
-basebranches is selective; a commit that mixes concerns cannot be cherry-picked cleanly and stalls. - Match the house bash style in
BOA.sh.txt/BARRACUDA.sh.txt/OCTOPUS.sh.txtandlib/: two-space indent,_SNAKE_CASEscript variables with a leading underscore,lowercase_with_underscoresfunctions, quoted expansions, and the_msgoutput helper withINFO:/NOTE:/OOPS:/ERROR:/FATAL ERROR:prefixes in main scripts and lib functions. - Bump the fetch serial when you touch a fetched tool. Tools under
aegir/tools/are deployed to running fleets by_fetch_versioned()(BOA.sh.txt:1056): the stamp file is<name>.ctrl.<serial>.<tree>.<xsrl>.pid, and a box refetches only when its stamp no longer matches. Any change to such a tool must change thefNNserial at its call site inBOA.sh.txtin the same commit — old stamps are cleaned on refresh, so the serial only has to differ — otherwise deployed servers never pick the change up. Files underlib/ride the release version serial instead and need nofNNbump. - Keep fork PHP at the lowest supported floor.
boa helpstill offersphp-maxinstalling PHP 5.6–8.5, and legacy servers run the Ægir backend under old PHP CLI. PHP for Provision/Hosting/Drush must not assume modern syntax (no??, arrow functions, scalar type hints,match, …) unless the file is provably loaded only under a newer engine. - Leave
CHANGELOG.txtalone — it is the genuine release changelog, assembled by the maintainers at release time, not per-PR.
Security disclosure
Do not open a public issue for an exploitable bug. SKYNET keeps every
enabled fleet current on a tight cadence (the version check runs in
aegir/tools/system/owl.sh, the fetched-tool refresh in BOA.sh.txt
_fetch_versioned, and the optional self-upgrade cron in
aegir/tools/bin/autoupboa):
- a daily release check;
- frequent refresh of the key BOA tools;
- monitors and D7 core patching;
- a meta-installer refresh on a short interval;
- and where the optional self-upgrade cron is configured, servers pull each new tagged release automatically.
A public proof-of-concept is therefore live against every production server for the window between disclosure and the next tagged release reaching them.
Report privately to the maintainers (Omega8.cc) via the contact form at
omega8.cc/contact — the same private ticket
channel the maintainers direct support requests to elsewhere in the stack.
There is no root-level SECURITY.md disclosure policy file in the repo; the
contact form is the documented private path.
If supporting material is needed, use a secret Gist and share the link only in the private ticket. Public issues that turn out to be security-sensitive get pulled and you will be asked to refile privately.
What maintainers do with your contribution
Understanding the pipeline explains the review strictness. All of this is visible in the public branch history:
- Triage happens in the
omega8cc/boaqueue; fork-repo work is routed from there. - Merge to
5.x-dev— the latest-untested line. Your change is now in the default branch every clone and doc link points at. - Promotion to
5.x-dev-base— the slower, non-breaking subset (Merge branch '5.x-dev' into 5.x-dev-basemerges in the history); experimental work parks on5.x-dev-edgeinstead. - Promotion into the release lines —
5.x-dev-basemerges into5.x-pro-baseand5.x-lts-base, which merge into the stable5.x-pro/5.x-lts. - Tagging — releases are tagged only on the stable lines
(
BOA-<X.Y.Z>-pro/BOA-<X.Y.Z>-ltsin the tag list), with notes inreleases/BOA-<X.Y.Z>-*.mdandCHANGELOG.txt. A tag is a fleet trigger: SKYNET-enabled servers detect the new release on their daily check (aegir/tools/system/owl.sh) and, where the self-upgrade cron entries are configured, upgrade themselves (aegir/tools/bin/autoupboa).
Step 5 is why review is conservative: a merged change ends up executing as root on every production BOA server with no operator in the loop. Expect maintainers to rework, split, or defer contributions to fit that pipeline — and expect a serial-mechanics or style rework request to be about fleet safety, not taste.
Related
- Reference appendix — consolidated variable and
command index, including the
boaCLI verbs and the_DEBUG_MODE/ logging-related/root/.barracuda.cnfsettings referenced above.