mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
report: add --logonly arg to report only log for a command
This commit is contained in:
parent
3e8e8ddb46
commit
92caebab95
@ -1,5 +1,6 @@
|
||||
Version 2.02.158 -
|
||||
=================================
|
||||
Add --logonly option to report only cmd log for a command, not other reports.
|
||||
Add log/command_log_selection to configure default selection used on cmd log.
|
||||
Use 'orphan' object type in cmd log for groups to collect PVs not yet in VGs.
|
||||
Add lvm lastlog command for query and display of last cmd's log in lvm shell.
|
||||
|
@ -83,7 +83,7 @@ typedef int (*field_report_fn) (struct report_handle * dh, struct field * field,
|
||||
|
||||
int report_format_init(struct cmd_context *cmd, dm_report_group_type_t *report_group_type,
|
||||
struct dm_report_group **report_group, struct dm_report **log_rh,
|
||||
log_report_t *saved_log_report_state);
|
||||
int *log_only, log_report_t *saved_log_report_state);
|
||||
|
||||
void *report_init(struct cmd_context *cmd, const char *format, const char *keys,
|
||||
report_type_t *report_type, const char *separator,
|
||||
|
@ -55,6 +55,7 @@ arg(lockopt_ARG, '\0', "lockopt", string_arg, 0, 0)
|
||||
arg(lockstart_ARG, '\0', "lockstart", NULL, 0, 0)
|
||||
arg(lockstop_ARG, '\0', "lockstop", NULL, 0, 0)
|
||||
arg(locktype_ARG, '\0', "locktype", locktype_arg, 0, 0)
|
||||
arg(logonly_ARG, '\0', "logonly", NULL, 0, 0)
|
||||
arg(maxrecoveryrate_ARG, '\0', "maxrecoveryrate", size_kb_arg, 0, 0)
|
||||
arg(merge_ARG, '\0', "merge", NULL, 0, 0)
|
||||
arg(mergedconfig_ARG, '\0', "mergedconfig", NULL, 0, 0)
|
||||
|
@ -149,6 +149,7 @@ xx(fullreport,
|
||||
"\t[-h|--help]\n"
|
||||
"\t[--ignorelockingfailure]\n"
|
||||
"\t[--ignoreskippedcluster]\n"
|
||||
"\t[--logonly]\n"
|
||||
"\t[--nameprefixes]\n"
|
||||
"\t[--noheadings]\n"
|
||||
"\t[--nosuffix]\n"
|
||||
@ -169,10 +170,10 @@ xx(fullreport,
|
||||
"\t[VolumeGroupName [VolumeGroupName...]]\n",
|
||||
|
||||
aligned_ARG, all_ARG, binary_ARG, foreign_ARG, ignorelockingfailure_ARG,
|
||||
ignoreskippedcluster_ARG, nameprefixes_ARG, noheadings_ARG, nolocking_ARG,
|
||||
nosuffix_ARG, options_ARG, partial_ARG, readonly_ARG, reportformat_ARG,
|
||||
rows_ARG, select_ARG, separator_ARG, shared_ARG, sort_ARG, trustcache_ARG,
|
||||
unbuffered_ARG, units_ARG, unquoted_ARG)
|
||||
ignoreskippedcluster_ARG, logonly_ARG, nameprefixes_ARG, noheadings_ARG,
|
||||
nolocking_ARG, nosuffix_ARG, options_ARG, partial_ARG, readonly_ARG,
|
||||
reportformat_ARG, rows_ARG, select_ARG, separator_ARG, shared_ARG,
|
||||
sort_ARG, trustcache_ARG, unbuffered_ARG, units_ARG, unquoted_ARG)
|
||||
|
||||
xx(lastlog,
|
||||
"Display last command's log report",
|
||||
@ -486,6 +487,7 @@ xx(lvdisplay,
|
||||
"\t[-H|--history]\n"
|
||||
"\t[--ignorelockingfailure]\n"
|
||||
"\t[--ignoreskippedcluster]\n"
|
||||
"\t[--logonly]\n"
|
||||
"\t[--noheadings]\n"
|
||||
"\t[--nosuffix]\n"
|
||||
"\t[-o|--options [+|-|#]Field[,Field]]\n"
|
||||
@ -504,7 +506,7 @@ xx(lvdisplay,
|
||||
|
||||
aligned_ARG, all_ARG, binary_ARG, colon_ARG, columns_ARG, foreign_ARG,
|
||||
history_ARG, ignorelockingfailure_ARG, ignoreskippedcluster_ARG,
|
||||
maps_ARG, noheadings_ARG, nosuffix_ARG, options_ARG, sort_ARG,
|
||||
logonly_ARG, maps_ARG, noheadings_ARG, nosuffix_ARG, options_ARG, sort_ARG,
|
||||
partial_ARG, readonly_ARG, reportformat_ARG, segments_ARG, select_ARG,
|
||||
separator_ARG, shared_ARG, unbuffered_ARG, units_ARG)
|
||||
|
||||
@ -730,6 +732,7 @@ xx(lvs,
|
||||
"\t[-H|--history]\n"
|
||||
"\t[--ignorelockingfailure]\n"
|
||||
"\t[--ignoreskippedcluster]\n"
|
||||
"\t[--logonly]\n"
|
||||
"\t[--nameprefixes]\n"
|
||||
"\t[--noheadings]\n"
|
||||
"\t[--nosuffix]\n"
|
||||
@ -751,11 +754,11 @@ xx(lvs,
|
||||
"\t[LogicalVolume[Path] [LogicalVolume[Path]...]]\n",
|
||||
|
||||
aligned_ARG, all_ARG, binary_ARG, configreport_ARG, foreign_ARG, history_ARG,
|
||||
ignorelockingfailure_ARG, ignoreskippedcluster_ARG, nameprefixes_ARG,
|
||||
noheadings_ARG, nolocking_ARG, nosuffix_ARG, options_ARG, partial_ARG,
|
||||
readonly_ARG, reportformat_ARG, rows_ARG, segments_ARG, select_ARG,
|
||||
separator_ARG, shared_ARG, sort_ARG, trustcache_ARG, unbuffered_ARG,
|
||||
units_ARG, unquoted_ARG)
|
||||
ignorelockingfailure_ARG, ignoreskippedcluster_ARG, logonly_ARG,
|
||||
nameprefixes_ARG, noheadings_ARG, nolocking_ARG, nosuffix_ARG,
|
||||
options_ARG, partial_ARG, readonly_ARG, reportformat_ARG, rows_ARG,
|
||||
segments_ARG, select_ARG, separator_ARG, shared_ARG, sort_ARG,
|
||||
trustcache_ARG, unbuffered_ARG, units_ARG, unquoted_ARG)
|
||||
|
||||
xx(lvscan,
|
||||
"List all logical volumes in all volume groups",
|
||||
@ -918,6 +921,7 @@ xx(pvdisplay,
|
||||
"\t[-h|--help]\n"
|
||||
"\t[--ignorelockingfailure]\n"
|
||||
"\t[--ignoreskippedcluster]\n"
|
||||
"\t[--logonly]\n"
|
||||
"\t[--noheadings]\n"
|
||||
"\t[--nosuffix]\n"
|
||||
"\t[-o|--options [+|-|#]Field[,Field]]\n"
|
||||
@ -933,7 +937,7 @@ xx(pvdisplay,
|
||||
"\t[PhysicalVolumePath [PhysicalVolumePath...]]\n",
|
||||
|
||||
aligned_ARG, all_ARG, binary_ARG, colon_ARG, columns_ARG, foreign_ARG,
|
||||
ignorelockingfailure_ARG, ignoreskippedcluster_ARG, maps_ARG,
|
||||
ignorelockingfailure_ARG, ignoreskippedcluster_ARG, logonly_ARG, maps_ARG,
|
||||
noheadings_ARG, nosuffix_ARG, options_ARG, readonly_ARG, reportformat_ARG,
|
||||
select_ARG, separator_ARG, shared_ARG, short_ARG, sort_ARG, unbuffered_ARG,
|
||||
units_ARG)
|
||||
@ -1014,6 +1018,7 @@ xx(pvs,
|
||||
"\t[-h|-?|--help]\n"
|
||||
"\t[--ignorelockingfailure]\n"
|
||||
"\t[--ignoreskippedcluster]\n"
|
||||
"\t[--logonly]\n"
|
||||
"\t[--nameprefixes]\n"
|
||||
"\t[--noheadings]\n"
|
||||
"\t[--nosuffix]\n"
|
||||
@ -1035,10 +1040,11 @@ xx(pvs,
|
||||
"\t[PhysicalVolume [PhysicalVolume...]]\n",
|
||||
|
||||
aligned_ARG, all_ARG, binary_ARG, foreign_ARG, ignorelockingfailure_ARG,
|
||||
ignoreskippedcluster_ARG, nameprefixes_ARG, noheadings_ARG, nolocking_ARG,
|
||||
nosuffix_ARG, options_ARG, partial_ARG, readonly_ARG, reportformat_ARG,
|
||||
rows_ARG, segments_ARG, select_ARG, separator_ARG, shared_ARG, sort_ARG,
|
||||
trustcache_ARG, unbuffered_ARG, units_ARG, unquoted_ARG)
|
||||
ignoreskippedcluster_ARG, logonly_ARG, nameprefixes_ARG, noheadings_ARG,
|
||||
nolocking_ARG, nosuffix_ARG, options_ARG, partial_ARG, readonly_ARG,
|
||||
reportformat_ARG, rows_ARG, segments_ARG, select_ARG, separator_ARG,
|
||||
shared_ARG, sort_ARG, trustcache_ARG, unbuffered_ARG, units_ARG,
|
||||
unquoted_ARG)
|
||||
|
||||
xx(pvscan,
|
||||
"List all physical volumes",
|
||||
@ -1265,6 +1271,7 @@ xx(vgdisplay,
|
||||
"\t[-h|--help]\n"
|
||||
"\t[--ignorelockingfailure]\n"
|
||||
"\t[--ignoreskippedcluster]\n"
|
||||
"\t[--logonly]\n"
|
||||
"\t[--noheadings]\n"
|
||||
"\t[--nosuffix]\n"
|
||||
"\t[-o|--options [+|-|#]Field[,Field]]\n"
|
||||
@ -1282,9 +1289,9 @@ xx(vgdisplay,
|
||||
|
||||
activevolumegroups_ARG, aligned_ARG, binary_ARG, colon_ARG, columns_ARG,
|
||||
foreign_ARG, ignorelockingfailure_ARG, ignoreskippedcluster_ARG,
|
||||
noheadings_ARG, nosuffix_ARG, options_ARG, partial_ARG, readonly_ARG,
|
||||
reportformat_ARG, select_ARG, shared_ARG, short_ARG, separator_ARG,
|
||||
sort_ARG, unbuffered_ARG, units_ARG)
|
||||
logonly_ARG, noheadings_ARG, nosuffix_ARG, options_ARG, partial_ARG,
|
||||
readonly_ARG, reportformat_ARG, select_ARG, shared_ARG, short_ARG,
|
||||
separator_ARG, sort_ARG, unbuffered_ARG, units_ARG)
|
||||
|
||||
xx(vgexport,
|
||||
"Unregister volume group(s) from the system",
|
||||
@ -1446,6 +1453,7 @@ xx(vgs,
|
||||
"\t[-h|--help]\n"
|
||||
"\t[--ignorelockingfailure]\n"
|
||||
"\t[--ignoreskippedcluster]\n"
|
||||
"\t[--logonly]\n"
|
||||
"\t[--nameprefixes]\n"
|
||||
"\t[--noheadings]\n"
|
||||
"\t[--nosuffix]\n"
|
||||
@ -1466,10 +1474,10 @@ xx(vgs,
|
||||
"\t[VolumeGroupName [VolumeGroupName...]]\n",
|
||||
|
||||
aligned_ARG, all_ARG, binary_ARG, foreign_ARG, ignorelockingfailure_ARG,
|
||||
ignoreskippedcluster_ARG, nameprefixes_ARG, noheadings_ARG, nolocking_ARG,
|
||||
nosuffix_ARG, options_ARG, partial_ARG, readonly_ARG, reportformat_ARG,
|
||||
rows_ARG, select_ARG, separator_ARG, shared_ARG, sort_ARG, trustcache_ARG,
|
||||
unbuffered_ARG, units_ARG, unquoted_ARG)
|
||||
ignoreskippedcluster_ARG, logonly_ARG, nameprefixes_ARG, noheadings_ARG,
|
||||
nolocking_ARG, nosuffix_ARG, options_ARG, partial_ARG, readonly_ARG,
|
||||
reportformat_ARG, rows_ARG, select_ARG, separator_ARG, shared_ARG,
|
||||
sort_ARG, trustcache_ARG, unbuffered_ARG, units_ARG, unquoted_ARG)
|
||||
|
||||
xx(vgscan,
|
||||
"Search for all volume groups",
|
||||
|
@ -54,6 +54,7 @@ struct report_args {
|
||||
int columns_as_rows;
|
||||
const char *separator;
|
||||
struct volume_group *full_report_vg;
|
||||
int log_only;
|
||||
struct single_report_args single_args[REPORT_IDX_COUNT];
|
||||
};
|
||||
|
||||
@ -1047,7 +1048,7 @@ static int _do_report(struct cmd_context *cmd, struct processing_handle *handle,
|
||||
&lv_segment_status_needed, &report_type))
|
||||
goto_out;
|
||||
|
||||
if (handle->report_group) {
|
||||
if (!(args->log_only && (single_args->report_type != CMDLOG))) {
|
||||
if (!dm_report_group_push(handle->report_group, report_handle, (void *) single_args->report_name))
|
||||
goto_out;
|
||||
report_in_group = 1;
|
||||
@ -1160,7 +1161,8 @@ static int _do_report(struct cmd_context *cmd, struct processing_handle *handle,
|
||||
log_error("Failed to compact given columns in report output.");
|
||||
}
|
||||
|
||||
dm_report_output(report_handle);
|
||||
if (!(args->log_only && (single_args->report_type != CMDLOG)))
|
||||
dm_report_output(report_handle);
|
||||
|
||||
if (lock_global)
|
||||
unlock_vg(cmd, VG_GLOBAL);
|
||||
@ -1189,7 +1191,7 @@ static int _full_report_single(struct cmd_context *cmd,
|
||||
|
||||
args->full_report_vg = vg;
|
||||
|
||||
if (!dm_report_group_push(handle->report_group, NULL, NULL))
|
||||
if (!args->log_only && !dm_report_group_push(handle->report_group, NULL, NULL))
|
||||
goto out;
|
||||
|
||||
if (orphan) {
|
||||
@ -1205,7 +1207,7 @@ static int _full_report_single(struct cmd_context *cmd,
|
||||
stack;
|
||||
}
|
||||
|
||||
if (!dm_report_group_pop(handle->report_group))
|
||||
if (!args->log_only && !dm_report_group_pop(handle->report_group))
|
||||
goto_out;
|
||||
out:
|
||||
args->full_report_vg = NULL;
|
||||
@ -1360,13 +1362,14 @@ static int _report(struct cmd_context *cmd, int argc, char **argv, report_type_t
|
||||
handle->include_historical_lvs = cmd->include_historical_lvs;
|
||||
|
||||
args.report_group_type = handle->report_group_type;
|
||||
args.log_only = handle->log_only;
|
||||
|
||||
if (!_config_report(cmd, &args, single_args)) {
|
||||
destroy_processing_handle(cmd, handle);
|
||||
return_ECMD_FAILED;
|
||||
}
|
||||
|
||||
if (!dm_report_group_push(handle->report_group, NULL, report_name)) {
|
||||
if (!args.log_only && !dm_report_group_push(handle->report_group, NULL, report_name)) {
|
||||
log_error("Failed to add main report section to report group.");
|
||||
destroy_processing_handle(cmd, handle);
|
||||
return ECMD_FAILED;
|
||||
@ -1426,20 +1429,23 @@ int devtypes(struct cmd_context *cmd, int argc, char **argv)
|
||||
|
||||
int report_format_init(struct cmd_context *cmd, dm_report_group_type_t *report_group_type,
|
||||
struct dm_report_group **report_group, struct dm_report **log_rh,
|
||||
log_report_t *saved_log_report_state)
|
||||
int *log_only, log_report_t *saved_log_report_state)
|
||||
{
|
||||
int config_set = find_config_tree_node(cmd, report_output_format_CFG, NULL) != NULL;
|
||||
const char *config_format_str = find_config_tree_str(cmd, report_output_format_CFG, NULL);
|
||||
const char *format_str = arg_str_value(cmd, reportformat_ARG, config_set ? config_format_str : NULL);
|
||||
int report_command_log = find_config_tree_bool(cmd, log_report_command_log_CFG, NULL);
|
||||
int report_command_log;
|
||||
struct report_args args = {0};
|
||||
struct single_report_args *single_args;
|
||||
struct dm_report_group *new_report_group;
|
||||
struct dm_report *tmp_log_rh = NULL;
|
||||
|
||||
args.log_only = arg_is_set(cmd, logonly_ARG) || *log_rh;
|
||||
report_command_log = args.log_only || find_config_tree_bool(cmd, log_report_command_log_CFG, NULL);
|
||||
|
||||
if (!format_str || !strcmp(format_str, REPORT_FORMAT_NAME_BASIC)) {
|
||||
args.report_group_type = report_command_log ? DM_REPORT_GROUP_BASIC
|
||||
: DM_REPORT_GROUP_SINGLE;
|
||||
args.report_group_type = (report_command_log && !args.log_only) ? DM_REPORT_GROUP_BASIC
|
||||
: DM_REPORT_GROUP_SINGLE;
|
||||
} else if (!strcmp(format_str, REPORT_FORMAT_NAME_JSON)) {
|
||||
args.report_group_type = DM_REPORT_GROUP_JSON;
|
||||
} else {
|
||||
@ -1452,6 +1458,8 @@ int report_format_init(struct cmd_context *cmd, dm_report_group_type_t *report_g
|
||||
|
||||
if (report_group_type)
|
||||
*report_group_type = args.report_group_type;
|
||||
if (log_only)
|
||||
*log_only = args.log_only;
|
||||
|
||||
if (!(new_report_group = dm_report_group_create(args.report_group_type, NULL))) {
|
||||
log_error("Failed to create report group.");
|
||||
@ -1517,7 +1525,7 @@ int lastlog(struct cmd_context *cmd, int argc, char **argv)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!report_format_init(cmd, NULL, &report_group, &cmd->log_rh, NULL))
|
||||
if (!report_format_init(cmd, NULL, &report_group, &cmd->log_rh, NULL, NULL))
|
||||
goto_out;
|
||||
|
||||
if (arg_count(cmd, select_ARG) &&
|
||||
|
@ -1733,7 +1733,8 @@ struct processing_handle *init_processing_handle(struct cmd_context *cmd, struct
|
||||
|
||||
if (!parent_handle) {
|
||||
if (!report_format_init(cmd, &handle->report_group_type, &handle->report_group,
|
||||
&handle->log_rh, &handle->saved_log_report_state)) {
|
||||
&handle->log_rh, &handle->log_only,
|
||||
&handle->saved_log_report_state)) {
|
||||
dm_pool_free(cmd->mem, handle);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -76,6 +76,7 @@ struct processing_handle {
|
||||
dm_report_group_type_t report_group_type;
|
||||
struct dm_report_group *report_group;
|
||||
struct dm_report *log_rh;
|
||||
int log_only;
|
||||
log_report_t saved_log_report_state;
|
||||
void *custom_handle;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user