diff options
author | Evgeniy Alexeev <e.alekseev@k-soft-spb.ru> | 2022-10-12 11:16:49 +0300 |
---|---|---|
committer | Evgeniy Alexeev <e.alekseev@k-soft-spb.ru> | 2022-10-12 11:16:49 +0300 |
commit | 4330d39c35cc44ab1fa5b1e6e1a35207c0635217 (patch) | |
tree | f0ba53fe12d3e25acf9a505c05e96c16b4f2cb72 /src/power_commands.c | |
parent | ec32cc9ceb8d8f5cb1003360417e5d26f885b8a5 (diff) | |
download | sila-shell-4330d39c35cc44ab1fa5b1e6e1a35207c0635217.tar.xz |
Squashed commit of the following:
commit 4ca788c95231709813bbe99220f93b4ef3e9c4ef
Author: Evgeniy Alexeev <e.alekseev@k-soft-spb.ru>
Date: Wed Oct 12 12:19:45 2022 +0500
Add host boot commands, pooulate variant functions
commit 21c36beefd0304a600a2f781a60559f647d569fb
Author: Evgeniy Alexeev <e.alekseev@k-soft-spb.ru>
Date: Mon Oct 10 19:07:45 2022 +0500
Begin to add variant type
commit b6f6416fa4dfbff9c677c4491fb42c5d3adb9d44
Author: Evgeniy Alexeev <e.alekseev@k-soft-spb.ru>
Date: Mon Oct 10 14:04:30 2022 +0500
Modify status commands in server
commit 72405cee84fbddb8866a8a3d96350010266fc137
Author: Evgeniy Alexeev <e.alekseev@k-soft-spb.ru>
Date: Mon Oct 10 13:35:37 2022 +0500
Add power&policy status, get sdbus property func
commit 81f88de144d6803bf4d53986193bf342772367eb
Author: ironcaterpillar <ironcaterpillar@yandex.ru>
Date: Sat Oct 8 13:42:22 2022 +0500
Refactor d_bus_commands to separate file
commit 224e5b8317e7e3ffbb04ada342447bf678297002
Author: Evgeniy Alexeev <e.alekseev@k-soft-spb.ru>
Date: Fri Oct 7 19:18:14 2022 +0500
Add power policy commands, refactor
commit 94427ebcf778a2c0cc148c0344002491abdb052c
Author: Evgeniy Alexeev <e.alekseev@k-soft-spb.ru>
Date: Thu Oct 6 18:23:42 2022 +0500
Add server power commands help
commit 6888ffd32af65cb984792a47f65983207c00467e
Author: Evgeniy Alexeev <e.alekseev@k-soft-spb.ru>
Date: Thu Oct 6 17:31:26 2022 +0500
Add unknown power command error message
commit 5d1b4a2000820de903f10959b499c758eba383e0
Author: Evgeniy Alexeev <e.alekseev@k-soft-spb.ru>
Date: Thu Oct 6 15:54:37 2022 +0500
Fix host power dbus property name
commit 49f8a15abdfb749427bd5769725b3ad54dc0583b
Author: Evgeniy Alexeev <e.alekseev@k-soft-spb.ru>
Date: Thu Oct 6 13:27:37 2022 +0500
Add .gitignore
commit 96569d5f9c7f245fd82545919a1910828c1058d9
Author: Evgeniy Alexeev <e.alekseev@k-soft-spb.ru>
Date: Thu Oct 6 13:27:10 2022 +0500
Add sdbus, server power commands
Diffstat (limited to 'src/power_commands.c')
-rw-r--r-- | src/power_commands.c | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/src/power_commands.c b/src/power_commands.c new file mode 100644 index 0000000..e91b31d --- /dev/null +++ b/src/power_commands.c @@ -0,0 +1,179 @@ +#include <stdio.h> +#include <string.h> +#include <errno.h> + +#include "utils.h" + +#include "d_bus_commands.h" +#include "power_commands.h" + +static const string_quadruple_t chassis_dbus = { + "xyz.openbmc_project.State.Chassis", + "/xyz/openbmc_project/state/chassis0", + "xyz.openbmc_project.State.Chassis", + "RequestedPowerTransition"}; + +static const string_quadruple_t host_dbus = { + "xyz.openbmc_project.State.Host", + "/xyz/openbmc_project/state/host0", + "xyz.openbmc_project.State.Host", + "RequestedHostTransition"}; + +static const string_quadruple_t policy_dbus = { + "xyz.openbmc_project.Settings", + "/xyz/openbmc_project/control/host0/power_restore_policy", + "xyz.openbmc_project.Control.Power.RestorePolicy", + "PowerRestorePolicy"}; + + +typedef enum +{ + POWER_UNKNOWN=-1, + POWER_ON_GRACEFUL=100, + POWER_ON_FORCE, + POWER_OFF_GRACEFUL, + POWER_OFF_FORCE, + POWER_RESET_GRACEFUL, + POWER_RESET_FORCE +}power_command_t; + +static const command_dbus_path_t power_command_paths[] = { + { POWER_ON_GRACEFUL, &host_dbus }, + { POWER_ON_FORCE, &host_dbus }, + { POWER_OFF_GRACEFUL, &host_dbus }, + { POWER_OFF_FORCE, &chassis_dbus }, + { POWER_RESET_GRACEFUL, &host_dbus }, + { POWER_RESET_FORCE, &host_dbus }, + { 0, NULL } +}; + +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" }}, + { POWER_OFF_FORCE, {.type="s", .string="xyz.openbmc_project.State.Chassis.Transition.Off" }}, + { POWER_RESET_GRACEFUL, {.type="s", .string="xyz.openbmc_project.State.Host.Transition.GracefulWarmReboot" }}, + { POWER_RESET_FORCE, {.type="s", .string="xyz.openbmc_project.State.Host.Transition.ForceWarmReboot" }}, + { 0, {.type=NULL, .integer=0}} +}; + +typedef enum +{ + POWER_POLICY_UNKNOWN=-1, + POWER_POLICY_ON=100, + POWER_POLICY_OFF, + POWER_POLICY_RESTORE + +}power_policy_command_t; + + +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" }, + { "off-graceful", POWER_OFF_GRACEFUL, "Graceful Power Off" }, + { "off", POWER_OFF_GRACEFUL, "Graceful Power Off" }, + { "off-force", POWER_OFF_FORCE, "Force Power Off" }, + { "reset-graceful", POWER_RESET_GRACEFUL, "Graceful Reset" }, + { "reset", POWER_RESET_GRACEFUL, "Graceful Reset" }, + { "reset-force", POWER_RESET_FORCE, "Force Reset" }, + { NULL, 0, NULL } +}; + +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 } +}; + +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 } +}; + +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" }}, + { 0, {.type=NULL, .integer=0 }} +}; + +int com_status(const universal_command_t *commands, const command_dbus_path_t * paths, const command_dbus_member_t * values) +{ + for(const command_dbus_path_t * cur_path = paths;cur_path->path !=NULL; cur_path++) + { + _cleanup_string_ char * value = dbus_get_property_string(cur_path->path); + if(!value)continue; + const command_dbus_member_t* member = get_dbus_command_by_member(value, values); + if(!member)continue; + const universal_command_t* cur_cmd = get_command_by_enum(member->command, commands); + if(!cur_cmd) + continue; + printf("Current status: %s - %s\n", cur_cmd->name, cur_cmd->help); + + } + return 0; +} + +static int power_status() +{ + + _cleanup_string_ char * host_value = dbus_get_property_string(&host_dbus); + if(!host_value) + return -EOPNOTSUPP; + const command_dbus_member_t* member = get_dbus_command_by_member(host_value, power_command_values); + if(!member) + return -EOPNOTSUPP; + const universal_command_t* cur_cmd = get_command_by_enum(member->command, power_commands); + if(!cur_cmd) + return -EOPNOTSUPP; + printf("Power status: \n"); + printf("\tHost: %s - %s\n", cur_cmd->name, cur_cmd->help); + _cleanup_string_ char * chassis_value = dbus_get_property_string(&chassis_dbus); + if(!host_value) + return -EOPNOTSUPP; + member = get_dbus_command_by_member(host_value, power_command_values); + if(!member) + return -EOPNOTSUPP; + cur_cmd = get_command_by_enum(member->command, power_commands); + if(!cur_cmd) + return -EOPNOTSUPP; + + printf("\tChassis: %s - %s\n", cur_cmd->name, cur_cmd->help); + + + return 0; +} + +static int power_policy_status() +{ + + _cleanup_string_ char * host_value = dbus_get_property_string(&host_dbus); + if(!host_value) + return -EOPNOTSUPP; + const command_dbus_member_t* member = get_dbus_command_by_member(host_value, power_command_values); + if(!member) + return -EOPNOTSUPP; + const universal_command_t* cur_cmd = get_command_by_enum(member->command, power_commands); + if(!cur_cmd) + return -EOPNOTSUPP; + printf("Power policy tatus: \n"); + printf("\tHost: %s - %s\n", cur_cmd->name, cur_cmd->help); + + return 0; +} + +int com_power( char *arg ) +{ + if(strcmp(arg, "status")==0)return power_status(); + return com_dbus_property(arg, power_commands, power_command_paths, power_command_values); +} + +int com_power_policy( char* arg ) +{ + if(strcmp(arg, "status")==0)return power_policy_status(); + return com_dbus_property(arg, power_policy_commands, power_command_policy_paths, power_command_policy_values); +} |