mirror of
https://gitlab.com/apparmor/apparmor
synced 2025-08-31 22:35:35 +00:00
Merge aa-status: fix json generation
- previously, aa-status --json --show profiles would return non-standard json - adding the --pretty flag would crash completely - closes #470 Things done: - removed trailing ", " in json generation - generate json seperator (", ") for each new json field (profiles/processes) after the header if json is enabled Tested on NixOS and apparmor 4.0.3 base, but should work on any version the patch applies on. Closes #470 MR: https://gitlab.com/apparmor/apparmor/-/merge_requests/1451 Approved-by: John Johansen <john@jjmx.net> Merged-by: John Johansen <john@jjmx.net>
This commit is contained in:
@@ -490,7 +490,7 @@ static int filter_processes(struct process *processes,
|
|||||||
*
|
*
|
||||||
* Return: 0 on success, else shell error code
|
* Return: 0 on success, else shell error code
|
||||||
*/
|
*/
|
||||||
static int simple_filtered_count(FILE *outf, filters_t *filters,
|
static int simple_filtered_count(FILE *outf, filters_t *filters, bool json,
|
||||||
struct profile *profiles, size_t nprofiles)
|
struct profile *profiles, size_t nprofiles)
|
||||||
{
|
{
|
||||||
struct profile *filtered = NULL;
|
struct profile *filtered = NULL;
|
||||||
@@ -499,7 +499,13 @@ static int simple_filtered_count(FILE *outf, filters_t *filters,
|
|||||||
|
|
||||||
ret = filter_profiles(profiles, nprofiles, filters,
|
ret = filter_profiles(profiles, nprofiles, filters,
|
||||||
&filtered, &nfiltered);
|
&filtered, &nfiltered);
|
||||||
fprintf(outf, "%zd\n", nfiltered);
|
|
||||||
|
if (!json) {
|
||||||
|
fprintf(outf, "%zd\n", nfiltered);
|
||||||
|
} else {
|
||||||
|
fprintf(outf, "\"profile_count\": %zd", nfiltered);
|
||||||
|
}
|
||||||
|
|
||||||
free_profiles(filtered, nfiltered);
|
free_profiles(filtered, nfiltered);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -514,7 +520,7 @@ static int simple_filtered_count(FILE *outf, filters_t *filters,
|
|||||||
*
|
*
|
||||||
* Return: 0 on success, else shell error code
|
* Return: 0 on success, else shell error code
|
||||||
*/
|
*/
|
||||||
static int simple_filtered_process_count(FILE *outf, filters_t *filters,
|
static int simple_filtered_process_count(FILE *outf, filters_t *filters, bool json,
|
||||||
struct process *processes, size_t nprocesses) {
|
struct process *processes, size_t nprocesses) {
|
||||||
struct process *filtered = NULL;
|
struct process *filtered = NULL;
|
||||||
size_t nfiltered;
|
size_t nfiltered;
|
||||||
@@ -522,7 +528,12 @@ static int simple_filtered_process_count(FILE *outf, filters_t *filters,
|
|||||||
|
|
||||||
ret = filter_processes(processes, nprocesses, filters, &filtered,
|
ret = filter_processes(processes, nprocesses, filters, &filtered,
|
||||||
&nfiltered);
|
&nfiltered);
|
||||||
fprintf(outf, "%zd\n", nfiltered);
|
if (!json) {
|
||||||
|
fprintf(outf, "%zd\n", nfiltered);
|
||||||
|
} else {
|
||||||
|
fprintf(outf, "\"process_count\": %zd", nfiltered);
|
||||||
|
}
|
||||||
|
|
||||||
free_processes(filtered, nfiltered);
|
free_processes(filtered, nfiltered);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -541,7 +552,12 @@ static int compare_processes_by_executable(const void *a, const void *b) {
|
|||||||
|
|
||||||
static void json_header(FILE *outf)
|
static void json_header(FILE *outf)
|
||||||
{
|
{
|
||||||
fprintf(outf, "{\"version\": \"%s\", ", aa_status_json_version);
|
fprintf(outf, "{\"version\": \"%s\"", aa_status_json_version);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void json_seperator(FILE *outf)
|
||||||
|
{
|
||||||
|
fprintf(outf, ", ");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void json_footer(FILE *outf)
|
static void json_footer(FILE *outf)
|
||||||
@@ -609,7 +625,7 @@ static int detailed_profiles(FILE *outf, filters_t *filters, bool json,
|
|||||||
free_profiles(filtered, nfiltered);
|
free_profiles(filtered, nfiltered);
|
||||||
}
|
}
|
||||||
if (json)
|
if (json)
|
||||||
fprintf(outf, "}, ");
|
fprintf(outf, "}");
|
||||||
|
|
||||||
return AA_EXIT_ENABLED;
|
return AA_EXIT_ENABLED;
|
||||||
}
|
}
|
||||||
@@ -702,7 +718,7 @@ static int detailed_processes(FILE *outf, filters_t *filters, bool json,
|
|||||||
fprintf(outf, "]");
|
fprintf(outf, "]");
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(outf, "}\n");
|
fprintf(outf, "}");
|
||||||
}
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
@@ -1030,8 +1046,10 @@ int main(int argc, char **argv)
|
|||||||
if (opt_json)
|
if (opt_json)
|
||||||
json_header(outf);
|
json_header(outf);
|
||||||
if (opt_show & SHOW_PROFILES) {
|
if (opt_show & SHOW_PROFILES) {
|
||||||
|
if (opt_json)
|
||||||
|
json_seperator(outf);
|
||||||
if (opt_count) {
|
if (opt_count) {
|
||||||
ret = simple_filtered_count(outf, &filters,
|
ret = simple_filtered_count(outf, &filters, opt_json,
|
||||||
profiles, nprofiles);
|
profiles, nprofiles);
|
||||||
} else {
|
} else {
|
||||||
ret = detailed_profiles(outf, &filters, opt_json,
|
ret = detailed_profiles(outf, &filters, opt_json,
|
||||||
@@ -1042,6 +1060,9 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (opt_show & SHOW_PROCESSES) {
|
if (opt_show & SHOW_PROCESSES) {
|
||||||
|
if (opt_json)
|
||||||
|
json_seperator(outf);
|
||||||
|
|
||||||
struct process *processes = NULL;
|
struct process *processes = NULL;
|
||||||
size_t nprocesses = 0;
|
size_t nprocesses = 0;
|
||||||
|
|
||||||
@@ -1049,7 +1070,7 @@ int main(int argc, char **argv)
|
|||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
eprintf(_("Failed to get processes: %d....\n"), ret);
|
eprintf(_("Failed to get processes: %d....\n"), ret);
|
||||||
} else if (opt_count) {
|
} else if (opt_count) {
|
||||||
ret = simple_filtered_process_count(outf, &filters,
|
ret = simple_filtered_process_count(outf, &filters, opt_json,
|
||||||
processes, nprocesses);
|
processes, nprocesses);
|
||||||
} else {
|
} else {
|
||||||
ret = detailed_processes(outf, &filters, opt_json,
|
ret = detailed_processes(outf, &filters, opt_json,
|
||||||
|
Reference in New Issue
Block a user