-Add listclusterusers command with AD
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@5362 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		| @@ -98,7 +98,6 @@ sub list_user_accounts { #provide enough data to construct an /etc/passwd lookin | ||||
|     my $searchin; | ||||
|     my $searcherr = gensym; | ||||
|     my $search = open3($searchin,$searchout,$searcherr,@searchcmd); | ||||
|     print Dumper(@searchcmd); | ||||
|     my $searchselect = IO::Select->new($searchout,$searchin); | ||||
|     my @handles; | ||||
|     my $failure; | ||||
| @@ -107,7 +106,6 @@ sub list_user_accounts { #provide enough data to construct an /etc/passwd lookin | ||||
|     while (@handles = $searchselect->can_read()) { | ||||
|         foreach (@handles) { | ||||
|             my $line = <$_>; | ||||
|             print $line; | ||||
|             if (not defined $line) { | ||||
|                 $searchselect->remove($_); | ||||
|                 next; | ||||
|   | ||||
| @@ -14,6 +14,10 @@ sub handled_commands { | ||||
|     return { | ||||
|         addclusteruser => 'site:directoryprovider', | ||||
|         addclouduser => 'site:directoryprovider', | ||||
|         delclusteruser => 'site:directoryprovider', | ||||
|         delclouduser => 'site:directoryprovider', | ||||
|         listclusterusers => 'site:directoryprovider', | ||||
|         listcloudusers => 'site:directoryprovider', | ||||
|     }; | ||||
| } | ||||
|  | ||||
| @@ -23,7 +27,84 @@ sub process_request { | ||||
|     $callback = shift; | ||||
|     my $doreq = shift; | ||||
|     use Data::Dumper; | ||||
|     if ($command =~ /add.*user/) { #user management command, adding | ||||
|     my $sitetab = xCAT::Table->new('site'); | ||||
|     my $domain; | ||||
|     $domain = $sitetab->getAttribs({key=>'domain'},['value']); | ||||
|     if ($domain and $domain->{value}) {  | ||||
|         $domain = $domain->{value}; | ||||
|     } else { | ||||
|         $domain = undef; | ||||
|     } | ||||
|     #TODO: if multi-domain support implemented, use the domains table to reference between realm and domain   | ||||
|     my $server = $sitetab->getAttribs({key=>'directoryserver'},['value']); | ||||
|     my $realm = $sitetab->getAttribs({key=>'realm'},['value']); | ||||
|     if ($realm and $realm->{value}) { | ||||
|         $realm = $realm->{value}; | ||||
|     } else { | ||||
|         $realm = uc($domain); | ||||
|         $realm =~ s/\.$//; #remove trailing dot if provided | ||||
|     } | ||||
|     my $passtab = xCAT::Table->new('passwd'); | ||||
|     my $adpent = $passtab->getAttribs({key=>'activedirectory'},[qw/username password/]); | ||||
|     unless ($adpent and $adpent->{username} and $adpent->{password}) { | ||||
|         sendmsg([1,"activedirectory entry missing from passwd table"]); | ||||
|         return 1; | ||||
|     } | ||||
|     if ($server and $server->{value}) { | ||||
|         $server = $server->{value}; | ||||
|     } else { | ||||
|         my $res = Net::DNS::Resolver->new; | ||||
|         my $query = $res->query("_ldap._tcp.$domain","SRV"); | ||||
|         if ($query) { | ||||
|             foreach my $srec ($query->answer) { | ||||
|                 $server = $srec->{target}; | ||||
|             } | ||||
|         } | ||||
|         unless ($server) { | ||||
|             sendmsg([1,"Unable to determine a directory server to communicate with, try site.directoryserver"]); | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|     if ($command =~ /list.*user/) { #user management command, listing | ||||
|         my $passwdfmt; | ||||
|         @ARGV=@{$request->{arg}}; | ||||
|         Getopt::Long::Configure("bundling"); | ||||
|         Getopt::Long::Configure("no_pass_through"); | ||||
|         if (!GetOptions( | ||||
|             'p' => \$passwdfmt | ||||
|             )) { | ||||
|             die "TODO: usage message"; | ||||
|         } | ||||
|          unless ($domain and $realm) { | ||||
|              sendmsg([1,"Unable to determine domain from arguments or site tabel"]); | ||||
|              return undef; | ||||
|          } | ||||
|          my $err = xCAT::ADUtils::krb_login(username=>$adpent->{username},password=>$adpent->{password},realm=>$realm); | ||||
|          if ($err) { | ||||
|              sendmsg([1,"Error authenticating to Active Directory"]); | ||||
|              return 1; | ||||
|          } | ||||
|          my $accounts = xCAT::ADUtils::list_user_accounts( | ||||
|             dnsdomain => $domain, | ||||
|             directoryserver=> $server, | ||||
|          ); | ||||
|          if ($passwdfmt) { | ||||
|              my $account; | ||||
|              foreach $account (keys %$accounts) { | ||||
|                  my $textout = ":".$account.":x:"; #first colon is because sendmsg would mistake it for a description | ||||
|                  foreach (qw/uid gid fullname homedir shell/) { | ||||
|                      $textout .= $accounts->{$account}->{$_}.":"; | ||||
|                  } | ||||
|                  $textout =~ s/:$//; | ||||
|                  sendmsg($textout); | ||||
|              } | ||||
|          } else { | ||||
|              my $account; | ||||
|              foreach $account (keys %$accounts) { | ||||
|                  sendmsg($account); | ||||
|              } | ||||
|          } | ||||
|     } elsif ($command =~ /add.*user/) { #user management command, adding | ||||
|         my $homedir; | ||||
|         my $fullname; | ||||
|         my $gid; | ||||
| @@ -43,48 +124,20 @@ sub process_request { | ||||
|          } | ||||
|          my $username = shift @ARGV; | ||||
|          my $domain; | ||||
|          my $sitetab = xCAT::Table->new('site'); | ||||
|          if ($username =~ /@/) { | ||||
|              ($username,$domain) = split /@/,$username; | ||||
|              $domain = lc($domain); | ||||
|          } else { | ||||
|              $domain = $sitetab->getAttribs({key=>'domain'},['value']); | ||||
|              unless ($domain and $domain->{value}) {  | ||||
|                  sendmsg([1,"Domain not provided and none set in site table"]); | ||||
|              } | ||||
|              $domain = $domain->{value}; | ||||
|          } | ||||
|          #TODO: if multi-domain support implemented, use the domains table to reference between realm and domain   | ||||
|          my $server = $sitetab->getAttribs({key=>'directoryserver'},['value']); | ||||
|          if ($server and $server->{value}) { | ||||
|              $server = $server->{value}; | ||||
|          } else { | ||||
|              my $res = Net::DNS::Resolver->new; | ||||
|              my $query = $res->query("_ldap._tcp.$domain","SRV"); | ||||
|              if ($query) { | ||||
|                  foreach my $srec ($query->answer) { | ||||
|                      $server = $srec->{target}; | ||||
|                  } | ||||
|              } | ||||
|              unless ($server) { | ||||
|                  sendmsg([1,"Unable to determine a directory server to communicate with, try site.directoryserver"]); | ||||
|              } | ||||
|          }  | ||||
|          unless ($domain) { | ||||
|              sendmsg([1,"Unable to determine domain from arguments or site tabel"]); | ||||
|              return undef; | ||||
|          } | ||||
|  | ||||
|          my $realm = $sitetab->getAttribs({key=>'realm'},['value']); | ||||
|          if ($realm and $realm->{value}) { | ||||
|              $realm = $realm->{value}; | ||||
|          } else { | ||||
|              $realm = uc($domain); | ||||
|              $realm =~ s/\.$//; #remove trailing dot if provided | ||||
|          } | ||||
|          #my $domainstab = xCAT::Table->new('domains'); | ||||
|          #$realm = $domainstab->getAttribs({domain=>$domain}, | ||||
|          my $passtab = xCAT::Table->new('passwd'); | ||||
|          my $adpent = $passtab->getAttribs({key=>'activedirectory'},[qw/username password/]); | ||||
|          unless ($adpent and $adpent->{username} and $adpent->{password}) { | ||||
|              sendmsg([1,"activedirectory entry missing from passwd table"]); | ||||
|              return 1; | ||||
|          unless ($realm) { | ||||
|             $realm = uc($domain); | ||||
|             $realm =~ s/\.$//; #remove trailing dot if provided | ||||
|          } | ||||
|  | ||||
|          my $err = xCAT::ADUtils::krb_login(username=>$adpent->{username},password=>$adpent->{password},realm=>$realm); | ||||
| @@ -96,7 +149,7 @@ sub process_request { | ||||
|             username => $username, | ||||
|             dnsdomain => $domain, | ||||
|             directoryserver=> $server, | ||||
|         ); | ||||
|          ); | ||||
|          if ($fullname) { $args{fullname} = $fullname }; | ||||
|          if ($ou)  { $args{ou} = $ou }; | ||||
|          if ($request->{environment} and  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user