summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Alexeev <e.alekseev@k-soft-spb.ru>2022-10-12 10:19:45 +0300
committerEvgeniy Alexeev <e.alekseev@k-soft-spb.ru>2022-10-12 10:19:45 +0300
commit4ca788c95231709813bbe99220f93b4ef3e9c4ef (patch)
treef0ba53fe12d3e25acf9a505c05e96c16b4f2cb72
parent21c36beefd0304a600a2f781a60559f647d569fb (diff)
downloadsila-shell-add-server-commands.tar.xz
Add host boot commands, pooulate variant functionsadd-server-commands
-rw-r--r--meson.build3
-rw-r--r--src/d_bus.h3
-rw-r--r--src/d_bus_commands.c13
-rw-r--r--src/host_commands.c60
-rw-r--r--src/host_commands.h2
-rw-r--r--src/main.c7
-rw-r--r--src/power_commands.c12
7 files changed, 89 insertions, 11 deletions
diff --git a/meson.build b/meson.build
index fc53052..55d1870 100644
--- a/meson.build
+++ b/meson.build
@@ -13,7 +13,8 @@ src = [
'src/d_bus.c',
'src/power_commands.c',
'src/d_bus_commands.c',
- 'src/d_bus_variant.c'
+ 'src/d_bus_variant.c',
+ 'src/host_commands.c'
]
readline = dependency('readline')
diff --git a/src/d_bus.h b/src/d_bus.h
index d947677..e6be821 100644
--- a/src/d_bus.h
+++ b/src/d_bus.h
@@ -1,6 +1,8 @@
#ifndef __SD_BUS_COMMANDS_H
#define __SD_BUS_COMMANDS_H
+#include "d_bus_variant.h"
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -30,6 +32,7 @@ int cmd_get_string();
int dbus_set_property_string(const string_quadruple_t* path, const char* value);
char* dbus_get_property_string(const string_quadruple_t* path );
+int dbus_set_property(const string_quadruple_t* path, dbus_value_variant_t value);
#ifdef __cplusplus
}
#endif
diff --git a/src/d_bus_commands.c b/src/d_bus_commands.c
index 5cb5767..8ae2351 100644
--- a/src/d_bus_commands.c
+++ b/src/d_bus_commands.c
@@ -64,6 +64,15 @@ const char* get_dbus_command_member_string(int cmd, const command_dbus_member_t*
return NULL;
}
+const dbus_value_variant_t* get_dbus_command_member_variant(int cmd, const command_dbus_member_t* values)
+{
+ for(const command_dbus_member_t* current = values; current->member.type != NULL; current++)
+ {
+ if(current->command == cmd)return &(current->member);
+ }
+ return NULL;
+}
+
const command_dbus_member_t* get_dbus_command_by_member(const char* member, const command_dbus_member_t* values)
{
for(const command_dbus_member_t* current = values; current->member.type != NULL; current++)
@@ -85,9 +94,9 @@ int com_dbus_property( char *arg, const universal_command_t* commands, const com
const string_quadruple_t* dbus_power_interface = get_dbus_command_interface(cmd, paths);
if(!dbus_power_interface)
return -EOPNOTSUPP;
- const char* property_val = get_dbus_command_member_string(cmd, values);
+ const dbus_value_variant_t* property_val = get_dbus_command_member_variant(cmd, values);
if(!property_val)
return -EOPNOTSUPP;
- return dbus_set_property_string(dbus_power_interface, property_val);
+ return dbus_set_property(dbus_power_interface, *property_val);
return 0;
}
diff --git a/src/host_commands.c b/src/host_commands.c
index df2d93a..d832ef8 100644
--- a/src/host_commands.c
+++ b/src/host_commands.c
@@ -1,3 +1,6 @@
+#include <stdio.h>
+#include <stdbool.h>
+
#include "host_commands.h"
static const string_quadruple_t boot_override_type_dbus = {
@@ -35,9 +38,64 @@ typedef enum
HOST_UNKNOWN=-1,
HOST_CD,
HOST_USB,
- HOST_BIOS,
+ HOST_BOOT_OVERRIDE,
+ HOST_BOOT_NO_OVERRIDE,
+ HOST_BOOT_REGULAR,
+ HOST_BOOT_BIOS,
+ HOST_BOOT_SAFE,
HOST_ONE_TIME,
HOST_CONTINOUS,
HOST_LEGACY,
HOST_UEFI
}host_command_t;
+
+static universal_command_t host_commands[] = {
+ { "cd", HOST_CD, "Boot from virtual CD-ROM"},
+ { "usb", HOST_USB, "Boot from virtual USB drive"},
+ { "override", HOST_BOOT_OVERRIDE, "Override host chosen boot options"},
+ { "no-override", HOST_BOOT_NO_OVERRIDE, "Don't override host chosen boot options"},
+ { "regular", HOST_BOOT_REGULAR, "Regular boot type"},
+ { "bios", HOST_BOOT_BIOS, "Boot into BIOS"},
+ { "safe", HOST_BOOT_SAFE, "Boot in safe mode"},
+ { "override-once", HOST_ONE_TIME, "Override only next boot"},
+ { "override-always", HOST_CONTINOUS, "Override always"},
+ { "legacy", HOST_LEGACY, "Legacy type boot"},
+ { "uefi", HOST_UEFI, "UEFI boot"},
+ { NULL, 0, NULL }
+};
+
+static const command_dbus_path_t host_command_paths[] = {
+ { HOST_CD, &boot_override_source_dbus },
+ { HOST_USB, &boot_override_source_dbus },
+ { HOST_BOOT_OVERRIDE, &boot_override_enable_dbus },
+ { HOST_BOOT_NO_OVERRIDE, &boot_override_enable_dbus },
+ { HOST_BOOT_REGULAR, &boot_override_mode_dbus },
+ { HOST_BOOT_BIOS, &boot_override_mode_dbus },
+ { HOST_BOOT_SAFE, &boot_override_mode_dbus },
+ { HOST_ONE_TIME, &boot_override_once_dbus },
+ { HOST_CONTINOUS, &boot_override_once_dbus },
+ { HOST_LEGACY, &boot_override_type_dbus },
+ { HOST_UEFI, &boot_override_type_dbus },
+ { 0, NULL }
+};
+
+static const command_dbus_member_t host_command_values[] = {
+ { HOST_CD, { .type="s", .string="xyz.openbmc_project.Control.Boot.Source.Sources.ExternalMedia"}},
+ { HOST_USB, { .type="s", .string="xyz.openbmc_project.Control.Boot.Source.Sources.RemovableMedia"}},
+ { HOST_BOOT_OVERRIDE, { .type="b", .boolean=true}},
+ { HOST_BOOT_NO_OVERRIDE, { .type="b", .boolean=false}},
+ { HOST_BOOT_REGULAR, { .type="s", .string="xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"}},
+ { HOST_BOOT_BIOS, { .type="s", .string="xyz.openbmc_project.Control.Boot.Mode.Modes.Setup"}},
+ { HOST_BOOT_SAFE,{ .type="s", .string="xyz.openbmc_project.Control.Boot.Mode.Modes.Safe"}},
+ { HOST_ONE_TIME, { .type="b", .boolean=true}},
+ { HOST_CONTINOUS, { .type="b", .boolean=false}},
+ { HOST_LEGACY, { .type="s", .string="xyz.openbmc_project.Control.Boot.Type.Types.Legacy"} },
+ { HOST_UEFI, { .type="s", .string="xyz.openbmc_project.Control.Boot.Type.Types.EFI"} },
+ { 0, {.type=NULL, .integer=0}}
+};
+
+int com_boot( char *arg )
+{
+ //if(strcmp(arg, "status")==0)return power_status();
+ return com_dbus_property(arg, host_commands, host_command_paths, host_command_values);
+}
diff --git a/src/host_commands.h b/src/host_commands.h
index 4bb5e3f..daafda4 100644
--- a/src/host_commands.h
+++ b/src/host_commands.h
@@ -3,4 +3,6 @@
#include "d_bus_commands.h"
+int com_boot( char *arg );
+
#endif // HOST_COMMANDS_H
diff --git a/src/main.c b/src/main.c
index 529436c..bef33f5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -21,7 +21,8 @@
#include <shell.h>
#include <users.h>
#include <power_commands.h>
-#include <d_bus.h>
+#include <host_commands.h>
+
char *progname; /* The name of this program, as taken from argv[0]. */
int done; /* When non-zero, this global means the user is done using this program. */
@@ -162,6 +163,7 @@ COMMAND server_admin_list[] = {
{ "?", com_help, "Synonym for `help'" },
{ "power", com_power, "Return to top menu" },
{ "restore-policy", com_power_policy, "Set power restore policy" },
+ { "boot", com_boot, "Set host boot options" },
{ "..", com_top, "Return to top menu" },
{ "quit", com_quit, "Quit using SILA Shell" },
{ (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL }
@@ -172,6 +174,7 @@ COMMAND server_operator_list[] = {
{ "?", com_help, "Synonym for `help'" },
{ "power", com_power, "Run on/off/reset" },
{ "restore-policy", com_power_policy, "Set power restore policy" },
+ { "boot", com_boot, "Set host boot options" },
{ "..", com_top, "Return to top menu" },
{ "quit", com_quit, "Quit using SILA Shell" },
{ (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL }
@@ -182,11 +185,13 @@ COMMAND server_user_list[] = {
{ "?", com_help, "Synonym for `help'" },
{ "power", com_power, "Return to top menu" },
{ "restore-policy", com_power_policy, "Set power restore policy" },
+ { "boot", com_boot, "Set host boot options" },
{ "..", com_top, "Return to top menu" },
{ "quit", com_quit, "Quit using SILA Shell" },
{ (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL }
};
+
COMMAND_LIST server = {"server", NULL};
COMMAND_LIST *current;
diff --git a/src/power_commands.c b/src/power_commands.c
index 3e63e23..e91b31d 100644
--- a/src/power_commands.c
+++ b/src/power_commands.c
@@ -37,7 +37,7 @@ typedef enum
POWER_RESET_FORCE
}power_command_t;
-const command_dbus_path_t power_command_paths[] = {
+static const command_dbus_path_t power_command_paths[] = {
{ POWER_ON_GRACEFUL, &host_dbus },
{ POWER_ON_FORCE, &host_dbus },
{ POWER_OFF_GRACEFUL, &host_dbus },
@@ -47,7 +47,7 @@ const command_dbus_path_t power_command_paths[] = {
{ 0, NULL }
};
-const command_dbus_member_t power_command_values[] = {
+static const command_dbus_member_t power_command_values[] = {
{ POWER_ON_GRACEFUL, {.type="s", .string="xyz.openbmc_project.State.Host.Transition.On" }},
{ POWER_ON_FORCE, {.type="s", .string="xyz.openbmc_project.State.Host.Transition.On" }},
{ POWER_OFF_GRACEFUL, {.type="s", .string="xyz.openbmc_project.State.Host.Transition.Off" }},
@@ -67,7 +67,7 @@ typedef enum
}power_policy_command_t;
-universal_command_t power_commands[] = {
+static universal_command_t power_commands[] = {
{ "on-graceful", POWER_ON_GRACEFUL, "Graceful Power On" },
{ "on", POWER_ON_GRACEFUL, "Graceful Power On" },
{ "on-force", POWER_ON_FORCE, "Force Power On" },
@@ -80,21 +80,21 @@ universal_command_t power_commands[] = {
{ NULL, 0, NULL }
};
-const universal_command_t power_policy_commands[] = {
+static const universal_command_t power_policy_commands[] = {
{"always-on", POWER_POLICY_ON, "Server is always ON"},
{"always-off", POWER_POLICY_OFF, "Server is always ON"},
{"restore", POWER_POLICY_RESTORE, "Server restores previous state"},
{ NULL, 0, NULL }
};
-const command_dbus_path_t power_command_policy_paths[] = {
+static const command_dbus_path_t power_command_policy_paths[] = {
{ POWER_POLICY_ON, &policy_dbus },
{ POWER_POLICY_OFF, &policy_dbus },
{ POWER_POLICY_RESTORE, &policy_dbus },
{ 0, NULL }
};
-const command_dbus_member_t power_command_policy_values[] = {
+static const command_dbus_member_t power_command_policy_values[] = {
{ POWER_POLICY_ON, {.type="s", .string="xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOn" }},
{ POWER_POLICY_OFF, {.type="s", .string="xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOff" }},
{ POWER_POLICY_RESTORE, {.type="s", .string="xyz.openbmc_project.Control.Power.RestorePolicy.Policy.Restore" }},