# OpenBMC webserver

This project is Google's version of BMCWeb.

See [Readme Google](README_GOOGLE.md) for Google added features. The following
is the original README of OpenBMC/BMCWeb.

==============================================================================

This component attempts to be a "do everything" embedded webserver for OpenBMC.

## Features

The webserver implements a few distinct interfaces:

- DBus event websocket. Allows registering on changes to specific dbus paths,
  properties, and will send an event from the websocket if those filters match.
- OpenBMC DBus REST api. Allows direct, low interference, high fidelity access
  to dbus and the objects it represents.
- Serial: A serial websocket for interacting with the host serial console
  through websockets.
- Redfish: A protocol compliant, [DBus to Redfish translator](Redfish.md).
- KVM: A websocket based implementation of the RFB (VNC) frame buffer protocol
  intended to mate to webui-vue to provide a complete KVM implementation.

## Protocols

bmcweb at a protocol level supports http and https. TLS is supported through
OpenSSL.

## AuthX

### Authentication

Bmcweb supports multiple authentication protocols:

- Basic authentication per RFC7617
- Cookie based authentication for authenticating against webui-vue
- Mutual TLS authentication based on OpenSSL
- Session authentication through webui-vue
- XToken based authentication conformant to Redfish DSP0266

Each of these types of authentication is able to be enabled or disabled both via
runtime policy changes (through the relevant Redfish APIs) or via configure time
options. All authentication mechanisms supporting username/password are routed
to libpam, to allow for customization in authentication implementations.

### Authorization

All authorization in bmcweb is determined at routing time, and per route, and
conform to the Redfish PrivilegeRegistry.

\*Note: Non-Redfish functions are mapped to the closest equivalent Redfish
privilege level.

## Configuration

bmcweb is configured per the
[meson build files](https://mesonbuild.com/Build-options.html). Available
options are documented in `meson_options.txt`

## Compile bmcweb with default options

```ascii
meson builddir
ninja -C builddir
```

If any of the dependencies are not found on the host system during
configuration, meson will automatically download them via its wrap dependencies
mentioned in `bmcweb/subprojects`.

## Use of persistent data

bmcweb relies on some on-system data for storage of persistent data that is
internal to the process. Details on the exact data stored and when it is
read/written can seen from the `persistent_data` namespace.

## TLS certificate generation

When SSL support is enabled and a usable certificate is not found, bmcweb will
generate a self-signed a certificate before launching the server. Please see the
bmcweb source code for details on the parameters this certificate is built with.

## Redfish Aggregation

bmcweb is capable of aggregating resources from satellite BMCs. Refer to
[AGGREGATION.md](https://github.com/openbmc/bmcweb/blob/master/AGGREGATION.md)
for more information on how to enable and use this feature.
