From 654a7353e1c46878dd84bfef0e987f0205e03fde Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Wed, 17 Mar 2010 22:47:35 -0700 Subject: Initial version of the libpiny stuff. --- usr/src/libpiny/Piny/Group.pm | 105 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 usr/src/libpiny/Piny/Group.pm (limited to 'usr/src/libpiny/Piny/Group.pm') diff --git a/usr/src/libpiny/Piny/Group.pm b/usr/src/libpiny/Piny/Group.pm new file mode 100644 index 0000000..8e0c2aa --- /dev/null +++ b/usr/src/libpiny/Piny/Group.pm @@ -0,0 +1,105 @@ +package Piny::Group; + +use Moose; + +use Piny::User; + +# Attributes + +has 'gid' => + ( is => 'ro' + , isa => 'Int' + , lazy_build => 1 + ); + +has 'groupname' => + ( is => 'ro' + , isa => 'Str' + , lazy_build => 1 + ); + +has 'grent' => + ( is => 'ro' + , isa => 'ArrayRef' + , lazy_build => 1 + , init_arg => undef + ); + +has 'members' => + ( is => 'ro' + , isa => 'ArrayRef[Piny::User]' + , lazy_build => 1 + , init_arg => undef + ); + +# Builder methods + +# If constructed with just one argument, then +# * If that argument is numeric, treat it as a UID. +# * Otherwise, treat it as a username. +around BUILDARGS => sub { + my ( $orig, $class ) = ( shift, shift ); + + if ( @_ == 1 && ! ref $_[0] ) { + if ( $_[0] =~ m/^\d+$/ ) { + return $class->$orig( gid => $_[0] ); + } else { + return $class->$orig( groupname => $_[0] ); + }; + } else { + return $class->$orig( @_ ); + }; +}; + +sub BUILD { + my ( $s ) = @_; + + if ( not ( $s->has_gid( ) or $s->has_groupname( ) ) ) { + die "You must provide either GID or groupname!\n"; + }; + + if ( $s->has_gid( ) and $s->has_groupname( ) ) { + die "You must not provide both GID and groupname!\n"; + }; +}; + +sub _build_gid { + my ( $s ) = @_; + + return $s->grent( )->[2]; +}; + +sub _build_groupname { + my ( $s ) = @_; + + return $s->grent( )->[0]; +}; + +sub _build_grent { + my ( $s ) = @_; + + if ( $s->has_gid( ) ) { + my @res = getgrgid( $s->gid( ) ); + die "getgrgid( " . $s->gid( ) . " ) failed: $!\n" unless @res; + return \@res; + } elsif ( $s->has_groupname( ) ) { + my @res = getgrnam( $s->groupname( ) ); + die "getgrnam( " . $s->groupname( ) . " ) failed: $!\n" unless @res; + return \@res; + } else { + die "Not enough information provided to lookup group!\n"; + }; +}; + +sub _build_members { + my ( $s ) = @_; + + return [ ] if ( $s->grent( )->[3] eq "" ); + return [ map { Piny::User->new( username => $_ ) } split( /:/, $s->grent( )->[3] ) ]; +}; + +# Moose boilerplate + +__PACKAGE__->meta->make_immutable; + +1; -- cgit v1.2.3