From: Jule Anger Date: Fri, 25 Mar 2022 13:16:27 +0000 (+0100) Subject: smbstatus: add JSON support for smbstatus --profile X-Git-Tag: samba-4.17.0rc1~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=803899fdc3cf64cda5f3f070b3546aa1c855c978;p=thirdparty%2Fsamba.git smbstatus: add JSON support for smbstatus --profile Signed-off-by: Jule Anger Reviewed-by: Ralph Boehme --- diff --git a/source3/utils/status.c b/source3/utils/status.c index 72cc2c08a11..e311f067c9c 100644 --- a/source3/utils/status.c +++ b/source3/utils/status.c @@ -1101,13 +1101,18 @@ int main(int argc, const char *argv[]) switch (profile_only) { case 'P': /* Dump profile data */ - ok = status_profile_dump(verbose); + ok = status_profile_dump(verbose, &state); ret = ok ? 0 : 1; goto done; case 'R': /* Continuously display rate-converted data */ - ok = status_profile_rates(verbose); - ret = ok ? 0 : 1; + if (!state.json_output) { + ok = status_profile_rates(verbose); + ret = ok ? 0 : 1; + } else { + fprintf(stderr, "Call rates not available in a json output.\n"); + ret = 1; + } goto done; default: break; @@ -1200,7 +1205,7 @@ done: cmdline_messaging_context_free(); poptFreeContext(pc); #ifdef HAVE_JANSSON - if (state.json_output && !profile_only) { + if (state.json_output) { d_printf("%s\n", json_to_string(frame, &state.root_json)); } json_free(&state.root_json); diff --git a/source3/utils/status_profile.c b/source3/utils/status_profile.c index b3428a8c618..6e0916ed7e8 100644 --- a/source3/utils/status_profile.c +++ b/source3/utils/status_profile.c @@ -21,12 +21,20 @@ #include "includes.h" #include "smbprofile.h" #include "status_profile.h" +#include "conn_tdb.h" +#include "librpc/gen_ndr/open_files.h" +#include "status_json.h" -static void profile_separator(const char * title) +static void profile_separator(const char * title, + struct traverse_state *state) { char line[79 + 1]; char * end; + if (state->json_output) { + return; + } + snprintf(line, sizeof(line), "**** %s ", title); for (end = line + strlen(line); end < &line[sizeof(line) -1]; ++end) { @@ -40,9 +48,11 @@ static void profile_separator(const char * title) /******************************************************************* dump the elements of the profile structure ******************************************************************/ -bool status_profile_dump(bool verbose) +bool status_profile_dump(bool verbose, + struct traverse_state *state) { struct profile_stats stats = {}; + const char* latest_section = NULL; if (!profile_setup(NULL, True)) { fprintf(stderr,"Failed to initialise profile memory\n"); @@ -52,12 +62,20 @@ bool status_profile_dump(bool verbose) smbprofile_collect(&stats); #define __PRINT_FIELD_LINE(name, _stats, field) do { \ - d_printf("%-59s%20ju\n", \ - name "_" #field ":", \ - (uintmax_t)stats.values._stats.field); \ + uintmax_t val = (uintmax_t)stats.values._stats.field; \ + if (!state->json_output) { \ + d_printf("%-59s%20ju\n", \ + name "_" #field ":", \ + val); \ + } else { \ + add_profile_item_to_json(state, latest_section, name, #field, val); \ + } \ } while(0); #define SMBPROFILE_STATS_START -#define SMBPROFILE_STATS_SECTION_START(name, display) profile_separator(#display); +#define SMBPROFILE_STATS_SECTION_START(name, display) do { \ + latest_section = display; \ + profile_separator(display, state);\ +} while(0); #define SMBPROFILE_STATS_COUNT(name) do { \ __PRINT_FIELD_LINE(#name, name##_stats, count); \ } while(0); diff --git a/source3/utils/status_profile.h b/source3/utils/status_profile.h index a8a73e12178..eed54e03360 100644 --- a/source3/utils/status_profile.h +++ b/source3/utils/status_profile.h @@ -21,8 +21,10 @@ #define __STATUS_PROFILE_H__ #include "replace.h" +#include "status.h" -bool status_profile_dump(bool be_verbose); +bool status_profile_dump(bool be_verbose, + struct traverse_state *state); bool status_profile_rates(bool be_verbose); #endif diff --git a/source3/utils/status_profile_dummy.c b/source3/utils/status_profile_dummy.c index dfc5da7756a..9083abf2111 100644 --- a/source3/utils/status_profile_dummy.c +++ b/source3/utils/status_profile_dummy.c @@ -21,7 +21,8 @@ #include "smbprofile.h" #include "status_profile.h" -bool status_profile_dump(bool be_verbose) +bool status_profile_dump(bool be_verbose, + struct traverse_state *state) { fprintf(stderr, "Profile data unavailable\n"); return true;