Skip to content

Commit 4bff865

Browse files
authored
Merge pull request #6022 from SimonThalvorsen/ENT-9962
ENT-9962: adds optionality args getusers() and getgroups() + tests
2 parents 2043064 + 67cd35e commit 4bff865

File tree

3 files changed

+135
-11
lines changed

3 files changed

+135
-11
lines changed

libpromises/evalfunction.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -935,11 +935,12 @@ static FnCallResult FnCallGetEnv(ARG_UNUSED EvalContext *ctx, ARG_UNUSED const P
935935

936936
static FnCallResult FnCallGetUsers(ARG_UNUSED EvalContext *ctx, ARG_UNUSED const Policy *policy, ARG_UNUSED const FnCall *fp, const Rlist *finalargs)
937937
{
938-
const char *except_name = RlistScalarValue(finalargs);
939-
const char *except_uid = RlistScalarValue(finalargs->next);
938+
const char *first_arg = (finalargs != NULL) ? RlistScalarValue(finalargs) : NULL;
939+
const char *second_arg = (finalargs != NULL && finalargs->next != NULL) ? RlistScalarValue(finalargs->next) : NULL;
940940

941-
Rlist *except_names = RlistFromSplitString(except_name, ',');
942-
Rlist *except_uids = RlistFromSplitString(except_uid, ',');
941+
942+
Rlist *except_names = RlistFromSplitString(first_arg, ',');
943+
Rlist *except_uids = RlistFromSplitString(second_arg, ',');
943944

944945
setpwent();
945946

@@ -982,12 +983,11 @@ static FnCallResult FnCallGetUsers(ARG_UNUSED EvalContext *ctx, ARG_UNUSED const
982983

983984
static FnCallResult FnCallGetGroups(ARG_UNUSED EvalContext *ctx, ARG_UNUSED const Policy *policy, ARG_UNUSED const FnCall *fp, const Rlist *finalargs)
984985
{
985-
assert(finalargs != NULL);
986-
const char *except_name = RlistScalarValue(finalargs);
987-
const char *except_uid = RlistScalarValue(finalargs->next);
986+
const char *first_arg = (finalargs != NULL) ? RlistScalarValue(finalargs) : NULL;
987+
const char *second_arg = (finalargs != NULL && finalargs->next != NULL) ? RlistScalarValue(finalargs->next) : NULL;
988988

989-
Rlist *except_names = RlistFromSplitString(except_name, ',');
990-
Rlist *except_uids = RlistFromSplitString(except_uid, ',');
989+
Rlist *except_names = RlistFromSplitString(first_arg, ',');
990+
Rlist *except_uids = RlistFromSplitString(second_arg, ',');
991991

992992
setgrent();
993993

@@ -11621,13 +11621,13 @@ const FnCallType CF_FNCALL_TYPES[] =
1162111621
FnCallTypeNew("getuid", CF_DATA_TYPE_INT, GETUID_ARGS, &FnCallGetUid, "Return the integer user id of the named user on this host",
1162211622
FNCALL_OPTION_NONE, FNCALL_CATEGORY_SYSTEM, SYNTAX_STATUS_NORMAL),
1162311623
FnCallTypeNew("getusers", CF_DATA_TYPE_STRING_LIST, GETUSERS_ARGS, &FnCallGetUsers, "Get a list of all system users defined, minus those names defined in arg1 and uids in arg2",
11624-
FNCALL_OPTION_NONE, FNCALL_CATEGORY_SYSTEM, SYNTAX_STATUS_NORMAL),
11624+
FNCALL_OPTION_VARARG, FNCALL_CATEGORY_SYSTEM, SYNTAX_STATUS_NORMAL),
1162511625
FnCallTypeNew("getuserinfo", CF_DATA_TYPE_CONTAINER, GETUSERINFO_ARGS, &FnCallGetUserInfo, "Get a data container describing user arg1, defaulting to current user",
1162611626
FNCALL_OPTION_VARARG, FNCALL_CATEGORY_SYSTEM, SYNTAX_STATUS_NORMAL),
1162711627
FnCallTypeNew("getgroupinfo", CF_DATA_TYPE_CONTAINER, GETGROUPINFO_ARGS, &FnCallGetGroupInfo, "Get a data container describing specified group, or current group if not specified",
1162811628
FNCALL_OPTION_VARARG, FNCALL_CATEGORY_SYSTEM, SYNTAX_STATUS_NORMAL),
1162911629
FnCallTypeNew("getgroups", CF_DATA_TYPE_STRING_LIST, GETGROUPS_ARGS, &FnCallGetGroups, "Get a list of all system groups defined, minus those names defined in the first argument and group IDs defined in the second argument",
11630-
FNCALL_OPTION_NONE, FNCALL_CATEGORY_SYSTEM, SYNTAX_STATUS_NORMAL),
11630+
FNCALL_OPTION_VARARG, FNCALL_CATEGORY_SYSTEM, SYNTAX_STATUS_NORMAL),
1163111631
FnCallTypeNew("getvalues", CF_DATA_TYPE_STRING_LIST, GETINDICES_ARGS, &FnCallGetValues, "Get a list of values in the list or array or data container arg1",
1163211632
FNCALL_OPTION_COLLECTING, FNCALL_CATEGORY_DATA, SYNTAX_STATUS_NORMAL),
1163311633
FnCallTypeNew("getvariablemetatags", CF_DATA_TYPE_STRING_LIST, GETVARIABLEMETATAGS_ARGS, &FnCallGetMetaTags, "Collect the variable arg1's meta tags into an slist, optionally collecting only tag key arg2",
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#######################################################
2+
#
3+
# Test getgroups() variable args
4+
#
5+
#######################################################
6+
7+
body common control
8+
{
9+
inputs => { "../../default.cf.sub" };
10+
bundlesequence => { default("$(this.promise_filename)") };
11+
version => "1.0";
12+
}
13+
bundle agent test
14+
{
15+
meta:
16+
"description"
17+
string => "Test variable arguments with getgroups()";
18+
19+
"test_skip_unsupported"
20+
string => "windows";
21+
vars:
22+
"group_entries" slist => splitstring(string_trim(readfile("/etc/group")), "\n", 999);
23+
24+
"name_list"
25+
slist => maplist(
26+
nth(splitstring("$(this)", ":", 1), 0),
27+
"@(group_entries)"
28+
);
29+
"actual_groups_content"
30+
string => join(" ", sort("@(name_list)", "lex"));
31+
32+
"groups1" slist => getgroups();
33+
"groups2" slist => getgroups("");
34+
"groups3" slist => getgroups("","");
35+
36+
"retrieved_groups_content_1"
37+
string => join(" ", sort("@(groups1)", "lex"));
38+
"retrieved_groups_content_2"
39+
string => join(" ", sort("@(groups2)", "lex"));
40+
"retrieved_groups_content_3"
41+
string => join(" ", sort("@(groups3)", "lex"));
42+
43+
}
44+
45+
bundle agent check
46+
{
47+
48+
classes:
49+
"ok"
50+
expression => and(
51+
strcmp("$(test.actual_groups_content)", "$(test.retrieved_groups_content_1)"),
52+
strcmp("$(test.actual_groups_content)", "$(test.retrieved_groups_content_2)"),
53+
strcmp("$(test.actual_groups_content)", "$(test.retrieved_groups_content_3)")
54+
);
55+
56+
reports:
57+
ok::
58+
"$(this.promise_filename) Pass";
59+
60+
!ok::
61+
"$(this.promise_filename) FAIL";
62+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#######################################################
2+
#
3+
# Test getusers() variable args
4+
#
5+
#######################################################
6+
7+
body common control
8+
{
9+
inputs => { "../../default.cf.sub" };
10+
bundlesequence => { default("$(this.promise_filename)") };
11+
version => "1.0";
12+
}
13+
bundle agent test
14+
{
15+
meta:
16+
"description" -> { "ENT-9962" }
17+
string => "Test variable arguments with getusers()";
18+
19+
"test_skip_unsupported"
20+
string => "windows";
21+
vars:
22+
"user_entries" slist => splitstring(string_trim(readfile("/etc/passwd")), "\n", 999);
23+
24+
"name_list"
25+
slist => maplist(
26+
nth(splitstring("$(this)", ":", 1), 0),
27+
"@(user_entries)"
28+
);
29+
"actual_users_content"
30+
string => join(" ", sort("@(name_list)", "lex"));
31+
32+
"users1" slist => getusers();
33+
"users2" slist => getusers("");
34+
"users3" slist => getusers("","");
35+
36+
"retrieved_users_content_1"
37+
string => join(" ", sort("@(users1)", "lex"));
38+
"retrieved_users_content_2"
39+
string => join(" ", sort("@(users2)", "lex"));
40+
"retrieved_users_content_3"
41+
string => join(" ", sort("@(users3)", "lex"));
42+
43+
}
44+
45+
bundle agent check
46+
{
47+
48+
classes:
49+
"ok"
50+
expression => and(
51+
strcmp("$(test.actual_users_content)", "$(test.retrieved_users_content_1)"),
52+
strcmp("$(test.actual_users_content)", "$(test.retrieved_users_content_2)"),
53+
strcmp("$(test.actual_users_content)", "$(test.retrieved_users_content_3)")
54+
);
55+
56+
reports:
57+
ok::
58+
"$(this.promise_filename) Pass";
59+
60+
!ok::
61+
"$(this.promise_filename) FAIL";
62+
}

0 commit comments

Comments
 (0)