mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 06:38:20 +00:00

I'm merging in the remaining pieces from the former doc directory and restructuring things into sub-directories.
1913 lines
66 KiB
ReStructuredText
1913 lines
66 KiB
ReStructuredText
.. Autogenerated. Do not edit.
|
||
|
||
.. -*- mode: rst-mode -*-
|
||
..
|
||
.. Note: This file includes further autogenerated ones.
|
||
..
|
||
.. Version number is filled in automatically.
|
||
.. |version| replace:: 1.1-3
|
||
|
||
==========
|
||
BroControl
|
||
==========
|
||
|
||
.. rst-class:: opening
|
||
|
||
This document summarizes installation and use of *BroControl*,
|
||
Bro's interactive shell for operating Bro installations. *BroControl*
|
||
has two modes of operation: a *stand-alone* mode for
|
||
managing a traditional, single-system Bro setup; and a *cluster*
|
||
mode for maintaining a multi-system setup of coordinated Bro
|
||
instances load-balancing the work across a set of independent
|
||
machines. Below, we describe the installation process separately
|
||
for the two modes. Once installed, the operation is pretty similar
|
||
for both types; just keep in mind that if this document refers to
|
||
"nodes" and you're in a stand-alone setup, there is only a
|
||
single one and no worker/proxies.
|
||
|
||
.. contents::
|
||
|
||
Download
|
||
--------
|
||
|
||
You can find the latest BroControl release for download at
|
||
http://www.bro.org/download.
|
||
|
||
BroControl's git repository is located at
|
||
`git://git.bro.org/broctl <git://git.bro.org/broctl>`_. You
|
||
can browse the repository `here <http://git.bro.org/broctl>`_.
|
||
|
||
This document describes BroControl |version|. See the ``CHANGES``
|
||
file for version history.
|
||
|
||
Prerequisites
|
||
-------------
|
||
|
||
Running *BroControl* requires the following prerequisites:
|
||
|
||
- A Unix system. FreeBSD, Linux, and MacOS are supported and
|
||
should work out of the box. Other Unix systems will quite likely
|
||
require some tweaking. Note that in a cluster setup, all systems
|
||
must be running exactly the *same* operating system.
|
||
|
||
- A version of *Python* >= 2.6.
|
||
|
||
- A *bash* (note in particular, that on FreeBSD, *bash* is not
|
||
installed by default).
|
||
|
||
Installation
|
||
------------
|
||
|
||
Stand-alone Bro
|
||
~~~~~~~~~~~~~~~
|
||
|
||
For installing a stand-alone Bro setup, just follow the
|
||
Bro :doc:`Quick Start Guide<../../quickstart>`.
|
||
|
||
Bro Cluster
|
||
~~~~~~~~~~~
|
||
|
||
A *Bro Cluster* is a set of systems jointly analyzing the traffic of
|
||
a network link in a coordinated fashion. *BroControl* is able to
|
||
operate such a setup from a central manager system pretty much
|
||
transparently, hiding much of the complexity of the multi-machine
|
||
installation.
|
||
|
||
A cluster consists of four types of components:
|
||
|
||
Frontends.
|
||
One or more frontends: Frontends load-balance the traffic
|
||
across a set of worker machines.
|
||
|
||
Worker nodes.
|
||
Workers are doing the actual analysis, with each seeing a
|
||
slice of the overall traffic as split by the frontend(s).
|
||
|
||
One or more proxies.
|
||
Proxies relay the communication between worker nodes.
|
||
|
||
One manager.
|
||
The manager provides the cluster's user-interface for
|
||
controlling and logging. During operation, the user only
|
||
interacts with the manager; this is where *BroControl* is
|
||
running.
|
||
|
||
For more information about the cluster architecture, including options
|
||
for the frontend, see the :doc:`Bro Cluster<../../cluster>` documentation.
|
||
|
||
This document focuses on the installation of manager,
|
||
workers, and the proxies. If not otherwise
|
||
stated, in the following we use the terms "manager", "worker", and
|
||
"proxy" to refer to Bro instances, not to physical machines; rather,
|
||
we use the term "node" to refer to physical machines. There may be
|
||
multiple Bro instances running on the same node. For example, it's
|
||
possible to run a proxy on the same node as the manager is operating
|
||
on.
|
||
|
||
In the following, as an example setup, we will assume that our
|
||
cluster consists of four nodes (not counting the frontend). The host
|
||
names of the systems will be ``host1``, ``host2``, ``host3``, and
|
||
``host4``. We will configure the cluster so that ``host1`` runs the
|
||
manager and the (only) proxy, and ``host{2,3,4}`` are each running
|
||
one worker. This is a typical setup, which will work well for many
|
||
sites.
|
||
|
||
When installing a cluster, in addition to the prerequisites
|
||
mentioned above, you need to
|
||
|
||
- have the same user account set up on all nodes. On the worker
|
||
nodes, this user must have access to target network interface in
|
||
promiscuous mode. ``ssh`` access from the manager node to this
|
||
user account must be setup on all machines, and must work
|
||
without asking for a password/passphrase.
|
||
|
||
- have some storage available on all nodes under the same path,
|
||
which we will call the cluster's *prefix* path. In the
|
||
following, we will use ``/usr/local/bro`` as an example. The Bro
|
||
user must be able to either create this directory or, where it
|
||
already exists, must have write permission inside this directory
|
||
on all nodes.
|
||
|
||
- have ``ssh`` and ``rsync`` installed.
|
||
|
||
|
||
With all prerequisites in place, perform the following steps to
|
||
install a Bro cluster (as the Bro user) if you install from the Bro source
|
||
code (which includes BroControl):
|
||
|
||
- Configure and compile the Bro distribution using the cluster's
|
||
prefix path as ``--prefix``::
|
||
|
||
> cd /path/to/bro/source/distribution
|
||
> ./configure --prefix=/usr/local/bro && make && make install
|
||
|
||
- Add ``<prefix>/bin`` to your ``PATH``.
|
||
|
||
- Create a cluster configuration file. There is an example provided,
|
||
which you can edit according to the instructions in the file::
|
||
|
||
> cd /usr/local/bro
|
||
> vi etc/broctl.cfg
|
||
|
||
- Create a node configuration file to define where manager, workers,
|
||
and proxies are to run. There is again an example, which defines
|
||
the example scenario described above and can be edited as needed::
|
||
|
||
> cd /usr/local/bro
|
||
> vi etc/node.cfg
|
||
|
||
- Create a network configuration file that lists all of the networks
|
||
which the cluster should consider as local to the monitored
|
||
environment. Once again, the installation installs a template for
|
||
editing::
|
||
|
||
> cd /usr/local/bro
|
||
> vi etc/networks.cfg
|
||
|
||
- Install workers and proxies using *BroControl*::
|
||
|
||
> broctl install
|
||
|
||
This installation process uses ``ssh`` and ``rdist`` to copy the
|
||
configuration over to the remote machines so, as described above,
|
||
you need to ensure that logging in via SSH works before the install will
|
||
succeed.
|
||
|
||
- Some tasks need to be run on a regular basis. On the manager node,
|
||
insert a line like this into the crontab of the user running the
|
||
cluster::
|
||
|
||
0-59/5 * * * * <prefix>/bin/broctl cron
|
||
|
||
- Finally, you can start the cluster::
|
||
|
||
> broctl start
|
||
|
||
Getting Started
|
||
---------------
|
||
|
||
*BroControl* is an interactive interface to the cluster which allows
|
||
you to, e.g., start/stop the monitoring or update its configuration.
|
||
It is started with the ``broctl`` script and then expects commands
|
||
on its command-line (alternatively, ``broctl`` can also be started
|
||
with a single command directly on the shell's command line)::
|
||
|
||
> broctl
|
||
Welcome to BroControl x.y
|
||
|
||
Type "help" for help.
|
||
|
||
[BroControl] >
|
||
|
||
As the message says, type help_ to see a list of
|
||
all commands. We will now briefly summarize the most important
|
||
commands. A full reference follows `Command Reference`_.
|
||
|
||
Once ``broctl.cfg`` and ``node.cfg`` are set up as described above,
|
||
the monitoring can be started with the start_ command. In the cluster
|
||
setup, this will successively start manager, proxies, and workers. The
|
||
status_ command should then show all nodes as operating. To stop the
|
||
monitoring, issue the stop_ command. exit_ leaves the shell.
|
||
|
||
On the manager system (and on the stand-alone system), you find the
|
||
current set of (aggregated) logs in ``logs/current`` (which is a
|
||
symlink to the corresponding spool directory). The proxies and workers
|
||
log into ``spool/proxy/`` and ``spool/<worker-name>/``, respectively.
|
||
The manager/stand-alone logs are archived in ``logs/``, by default
|
||
once a day. Log files of workers and proxies are discarded at the
|
||
same rotation interval.
|
||
|
||
Whenever the *BroControl* configuration is modified in any way
|
||
(including changes to configuration files and site-specific policy
|
||
scripts), install_ installs the new version. *No changes will take
|
||
effect until* install_ *is run*. Before you run install_, check_ can be
|
||
used to check for any potential errors in the new configuration, e.g.,
|
||
typos in scripts. If check_ does not report any problems, doing
|
||
install_ will pretty likely not break anything.
|
||
|
||
Note that generally configuration changes only take effect after a
|
||
restart of the affected nodes. The restart_ command triggers this.
|
||
Some changes however can be put into effect on-the-fly without
|
||
restarting any of the nodes by using the update_ command (again only
|
||
after doing install_ first). Such dynamic updates generally work with
|
||
all changes done which only modify const variables declared as
|
||
*redefinable* (i.e., with Bro's *&redef* attribute).
|
||
|
||
Generally, site-specific tuning needs to be done with local policy
|
||
scripts, as in any Bro setup. This is described in
|
||
`Site-specific Customization`_.
|
||
|
||
*BroControl* provides various options to control the behavior of
|
||
the setup. These options can be set by editing ``broctl.cfg``.
|
||
The config_ command gives a list of all options
|
||
with their current values. A list of the most important options also
|
||
follows `Option Reference`_.
|
||
|
||
Site-specific Customization
|
||
---------------------------
|
||
|
||
You'll most likely want to adapt the Bro policy to the local
|
||
environment and much of the more specific tuning requires writing
|
||
local policy files.
|
||
|
||
During the initial install, sample local policy scripts (which you can edit)
|
||
are installed in ``share/bro/site``. In the stand-alone setup, a single
|
||
file called ``local.bro`` gets loaded automatically. In the cluster
|
||
setup, the same ``local.bro`` gets loaded, followed by one of three
|
||
other files: ``local-manager.bro``, ``local-worker.bro``, and
|
||
``local-proxy.bro`` are loaded by the manager, workers, and proxy,
|
||
respectively.
|
||
|
||
In the cluster setup, the main exception to putting everything into
|
||
``local.bro`` is notice filtering, which should be done only on the
|
||
manager.
|
||
|
||
The next scripts that are loaded are the ones that are automatically
|
||
generated by BroControl. These scripts are created from the
|
||
``networks.cfg`` and ``broctl.cfg`` files.
|
||
|
||
The last scripts loaded are any node-specific scripts specified with the
|
||
option ``aux_scripts`` in ``node.cfg``. This option can be used to
|
||
load additional scripts to individual nodes only. For example, one could
|
||
add a script ``experimental.bro`` to a single worker for trying out new
|
||
experimental code.
|
||
|
||
The scripts_ command shows precisely which policy scripts get loaded (and
|
||
in what order) by a node; that can be very helpful.
|
||
|
||
If you want to change which local policy scripts are loaded by the nodes,
|
||
you can set SitePolicyStandalone_ for all Bro instances,
|
||
SitePolicyManager_ for the manager, and SitePolicyWorker_ for the
|
||
workers. To change the directory where local policy scripts are
|
||
located, set the option SitePolicyPath_ to a different path. These
|
||
options can be changed in the ``broctl.cfg`` file.
|
||
|
||
Command Reference
|
||
-----------------
|
||
|
||
The following summary lists all commands supported by *BroControl*.
|
||
All commands may be either entered interactively or specified on the
|
||
shell's command line. If not specified otherwise, commands taking
|
||
*[<nodes>]* as arguments apply their action either to the given set of
|
||
nodes, or to all nodes if none is given.
|
||
|
||
[?1034h.. Automatically generated. Do not edit.
|
||
|
||
|
||
.. _attachgdb:
|
||
|
||
*attachgdb* *[<nodes>]*
|
||
Primarily for debugging, the command attaches a *gdb* to the main Bro
|
||
process on the given nodes.
|
||
|
||
|
||
.. _capstats:
|
||
|
||
*capstats* *[<nodes>] [<interval>]*
|
||
Determines the current load on the network interfaces monitored by
|
||
each of the given worker nodes. The load is measured over the
|
||
specified interval (in seconds), or by default over 10 seconds. This
|
||
command uses the `capstats tool
|
||
<http://www.bro.org/files/capstats-release/README.html>`_,
|
||
which is installed along with ``broctl``.
|
||
|
||
(Note: When using a CFlow and the CFlow command line utility is
|
||
installed as well, the ``capstats`` command can also query the device
|
||
for port statistics. *TODO*: document how to set this up.)
|
||
|
||
|
||
.. _check:
|
||
|
||
*check* *[<nodes>]*
|
||
Verifies a modified configuration in terms of syntactical correctness
|
||
(most importantly correct syntax in policy scripts). This command
|
||
should be executed for each configuration change *before*
|
||
install_ is used to put the change into place. Note
|
||
that ``check`` is the only command which operates correctly without a
|
||
former install_ command; ``check`` uses the policy
|
||
files as found in SitePolicyPath_ to make
|
||
sure they compile correctly. If they do, install_
|
||
will then copy them over to an internal place from where the nodes
|
||
will read them at the next start_. This approach
|
||
ensures that new errors in a policy script will not affect currently
|
||
running nodes, even when one or more of them needs to be restarted.
|
||
|
||
|
||
.. _cleanup:
|
||
|
||
*cleanup* *[--all] [<nodes>]*
|
||
Clears the nodes' spool directories (if they are not running
|
||
currently). This implies that their persistent state is flushed. Nodes
|
||
that were crashed are reset into *stopped* state. If ``--all`` is
|
||
specified, this command also removes the content of the node's
|
||
TmpDir_, in particular deleteing any data
|
||
potentially saved there for reference from previous crashes.
|
||
Generally, if you want to reset the installation back into a clean
|
||
state, you can first stop_ all nodes, then execute
|
||
``cleanup --all``, and finally start_ all nodes
|
||
again.
|
||
|
||
|
||
.. _config:
|
||
|
||
*config*
|
||
Prints all configuration options with their current values.
|
||
|
||
|
||
.. _cron:
|
||
|
||
*cron* *[enable|disable|?] | [--no-watch]*
|
||
This command has two modes of operation. Without arguments (or just
|
||
``--no-watch``), it performs a set of maintenance tasks, including
|
||
the logging of various statistical information, expiring old log
|
||
files, checking for dead hosts, and restarting nodes which terminated
|
||
unexpectedly. The latter can be suppressed with the ``--no-watch``
|
||
option if no auto-restart is desired. This mode is intended to be
|
||
executed regularly via *cron*, as described in the installation
|
||
instructions. While not intended for interactive use, no harm will be
|
||
caused by executing the command manually: all the maintenance tasks
|
||
will then just be performed one more time.
|
||
|
||
The second mode is for interactive usage and determines if the regular
|
||
tasks are indeed performed when ``broctl cron`` is executed. In other
|
||
words, even with ``broctl cron`` in your crontab, you can still
|
||
temporarily disable its execution by running ``cron disable``, and
|
||
then later reenable with ``cron enable``. This can be helpful while
|
||
working, e.g., on the BroControl configuration and ``cron`` would
|
||
interfere with that. ``cron ?`` can be used to query the current state.
|
||
|
||
|
||
.. _df:
|
||
|
||
*df* *[<nodes>]*
|
||
Reports the amount of disk space available on the nodes. Shows only
|
||
paths relevant to the broctl installation.
|
||
|
||
|
||
.. _diag:
|
||
|
||
*diag* *[<nodes>]*
|
||
If a node has terminated unexpectedly, this command prints a (somewhat
|
||
cryptic) summary of its final state including excerpts of any
|
||
stdout/stderr output, resource usage, and also a stack backtrace if a
|
||
core dump is found. The same information is sent out via mail when a
|
||
node is found to have crashed (the "crash report"). While the
|
||
information is mainly intended for debugging, it can also help to find
|
||
misconfigurations (which are usually, but not always, caught by the
|
||
check_ command).
|
||
|
||
|
||
.. _exec:
|
||
|
||
*exec* *<command line>*
|
||
Executes the given Unix shell command line on all nodes configured to
|
||
run at least one Bro instance. This is handy to quickly perform an
|
||
action across all systems.
|
||
|
||
|
||
.. _exit:
|
||
|
||
*exit*
|
||
Terminates the shell.
|
||
|
||
|
||
.. _help:
|
||
|
||
*help*
|
||
Prints a brief summary of all commands understood by the shell.
|
||
|
||
|
||
.. _install:
|
||
|
||
*install*
|
||
Reinstalls the given nodes, including all configuration files and
|
||
local policy scripts. This command must be executed after *all*
|
||
changes to any part of the broctl configuration, otherwise the
|
||
modifications will not take effect. Usually all nodes should be
|
||
reinstalled at the same time, as any inconsistencies between them will
|
||
lead to strange effects. Before executing ``install``, it is recommended
|
||
to verify the configuration with check_.
|
||
|
||
|
||
.. _netstats:
|
||
|
||
*netstats* *[<nodes>]*
|
||
Queries each of the nodes for their current counts of captured and
|
||
dropped packets.
|
||
|
||
|
||
.. _nodes:
|
||
|
||
*nodes*
|
||
Prints a list of all configured nodes.
|
||
|
||
|
||
.. _peerstatus:
|
||
|
||
*peerstatus* *[<nodes>]*
|
||
Primarily for debugging, ``peerstatus`` reports statistics about the
|
||
network connections cluster nodes are using to communicate with other
|
||
nodes.
|
||
|
||
|
||
.. _print:
|
||
|
||
*print* *<id> [<nodes>]*
|
||
Reports the *current* live value of the given Bro script ID on all of
|
||
the specified nodes (which obviously must be running). This can for
|
||
example be useful to (1) check that policy scripts are working as
|
||
expected, or (2) confirm that configuration changes have in fact been
|
||
applied. Note that IDs defined inside a Bro namespace must be
|
||
prefixed with ``<namespace>::`` (e.g., ``print SSH::did*ssh*version`` to
|
||
print the corresponding table from ``ssh.bro``.)
|
||
|
||
|
||
.. _process:
|
||
|
||
*process* *<trace> [options] [-- <scripts>]*
|
||
Runs Bro offline on a given trace file using the same configuration as
|
||
when running live. It does, however, use the potentially
|
||
not-yet-installed policy files in SitePolicyPath_ and disables log
|
||
rotation. Additional Bro command line flags and scripts can
|
||
be given (each argument after a ``--`` argument is interpreted as
|
||
a script).
|
||
|
||
Upon completion, the command prints a path where the log files can be
|
||
found. Subsequent runs of this command may delete these logs.
|
||
|
||
In cluster mode, Bro is run with *both* manager and worker scripts
|
||
loaded into a single instance. While that doesn't fully reproduce the
|
||
live setup, it is often sufficient for debugging analysis scripts.
|
||
|
||
|
||
.. _quit:
|
||
|
||
*quit*
|
||
Terminates the shell.
|
||
|
||
|
||
.. _restart:
|
||
|
||
*restart* *[--clean] [<nodes>]*
|
||
Restarts the given nodes, or all nodes if none are specified. The
|
||
effect is the same as first executing stop_ followed
|
||
by a start_, giving the same nodes in both cases.
|
||
This command is most useful to activate any changes made to Bro policy
|
||
scripts (after running install_ first). Note that a
|
||
subset of policy changes can also be installed on the fly via the
|
||
update_, without requiring a restart.
|
||
|
||
If ``--clean`` is given, the installation is reset into a clean state
|
||
before restarting. More precisely, a ``restart --clean`` turns into
|
||
the command sequence stop_, cleanup_ --all, check_, install_, and
|
||
start_.
|
||
|
||
|
||
.. _scripts:
|
||
|
||
*scripts* *[-c] [<nodes>]*
|
||
Primarily for debugging Bro configurations, the ``scripts``
|
||
command lists all the Bro scripts loaded by each of the nodes in the
|
||
order they will be parsed by the node at startup.
|
||
If ``-c`` is given, the command operates as check_ does: it reads
|
||
the policy files from their *original* location, not the copies
|
||
installed by install_. The latter option is useful to check a
|
||
not yet installed configuration.
|
||
|
||
|
||
.. _start:
|
||
|
||
*start* *[<nodes>]*
|
||
Starts the given nodes, or all nodes if none are specified. Nodes
|
||
already running are left untouched.
|
||
|
||
|
||
.. _status:
|
||
|
||
*status* *[<nodes>]*
|
||
Prints the current status of the given nodes.
|
||
|
||
|
||
.. _stop:
|
||
|
||
*stop* *[<nodes>]*
|
||
Stops the given nodes, or all nodes if none are specified. Nodes not
|
||
running are left untouched.
|
||
|
||
|
||
.. _top:
|
||
|
||
*top* *[<nodes>]*
|
||
For each of the nodes, prints the status of the two Bro
|
||
processes (parent process and child process) in a *top*-like
|
||
format, including CPU usage and memory consumption. If
|
||
executed interactively, the display is updated frequently
|
||
until key ``q`` is pressed. If invoked non-interactively, the
|
||
status is printed only once.
|
||
|
||
|
||
.. _update:
|
||
|
||
*update* *[<nodes>]*
|
||
After a change to Bro policy scripts, this command updates the Bro
|
||
processes on the given nodes *while they are running* (i.e., without
|
||
requiring a restart_). However, such dynamic
|
||
updates work only for a *subset* of Bro's full configuration. The
|
||
following changes can be applied on the fly: The value of all
|
||
const variables defined with the ``&redef`` attribute can be changed.
|
||
More extensive script changes are not possible during runtime and
|
||
always require a restart; if you change more than just the values of
|
||
``&redef``-able consts and still issue ``update``, the results are
|
||
undefined and can lead to crashes. Also note that before running
|
||
``update``, you still need to do an install_ (preferably after
|
||
check_), as otherwise ``update`` will not see the changes and it will
|
||
resend the old configuration.
|
||
|
||
|
||
Option Reference
|
||
----------------
|
||
|
||
This section summarizes the options that can be set in ``broctl.cfg``
|
||
for customizing the behavior of *BroControl*. Usually, one only needs
|
||
to change the "user options", which are listed first. The "internal
|
||
options" are, as the name suggests, primarily used internally and set
|
||
automatically. They are documented here only for reference.
|
||
|
||
.. Automatically generated. Do not edit.
|
||
|
||
User Options
|
||
~~~~~~~~~~~~
|
||
.. _BroArgs:
|
||
|
||
*BroArgs* (string, default _empty_)
|
||
Additional arguments to pass to Bro on the command-line.
|
||
|
||
.. _CFlowAddress:
|
||
|
||
*CFlowAddress* (string, default _empty_)
|
||
If a cFlow load-balancer is used, the address of the device (format: <ip>:<port>).
|
||
|
||
.. _CFlowPassword:
|
||
|
||
*CFlowPassword* (string, default _empty_)
|
||
If a cFlow load-balancer is used, the password for accessing its configuration interface.
|
||
|
||
.. _CFlowUser:
|
||
|
||
*CFlowUser* (string, default _empty_)
|
||
If a cFlow load-balancer is used, the user name for accessing its configuration interface.
|
||
|
||
.. _CommTimeout:
|
||
|
||
*CommTimeout* (int, default 10)
|
||
The number of seconds to wait before assuming Broccoli communication events have timed out.
|
||
|
||
.. _CompressCmd:
|
||
|
||
*CompressCmd* (string, default "gzip -9")
|
||
If archived logs will be compressed, the command to use for that. The specified command must compress its standard input to standard output.
|
||
|
||
.. _CompressExtension:
|
||
|
||
*CompressExtension* (string, default "gz")
|
||
If archived logs will be compressed, the file extension to use on compressed log files. When specifying a file extension, don't include the period character (e.g., specify 'gz' instead of '.gz').
|
||
|
||
.. _CompressLogs:
|
||
|
||
*CompressLogs* (bool, default 1)
|
||
True to compress archived log files.
|
||
|
||
.. _CronCmd:
|
||
|
||
*CronCmd* (string, default _empty_)
|
||
A custom command to run everytime the cron command has finished.
|
||
|
||
.. _Debug:
|
||
|
||
*Debug* (bool, default 0)
|
||
Enable extensive debugging output in spool/debug.log.
|
||
|
||
.. _HaveNFS:
|
||
|
||
*HaveNFS* (bool, default 0)
|
||
True if shared files are mounted across all nodes via NFS (see FAQ).
|
||
|
||
.. _IPv6Comm:
|
||
|
||
*IPv6Comm* (bool, default 1)
|
||
Enable IPv6 communication between cluster nodes (and also between them and BroControl)
|
||
|
||
.. _LogDir:
|
||
|
||
*LogDir* (string, default "$\{BroBase}/logs")
|
||
Directory for archived log files.
|
||
|
||
.. _LogExpireInterval:
|
||
|
||
*LogExpireInterval* (int, default 0)
|
||
Number of days log files are kept (zero means disabled).
|
||
|
||
.. _LogRotationInterval:
|
||
|
||
*LogRotationInterval* (int, default 3600)
|
||
The frequency of log rotation in seconds for the manager/standalone node.
|
||
|
||
.. _MailAlarmsTo:
|
||
|
||
*MailAlarmsTo* (string, default "$\{MailTo}")
|
||
Destination address for alarm summary mails. Default is to use the same address as MailTo.
|
||
|
||
.. _MailFrom:
|
||
|
||
*MailFrom* (string, default "Big Brother <bro@localhost>")
|
||
Originator address for broctl-generated mails.
|
||
|
||
.. _MailReplyTo:
|
||
|
||
*MailReplyTo* (string, default _empty_)
|
||
Reply-to address for broctl-generated mails.
|
||
|
||
.. _MailSubjectPrefix:
|
||
|
||
*MailSubjectPrefix* (string, default "[Bro]")
|
||
General Subject prefix for mails.
|
||
|
||
.. _MailTo:
|
||
|
||
*MailTo* (string, default "<user>")
|
||
Destination address for non-alarm mails.
|
||
|
||
.. _MakeArchiveName:
|
||
|
||
*MakeArchiveName* (string, default "$\{BroBase}/share/broctl/scripts/make-archive-name")
|
||
Script to generate filenames for archived log files.
|
||
|
||
.. _MemLimit:
|
||
|
||
*MemLimit* (string, default "unlimited")
|
||
Maximum amount of memory for Bro processes to use (in KB, or the string 'unlimited').
|
||
|
||
.. _MinDiskSpace:
|
||
|
||
*MinDiskSpace* (int, default 5)
|
||
Percentage of minimum disk space available before warning is mailed.
|
||
|
||
.. _PFRINGClusterID:
|
||
|
||
*PFRINGClusterID* (int, default @PF_RING_CLUSTER_ID@)
|
||
If PF_RING flow-based load balancing is desired, this is where the PF_RING cluster id is defined. The default value is configuration-dependent and determined automatically by CMake at configure-time based upon whether PF_RING's enhanced libpcap is available. Bro must be linked with PF_RING's libpcap wrapper for this option to work.
|
||
|
||
.. _Prefixes:
|
||
|
||
*Prefixes* (string, default "local")
|
||
Additional script prefixes for Bro, separated by colons. Use this instead of @prefix.
|
||
|
||
.. _SaveTraces:
|
||
|
||
*SaveTraces* (bool, default 0)
|
||
True to let backends capture short-term traces via '-w'. These are not archived but might be helpful for debugging.
|
||
|
||
.. _SendMail:
|
||
|
||
*SendMail* (string, default "@SENDMAIL@")
|
||
Location of the sendmail binary. Make this string blank to prevent email from being sent. The default value is configuration-dependent and determined automatically by CMake at configure-time.
|
||
|
||
.. _SitePluginPath:
|
||
|
||
*SitePluginPath* (string, default _empty_)
|
||
Directories to search for custom plugins, separated by colons.
|
||
|
||
.. _SitePolicyManager:
|
||
|
||
*SitePolicyManager* (string, default "local-manager.bro")
|
||
Space-separated list of local policy files for manager.
|
||
|
||
.. _SitePolicyPath:
|
||
|
||
*SitePolicyPath* (string, default "$\{PolicyDir}/site")
|
||
Directories to search for local policy files, separated by colons.
|
||
|
||
.. _SitePolicyStandalone:
|
||
|
||
*SitePolicyStandalone* (string, default "local.bro")
|
||
Space-separated list of local policy files for all Bro instances.
|
||
|
||
.. _SitePolicyWorker:
|
||
|
||
*SitePolicyWorker* (string, default "local-worker.bro")
|
||
Space-separated list of local policy files for workers.
|
||
|
||
.. _StopTimeout:
|
||
|
||
*StopTimeout* (int, default 60)
|
||
The number of seconds to wait before sending a SIGKILL to a node which was previously issued the 'stop' command but did not terminate gracefully.
|
||
|
||
.. _TimeFmt:
|
||
|
||
*TimeFmt* (string, default "%d %b %H:%M:%S")
|
||
Format string to print date/time specifications (see 'man strftime').
|
||
|
||
.. _TimeMachineHost:
|
||
|
||
*TimeMachineHost* (string, default _empty_)
|
||
If the manager should connect to a Time Machine, the address of the host it is running on.
|
||
|
||
.. _TimeMachinePort:
|
||
|
||
*TimeMachinePort* (string, default "47757/tcp")
|
||
If the manager should connect to a Time Machine, the port it is running on (in Bro syntax, e.g., 47757/tcp).
|
||
|
||
.. _ZoneID:
|
||
|
||
*ZoneID* (string, default _empty_)
|
||
If the host running BroControl is managing a cluster comprised of nodes with non-global IPv6 addresses, this option indicates what RFC 4007 zone_id to append to node addresses when communicating with them.
|
||
|
||
|
||
Internal Options
|
||
~~~~~~~~~~~~~~~~
|
||
|
||
.. _BinDir:
|
||
|
||
*BinDir* (string, default "$\{BroBase}/bin")
|
||
Directory for executable files.
|
||
|
||
.. _BroBase:
|
||
|
||
*BroBase* (string, default _empty_)
|
||
Base path of broctl installation on all nodes.
|
||
|
||
.. _CapstatsPath:
|
||
|
||
*CapstatsPath* (string, default "$\{bindir}/capstats")
|
||
Path to capstats binary; empty if not available.
|
||
|
||
.. _CfgDir:
|
||
|
||
*CfgDir* (string, default "$\{BroBase}/etc")
|
||
Directory for configuration files.
|
||
|
||
.. _DebugLog:
|
||
|
||
*DebugLog* (string, default "$\{SpoolDir}/debug.log")
|
||
Log file for debugging information.
|
||
|
||
.. _HelperDir:
|
||
|
||
*HelperDir* (string, default "$\{BroBase}/share/broctl/scripts/helpers")
|
||
Directory for broctl helper scripts.
|
||
|
||
.. _LibDir:
|
||
|
||
*LibDir* (string, default "$\{BroBase}/lib")
|
||
Directory for library files.
|
||
|
||
.. _LibDirInternal:
|
||
|
||
*LibDirInternal* (string, default "$\{BroBase}/lib/broctl")
|
||
Directory for broctl-specific library files.
|
||
|
||
.. _LocalNetsCfg:
|
||
|
||
*LocalNetsCfg* (string, default "$\{CfgDir}/networks.cfg")
|
||
File defining the local networks.
|
||
|
||
.. _LockFile:
|
||
|
||
*LockFile* (string, default "$\{SpoolDir}/lock")
|
||
Lock file preventing concurrent shell operations.
|
||
|
||
.. _NodeCfg:
|
||
|
||
*NodeCfg* (string, default "$\{CfgDir}/node.cfg")
|
||
Node configuration file.
|
||
|
||
.. _OS:
|
||
|
||
*OS* (string, default _empty_)
|
||
Name of operating system as reported by uname.
|
||
|
||
.. _PluginDir:
|
||
|
||
*PluginDir* (string, default "$\{LibDirInternal}/plugins")
|
||
Directory where standard plugins are located.
|
||
|
||
.. _PolicyDir:
|
||
|
||
*PolicyDir* (string, default "$\{BroBase}/share/bro")
|
||
Directory for standard policy files.
|
||
|
||
.. _PolicyDirSiteInstall:
|
||
|
||
*PolicyDirSiteInstall* (string, default "$\{SpoolDir}/installed-scripts-do-not-touch/site")
|
||
Directory where the shell copies local policy scripts when installing.
|
||
|
||
.. _PolicyDirSiteInstallAuto:
|
||
|
||
*PolicyDirSiteInstallAuto* (string, default "$\{SpoolDir}/installed-scripts-do-not-touch/auto")
|
||
Directory where the shell copies auto-generated local policy scripts when installing.
|
||
|
||
.. _PostProcDir:
|
||
|
||
*PostProcDir* (string, default "$\{BroBase}/share/broctl/scripts/postprocessors")
|
||
Directory for log postprocessors.
|
||
|
||
.. _ScriptsDir:
|
||
|
||
*ScriptsDir* (string, default "$\{BroBase}/share/broctl/scripts")
|
||
Directory for executable scripts shipping as part of broctl.
|
||
|
||
.. _SpoolDir:
|
||
|
||
*SpoolDir* (string, default "$\{BroBase}/spool")
|
||
Directory for run-time data.
|
||
|
||
.. _StandAlone:
|
||
|
||
*StandAlone* (bool, default 0)
|
||
True if running in stand-alone mode (see elsewhere).
|
||
|
||
.. _StateFile:
|
||
|
||
*StateFile* (string, default "$\{SpoolDir}/broctl.dat")
|
||
File storing the current broctl state.
|
||
|
||
.. _StaticDir:
|
||
|
||
*StaticDir* (string, default "$\{BroBase}/share/broctl")
|
||
Directory for static, arch-independent files.
|
||
|
||
.. _StatsDir:
|
||
|
||
*StatsDir* (string, default "$\{LogDir}/stats")
|
||
Directory where statistics are kept.
|
||
|
||
.. _StatsLog:
|
||
|
||
*StatsLog* (string, default "$\{SpoolDir}/stats.log")
|
||
Log file for statistics.
|
||
|
||
.. _Time:
|
||
|
||
*Time* (string, default _empty_)
|
||
Path to time binary.
|
||
|
||
.. _TmpDir:
|
||
|
||
*TmpDir* (string, default "$\{SpoolDir}/tmp")
|
||
Directory for temporary data.
|
||
|
||
.. _TmpExecDir:
|
||
|
||
*TmpExecDir* (string, default "$\{SpoolDir}/tmp")
|
||
Directory where binaries are copied before execution.
|
||
|
||
.. _TraceSummary:
|
||
|
||
*TraceSummary* (string, default "$\{bindir}/trace-summary")
|
||
Path to trace-summary script (empty if not available). Make this string blank to disable the connection summary emails.
|
||
|
||
.. _Version:
|
||
|
||
*Version* (string, default _empty_)
|
||
Version of the broctl.
|
||
|
||
|
||
Writing Plugins
|
||
---------------
|
||
|
||
BroControl provides a plugin interface to extend its functionality. A
|
||
plugin is written in Python and can do any, or all, of the following:
|
||
|
||
* Perform actions before or after any of the standard BroControl
|
||
commands is executed. When running before the actual command, it
|
||
can filter which nodes to operate or stop the execution
|
||
altogether. When running after the command, it gets access to
|
||
the commands success on a per-node basis (where applicable).
|
||
|
||
* Add custom commands to BroControl.
|
||
|
||
* Add custom options to BroControl defined in ``broctl.cfg``.
|
||
|
||
* Add custom keys to nodes defined in ``node.cfg``.
|
||
|
||
A plugin is written by deriving a new class from BroControl class
|
||
`Plugin`_. The Python script with the new plugin is then copied into a
|
||
plugin directory searched by BroControl at startup. By default,
|
||
BroControl searches ``<prefix>/lib/broctl/plugins``; further may be
|
||
configured by setting the PluginDir_ option. Note that any plugin
|
||
script must end in ``*.py`` to be found. BroControl comes with some
|
||
example plugins that can be used as a starting point; see
|
||
the ``<prefix>/lib/broctl/plugins`` directory.
|
||
|
||
In the following, we document the API that is available to plugins. A
|
||
plugin must be derived from the `Plugin`_ class, and can use its
|
||
methods as well as those of the `Node`_ class.
|
||
|
||
.. _Plugin:
|
||
|
||
Class ``Plugin``
|
||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
||
class **Plugin**
|
||
The class ``Plugin`` is the base class for all BroControl plugins.
|
||
|
||
The class has a number of methods for plugins to override, and every
|
||
plugin must at least override ``name()`` and ``pluginVersion()``.
|
||
|
||
For each BroControl command ``foo``, there are two methods,
|
||
``cmd_foo_pre`` and ``cmd_foo_post``, that are called just before the
|
||
command is executed and just after it has finished, respectively. The
|
||
arguments these methods receive correspond to their command-line
|
||
parameters, and are further documented below.
|
||
|
||
The ``cmd_<XXX>_pre`` methods have the ability to prevent the command's
|
||
execution, either completely or partially for those commands that take
|
||
nodes as parameters. In the latter case, the method receives a list of
|
||
nodes that the command is to be run on, and it can filter that list and
|
||
returns modified version of nodes to actually use. The standard case would
|
||
be returning simply the unmodified ``nodes`` parameter. To completely
|
||
block the command's execution, return an empty list. To just not execute
|
||
the command for a subset, remove the affected ones. For commands that do
|
||
not receive nodes as arguments, the return value is interpreted as boolean
|
||
indicating whether command execution should proceed (True) or not (False).
|
||
|
||
The ``cmd_<XXX>_post`` methods likewise receive the commands arguments as
|
||
their parameter, as documented below. For commands taking nodes, the list
|
||
corresponds to those nodes for which the command was actually executed
|
||
(i.e., after any ``cmd_<XXX>_pre`` filtering). Each node is given as a
|
||
tuple ``(node, bool)`` with *node* being the actual `Node`_, and the boolean
|
||
indicating whether the command was successful for it.
|
||
|
||
Note that if a plugin prevents a command from executing either completely or
|
||
partially, it should report its reason via the ``message*()`` or
|
||
``error()`` methods.
|
||
|
||
If multiple plugins hook into the same command, all their
|
||
``cmd_<XXX>_{pre,post}`` are executed in undefined order. The command is
|
||
executed on the intersection of all ``cmd_<XXX>_pre`` results.
|
||
|
||
Finally, note that the ``restart`` command doesn't have its own method as
|
||
it's just a combination of other commands and thus their callbacks are
|
||
run.
|
||
|
||
.. _Plugin.debug:
|
||
|
||
**debug** (self, msg)
|
||
|
||
Logs a debug message in BroControl's debug log if enabled.
|
||
|
||
.. _Plugin.error:
|
||
|
||
**error** (self, msg)
|
||
|
||
Reports an error to the user.
|
||
|
||
.. _Plugin.execute:
|
||
|
||
**execute** (self, node, cmd)
|
||
|
||
Executes a command on the host for the given *node* of type
|
||
`Node`_. Returns a tuple ``(success, output)`` in which ``success`` is
|
||
True if the command ran successfully and ``output`` is the combined
|
||
stdout/stderr output.
|
||
|
||
.. _Plugin.executeParallel:
|
||
|
||
**executeParallel** (self, cmds)
|
||
|
||
Executes a set of commands in parallel on multiple hosts. ``cmds``
|
||
is a list of tuples ``(node, cmd)``, in which the *node* is a `Node`_
|
||
instance and *cmd* is a string with the command to execute for it. The
|
||
method returns a list of tuples ``(node, success, output)``, in which
|
||
``success`` is True if the command ran successfully and ``output`` is
|
||
the combined stdout/stderr output for the corresponding ``node``.
|
||
|
||
.. _Plugin.getGlobalOption:
|
||
|
||
**getGlobalOption** (self, name)
|
||
|
||
Returns the value of the global BroControl option or state
|
||
attribute *name*. If the user has not set the options, its default
|
||
value is returned. See the output of ``broctl config`` for a complete
|
||
list.
|
||
|
||
.. _Plugin.getOption:
|
||
|
||
**getOption** (self, name)
|
||
|
||
Returns the value of one of the plugin's options, *name*. The
|
||
returned value will always be a string.
|
||
|
||
An option has a default value (see *options()*), which can be
|
||
overridden by a user in ``broctl.cfg``. An option's value cannot be
|
||
changed by the plugin.
|
||
|
||
.. _Plugin.getState:
|
||
|
||
**getState** (self, name)
|
||
|
||
Returns the current value of one of the plugin's state variables,
|
||
*name*. The returned value will always be a string. If it has not yet
|
||
been set, an empty string will be returned.
|
||
|
||
Different from options, state variables can be set by the plugin and
|
||
are persistent across restarts. They are not visible to the user.
|
||
|
||
Note that a plugin cannot query any global BroControl state variables.
|
||
|
||
.. _Plugin.hosts:
|
||
|
||
**hosts** (self, nodes)
|
||
|
||
Returns a list of all hosts running at least one node from the list
|
||
of Nodes_ objects in *nodes*, or configured in if *nodes* is empty.
|
||
|
||
.. _Plugin.message:
|
||
|
||
**message** (self, msg)
|
||
|
||
Reports a message to the user.
|
||
|
||
.. _Plugin.nodes:
|
||
|
||
**nodes** (self)
|
||
|
||
Returns a list of all configured `Node`_ objects.
|
||
|
||
.. _Plugin.parseNodes:
|
||
|
||
**parseNodes** (self, names)
|
||
|
||
Returns `Node`_ objects for a string of space-separated node names.
|
||
If a name does not correspond to a known node, an error message is
|
||
printed and the node is skipped from the returned list. If no names
|
||
are known, an empty list is returned.
|
||
|
||
.. _Plugin.setState:
|
||
|
||
**setState** (self, name, value)
|
||
|
||
Sets one of the plugin's state variables, *name*, to *value*.
|
||
*value* must be a string. The change is permanent and will be recorded
|
||
to disk.
|
||
|
||
Note that a plugin cannot change any global BroControl state
|
||
variables.
|
||
|
||
.. _Plugin.broProcessDied:
|
||
|
||
**broProcessDied** (self, node)
|
||
|
||
Called when BroControl finds the Bro process for Node_ *node*
|
||
to have terminated unexpectedly. This method will be called just
|
||
before BroControl prepares the node's "crash report" and before it
|
||
cleans up the node's spool directory.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_attachgdb_post:
|
||
|
||
**cmd_attachgdb_post** (self, nodes)
|
||
|
||
Called just after the ``attachgdb`` command has finished. Arguments
|
||
are as with the ``pre`` method.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_attachgdb_pre:
|
||
|
||
**cmd_attachgdb_pre** (self, nodes)
|
||
|
||
Called just before the ``attachgdb`` command is run. It receives the
|
||
list of nodes, and returns the list of nodes that should proceed with
|
||
the command.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_capstats_post:
|
||
|
||
**cmd_capstats_post** (self, nodes, interval)
|
||
|
||
Called just after the ``capstats`` command has finished. Arguments
|
||
are as with the ``pre`` method.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_capstats_pre:
|
||
|
||
**cmd_capstats_pre** (self, nodes, interval)
|
||
|
||
Called just before the ``capstats`` command is run. It receives the
|
||
list of nodes, and returns the list of nodes that should proceed with
|
||
the command. *integer* is an integer with the measurement interval in
|
||
seconds.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_check_post:
|
||
|
||
**cmd_check_post** (self, results)
|
||
|
||
Called just after the ``check`` command has finished. It receives
|
||
the list of 2-tuples ``(node, bool)`` indicating the nodes the command
|
||
was executed for, along with their success status.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_check_pre:
|
||
|
||
**cmd_check_pre** (self, nodes)
|
||
|
||
Called just before the ``check`` command is run. It receives the
|
||
list of nodes, and returns the list of nodes that should proceed with
|
||
the command.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_cleanup_post:
|
||
|
||
**cmd_cleanup_post** (self, nodes, all)
|
||
|
||
Called just after the ``cleanup`` command has finished. Arguments
|
||
are as with the ``pre`` method.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_cleanup_pre:
|
||
|
||
**cmd_cleanup_pre** (self, nodes, all)
|
||
|
||
Called just before the ``cleanup`` command is run. It receives the
|
||
list of nodes, and returns the list of nodes that should proceed with
|
||
the command. *all* is boolean indicating whether the ``--all``
|
||
argument has been given.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_config_post:
|
||
|
||
**cmd_config_post** (self)
|
||
|
||
Called just after the ``config`` command has finished.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_config_pre:
|
||
|
||
**cmd_config_pre** (self)
|
||
|
||
Called just before the ``config`` command is run.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_cron_post:
|
||
|
||
**cmd_cron_post** (self, arg, watch)
|
||
|
||
Called just after the ``cron`` command has finished. Arguments are
|
||
as with the ``pre`` method.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_cron_pre:
|
||
|
||
**cmd_cron_pre** (self, arg, watch)
|
||
|
||
Called just before the ``cron`` command is run. *arg* is None if
|
||
the cron is executed without arguments. Otherwise, it is one of the
|
||
strings: ``enable``, ``disable``, ``?``. *watch* is a boolean
|
||
indicating whether ``cron`` should restart abnormally terminated Bro
|
||
processes; it's only valid if arg is empty.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_custom:
|
||
|
||
**cmd_custom** (self, cmd, args)
|
||
|
||
Called when command defined by the ``commands`` method is executed.
|
||
``cmd`` is the command (with the plugin's prefix), and ``args`` is a
|
||
single *string* with all arguments.
|
||
|
||
If the arguments are actually node names, ``parseNodes`` can
|
||
be used to get the `Node`_ objects.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_df_post:
|
||
|
||
**cmd_df_post** (self, nodes)
|
||
|
||
Called just after the ``df`` command has finished. Arguments are as
|
||
with the ``pre`` method.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_df_pre:
|
||
|
||
**cmd_df_pre** (self, nodes)
|
||
|
||
Called just before the ``df`` command is run. It receives the
|
||
list of nodes, and returns the list of nodes that should proceed with
|
||
the command.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_diag_post:
|
||
|
||
**cmd_diag_post** (self, nodes)
|
||
|
||
Called just after the ``diag`` command has finished. Arguments are
|
||
as with the ``pre`` method.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_diag_pre:
|
||
|
||
**cmd_diag_pre** (self, nodes)
|
||
|
||
Called just before the ``diag`` command is run. It receives the
|
||
list of nodes, and returns the list of nodes that should proceed with
|
||
the command.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_exec_post:
|
||
|
||
**cmd_exec_post** (self, cmdline)
|
||
|
||
Called just after the ``exec`` command has finished. Arguments are
|
||
as with the ``pre`` method.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_exec_pre:
|
||
|
||
**cmd_exec_pre** (self, cmdline)
|
||
|
||
Called just before the ``exec`` command is run. *cmdline* is a
|
||
string with the command line to execute.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_install_post:
|
||
|
||
**cmd_install_post** (self)
|
||
|
||
Called just after the ``install`` command has finished.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_install_pre:
|
||
|
||
**cmd_install_pre** (self)
|
||
|
||
Called just before the ``install`` command is run.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_netstats_post:
|
||
|
||
**cmd_netstats_post** (self, nodes)
|
||
|
||
Called just after the ``netstats`` command has finished. Arguments
|
||
are as with the ``pre`` method.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_netstats_pre:
|
||
|
||
**cmd_netstats_pre** (self, nodes)
|
||
|
||
Called just before the ``netstats`` command is run. It receives the
|
||
list of nodes, and returns the list of nodes that should proceed with
|
||
the command.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_nodes_post:
|
||
|
||
**cmd_nodes_post** (self)
|
||
|
||
Called just after the ``nodes`` command has finished.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_nodes_pre:
|
||
|
||
**cmd_nodes_pre** (self)
|
||
|
||
Called just before the ``nodes`` command is run.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_peerstatus_post:
|
||
|
||
**cmd_peerstatus_post** (self, nodes)
|
||
|
||
Called just after the ``peerstatus`` command has finished.
|
||
Arguments are as with the ``pre`` method.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_peerstatus_pre:
|
||
|
||
**cmd_peerstatus_pre** (self, nodes)
|
||
|
||
Called just before the ``peerstatus`` command is run. It receives the
|
||
list of nodes, and returns the list of nodes that should proceed with
|
||
the command.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_print_post:
|
||
|
||
**cmd_print_post** (self, nodes, id)
|
||
|
||
Called just after the ``print`` command has finished. Arguments are
|
||
as with the ``pre`` method.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_print_pre:
|
||
|
||
**cmd_print_pre** (self, nodes, id)
|
||
|
||
Called just before the ``print`` command is run. It receives the
|
||
list of nodes, and returns the list of nodes that should proceed with
|
||
the command. *id* is a string with the name of the ID to be printed.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_process_post:
|
||
|
||
**cmd_process_post** (self, trace, options, scripts, success)
|
||
|
||
Called just after the ``process`` command has finished. Arguments
|
||
are as with the ``pre`` method, plus an additional boolean *success*
|
||
indicating whether Bro terminated normally.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_process_pre:
|
||
|
||
**cmd_process_pre** (self, trace, options, scripts)
|
||
|
||
Called just before the ``process`` command is run. It receives the
|
||
*trace* to read from as a string, a list of additional Bro *options*,
|
||
and a list of additional Bro scripts.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_restart_post:
|
||
|
||
**cmd_restart_post** (self, results)
|
||
|
||
Called just after the ``restart`` command has finished. It receives
|
||
the list of 2-tuples ``(node, bool)`` indicating the nodes the command
|
||
was executed for, along with their success status. The remaining
|
||
arguments are as with the ``pre`` method.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_restart_pre:
|
||
|
||
**cmd_restart_pre** (self, nodes, clean)
|
||
|
||
Called just before the ``restart`` command is run. It receives the
|
||
list of nodes, and returns the list of nodes that should proceed with
|
||
the command. *clean* is boolean indicating whether the ``--clean``
|
||
argument has been given.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_scripts_post:
|
||
|
||
**cmd_scripts_post** (self, nodes, full_path, check)
|
||
|
||
Called just after the ``scripts`` command has finished. Arguments
|
||
are as with the ``pre`` method.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_scripts_pre:
|
||
|
||
**cmd_scripts_pre** (self, nodes, full_path, check)
|
||
|
||
Called just before the ``scripts`` command is run. It receives the
|
||
list of nodes, and returns the list of nodes that should proceed with
|
||
the command. ``full_path`` and ``check`` are boolean indicating
|
||
whether the ``-p`` and ``-c`` options were given, respectively.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_start_post:
|
||
|
||
**cmd_start_post** (self, results)
|
||
|
||
Called just after the ``start`` command has finished. It receives
|
||
the list of 2-tuples ``(node, bool)`` indicating the nodes the command
|
||
was executed for, along with their success status.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_start_pre:
|
||
|
||
**cmd_start_pre** (self, nodes)
|
||
|
||
Called just before the ``start`` command is run. It receives the
|
||
list of nodes, and returns the list of nodes that should proceed with
|
||
the command.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_status_post:
|
||
|
||
**cmd_status_post** (self, nodes)
|
||
|
||
Called just after the ``status`` command has finished. Arguments
|
||
are as with the ``pre`` method.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_status_pre:
|
||
|
||
**cmd_status_pre** (self, nodes)
|
||
|
||
Called just before the ``status`` command is run. It receives the
|
||
list of nodes, and returns the list of nodes that should proceed with
|
||
the command.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_stop_post:
|
||
|
||
**cmd_stop_post** (self, results)
|
||
|
||
Called just after the ``stop`` command has finished. It receives
|
||
the list of 2-tuples ``(node, bool)`` indicating the nodes the command
|
||
was executed for, along with their success status.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_stop_pre:
|
||
|
||
**cmd_stop_pre** (self, nodes)
|
||
|
||
Called just before the ``stop`` command is run. It receives the
|
||
list of nodes, and returns the list of nodes that should proceed with
|
||
the command.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_top_post:
|
||
|
||
**cmd_top_post** (self, nodes)
|
||
|
||
Called just after the ``top`` command has finished. Arguments are
|
||
as with the ``pre`` method. Note that when ``top`` is run
|
||
interactively to auto-refresh continuously, this method will be called
|
||
once after each update.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_top_pre:
|
||
|
||
**cmd_top_pre** (self, nodes)
|
||
|
||
Called just before the ``top`` command is run. It receives the list
|
||
of nodes, and returns the list of nodes that should proceed with the
|
||
command. Note that when ``top`` is run interactively to auto-refresh
|
||
continuously, this method will be called once before each update.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_update_post:
|
||
|
||
**cmd_update_post** (self, results)
|
||
|
||
Called just after the ``update`` command has finished. It receives
|
||
the list of 2-tuples ``(node, bool)`` indicating the nodes the command
|
||
was executed for, along with their success status.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.cmd_update_pre:
|
||
|
||
**cmd_update_pre** (self, nodes)
|
||
|
||
Called just before the ``update`` command is run. It receives the
|
||
list of nodes, and returns the list of nodes that should proceed with
|
||
the command.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.commands:
|
||
|
||
**commands** (self)
|
||
|
||
Returns a set of custom commands provided by the
|
||
plugin.
|
||
|
||
The return value is a list of 3-tuples each having the following
|
||
elements:
|
||
|
||
``command``
|
||
A string with the command's name. Note that the command name
|
||
exposed to the user will be prefixed with the plugin's prefix
|
||
as returned by *name()* (e.g., ``myplugin.mycommand``).
|
||
|
||
``arguments``
|
||
A string describing the command's arguments in a textual form
|
||
suitable for use in the ``help`` command summary (e.g.,
|
||
``[<nodes>]`` for command taking an optional list of nodes).
|
||
Empty if no arguments are expected.
|
||
|
||
``description``
|
||
A string with a description of the command's semantics.
|
||
|
||
|
||
This method can be overridden by derived classes. The implementation
|
||
must not call the parent class' implementation. The default
|
||
implementation returns an empty list.
|
||
|
||
.. _Plugin.done:
|
||
|
||
**done** (self)
|
||
|
||
Called once just before BroControl terminates. This method can do
|
||
any cleanup the plugin may require.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.hostStatusChanged:
|
||
|
||
**hostStatusChanged** (self, host, status)
|
||
|
||
Called when BroControl's ``cron`` command finds the availability of
|
||
a cluster system to have changed. Initially, all systems are assumed
|
||
to be up and running. Once BroControl notices that a system isn't
|
||
responding (defined as either it doesn't ping at all, or does not
|
||
accept SSH sessions), it calls this method, passing in a string with
|
||
the name of the *host* and a boolean *status* set to False. Once the
|
||
host becomes available again, the method will be called again for the
|
||
same host with *status* now set to True.
|
||
|
||
Note that BroControl's ``cron`` tracks a host's availability across
|
||
execution, so if the next time it's run the host is still down, this
|
||
method will not be called again.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation does nothing.
|
||
|
||
.. _Plugin.init:
|
||
|
||
**init** (self)
|
||
|
||
Called once just before BroControl starts executing any commands.
|
||
This method can do any initialization that the plugin may require.
|
||
|
||
Note that when this method executes, BroControl guarantees that all
|
||
internals are fully set up (e.g., user-defined options are available).
|
||
This may not be the case when the class ``__init__`` method runs.
|
||
|
||
Returns a boolean, indicating whether the plugin should be used. If it
|
||
returns ``False``, the plugin will be removed and no other methods
|
||
called.
|
||
|
||
This method can be overridden by derived classes. The default
|
||
implementation always returns True.
|
||
|
||
.. _Plugin.name:
|
||
|
||
**name** (self)
|
||
|
||
Returns a string with a descriptive *name* for the plugin (e.g.,
|
||
``"TestPlugin"``). The name must not contain any whitespace.
|
||
|
||
This method must be overridden by derived classes. The implementation
|
||
must not call the parent class' implementation.
|
||
|
||
.. _Plugin.nodeKeys:
|
||
|
||
**nodeKeys** (self)
|
||
|
||
Returns a list of custom keys for ``node.cfg``. The value for a
|
||
key will be available from the `Node`_ object as attribute
|
||
``<prefix>_<key>`` (e.g., ``node.test_mykw``). If not set, the
|
||
attribute will be set to None.
|
||
|
||
This method can be overridden by derived classes. The implementation
|
||
must not call the parent class' implementation. The default
|
||
implementation returns an empty list.
|
||
|
||
.. _Plugin.options:
|
||
|
||
**options** (self)
|
||
|
||
Returns a set of local configuration options provided by the
|
||
plugin.
|
||
|
||
The return value is a list of 4-tuples each having the following
|
||
elements:
|
||
|
||
``name``
|
||
A string with name of the option (e.g., ``Path``). Option
|
||
names are case-insensitive. Note that the option name exposed
|
||
to the user will be prefixed with your plugin's prefix as
|
||
returned by *name()* (e.g., ``myplugin.Path``).
|
||
|
||
``type``
|
||
A string with type of the option, which must be one of
|
||
``"bool"``, ``"string"``, or ``"int"``.
|
||
|
||
``default``
|
||
A string with the option's default value. Note that this must
|
||
always be a string, even for non-string types. For booleans,
|
||
use ``"0"`` for False and ``"1"`` for True. For integers, give
|
||
the value as a string ``"42"``.
|
||
|
||
``description``
|
||
A string with a description of the option semantics.
|
||
|
||
This method can be overridden by derived classes. The implementation
|
||
must not call the parent class' implementation. The default
|
||
implementation returns an empty list.
|
||
|
||
.. _Plugin.pluginVersion:
|
||
|
||
**pluginVersion** (self)
|
||
|
||
Returns an integer with a version number for the plugin. Plugins
|
||
should increase their version number with any significant change.
|
||
|
||
This method must be overridden by derived classes. The implementation
|
||
must not call the parent class' implementation.
|
||
|
||
.. _Plugin.prefix:
|
||
|
||
**prefix** (self)
|
||
|
||
Returns a string with a prefix for the plugin's options and
|
||
commands names (e.g., "myplugin").
|
||
|
||
This method can be overridden by derived classes. The implementation
|
||
must not call the parent class' implementation. The default
|
||
implementation returns a lower-cased version of *name()*.
|
||
|
||
.. _Node:
|
||
|
||
Class ``Node``
|
||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
||
class **Node**
|
||
Class representing one node of the BroControl maintained setup. In
|
||
standalone mode, there's always exactly one node of type ``standalone``. In
|
||
a cluster setup, there is exactly one of type ``manager``, one or
|
||
more of type ``proxy``, and zero or more of type ``worker``.
|
||
|
||
In addition to the methods described above, a ``Node`` object has a number
|
||
of keys with values that are set via ``node.cfg`` and can be accessed
|
||
directly via corresponding Python attributes (e.g., ``node.name``):
|
||
|
||
``name`` (string)
|
||
The name of the node, which corresponds to the ``[<name>]``
|
||
section in ``node.cfg``.
|
||
|
||
``type`` (string)
|
||
The type of the node, which will be one of ``standalone``,
|
||
``manager``, ``proxy``, and ``worker``.
|
||
|
||
``host`` (string)
|
||
The hostname of the system the node is running on.
|
||
|
||
``interface`` (string)
|
||
The network interface for Bro to use; empty if not set.
|
||
|
||
``lb_procs`` (integer)
|
||
The number of clustered Bro workers you'd like to start up.
|
||
|
||
``lb_method`` (string)
|
||
The load balancing method to distribute packets to all of the
|
||
processes (must be one of: ``pf_ring``, ``myricom``, or
|
||
``interfaces``).
|
||
|
||
``lb_interfaces`` (string)
|
||
If the load balancing method is ``interfaces``, then this is
|
||
a comma-separated list of network interface names to use.
|
||
|
||
``aux_scripts`` (string)
|
||
Any node-specific Bro script configured for this node.
|
||
|
||
``zone_id`` (string)
|
||
If BroControl is managing a cluster comprised of nodes
|
||
using non-global IPv6 addresses, then this configures the
|
||
RFC 4007 ``zone_id`` string that the node associates with
|
||
the common zone that all cluster nodes are a part of. This
|
||
identifier may differ between nodes.
|
||
|
||
Any attribute that is not defined in ``node.cfg`` will be empty.
|
||
|
||
In addition, plugins can override `Plugin.nodeKeys`_ to define their own
|
||
node keys, which can then be likewise set in ``node.cfg``. The key names
|
||
will be prepended with the plugin's `Plugin.prefix`_ (e.g., for the plugin
|
||
``test``, the node key ``foo`` is set by adding ``test.foo=value`` to
|
||
``node.cfg``).
|
||
|
||
.. _Node.cwd:
|
||
|
||
**cwd** (self)
|
||
|
||
Returns a string with the node's working directory.
|
||
|
||
.. _Node.describe:
|
||
|
||
**describe** (self)
|
||
|
||
Returns an extended string representation of the node including all
|
||
its keys with values.
|
||
|
||
.. _Node.getPID:
|
||
|
||
**getPID** (self)
|
||
|
||
Returns the process ID of the node's Bro process if running, and
|
||
None otherwise.
|
||
|
||
.. _Node.getPort:
|
||
|
||
**getPort** (self)
|
||
|
||
Returns an integer with the port that this node's communication
|
||
system is listening on for incoming connections, or -1 if no such port
|
||
has been set yet.
|
||
|
||
.. _Node.hasCrashed:
|
||
|
||
**hasCrashed** (self)
|
||
|
||
Returns True if the node's Bro process has exited abnormally.
|
||
|
||
|
||
Miscellaneous
|
||
-------------
|
||
|
||
Mails
|
||
~~~~~
|
||
|
||
*BroControl* sends four types of mails to the address given in
|
||
``MailTo``:
|
||
|
||
1. When logs are rotated (per default once a day), a list of all
|
||
alarms during the last rotation interval is sent. This can be
|
||
disabled by setting ``MailAlarms=0``.
|
||
|
||
2. When the ``cron`` command notices that a node has crashed, it
|
||
restarts it and sends a notification. It may also send a more
|
||
detailed crash report containing information about the crash.
|
||
|
||
3. NOTICES with a notice action ``EMAIL``.
|
||
|
||
4. If `trace-summary <http://www.bro.org/documentation/components/trace-summary/README.html>`_
|
||
is installed, a traffic summary is sent each rotation interval.
|
||
|
||
Performance Analysis
|
||
~~~~~~~~~~~~~~~~~~~~
|
||
|
||
*TODO*: ``broctl cron`` logs a number of statistics, which can be
|
||
analyzed/plotted for understanding the clusters run-time behavior.
|
||
|
||
Questions and Answers
|
||
---------------------
|
||
|
||
*Can I use an NFS-mounted partition as the cluster's base directory to avoid the ``rsync``'ing?*
|
||
Yes. BroBase_ can be on an NFS partition.
|
||
Configure and install the shell as usual with
|
||
``--prefix=<BroBase>``. Then add ``HaveNFS=1`` and
|
||
``SpoolDir=<spath>`` to ``broctl.cfg``, where ``<spath>`` is a
|
||
path on the local disks of the nodes; ``<spath>`` will be used for
|
||
all non-shared data (make sure that the parent directory exists
|
||
and is writable on all nodes!). Then run ``make install`` again.
|
||
Finally, you can remove ``<BroBase>/spool`` (or link it to <spath>).
|
||
In addition, you might want to keep the log files locally on the nodes
|
||
as well by setting LogDir_ to a non-NFS directory. (Only
|
||
the manager's logs will be kept permanently, the logs of
|
||
workers/proxies are discarded upon rotation.)
|
||
|
||
*When I'm using the stand-alone mode, do I still need to have ``ssh`` and ``rsync`` installed and configured?*
|
||
No. In stand-alone mode all operations are performed directly on the local
|
||
file system.
|
||
|
||
*What do I need to do when something in the Bro distribution changes?*
|
||
After pulling from the main Bro git repository, just re-run ``make
|
||
install`` inside your build directory. It will reinstall all the
|
||
files from the distribution that are not up-to-date. Then do
|
||
``broctl install`` to make sure everything gets pushed out.
|
||
|
||
*Can I change the naming scheme that BroControl uses for archived log files?*
|
||
Yes, set MakeArchiveName_ to a
|
||
script that outputs the desired destination file name for an
|
||
archived log file. The default script for that task is
|
||
``<BroBase>/share/broctl/scripts/make-archive-name``, which you
|
||
can use as a template for creating your own version. See
|
||
the beginning of that script for instructions.
|
||
|
||
*Can BroControl manage a cluster of nodes over non-global IPv6 scope (e.g. link-local)?*
|
||
Yes, set ``ZoneID`` in ``broctl.cfg`` to the zone identifier
|
||
that the BroControl node uses to identify the scope zone
|
||
(the ``ifconfig`` command output is usually helpful, if it doesn't
|
||
show the zone identifier appended to the address with a '%'
|
||
character, then it may just be the interface name). Then in
|
||
``node.cfg``, add a ``zone_id`` key to each node section
|
||
representing that particular node's zone identifier and set
|
||
the ``host`` key to the IPv6 address assigned to the node within
|
||
the scope zone. Most nodes probably have the same ``zone_id``, but
|
||
may not if their interface configuration differs. See RFC 4007 for
|
||
more information on IPv6 scoped addresses and zones.
|