File: | /home/mik/work/module/Tivoli/AccessManager/Admin/Server.pm |
Coverage: | 98.8% |
line | stmt | bran | cond | sub | pod | time | code |
---|---|---|---|---|---|---|---|
1 | package Tivoli::AccessManager::Admin::Server; | ||||||
2 | 15 15 15 | 165 51 245 | use strict; | ||||
3 | 15 15 15 | 209 67 220 | use warnings; | ||||
4 | 15 15 15 | 208 54 279 | use Carp; | ||||
5 | 15 15 15 | 209 51 251 | use Data::Dumper; | ||||
6 | 15 15 15 | 188 52 238 | use Tivoli::AccessManager::Admin::Response; | ||||
7 | |||||||
8 | #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | ||||||
9 | # $Id: Server.pm 328 2006-11-20 19:00:06Z mik $ | ||||||
10 | #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | ||||||
11 | $Tivoli::AccessManager::Admin::Server::VERSION = '0.00'; | ||||||
12 | 15 | 223 | use Inline(C => 'DATA', | ||||
13 | INC => '-I/opt/PolicyDirector/include', | ||||||
14 | LIBS => ' -lpthread -lpdadminapi -lpdmgrapi -lstdc++', | ||||||
15 | CCFLAGS => '-Wall', | ||||||
16 | NAME => 'Tivoli::AccessManager::Admin::Server', | ||||||
17 | 15 15 | 189 61 | ); | ||||
18 | |||||||
19 | sub new { | ||||||
20 | 9 | 1 | 55 | my $class = shift; | |||
21 | 9 | 35 | my $cont = shift; | ||||
22 | 9 | 42 | my $name = ""; | ||||
23 | 9 | 189 | unless (defined($cont) and UNIVERSAL::isa($cont,'Tivoli::AccessManager::Admin::Context')) { | ||||
24 | 2 | 424 | warn "Incorrect syntax -- did you forget the context?\n"; | ||||
25 | 2 | 34 | return undef; | ||||
26 | } | ||||||
27 | |||||||
28 | 7 | 60 | if (@_ == 1) { | ||||
29 | 2 | 10 | $name = shift; | ||||
30 | } | ||||||
31 | elsif (@_ % 2) { | ||||||
32 | 1 | 23 | warn "Invalid syntax for new\n"; | ||||
33 | 1 | 9 | return undef; | ||||
34 | } | ||||||
35 | elsif (@_) { | ||||||
36 | 2 | 18 | my %opts = @_; | ||||
37 | 2 | 36 | $name = $opts{name} || ''; | ||||
38 | } | ||||||
39 | |||||||
40 | 6 | 51 | my $self = bless {}, $class; | ||||
41 | |||||||
42 | 6 | 29 | $self->{context} = $cont; | ||||
43 | 6 | 32 | $self->{name} = $name; | ||||
44 | |||||||
45 | 6 | 37 | return $self; | ||||
46 | } | ||||||
47 | |||||||
48 | sub tasklist { | ||||||
49 | 3 | 1 | 29 | my $self = shift; | |||
50 | 3 | 43 | my $resp = Tivoli::AccessManager::Admin::Response->new; | ||||
51 | |||||||
52 | 3 | 29 | unless ($self->{name}) { | ||||
53 | 1 | 7 | $resp->set_message("Unnamed servers cannot list tasks"); | ||||
54 | 1 | 29 | $resp->set_isok(0); | ||||
55 | 1 | 9 | return $resp; | ||||
56 | } | ||||||
57 | |||||||
58 | 2 | 131321 | my $rc = $self->server_gettasklist($resp); | ||||
59 | 2 | 53 | $resp->isok() && $resp->set_value($rc); | ||||
60 | |||||||
61 | 2 | 23 | return $resp; | ||||
62 | } | ||||||
63 | |||||||
64 | sub task { | ||||||
65 | 7 | 1 | 54 | my $self = shift; | |||
66 | 7 | 72 | my $resp = Tivoli::AccessManager::Admin::Response->new; | ||||
67 | 7 | 36 | my $task = ''; | ||||
68 | |||||||
69 | 7 | 48 | unless ($self->{name}) { | ||||
70 | 1 | 11 | $resp->set_message("Unnamed servers cannot perform tasks"); | ||||
71 | 1 | 10 | $resp->set_isok(0); | ||||
72 | 1 | 4 | return $resp; | ||||
73 | } | ||||||
74 | |||||||
75 | 6 | 63 | if (@_ == 1) { | ||||
76 | 2 | 11 | $task = shift; | ||||
77 | } | ||||||
78 | elsif (@_ % 2) { | ||||||
79 | 1 | 11 | $resp->set_message("Invalid syntax"); | ||||
80 | 1 | 12 | $resp->set_isok(0); | ||||
81 | 1 | 9 | return $resp; | ||||
82 | } | ||||||
83 | elsif (@_) { | ||||||
84 | 2 | 17 | my %opts = @_; | ||||
85 | 2 | 43 | $task = $opts{task} || ''; | ||||
86 | } | ||||||
87 | |||||||
88 | 5 | 22 | if ($task) { | ||||
89 | 3 | 252276 | my $rc = $self->server_performtask($resp,$task); | ||||
90 | 3 | 82 | if ($resp->isok) { | ||||
91 | 2 | 31 | my @temp = split("\n",$rc); | ||||
92 | 2 | 16 | for (@temp) { | ||||
93 | 8 | 26 | chomp; | ||||
94 | 8 | 42 | s/^\s*//; | ||||
95 | 8 | 82 | s/\s*$//; | ||||
96 | } | ||||||
97 | 2 | 21 | $resp->set_value(\@temp); | ||||
98 | } | ||||||
99 | } | ||||||
100 | else { | ||||||
101 | 2 | 20 | $resp->set_isok(0); | ||||
102 | 2 | 18 | $resp->set_message("Cannot perform a nameless task"); | ||||
103 | } | ||||||
104 | 5 | 50 | return $resp; | ||||
105 | } | ||||||
106 | |||||||
107 | # This is a kludge, because IBM won't expose the real calls via the C API. | ||||||
108 | # They did for java, but not C. Bastards | ||||||
109 | sub list { | ||||||
110 | 4 | 1 | 26 | my $class = shift; | |||
111 | 4 | 21 | my ($tam,$grp,@list); | ||||
112 | 4 | 46 | my $resp = Tivoli::AccessManager::Admin::Response->new(); | ||||
113 | |||||||
114 | # I want this to be called as either Tivoli::AccessManager::Admin::User->list or | ||||||
115 | # $self->list | ||||||
116 | 4 | 31 | if ( ref($class) ) { | ||||
117 | 1 | 9 | $tam = $class->{context}; | ||||
118 | } | ||||||
119 | else { | ||||||
120 | 3 | 11 | $tam = shift; | ||||
121 | 3 | 59 | unless (defined($tam) and UNIVERSAL::isa($tam,'Tivoli::AccessManager::Admin::Context' ) ) { | ||||
122 | 2 | 16 | $resp->set_message("Incorrect syntax -- did you forget the context?"); | ||||
123 | 2 | 12 | $resp->set_isok(0); | ||||
124 | 2 | 10 | return $resp; | ||||
125 | } | ||||||
126 | } | ||||||
127 | |||||||
128 | 2 | 34 | $grp = Tivoli::AccessManager::Admin::Group->new($tam,name => 'remote-acl-users'); | ||||
129 | 2 | 54 | $resp = $grp->members; | ||||
130 | 2 | 32 | return $resp unless $resp->isok; | ||||
131 | |||||||
132 | 2 | 28 | for ( $resp->value ) { | ||||
133 | 10 | 111 | next unless s#/#-#; | ||||
134 | 10 | 76 | push @list, $_; | ||||
135 | } | ||||||
136 | |||||||
137 | 2 | 34 | $resp = Tivoli::AccessManager::Admin::Response->new; | ||||
138 | 2 | 13 | $resp->set_value(\@list); | ||||
139 | |||||||
140 | 2 | 18 | return $resp; | ||||
141 | } | ||||||
142 | |||||||
143 | sub name { | ||||||
144 | 5 | 1 | 22 | my $self = shift; | |||
145 | 5 | 45 | my $resp = Tivoli::AccessManager::Admin::Response->new; | ||||
146 | 5 | 20 | my $name = ""; | ||||
147 | |||||||
148 | 5 | 52 | if (@_ == 1) { | ||||
149 | 1 | 8 | $name = shift; | ||||
150 | } | ||||||
151 | elsif (@_ % 2) { | ||||||
152 | 1 | 7 | $resp->set_message("Invalid syntax for name"); | ||||
153 | 1 | 12 | $resp->set_isok(0); | ||||
154 | 1 | 9 | return $resp; | ||||
155 | } | ||||||
156 | elsif (@_) { | ||||||
157 | 2 | 26 | my %opts = @_; | ||||
158 | 2 | 39 | $name = $opts{name} || ''; | ||||
159 | } | ||||||
160 | |||||||
161 | 4 | 33 | $self->{name} = $name if $name; | ||||
162 | |||||||
163 | 4 | 34 | $resp->set_value($self->{name}); | ||||
164 | 4 | 22 | return $resp; | ||||
165 | } | ||||||
166 | |||||||
167 | |||||||
168 | 1; | ||||||
169 | |||||||
170 - 336 | =head1 NAME Tivoli::AccessManager::Admin::Server =head1 SYNOPSIS my $tam = Tivoli::AccessManager::Admin->new(password => 'N3ew0nk'); my($server, $resp); # Lets see what servers are defined $resp = Tivoli::AccessManager::Admin::Server->list($tam); # Lets find a webSEAL my $wseal; for ($resp->value) { if (/webseal/) { $wseal = $_; last; } } $server = Tivoli::AccessManager::Admin::Server->new($tam,$wseal); # Get a list of tasks from the webSEAL $resp = $server->tasklist; # Execute a task $resp = $server->task("list"); =head1 DESCRIPTION L<Tivoli::AccessManager::Admin::Server> implements the server access portion of the TAM API. This basically means any pdadmin command that starts with the word "server". =head1 CONSTRUCTOR =head2 new(PDADMIN[, NAME]) Creates a blessed L<Tivoli::AccessManager::Admin::Server> object. As you may well expect, you will need to destroy the object if you want to change the context. =head3 Parameters =over 4 =item PDADMIN An initialized L<Tivoli::AccessManager::Admin::Context> object. This is the only required parameter. =item NAME The servers's name. This is technically not required, but you need to define the name before you can use L</"tasklist"> or L</"task">. =back =head3 Returns A blessed L<Tivoli::AccessManager::Admin::Server> as long as you provide a valid context. It will warn and return undef otherwise. =head1 CLASS METHODS =head2 list Lists all servers. This method is something of a hack. TAM does not expose a server list function to the C API. This method actually uses the membership list of the remote-acl-users group. It isn't great, but it should work. =head3 Parameters None. =head3 Returns Hopefully, a list of all the defined servers buried in a L<Tivoli::AccessManager::Admin::Response> object. There may be some extra values in there, but you shouldn't be adding your own stuff to remove-acl-users anyway. =head1 METHODS All methods return a L<Tivoli::AccessManager::Admin::Response> object. See the documentation for that module to get the actual values out. =head2 task(COMMAND) Executes the named command on the server. =head3 Parameters =over 4 =item COMMAND The command to execute. This parameter is required. =back =head3 Returns An array containing the results of the command. The API is a little weird in this, but it makes some sense. The API actually returns everything as one string, separated by newlines. I split this string on newlines to generate an array. It isn't pretty, but that is the way it works. An invalid or missing command will generate an error. =head2 tasklist Gets a list of all the tasks defined on the server. =head3 Parameters None. =head3 Returns An array containing the output. See the discussion in L</"task"> for more information. =head2 name([NAME]) Gets or sets the server's name. =head3 Parameters =over 4 =item NAME The new name. This parameter is optional. =back =head3 Returns The name of the server, buried in a L<Tivoli::AccessManager::Admin::Response> object. =head1 ACKNOWLEDGEMENTS See L<Tivoli::AccessManager::Admin> for the list. This was not possible without the help of a bunch of people smarter than I. =head1 BUGS I would really like a server list and server info function exposed to the C API. Like what Java has. This isn't my bug. =head1 AUTHOR Mik Firestone E<lt>mikfire@gmail.comE<gt> =head1 COPYRIGHT Copyright (c) 2006-2013 Mik Firestone. All rights reserved. This program is free software; you can redistibute it and/or modify it under the same terms as Perl itself. All references to TAM, Tivoli Access Manager, etc are copyrighted, trademarked and otherwise patented by IBM. =cut | ||||||
337 |