systemctl: list-dependencies: support --type= and --state=
Closes #25975
This commit is contained in:
@@ -80,6 +80,9 @@ static int list_dependencies_one(
|
||||
typesafe_qsort(deps, strv_length(deps), list_dependencies_compare);
|
||||
|
||||
STRV_FOREACH(c, deps) {
|
||||
_cleanup_free_ char *load_state = NULL, *sub_state = NULL;
|
||||
UnitActiveState active_state;
|
||||
|
||||
if (strv_contains(*units, *c)) {
|
||||
if (!arg_plain) {
|
||||
printf(" ");
|
||||
@@ -90,14 +93,31 @@ static int list_dependencies_one(
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg_types && !strv_contains(arg_types, unit_type_suffix(*c)))
|
||||
continue;
|
||||
|
||||
r = get_state_one_unit(bus, *c, &active_state);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (arg_states) {
|
||||
r = unit_load_state(bus, *c, &load_state);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = get_sub_state_one_unit(bus, *c, &sub_state);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (!strv_overlap(arg_states, STRV_MAKE(unit_active_state_to_string(active_state), load_state, sub_state)))
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg_plain)
|
||||
printf(" ");
|
||||
else {
|
||||
UnitActiveState active_state = _UNIT_ACTIVE_STATE_INVALID;
|
||||
const char *on;
|
||||
|
||||
(void) get_state_one_unit(bus, *c, &active_state);
|
||||
|
||||
switch (active_state) {
|
||||
case UNIT_ACTIVE:
|
||||
case UNIT_RELOADING:
|
||||
@@ -141,6 +161,9 @@ int verb_list_dependencies(int argc, char *argv[], void *userdata) {
|
||||
sd_bus *bus;
|
||||
int r;
|
||||
|
||||
/* We won't be able to preserve the tree structure if --type= or --state= is used */
|
||||
arg_plain = arg_plain || arg_types || arg_states;
|
||||
|
||||
r = acquire_bus(BUS_MANAGER, &bus);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
@@ -122,6 +122,7 @@ int get_state_one_unit(sd_bus *bus, const char *unit, UnitActiveState *ret_activ
|
||||
UnitActiveState state;
|
||||
int r;
|
||||
|
||||
assert(bus);
|
||||
assert(unit);
|
||||
assert(ret_active_state);
|
||||
|
||||
@@ -148,6 +149,34 @@ int get_state_one_unit(sd_bus *bus, const char *unit, UnitActiveState *ret_activ
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_sub_state_one_unit(sd_bus *bus, const char *unit, char **ret_sub_state) {
|
||||
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
_cleanup_free_ char *sub_state = NULL, *dbus_path = NULL;
|
||||
int r;
|
||||
|
||||
assert(bus);
|
||||
assert(unit);
|
||||
assert(ret_sub_state);
|
||||
|
||||
dbus_path = unit_dbus_path_from_name(unit);
|
||||
if (!dbus_path)
|
||||
return log_oom();
|
||||
|
||||
r = sd_bus_get_property_string(
|
||||
bus,
|
||||
"org.freedesktop.systemd1",
|
||||
dbus_path,
|
||||
"org.freedesktop.systemd1.Unit",
|
||||
"SubState",
|
||||
&error,
|
||||
&sub_state);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to retrieve unit sub state: %s", bus_error_message(&error, r));
|
||||
|
||||
*ret_sub_state = TAKE_PTR(sub_state);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_unit_list(
|
||||
sd_bus *bus,
|
||||
const char *machine,
|
||||
|
||||
@@ -21,7 +21,8 @@ void polkit_agent_open_maybe(void);
|
||||
|
||||
int translate_bus_error_to_exit_status(int r, const sd_bus_error *error);
|
||||
|
||||
int get_state_one_unit(sd_bus *bus, const char *name, UnitActiveState *ret_active_state);
|
||||
int get_state_one_unit(sd_bus *bus, const char *unit, UnitActiveState *ret_active_state);
|
||||
int get_sub_state_one_unit(sd_bus *bus, const char *unit, char **ret_sub_state);
|
||||
int get_unit_list(sd_bus *bus, const char *machine, char **patterns, UnitInfo **unit_infos, int c, sd_bus_message **ret_reply);
|
||||
int expand_unit_names(sd_bus *bus, char **names, const char* suffix, char ***ret, bool *ret_expanded);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user