POSIX::PWDENT
POSIX::PWDENT
This module creates two new dynamic variables for easy access to information in the
/etc/passwd and /etc/group files in POSIX systems.
Usage
To query data in /etc/passwd use the $*PWDENT variable:
need POSIX::PWDENT; # No "use" required as no exports available.
# To get the UID of user named 'auser' use $*PWDENT variable as an Associative
my $uid = $*PWDENT<auser>.uid;
# Or
my $uid = +$*PWDENT<auser>;
# To get the name of the user with UID zero use the variable as a Positional
say $*PWDENT[0].name;
# Or
say ~$*PWDENT[0];To query data in /etc/group use the $*GRPENT variable
need POSIX::GRPENT; # No "use" required as no exports available.
# To get the GID of a gruop named 'agroup' use $*GRPENT variable as an Associative
my $gid = $*PWDENT<auser>.gid;
# Or
my $gid = +$*PWDENT<agroup>;
# To get the name of the group with GID zero use the variable as a Positional
say $*GRPENT[0].name;
# Or
say ~$*GRPENT[0];
Reference
The $*PWDENT dynamic variable
When you request the POSIX::PWDENT module to be loaded the $*PWDENT dynamic variable
is installed and is available anywhere in your code.
To get an entry by name use the variable as an Associative and to get an entry by UID
use the variable as a Positional.
Accessing $*PWDENT by any of the roles, if the entry exists, returns a PwdEnt object
with the following methods to access the corresponding fields of the entry:
name Str
passwd Str
uid Int
gid Int
change Int Valid only in BSD and Darwin, 0 otherwise
class Str Valid only in BSD and Darwin, '' otherwise
gecos Str Valid only in Linux, BSD and Darwin, '' otherwise
dir Str
shell Str
expire Int Valid only in BSD and Darwin, 0 otherwise
fields Int Valid only in BSD and Darwin, 0 otherwise
Similar to how Raku“s allomorphs works, evaluating a PwdEnt object in Str context returns the
value of .name and in Numeric context the value of .uid.
So to get the user name with UID 123, you can:
my $uname = ~$*PWDENT[123]; # Or $*PWDENT[123].StrOr to get the UID of a user named auser all you need to do is:
my $uid = +$*PWDENT<auser>; # Or $*PWDENT<auser>.NumericEven you can coerce the PwdEnt object to IO to get the value of dir as an IO::Path.
The $*PWDENT variable can also be used as an Iterable, so to get a list of the user
names available in the system you can:
my @users is List = (~$_ for $*PWDENT);The $*GRPENT dynamic variable
When you request the POSIS::GRPENT module to be loaded, the $*GRPENT dynamic variable is installed
To get an entry by name use the variable as an Associative and to get an entry by GID
use the variable as a Positional.
Accessing $*GRPENT by any of the roles, if the entry exists, returns a GrpEnt object
with the following methods to access the corresponding fields of the entry:
name Str
passwd Str
gid Int
members List of Str
Similar to how Raku“s allomorphs works, evaluating a GrpEnt object in Str context returns the
value of .name and in Numeric context the value of .gid.
So, to get the group name with GID 123, you can:
my $uname = ~$*GRPENT[123]; # Or $*GRPENT[123].StrOr to get the GID of a group named agroup all you need to do is:
my $gid = +$*GRPENT<auser>; # Or $*GRPENT<auser>.NumericThe $*GRPENT variable can also be used as an Iterable, so to get a list of all group
names available in the system you can:
my @group is List = (~$_ for $*GRPENT);Non existing entries
Requesting an inexistent entry from any of $*PWDENT or $*GRPENT returns Nil.
So, you can use with
with $*PWDENT<apache> {
# User 'apache' exists, can access its methods
say .gecos;
say "Apache dir is {.dir}";
}
with $*GRPENT<wheel> {
# User 'wheel' exists, can access its methods
say .members; # The list of users with access to 'sudo' in (some?) Linux
}As with other positional or associative you can use the :exists adverb to check existence.
say $*PWDENT<root>:exists; # True (root user almost always exists)
say $*PWDENT[0]:exists; # True
if $*GRPENT<kvm>:exists {
# The group 'kvm' exists
ā¦
}Convert PwdEnt or GRPENT objects to other types
If you need to access the returned data as other kind of structure, you can coerce it to
Map, Hash or List objects (whose keys will be the names of the methods above):
my $foouser = $*PWDENT<foo>.Map;
say $foouser<name>; # Use name as a key, not as a method
my $bargroup = $*GRPENT<bar>.List;Author
Salvador Ortiz [email protected]