File Coverage

blib/lib/Wizard/LDAP/Net.pm
Criterion Covered Total %
statement 13 15 86.6
branch n/a
condition n/a
subroutine 5 5 100.0
pod n/a
total 18 20 90.0


line stmt bran cond sub pod time code
1             # -*- perl -*-
2              
3 1     1   1102 use strict;
  1         2  
  1         44  
4              
5 1     1   5 use Net::LDAP ();
  1         2  
  1         16  
6 1     1   5 use Net::Netmask ();
  1         2  
  1         15  
7 1     1   5 use Socket ();
  1         3  
  1         17  
8 1     1   626 use Wizard ();
  0            
  0            
9             use Wizard::State ();
10             use Wizard::SaveAble ();
11             use Wizard::SaveAble::LDAP ();
12             use Wizard::LDAP ();
13             use Wizard::LDAP::Config ();
14              
15             @Wizard::LDAP::Net::ISA = qw(Wizard::LDAP);
16             $Wizard::LDAP::Net::VERSION = '0.01';
17              
18             package Wizard::LDAP::Net;
19              
20             sub init {
21             my $self = shift;
22             return ($self->SUPER::init(1)) unless shift;
23             my $item = $self->{'net'} || die "Missing net";
24             ($self->SUPER::init(1), $item);
25             }
26              
27              
28             sub ShowMe {
29             my($self, $wiz, $prefs, $net) = @_;
30             (['Wizard::Elem::Title',
31             'value' => $net->CreateMe() ?
32             'LDAP Wizard: Create a new net' :
33             'LDAP Wizard: Edit an existing net'],
34             ($net->CreateMe() ?
35             ['Wizard::Elem::Text', 'name' => 'ldap-net-netname',
36             'value' => $net->{'ldap-net-netname'},
37             'descr' => 'Name of net']
38             : ['Wizard::Elem::Data' => 'value' => $net->{'ldap-net-netname'},
39             'descr' => 'Name of net']),
40             ['Wizard::Elem::Text', 'name' => 'ldap-net-mask',
41             'value' => $net->{'ldap-net-mask'},
42             'descr' => 'Netmask of the net'],
43             ['Wizard::Elem::Text', 'name' => 'ldap-net-domain',
44             'value' => $net->{'ldap-net-domain'},
45             'descr' => 'Netmask domain'],
46             ['Wizard::Elem::Text', 'name' => 'ldap-net-dns',
47             'value' => $net->{'ldap-net-dns'},
48             'descr' => 'DNS Server(s) for the network, seperated by ","'],
49             ['Wizard::Elem::Text', 'name' => 'ldap-net-wins',
50             'value' => $net->{'ldap-net-wins'},
51             'descr' => 'WINS Server(s) for the network, seperated by ","'],
52             ['Wizard::Elem::Text', 'name' => 'ldap-net-gateway',
53             'value' => $net->{'ldap-net-gateway'},
54             'descr' => 'Gateway for this net'],
55             ['Wizard::Elem::Text', 'name' => 'ldap-net-timeserver',
56             'value' => $net->{'ldap-net-timeserver'},
57             'descr' => 'Timeserver for this net'],
58             ['Wizard::Elem::Text', 'name' => 'ldap-net-reservedipbegin',
59             'value' => $net->{'ldap-net-reservedipbegin'},
60             'descr' => 'Reserved IP Block begin'],
61             ['Wizard::Elem::Text', 'name' => 'ldap-net-reservedipend',
62             'value' => $net->{'ldap-net-reservedipend'},
63             'descr' => 'Reserved IP Block end'],
64             ['Wizard::Elem::Submit', 'name' => 'Action_NetSave',
65             'value' => 'Save these settings', 'id' => 1],
66             ['Wizard::Elem::BR'],
67             ['Wizard::Elem::Submit', 'name' => 'Action_Reset',
68             'value' => 'Return to Net menu', 'id' => 98],
69             ['Wizard::Elem::Submit', 'name' => 'Wizard::LDAP::Action_Reset',
70             'value' => 'Return to top menu', 'id' => 99]);
71             }
72              
73              
74             sub Action_Reset {
75             my($self, $wiz) = @_;
76             $self->init();
77              
78             delete $self->{'net'};
79             $self->Store($wiz);
80              
81             # Return the initial menu.
82             (['Wizard::Elem::Title', 'value' => 'LDAP Wizard Net Menu'],
83             ['Wizard::Elem::Submit', 'value' => 'Create a new net',
84             'name' => 'Action_CreateNet',
85             'id' => 1],
86             ['Wizard::Elem::Submit', 'value' => 'Host menu',
87             'name' => 'Action_HostMenu',
88             'id' => 1],
89             ['Wizard::Elem::Submit', 'value' => 'Modify an existing net',
90             'name' => 'Action_ModifyNet',
91             'id' => 3],
92             ['Wizard::Elem::Submit', 'value' => 'Delete an existing net',
93             'name' => 'Action_DeleteNet',
94             'id' => 4],
95             ['Wizard::Elem::BR'],
96             ['Wizard::Elem::Submit', 'value' => 'Return to Top Menu',
97             'name' => 'Wizard::LDAP::Action_Reset',
98             'id' => 98],
99             ['Wizard::Elem::Submit', 'value' => 'Exit LDAP Wizard',
100             'id' => 99]);
101             }
102              
103             sub Action_CreateNet {
104             my($self, $wiz) = @_;
105             my ($prefs, $admin) = $self->init();
106             my $net = Wizard::SaveAble::LDAP->new('adminDN' => $admin->{'ldap-admin-dn'},
107             'adminPassword' => $admin->{'ldap-admin-password'},
108             'prefix' => 'ldap-net-',
109             'serverip' => $prefs->{'ldap-prefs-serverip'},
110             'serverport' => $prefs->{'ldap-prefs-serverport'},
111             );
112             $net->CreateMe(1);
113             $self->{'net'} = $net;
114             $self->Store($wiz);
115             $self->ShowMe($wiz, $prefs, $net);
116             }
117              
118             sub Action_NetSave {
119             my($self, $wiz) = @_;
120             my ($prefs, $admin, $net) = $self->init(1);
121             my $base = $prefs->{'ldap-prefs-netbase'};
122             local $SIG{'__WARN__'} = 'IGNORE';
123              
124             foreach my $opt ($wiz->param()) {
125             $net->{$opt} = $wiz->param($opt)
126             if (($opt =~ /^ldap\-net/) && (defined($wiz->param($opt))));
127             }
128              
129             # Verify settings
130             my $errors = '';
131             my $name = $net->{'ldap-net-netname'}
132             or ($errors .= "Missing net name.\n");
133             my $mask = $net->{'ldap-net-mask'}
134             or ($errors .= "Missing net mask.\n");
135             my $domain = $net->{'ldap-net-domain'}
136             or ($errors .= "Missing net domain.\n");
137             my $dns = $net->{'ldap-net-dns'};
138             my $wins = $net->{'ldap-net-winns'};
139             my $gateway = $net->{'ldap-net-gateway'};
140             my $times = $net->{'ldap-net-timeserver'};
141             my $ripb = $net->{'ldap-net-reservedipbegin'};
142             my $ripe = $net->{'ldap-net-reservedipend'};
143              
144             my @servs = map { s/[\ ]*//g; (($_ ne '') ? $_ : ());
145             } (split(/\,/, $dns), split(/\,/, $wins), $times) ;
146             my $serv;
147             foreach $serv (@servs) {
148             unless(Socket::inet_aton($serv)) {
149             $errors .= "Cannot resolve $serv.\n";
150             }
151             }
152             my $nmask = new Net::Netmask($mask);
153             $errors .= "Invalid netmask $mask, due to "
154             . $nmask->{'ERROR'} if $nmask->{'ERROR'};
155            
156             $errors .= "Only begin or end of reserved IP block has been specified.\n"
157             if (($ripb && !$ripe) || (!$ripb && $ripe));
158             if($ripb) {
159             $errors .= "Invalid IP adress $ripb.\n"
160             unless Socket::inet_aton($ripb);
161             $errors .= "IP adress $ripb does not match the netmask $mask.\n"
162             unless $nmask->match($ripb);
163             }
164             if($ripe) {
165             $errors .= "Invalid IP adress $ripe.\n"
166             unless Socket::inet_aton($ripe);
167             $errors .= "IP adress $ripe does not match the netmask $mask.\n"
168             unless $nmask->match($ripe);
169             }
170              
171             if($domain !~ /^[\w\-]+(\.[\w\-]+)*$/) {
172             $errors .= "Invalid domainnname $domain.\n";
173             }
174              
175             $net->{'ldap-net-objectClass'} = 'net';
176             die $errors if $errors;
177              
178             $net->AttrScalar2Ref('dns', 'wins');
179             $net->Modified(1);
180             $net->DN("network=$name, $base");
181              
182             $self->Store($wiz, 1);
183             $self->OnChange('net');
184             $self->Action_Reset($wiz);
185             }
186              
187             sub Action_HostMenu {
188             my $self = shift; my $wiz = shift;
189             $self->Action_ModifyNet($wiz, 'Manage hosts in this net',
190             'Wizard::LDAP::Host::Action_Enter');
191             }
192              
193             sub Action_ModifyNet {
194             my $self = shift; my $wiz = shift;
195             my $button = shift || 'Modify Net';
196             my $action = shift || 'Action_EditNet';
197             my ($prefs, $admin) = $self->init();
198             my $base = $prefs->{'ldap-prefs-netbase'};
199              
200             my @items = $self->ItemList($prefs, $admin, $base, 'netName');
201             return $self->Action_Reset($wiz) unless @items;
202             if(@items == 1) {
203             # Hack: If there's only one net, pick it up immediately.
204             # We need to load the class and bless ... :-(
205             if ($action =~ /(.*)::/) {
206             my $class = $1;
207             my $cl = "$class.pm";
208             $cl =~ s/\:\:/\//g;
209             require $cl;
210             bless $self, $class;
211             }
212             $wiz->param('ldap-net', $items[0]);
213             return $self->$action($wiz);
214             }
215             @items = sort @items;
216             # Return the initial menu.
217             (['Wizard::Elem::Title', 'value' => "LDAP Wizard Net Selection"],
218             ['Wizard::Elem::Select', 'options' => \@items, 'name' => 'ldap-net',
219             'descr' => 'Select an net'],
220             ['Wizard::Elem::Submit', 'value' => $button, 'name' => $action,
221             'id' => 1]);
222             }
223              
224             sub Load {
225             my($self, $wiz, $prefs, $admin, $dn) = @_;
226             my $net = Wizard::SaveAble::LDAP->new('adminDN' => $admin->{'ldap-admin-dn'},
227             'adminPassword' => $admin->{'ldap-admin-password'},
228             'prefix' => 'ldap-net-',
229             'serverip' => $prefs->{'ldap-prefs-serverip'},
230             'serverport' => $prefs->{'ldap-prefs-serverport'},
231             'dn' => $dn, 'load' => 1);
232             $net->DN($dn);
233             $self->{'net'} = $net;
234             $self->Store($wiz);
235             $net->AttrRef2Scalar('dns', 'wins');
236             $net;
237             }
238              
239              
240             sub Action_EditNet {
241             my($self, $wiz) = @_;
242             my($prefs, $admin) = $self->init();
243             my $net = $wiz->param('ldap-net') || die "Missing net name.";
244             my $dn = "network=$net, " . $prefs->{'ldap-prefs-netbase'};
245             my $n = $self->Load($wiz, $prefs, $admin, $dn);
246             $self->ShowMe($wiz, $prefs, $n);
247             }
248              
249             sub Action_DeleteNet {
250             shift->Action_ModifyNet(shift, 'Delete Net', 'Action_DeleteNet2');
251             }
252              
253             sub Action_DeleteNet2 {
254             my ($self, $wiz) = @_;
255             my($prefs, $admin) = $self->init();
256             my $netname = $wiz->param('ldap-net') || die "Missing net.";
257             my $dn = "network=$netname, " . $prefs->{'ldap-prefs-netbase'};
258             my $net = $self->Load($wiz, $prefs, $admin, $dn);
259              
260             (['Wizard::Elem::Title', 'value' => 'Deleting an LDAP Net ' .
261             '(and all the hosts belonging to it)'],
262             ['Wizard::Elem::Data', 'descr' => 'Net name',
263             'value' => $net->{'ldap-net-netname'}],
264             ['Wizard::Elem::Data', 'descr' => 'Netmask',
265             'value' => $net->{'ldap-net-mask'}],
266             ['Wizard::Elem::Data', 'descr' => 'Net domain',
267             'value' => $net->{'ldap-net-domain'}],
268             ['Wizard::Elem::Data', 'descr' => 'Net DNS server(s)',
269             'value' => $net->{'ldap-net-dns'}],
270             ['Wizard::Elem::Data', 'descr' => 'Net WINS server(s)',
271             'value' => $net->{'ldap-net-wins'}],
272             ['Wizard::Elem::Data', 'descr' => 'Net gateway',
273             'value' => $net->{'ldap-net-gateway'}],
274             ['Wizard::Elem::Data', 'descr' => 'Net timeserver',
275             'value' => $net->{'ldap-net-timeserver'}],
276             ['Wizard::Elem::Data', 'descr' => 'Reserved IP begin',
277             'value' => $net->{'ldap-net-reservedipbegin'}],
278             ['Wizard::Elem::Data', 'descr' => 'Reserved IP end',
279             'value' => $net->{'ldap-net-reservedipend'}],
280             ['Wizard::Elem::Data', 'descr' => 'Net timeserver',
281             'value' => $net->{'ldap-net-timeserver'}],
282             ['Wizard::Elem::Submit', 'value' => 'Yes, delete it',
283             'id' => 1, 'name' => 'Action_DeleteNet3'],
284             ['Wizard::Elem::Submit', 'value' => 'Return to Net Menu',
285             'id' => 98, 'name' => 'Action_Reset'],
286             ['Wizard::Elem::Submit', 'value' => 'Return to Top Menu',
287             'id' => 99, 'name' => 'Wizard::LDAP::Action_Reset']);
288             }
289              
290             sub Action_DeleteNet3 {
291             my($self, $wiz) = @_;
292             my($prefs, $admin, $net) = $self->init(1);
293             ($prefs, $admin) = $self->init();
294             my $base = "network=" . $net->{'ldap-net-netname'} . ", " . $prefs->{'ldap-prefs-netbase'};
295             my $mesg = $self->ItemList($prefs, $admin, $base, 'objectClass');
296             my $entry;
297             my $item = Wizard::SaveAble::LDAP->new('adminDN' => $admin->{'ldap-admin-dn'},
298             'adminPassword' => $admin->{'ldap-admin-password'},
299             'prefix' => 'NONE',
300             'serverip' => $prefs->{'ldap-prefs-serverip'},
301             'serverport' => $prefs->{'ldap-prefs-serverport'});
302            
303             foreach $entry ($mesg->entries) {
304             $item->DN($entry->dn());
305             $item->Delete();
306             }
307            
308             $net->Delete();
309             $self->OnChange('net');
310             $self->Action_Reset($wiz);
311             }
312              
313              
314              
315