Added new dbus interface to query console info
obmc-console recipe configure consoles by setting the socket-id
field in the console server config file. obmc-console server use this
socket id to build a abract socket name and register new service
"xyz.openbmc_project.Console.Access". The leaf of the object path will
be socket-id configured. It also exposes the unix abstract socket name
through SocketName property. The socket name is sent as a byte stream as
abstract socket contains null character at the start.
*** For example if recipe configured socket-id as "console0" the
*** following object is exported through dbus interface
# Tree for "console0" console.
$ busctl tree xyz.openbmc_project.Console.console0
`-/xyz
`-/xyz/openbmc_project
`-/xyz/openbmc_project/console
`-/xyz/openbmc_project/console/console0
# Get SocketName property for console0 object
$ busctl get-property xyz.openbmc_project.Console.console0 /xyz/openbmc_project/console/console0 xyz.openbmc_project.Console.Access SocketName
ay 22 0 111 98 109 99 45 99 111 110 115 111 108 101 46 99 111 110 115 111 108 101 48
# Tree for "hypervisor" console
$ busctl tree xyz.openbmc_project.Console.hypervisor
`-/xyz
`-/xyz/openbmc_project
`-/xyz/openbmc_project/console
`-/xyz/openbmc_project/console/hypervisor
# Get SocketName property for hypervisor object
$ busctl get-property xyz.openbmc_project.Console.hypervisor /xyz/openbmc_project/console/hypervisor xyz.openbmc_project.Console.Access SocketName
ay 24 0 111 98 109 99 45 99 111 110 115 111 108 101 46 104 121 112 101 114 118 105 115 111 114
# Note that this is an example of two consoles one is 'console0' and
# second is 'hypervisor'. I have formated the output to easy viewing.
# We also have one extra service for console that is coming from the
# service exist today to get/set the tty device baud rate.
$ busctl call xyz.openbmc_project.ObjectMapper \
/xyz/openbmc_project/object_mapper xyz.openbmc_project.ObjectMapper \
GetSubTree sias /xyz/openbmc_project/console 0 1 \
xyz.openbmc_project.Console.Access
a{sa{sas}}
2
"/xyz/openbmc_project/console/console0" \
1
"xyz.openbmc_project.Console.console0"
4 "org.freedesktop.DBus.Introspectable"
"org.freedesktop.DBus.Peer"
"org.freedesktop.DBus.Properties"
"xyz.openbmc_project.Console.Access"
"/xyz/openbmc_project/console/hypervisor"
2
"xyz.openbmc_project.Console.hypervisor"
4 "org.freedesktop.DBus.Introspectable"
"org.freedesktop.DBus.Peer"
"org.freedesktop.DBus.Properties"
"xyz.openbmc_project.Console.Access"
"xyz.openbmc_project.console"
4 "org.freedesktop.DBus.Introspectable"
"org.freedesktop.DBus.Peer"
"org.freedesktop.DBus.Properties"
"xyz.openbmc_project.Console.Access"
Tested:
Tested on the rainer system with busctl command and integration
with bmcweb
Related commits:
1) phosphor-dbus-interface: https://gerrit.openbmc.org/c/openbmc/phosphor-dbus-interfaces/+/61486
2) obmc-console: https://gerrit.openbmc.org/c/openbmc/obmc-console/+/62496
3) bmcweb: https://gerrit.openbmc.org/c/openbmc/bmcweb/+/62525
Change-Id: Ifb70ce5585c3937f3abd904ffbae51ca67f58724
Signed-off-by: Ninad Palsule <ninadpalsule@us.ibm.com>
diff --git a/console-dbus.c b/console-dbus.c
index 0672e5b..3b24061 100644
--- a/console-dbus.c
+++ b/console-dbus.c
@@ -22,10 +22,11 @@
/* size of the dbus object path length */
const size_t dbus_obj_path_len = 1024;
-#define DBUS_ERR "org.openbmc.error"
-#define INTF_NAME "xyz.openbmc_project.Console"
-#define DBUS_NAME "xyz.openbmc_project.Console.%s"
-#define OBJ_NAME "/xyz/openbmc_project/console/%s"
+#define DBUS_ERR "org.openbmc.error"
+#define DBUS_NAME "xyz.openbmc_project.Console.%s"
+#define OBJ_NAME "/xyz/openbmc_project/console/%s"
+#define TTY_INTF "xyz.openbmc_project.console"
+#define ACCESS_INTF "xyz.openbmc_project.Console.Access"
static void tty_change_baudrate(struct console *console)
{
@@ -101,7 +102,23 @@
return r;
}
-static const sd_bus_vtable console_vtable[] = {
+static int get_socket_name(sd_bus *bus __attribute__((unused)),
+ const char *path __attribute__((unused)),
+ const char *interface __attribute__((unused)),
+ const char *property __attribute__((unused)),
+ sd_bus_message *reply, void *userdata,
+ sd_bus_error *error __attribute__((unused)))
+{
+ struct console *console = userdata;
+
+ /* The abstract socket name starts with null character hence we need to
+ * send it as a byte stream instead of regular string.
+ */
+ return sd_bus_message_append_array(reply, 'y', console->socket_name,
+ console->socket_name_len);
+}
+
+static const sd_bus_vtable console_tty_vtable[] = {
SD_BUS_VTABLE_START(0),
SD_BUS_METHOD("setBaudRate", "u", "x", method_set_baud_rate,
SD_BUS_VTABLE_UNPRIVILEGED),
@@ -109,6 +126,12 @@
SD_BUS_VTABLE_END,
};
+static const sd_bus_vtable console_access_vtable[] = {
+ SD_BUS_VTABLE_START(0),
+ SD_BUS_PROPERTY("SocketName", "ay", get_socket_name, 0, 0),
+ SD_BUS_VTABLE_END,
+};
+
void dbus_init(struct console *console,
struct config *config __attribute__((unused)))
{
@@ -139,8 +162,17 @@
return;
}
- r = sd_bus_add_object_vtable(console->bus, NULL, obj_name, INTF_NAME,
- console_vtable, console);
+ /* Register tty interface */
+ r = sd_bus_add_object_vtable(console->bus, NULL, obj_name, TTY_INTF,
+ console_tty_vtable, console);
+ if (r < 0) {
+ warnx("Failed to issue method call: %s", strerror(-r));
+ return;
+ }
+
+ /* Register access interface */
+ r = sd_bus_add_object_vtable(console->bus, NULL, obj_name, ACCESS_INTF,
+ console_access_vtable, console);
if (r < 0) {
warnx("Failed to issue method call: %s", strerror(-r));
return;
@@ -154,6 +186,7 @@
return;
}
+ /* Finally register the bus name */
r = sd_bus_request_name(console->bus, dbus_name,
SD_BUS_NAME_ALLOW_REPLACEMENT |
SD_BUS_NAME_REPLACE_EXISTING);