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].Str
Or to get the UID of a user named auser all you need to do is:
my $uid = +$*PWDENT<auser>; # Or $*PWDENT<auser>.Numeric
Even 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].Str
Or to get the GID of a group named agroup all you need to do is:
my $gid = +$*GRPENT<auser>; # Or $*GRPENT<auser>.Numeric
The $*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 sortiz@cpan.org