File Coverage

lib/Rex/User/NetBSD.pm
Criterion Covered Total %
statement 35 127 27.5
branch 0 48 0.0
condition 0 24 0.0
subroutine 12 15 80.0
pod 0 3 0.0
total 47 217 21.6


line stmt bran cond sub pod time code
1             #
2             # (c) Jan Gehring
3             #
4              
5             package Rex::User::NetBSD;
6              
7 1     1   13 use v5.12.5;
  1         3  
8 1     1   47 use warnings;
  1         4  
  1         50  
9              
10             our $VERSION = '1.14.3'; # VERSION
11              
12 1     1   7 use Rex::Logger;
  1         1  
  1         6  
13 1     1   37 use Rex::Commands::MD5;
  1         3  
  1         16  
14 1     1   11 use Rex::Helper::Run;
  1         5  
  1         64  
15 1     1   9 use Rex::Commands::Fs;
  1         5  
  1         8  
16 1     1   14 use Rex::User::Linux;
  1         6  
  1         17  
17 1     1   36 use Rex::Interface::File;
  1         2  
  1         15  
18 1     1   24 use Rex::Interface::Fs;
  1         2  
  1         12  
19 1     1   39 use Rex::Interface::Exec;
  1         2  
  1         7  
20 1     1   29 use Rex::Helper::Path;
  1         5  
  1         72  
21              
22 1     1   5 use base qw(Rex::User::Linux);
  1         6  
  1         1177  
23              
24             sub new {
25 0     0 0   my $that = shift;
26 0   0       my $proto = ref($that) || $that;
27 0           my $self = $proto->SUPER::new(@_);
28              
29 0           bless( $self, $proto );
30              
31 0           return $self;
32             }
33              
34             sub create_user {
35 0     0 0   my ( $self, $user, $data ) = @_;
36              
37 0           my $cmd;
38              
39 0           my $uid = $self->get_uid($user);
40 0           my $should_create_home;
41              
42 0           my $old_pw_md5 = md5("/etc/passwd");
43              
44 0 0 0       if ( $data->{'create_home'} || $data->{'create-home'} ) {
    0 0        
    0 0        
      0        
      0        
45 0           $should_create_home = 1;
46             }
47             elsif ( $data->{'no_create_home'} || $data->{'no-create-home'} ) {
48 0           $should_create_home = 0;
49             }
50             elsif ( ( exists $data->{'no_create_home'} && $data->{'no_create_home'} == 0 )
51             || ( exists $data->{'no-create-home'} && $data->{'no-create-home'} == 0 ) )
52             {
53 0           $should_create_home = 1;
54             }
55              
56 0 0         if ( !defined $uid ) {
57 0           Rex::Logger::debug("User $user does not exists. Creating it now.");
58 0           $cmd = "useradd ";
59              
60 0 0         if ( exists $data->{system} ) {
61 0           $cmd .= " -r";
62             }
63             }
64             else {
65 0           Rex::Logger::debug("User $user already exists. Updating...");
66              
67 0           $cmd = "usermod ";
68             }
69              
70 0 0         if ( exists $data->{uid} ) {
71 0           $cmd .= " -u " . $data->{uid};
72             }
73              
74 0 0         if ( exists $data->{home} ) {
75 0           $cmd .= " -d " . $data->{home};
76             }
77              
78 0 0 0       if ( $should_create_home && !defined $uid ) { #useradd mode
79 0           $cmd .= " -m ";
80             }
81              
82 0 0         if ( exists $data->{shell} ) {
83 0           $cmd .= " -s " . $data->{shell};
84             }
85              
86 0 0         if ( exists $data->{comment} ) {
87 0           $cmd .= " -c '" . $data->{comment} . "'";
88             }
89              
90 0 0         if ( exists $data->{expire} ) {
91 0           $cmd .= " -e '" . $data->{expire} . "'";
92             }
93              
94 0 0         if ( exists $data->{groups} ) {
95 0           my @groups = @{ $data->{groups} };
  0            
96 0           my $pri_group = shift @groups;
97              
98 0           $cmd .= " -g $pri_group";
99              
100 0 0         if (@groups) {
101 0           $cmd .= " -G " . join( ",", @groups );
102             }
103             }
104              
105 0           my $rnd_file = get_tmp_file;
106 0           my $fh = Rex::Interface::File->create;
107 0           $fh->open( ">", $rnd_file );
108 0           $fh->write("$cmd $user\nexit \$?\n");
109 0           $fh->close;
110              
111 0           i_run "/bin/sh $rnd_file", fail_ok => 1;
112 0 0         if ( $? == 0 ) {
113 0           Rex::Logger::debug("User $user created/updated.");
114             }
115             else {
116 0           Rex::Logger::info( "Error creating/updating user $user", "warn" );
117 0           die("Error creating/updating user $user");
118             }
119              
120 0           Rex::Interface::Fs->create()->unlink($rnd_file);
121              
122 0 0         if ( exists $data->{password} ) {
123 0           Rex::Logger::debug("Changing password of $user.");
124              
125 0           $rnd_file = get_tmp_file;
126 0           $fh = Rex::Interface::File->create;
127 0           $fh->open( ">", $rnd_file );
128             $fh->write(
129 0           "usermod -p \$(pwhash '" . $data->{password} . "') $user\nexit \$?\n" );
130 0           $fh->close;
131              
132 0           i_run "/bin/sh $rnd_file", fail_ok => 1;
133 0 0         if ( $? != 0 ) {
134 0           die("Error setting password for $user");
135             }
136              
137 0           Rex::Interface::Fs->create()->unlink($rnd_file);
138             }
139              
140 0 0         if ( exists $data->{crypt_password} ) {
141 0           Rex::Logger::debug("Setting encrypted password of $user");
142              
143 0           $rnd_file = get_tmp_file;
144 0           $fh = Rex::Interface::File->create;
145 0           $fh->open( ">", $rnd_file );
146             $fh->write(
147 0           "usermod -p '" . $data->{crypt_password} . "' $user\nexit \$?\n" );
148 0           $fh->close;
149              
150 0           i_run "/bin/sh $rnd_file", fail_ok => 1;
151 0 0         if ( $? != 0 ) {
152 0           die("Error setting password for $user");
153             }
154              
155 0           Rex::Interface::Fs->create()->unlink($rnd_file);
156             }
157              
158 0           my $new_pw_md5 = md5("/etc/passwd");
159              
160 0 0         if ( $new_pw_md5 eq $old_pw_md5 ) {
161             return {
162 0           changed => 0,
163             ret => $self->get_uid($user),
164             };
165             }
166             else {
167             return {
168 0           changed => 1,
169             ret => $self->get_uid($user),
170             },
171             ;
172             }
173              
174             }
175              
176             sub rm_user {
177 0     0 0   my ( $self, $user, $data ) = @_;
178              
179 0           Rex::Logger::debug("Removing user $user");
180              
181 0           my %user_info = $self->get_user($user);
182              
183 0           my $cmd = "userdel";
184              
185 0 0         if ( exists $data->{delete_home} ) {
186 0           $cmd .= " -r";
187             }
188              
189 0           my $output = i_run $cmd . " " . $user, fail_ok => 1;
190 0 0         if ( $? == 67 ) {
    0          
191 0           Rex::Logger::info( "Cannot delete user $user (no such user)", "warn" );
192             }
193             elsif ( $? != 0 ) {
194 0           die("Error deleting user $user ($output)");
195             }
196              
197 0 0 0       if ( exists $data->{delete_home} && is_dir( $user_info{home} ) ) {
198 0           Rex::Logger::debug(
199             "userdel doesn't delete home directory. removing it now by hand...");
200 0           rmdir $user_info{home};
201             }
202              
203 0 0         if ( $? != 0 ) {
204 0           die( "Error removing " . $user_info{home} );
205             }
206              
207             }
208              
209             1;