our
$VERSION
=
'1.16.0'
;
@EXPORT
=
qw(create_user delete_user get_uid get_user user_list
user_groups create_group delete_group get_group get_gid
account lock_password unlock_password
)
;
sub
account {
my
(
$name
,
%option
) =
@_
;
if
( !
ref
$name
) {
$name
= [
$name
];
}
$option
{ensure} ||=
"present"
;
for
my
$n
( @{
$name
} ) {
Rex::get_current_connection()->{reporter}
->report_resource_start(
type
=>
"account"
,
name
=>
$n
);
my
$real_name
=
$n
;
if
(
exists
$option
{name} ) {
$real_name
=
$option
{name};
}
if
(
exists
$option
{ensure} &&
$option
{ensure} eq
"present"
) {
delete
$option
{ensure};
my
$data
=
&create_user
(
$real_name
,
%option
,
__ret_changed
=> 1 );
Rex::get_current_connection()->{reporter}
->report(
changed
=>
$data
->{changed}, );
}
elsif
(
exists
$option
{ensure} &&
$option
{ensure} eq
"absent"
) {
&delete_user
(
$real_name
);
Rex::get_current_connection()->{reporter}->report(
changed
=> 1, );
}
Rex::get_current_connection()->{reporter}
->report_resource_end(
type
=>
"account"
,
name
=>
$n
);
}
}
sub
create_user {
my
(
$user
,
@_data
) =
@_
;
eval
{
my
@new_args
= Rex::Hook::run_hook(
create_user
=>
"before"
,
@_
);
if
(
@new_args
) {
(
$user
,
@_data
) =
@new_args
;
}
1;
} or
do
{
die
(
"Before-Hook failed. Canceling create_user() action: $@"
);
};
my
$data
= {};
if
( !
ref
(
$_data
[0] ) ) {
$data
= {
@_data
};
}
else
{
$data
=
$_data
[0];
}
my
$uid
= Rex::User->get()->create_user(
$user
,
$data
);
if
(
defined
$data
->{
"ssh_key"
} && !
defined
$data
->{
"home"
} ) {
Rex::Logger::debug(
"If ssh_key option is used you have to specify home, too."
);
die
(
"If ssh_key option is used you have to specify home, too."
);
}
if
(
defined
$data
->{
"ssh_key"
} ) {
if
( !is_dir(
$data
->{
"home"
} .
"/.ssh"
) ) {
eval
{
mkdir
$data
->{
"home"
} .
"/.ssh"
,
owner
=>
$user
,
mode
=> 700,
not_recursive
=> 1;
} or
do
{
Rex::Logger::debug(
"Not creating .ssh directory because parent doesn't exists."
);
};
}
if
( is_dir(
$data
->{
"home"
} .
"/.ssh"
) ) {
file
$data
->{
"home"
} .
"/.ssh/authorized_keys"
,
content
=>
$data
->{
"ssh_key"
},
owner
=>
$user
,
mode
=> 600;
}
}
Rex::Hook::run_hook(
create_user
=>
"after"
,
@_
,
$uid
);
if
(
$data
->{__ret_changed} ) {
return
$uid
;
}
return
$uid
->{ret};
}
sub
get_uid {
Rex::User->get()->get_uid(
@_
);
}
sub
get_user {
Rex::User->get()->get_user(
@_
);
}
sub
user_groups {
Rex::User->get()->user_groups(
@_
);
}
sub
user_list {
Rex::User->get()->user_list(
@_
);
}
sub
delete_user {
my
(
$user
,
@_data
) =
@_
;
my
$data
= {};
if
( !
ref
(
$_data
[0] ) ) {
$data
= {
@_data
};
}
else
{
$data
=
$_data
[0];
}
Rex::User->get()->rm_user(
$user
,
$data
);
}
sub
lock_password {
Rex::User->get()->lock_password(
@_
);
}
sub
unlock_password {
Rex::User->get()->unlock_password(
@_
);
}
sub
group_resource {
my
@params
=
@_
;
my
$name
=
shift
@params
;
my
%option
=
@params
;
if
(
ref
$name
ne
"ARRAY"
) {
$name
= [
$name
];
}
$option
{ensure} ||=
"present"
;
for
my
$group_name
( @{
$name
} ) {
Rex::get_current_connection()->{reporter}
->report_resource_start(
type
=>
"group"
,
name
=>
$group_name
);
my
$gid
= get_gid(
$group_name
);
if
(
$option
{ensure} eq
"present"
) {
if
( !
defined
$gid
) {
Rex::Commands::User::create_group(
$group_name
,
%option
);
}
}
elsif
(
$option
{ensure} eq
"absent"
) {
if
(
defined
$gid
) {
Rex::Commands::User::delete_group(
$group_name
);
}
}
else
{
die
"Unknown 'ensure' value. Valid values are 'present' and 'absent'."
;
}
Rex::get_current_connection()->{reporter}
->report_resource_end(
type
=>
"group"
,
name
=>
$group_name
);
}
}
sub
create_group {
my
$group
=
shift
;
my
@params
;
if
( !
ref
$_
[0] ) {
push
@params
, {
@_
};
}
else
{
push
@params
,
@_
;
}
Rex::User->get()->create_group(
$group
,
@params
);
}
sub
get_gid {
Rex::User->get()->get_gid(
@_
);
}
sub
get_group {
Rex::User->get()->get_group(
@_
);
}
sub
delete_group {
Rex::User->get()->rm_group(
@_
);
}
1;