merge binaries bmcweb and bmcwebd
Solution to reduce compressed rofs size.
Conclusion: The compiler is better at reducing binary size than the rofs
compression is at deduplicating sections of already compiled binaries,
in the case of bmcweb.
What's been changed?
`bmcweb` and `bmcwebd` have been merged into `bmcweb`.
The webserver can be started with `bmcweb daemon`.
Commands used to check size
```
wc -c build/s8030/tmp/work/*-openbmc-linux-gnueabi/obmc-phosphor-image/1.0/obmc-phosphor-image-1.0/static/image-rofs
wc -c build/s8030/tmp/deploy/images/s8030/image-rofs
xz -c build/s8030/tmp/work/*-openbmc-linux-gnueabi/obmc-phosphor-image/1.0/rootfs/bin/bmcweb | wc -c
xz -c build/s8030/tmp/work/*-openbmc-linux-gnueabi/obmc-phosphor-image/1.0/rootfs/usr/libexec/bmcwebd | wc -c
```
Base commit used for testing:
`2169e896448fac1b59c57516b381492e4b2161c7`
Results:
Before patch:
```
image-rofs compressed size:
25526272 build/s8030/tmp/work/s8030-openbmc-linux-gnueabi/obmc-phosphor-image/1.0/obmc-phosphor-image-1.0/static/image-rofs
rootfs
25526272 build/s8030/tmp/deploy/images/s8030/image-rofs
bmcweb cli
95424
bmcwebd
1016004
```
After patch:
```
image-rofs compressed size:
25477120 build/s8030/tmp/work/s8030-openbmc-linux-gnueabi/obmc-phosphor-image/1.0/obmc-phosphor-image-1.0/static/image-rofs
rootfs
25477120 build/s8030/tmp/deploy/images/s8030/image-rofs
bmcweb cli
96
bmcwebd
1059556
```
Calculating the difference in compressed rofs
25526272 - 25477120 = 49152
which is around 0.2% in terms of the total image but around 4.6% in
terms of bmcwebd binary.
Tested: on yosemite4 qemu
`bmcweb` cli interactions work as before.
```
root@yosemite4:~# bmcweb --help
BMCWeb CLI
Usage: bmcweb [OPTIONS] SUBCOMMAND
Options:
-h,--help Print this help message and exit
Subcommands:
loglevel Set bmcweb log level
daemon Run webserver
root@yosemite4:~# bmcweb loglevel info
<6>[webserver_cli.cpp:97] logging level changed to: INFO
root@yosemite4:~# bmcweb loglevel
level is required
Run with --help for more information.
root@yosemite4:~# bmcweb loglevel debug
<6>[webserver_cli.cpp:97] logging level changed to: DEBUG
```
systemd service still working
```
root@yosemite4:~# systemctl status bmcweb
● bmcweb.service - Start bmcweb server
Loaded: loaded (/usr/lib/systemd/system/bmcweb.service; enabled; preset: enabled)
Active: active (running) since Thu 2025-04-03 13:35:45 PDT; 5 months 15 days ago
```
Change-Id: Ib5dde568ac1c12c5414294ed96404c6a69417424
Signed-off-by: Alexander Hansen <alexander.hansen@9elements.com>
diff --git a/src/webserver_cli.cpp b/src/webserver_cli.cpp
index 58fbacb..a4ad819 100644
--- a/src/webserver_cli.cpp
+++ b/src/webserver_cli.cpp
@@ -1,7 +1,11 @@
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: Copyright OpenBMC Authors
+
+#include "webserver_cli.hpp"
+
#include "boost_formatters.hpp"
#include "logging.hpp"
+#include "webserver_run.hpp"
#include <CLI/CLI.hpp>
#include <boost/asio/io_context.hpp>
@@ -46,18 +50,14 @@
return help;
}
-int main(int argc, char** argv) noexcept(false)
+static int loglevelMain(std::string& loglevel);
+
+int cliMain(int argc, char** argv) noexcept(false)
{
- CLI::App app("BMCWeb SetLogLevel CLI");
+ CLI::App app("BMCWeb CLI");
cliLogLevel("INFO");
- // Define sdbus interfaces:
- std::string service = "xyz.openbmc_project.bmcweb";
- std::string path = "/xyz/openbmc_project/bmcweb";
- std::string iface = "xyz.openbmc_project.bmcweb";
- std::string method = "SetLogLevel";
-
std::string loglevel;
app.require_subcommand(1);
@@ -69,8 +69,31 @@
->required()
->check(levelValidator);
+ CLI::App* daemon = app.add_subcommand("daemon", "Run webserver");
+
CLI11_PARSE(app, argc, argv)
+ if (daemon->parsed())
+ {
+ return run();
+ }
+
+ if (sub->parsed())
+ {
+ return loglevelMain(loglevel);
+ }
+
+ return 0;
+}
+
+static int loglevelMain(std::string& loglevel)
+{
+ // Define sdbus interfaces:
+ std::string service = "xyz.openbmc_project.bmcweb";
+ std::string path = "/xyz/openbmc_project/bmcweb";
+ std::string iface = "xyz.openbmc_project.bmcweb";
+ std::string method = "SetLogLevel";
+
std::transform(loglevel.begin(), loglevel.end(), loglevel.begin(),
::toupper);
// Set up dbus connection: