File Coverage

blib/lib/Wizard/Examples/Apache/VirtualServer.pm
Criterion Covered Total %
statement 7 9 77.7
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 10 12 83.3


line stmt bran cond sub pod time code
1             # -*- perl -*-
2              
3 1     1   761 use strict;
  1         2  
  1         38  
4              
5 1     1   6 use Wizard::State ();
  1         2  
  1         16  
6 1     1   40 use Wizard::SaveAble ();
  0            
  0            
7             use Wizard::Examples::Apache ();
8             use Wizard::Examples::Apache::Host ();
9             use Wizard::Examples::Apache::Server ();
10             use Wizard::Examples::Apache::Directory ();
11             use Wizard::Examples::Apache::Config ();
12              
13              
14             package Wizard::Examples::Apache::VirtualServer;
15              
16             @Wizard::Examples::Apache::VirtualServer::ISA = qw(Wizard::Examples::Apache::Server);
17             $Wizard::Examples::Apache::VirtualServer::VERSION = '0.01';
18              
19             my $allModes = {'http' => 1, 'https' => 1, 'both' => 1};
20             my $isHttps = {'https' => 1, 'both' => 1};
21             my $isHttp = {'http' => 1, 'both' => 1};
22              
23             sub createDefault {
24             my $self = shift || die "Missing state";
25             my $name = shift || die "Missing server name";
26             my $defroot = shift || die "Missing default root directory";
27             my $sbasedir = shift || die "Missing basedir of server";
28             my $vs = bless({'apache-virtualserver-admin' => 'webmaster@' . $name,
29             'apache-virtualserver-enable-ep' => '',
30             'apache-virtualserver-options' => '',
31             'apache-virtualserver-isdefault' => 'yes',
32             'apache-virtualserver-interface' => '',
33             'apache-virtualserver-http-mode' => 'http',
34             'apache-virtualserver-http-port' => '80',
35             'apache-virtualserver-https-port' => '443',
36             'apache-virtualserver-http-version' => 'HTTP/1.1',
37             'apache-virtualserver-enable-pcgi' => '',
38             'apache-virtualserver-index' => '',
39             'apache-virtualserver-sslcrtfile' => '',
40             'apache-virtualserver-sslkeyfile' => '',
41             'apache-virtualserver-name' => $name,
42             'apache-virtualserver-enable-ssi' => '',
43             'apache-virtualserver-http_mode' => 'http',
44             'apache-virtualserver-http_port' => 80,
45             'apache-virtualserver-root' => File::Spec->catdir($defroot, $name),
46             }, 'Wizard::SaveAble' );
47             $self->{'virtualserver'} = $vs;
48             my $file = File::Spec->catfile($sbasedir, "$name.cfg");
49             my $dir = File::Spec->catdir($sbasedir, $name);
50             File::Path::mkpath([$dir],0, 0777);
51             die "Couldn't create directory $dir: $!" unless -d $dir;
52             $vs->CreateMe(1);
53             $vs->File($file);
54             $vs->Modified(1);
55             Wizard::Examples::Apache::Directory::createDefault($self, $dir);
56             }
57              
58             sub GetKey { 'virtualserver';};
59              
60             sub init {
61             my $self = shift;
62             return $self->SUPER::init(1) unless shift;
63             my $item = $self->{'virtualserver'} || die "Missing virtualserver";
64             ($self->SUPER::init(1), $item);
65             }
66              
67             sub _superFileDir {
68             Wizard::Examples::Apache::Host::getFileDir(shift, shift,
69             'Wizard::Examples::Apache::Server');
70             }
71              
72             sub ShowMe {
73             my($self, $wiz, $vs) = @_;
74             my $server = $self->{'server'} || die "Missing server";
75             my $defvsroot = $self->{'server'}->{'apache-server-vserver-root'} || die "Missing default root dir for virtual servers";
76             my $name = $vs->{'apache-virtualserver-name'}
77             or die "Missing virtual WWWserver name";
78             my $https = $isHttps->{$vs->{'apache-virtualserver-http-mode'}} || '';
79             my $http = $isHttp->{$vs->{'apache-virtualserver-http-mode'}} || '';
80              
81             my $http_only = $http && !$https;
82             my $domain = $name;
83             if($domain =~ /^([^\.]\.)*([^\.]\.[^\.])$/) {
84             $domain = $2;
85             }
86             my $vsroot = File::Spec->catfile($defvsroot, $name);
87             (['Wizard::Elem::Title',
88             'value' => $vs->CreateMe() ?
89             'Apache Wizard: Create a new virtual WWWserver' :
90             'Apache Wizard: Edit an existing virtual WWWserver'],
91             ['Wizard::Elem::Text',
92             'name' => 'apache-virtualserver-root',
93             'value' => $vs->{'apache-virtualserver-root'} || $vsroot,
94             'descr' => 'Virtual WWW server root directory'],
95             ['Wizard::Elem::Text', 'name' => 'apache-virtualserver-admin',
96             'value' => $vs->{'apache-virtualserver-admin'} || "webmaster\@$domain",
97             'descr' => 'Virtual WWW server admin'],
98             ['Wizard::Elem::Text', 'name' => 'apache-virtualserver-http-port',
99             'value' => $vs->{'apache-virtualserver-http-port'} || '',
100             'descr' => 'Virtual WWW server HTTP port (if left empty the HTTP port of the server will be assumed)'],
101             ($https ? ( ['Wizard::Elem::Text', 'name' => 'apache-virtualserver-https-port',
102             'value' => $vs->{'apache-virtualserver-https-port'} || '',
103             'descr' => 'Virtual WWW server HTTPS port (if left empty '
104             . ' the HTTPS port of the server will be assumed)'],
105             ['Wizard::Elem::Text', 'name' => 'apache-virtualserver-sslkeyfile',
106             'value' => $vs->{'apache-virtualserver-sslkeyfile'} ||
107             File::Spec->catfile($vsroot, "$name.key"),
108             'descr' => 'Private key file'],
109             ['Wizard::Elem::Text', 'name' => 'apache-virtualserver-sslcrtfile',
110             'value' => $vs->{'apache-virtualserver-sslcrtfile'} ||
111             File::Spec->catfile($vsroot, "$name.crt"),
112             'descr' => 'Certificate file']) : ()),
113             ($http_only ? (['Wizard::Elem::Select', 'name' => 'apache-virtualserver-http-version',
114             'options' => ['HTTP/1.0', 'HTTP/1.1'],
115             'value' => $vs->{'apache-virtualserver-http-version'} || 'HTTP/1.1',
116             'descr' => 'Virtual WWW server HTTP version']) : ()),
117             ['Wizard::Elem::Text', 'name' => 'apache-virtualserver-interface',
118             'value' => $vs->{'apache-virtualserver-interface'},
119             'descr' => 'Virtual WWW server interface number'],
120             ['Wizard::Elem::Text', 'name' => 'apache-virtualserver-index',
121             'value' => $vs->{'apache-virtualserver-index'},
122             'descr' => 'Virtual WWW server DirectoryIndex'],
123             ['Wizard::Elem::Text', 'name' => 'apache-virtualserver-options',
124             'value' => $vs->{'apache-virtualserver-options'},
125             'descr' => 'Virtual WWW server Options'],
126             ['Wizard::Elem::CheckBox', 'name' => 'apache-virtualserver-enable-pcgi',
127             'value' => $vs->{'apache-virtualserver-enable-pcgi'},
128             'descr' => 'Enable PCGI'],
129             ['Wizard::Elem::CheckBox', 'name' => 'apache-virtualserver-enable-ep',
130             'value' => $vs->{'apache-virtualserver-enable-ep'},
131             'descr' => 'Enable EP'],
132             ['Wizard::Elem::CheckBox', 'name' => 'apache-virtualserver-enable-ssi',
133             'value' => $vs->{'apache-virtualserver-enable-ssi'},
134             'descr' => 'Enable Server Side Includes'],
135             ['Wizard::Elem::Submit', 'name' => 'Action_VServerSave',
136             'value' => 'Save these settings', 'id' => 1],
137             ['Wizard::Elem::BR'],
138             ['Wizard::Elem::Submit', 'value' => 'Return to Virtual WWW server Menu',
139             'name' => 'Action_Reset',
140             'id' => 95],
141             ['Wizard::Elem::Submit', 'value' => 'Return to Server Menu',
142             'name' => 'Wizard::Examples::Apache::Server::Action_Reset',
143             'id' => 96],
144             ['Wizard::Elem::Submit', 'value' => 'Return to Host Menu',
145             'name' => 'Wizard::Examples::Apache::Host::Action_Reset',
146             'id' => 97],
147             ['Wizard::Elem::Submit', 'value' => 'Return to Top Menu',
148             'name' => 'Wizard::Examples::Apache::Action_Reset',
149             'id' => 98],
150             ['Wizard::Elem::Submit', 'value' => 'Exit Apache Wizard',
151             'id' => 99]);
152             }
153              
154             sub Action_Enter {
155             my($self, $wiz) = @_;
156             $self->SUPER::Load($wiz, 'Wizard::Examples::Apache::Server');
157             $self->Action_Reset($wiz);
158             }
159              
160             sub Action_Reset {
161             my($self, $wiz) = @_;
162             my($prefs, $basedir, $host, $server) = $self->init();
163              
164             delete $self->{'virtualserver'};
165             $self->Store($wiz);
166              
167             # Return the initial menu.
168             (['Wizard::Elem::Title', 'value' => 'Apache Wizard Virtual WWWserver Menu'],
169             ['Wizard::Elem::Submit', 'value' => 'Create a new virtual WWWserver',
170             'name' => 'Action_CreateVServer',
171             'id' => 1],
172             ['Wizard::Elem::Submit', 'value' => 'Modify an existing virtual WWWserver',
173             'name' => 'Action_ModifyVServer',
174             'id' => 2],
175             ['Wizard::Elem::Submit', 'value' => 'Directory Menu',
176             'name' => 'Action_DirectoryMenu',
177             'id' => 3],
178             ['Wizard::Elem::Submit', 'value' => 'Delete an existing virtual WWWserver',
179             'name' => 'Action_DeleteVServer',
180             'id' => 4],
181             ['Wizard::Elem::BR'],
182             ['Wizard::Elem::Submit', 'value' => 'Return to Server Menu',
183             'name' => 'Wizard::Examples::Apache::Server::Action_Reset',
184             'id' => 96],
185             ['Wizard::Elem::Submit', 'value' => 'Return to Host Menu',
186             'name' => 'Wizard::Examples::Apache::Host::Action_Reset',
187             'id' => 97],
188             ['Wizard::Elem::Submit', 'value' => 'Return to Top Menu',
189             'name' => 'Wizard::Examples::Apache::Action_Reset',
190             'id' => 98],
191             ['Wizard::Elem::Submit', 'value' => 'Exit Apache Wizard',
192             'id' => 99]);
193             }
194              
195             sub FirstParams {
196             my $self = shift; my $wiz = shift;
197             my $vs = shift;
198             my $button = shift || "Continue creation";
199             my $action = shift || "Action_FirstParamsVServer";
200              
201             (['Wizard::Elem::Title', 'value' => 'Virtual WWW server'],
202             ['Wizard::Elem::Text', 'name' => 'apache-virtualserver-name',
203             'value' => $vs->{'apache-virtualserver-name'},
204             'descr' => 'Virtual WWW server DNS name or IP address'],
205             ['Wizard::Elem::Select', 'name' => 'apache-virtualserver-http-mode',
206             'options' => ['http', 'https', 'both'],
207             'value' => $vs->{'apache-virtualserver-http-mode'},
208             'descr' => 'Choose a server type'],
209             ['Wizard::Elem::Submit', 'name' => $action, 'value' => $button,
210             'id' => 1],
211             ['Wizard::Elem::BR'],
212             ['Wizard::Elem::Submit', 'name' => 'Action_Reset',
213             'value' => 'Return to Virtual WWW Server menu ',
214             'id' => '95'],
215             ['Wizard::Elem::Submit', 'value' => 'Return to Server Menu',
216             'name' => 'Wizard::Examples::Apache::Server::Action_Reset',
217             'id' => 96],
218             ['Wizard::Elem::Submit', 'value' => 'Return to Host Menu',
219             'name' => 'Wizard::Examples::Apache::Host::Action_Reset',
220             'id' => 97],
221             ['Wizard::Elem::Submit', 'value' => 'Return to Top Menu',
222             'name' => 'Wizard::Examples::Apache::Action_Reset',
223             'id' => 98],
224             ['Wizard::Elem::Submit', 'value' => 'Exit Apache Wizard',
225             'id' => 99]);
226             }
227              
228             sub GetIfaces {
229             my $self = shift;
230             my ($prefs, $basedir, $host, $server) = $self->init();
231             my $hname = $host->{'apache-host-name'};
232             my ($fileo, $diro) = $self->getFileDir('', 'Wizard::Examples::Apache::Host');
233             my $tdir;
234              
235             my $fho = Symbol::gensym();
236             my $fh = Symbol::gensym();
237             my $maxkey=0;
238             my $ifaces = {};
239             opendir($fho, $diro) || die "Failed to open directory $diro: $!";
240             while($tdir=readdir($fho)) {
241             my $dir = File::Spec->catdir($diro, $tdir);
242             next unless (-d $dir) && ($dir !~ /^[\.]{1,2}$/);
243             opendir($fh, $dir) || die "Failed to open directory $dir: $!";
244             $ifaces = { %$ifaces,
245             map { if(/\.cfg$/) {
246             my $vs = do File::Spec->catfile($dir, $_);
247             $maxkey = $vs->{'apache-virtualserver-interface'}
248             if $vs->{'apache-virtualserver-interface'} > $maxkey;
249             (defined($vs->{'apache-virtualserver-interface'})) ?
250             ($vs->{'apache-virtualserver-interface'} => File::Spec->catfile($tdir,$vs->{'apache-virtualserver-name'}))
251             : ();
252             } else {
253             ();
254             }
255             } readdir($fh) };
256             closedir($fh);
257             }
258             closedir($fho);
259             $ifaces->{'_max'} = $maxkey;
260             return $ifaces;
261             }
262              
263             sub Action_CreateVServer {
264             my $self = shift;
265             $self->Action_CreateItem(@_, 1);
266             return $self->FirstParams(shift, $self->{'virtualserver'});
267             }
268              
269             sub AssignFirstParams {
270             my($self, $wiz, $vs) = @_;
271             my($prefs, $basedir, $host, $server) = $self->init();
272             my $errors = '';
273             my $old_name = $vs->{'apache-virtualserver-name'} || '';
274             my $name = $wiz->param('apache-virtualserver-name')
275             or ($errors .= "Missing virtual WWW server name.\n");
276             my $http_mode = $wiz->param('apache-virtualserver-http-mode')
277             or ($errors .= "Missing virtual WWW server http mode.\n");
278             $errors .= "Invalid http mode.\n" unless defined($allModes->{$http_mode});
279              
280             my $ifaces = $self->GetIfaces();
281             my $iface = $vs->{'apache-virtualserver-interface'};
282              
283             $vs->{'apache-virtualserver-name'} = $name;
284             $vs->{'apache-virtualserver-http-version'} = 'HTTP/1.0' if $isHttps->{$http_mode};
285             $vs->{'apache-virtualserver-http-mode'} = $http_mode;
286             if (($vs->{'apache-virtualserver-http-version'} eq 'HTTP/1.0') && ($iface !~ /^[\d]+$/)) {
287             $vs->{'apache-virtualserver-interface'} = $ifaces->{'_max'}+1 ;
288             }
289             my($file, $dir) =$self->getFileDir();
290              
291             $vs->{'_virtualserver_old_name'} = $old_name;
292              
293              
294             if ($name) {
295             $errors .= "Cannot resolve IP address or DNS name.\n"
296             unless Socket::inet_aton($name);
297             if($vs->CreateMe() or $name ne $old_name) {
298             $errors .= "A virtual server $name already exists: $file.\n" if -e $file;
299             $errors .= "A virtual server $name already exists: $dir.\n" if -e $dir;
300             }
301             }
302              
303             die $errors if $errors;
304             }
305              
306             sub Action_FirstParamsVServer {
307             my($self, $wiz) = @_;
308             my $vs = $self->{'virtualserver'};
309              
310             $self->AssignFirstParams($wiz, $vs);
311             $self->Store($wiz);
312             $self->ShowMe($wiz, $vs);
313             }
314              
315             sub Action_VServerSave {
316             my $self=shift; my $wiz = shift;
317             my($prefs, $basedir, $host, $server, $vs) = $self->init(1);
318            
319             my $name = $vs->{'apache-virtualserver-name'};
320             my $old_name = delete $vs->{'_virtualserver_old_name'} || '';
321              
322             foreach my $opt ($wiz->param()) {
323             $vs->{$opt} = $wiz->param($opt)
324             if (($opt =~ /^apache\-virtualserver/)
325             && (defined($wiz->param($opt))));
326             }
327            
328             # Verify the new settings
329             my $errors = '';
330             my $admin = $vs->{'apache-virtualserver-admin'}
331             or ($errors .= "Missing virtual WWW server admin.\n");
332             my $dohttps = $isHttps->{$vs->{'apache-virtualserver-http-mode'}} || '';
333             my $dohttp = $isHttp->{$vs->{'apache-virtualserver-http-mode'}} || '';
334             my $doiface = 0;
335             my $httpver;
336              
337             $httpver = (($vs->{'apache-virtualserver-http-version'} =~ /^HTTP\/1\.[\d]$/) ?
338             $vs->{'apache-virtualserver-http-version'} : '')
339             or ($errors .= "Invalid HTTP version.\n");
340              
341             $httpver = $vs->{'apache-virtualserver-http-version'} = 'HTTP/1.0' if $dohttps;
342             $doiface = 1 if $httpver eq 'HTTP/1.0';
343              
344             my $vsroot = $vs->{'apache-virtualserver-root'}
345             or ($errors .= "Missing virtual WWW server root dir.\n");
346             if($dohttps) {
347             my $sslkey = $vs->{'apache-virtualserver-sslkeyfile'}
348             or ($errors .= "Missing SSL key file.\n");
349             my $sslcrt = $vs->{'apache-virtualserver-sslcrtfile'}
350             or ($errors .= "Missing SSL certificate file.\n");
351             }
352             my $sname = $server->{'apache-server-name'};
353             if($doiface) {
354             my $ifaces = $self->GetIfaces();
355             my $iface = $vs->{'apache-virtualserver-interface'};
356             if($iface =~ /^[\d]+$/) {
357             $errors .= "Interface already in use by " . $ifaces->{$iface} . ".\n"
358             if (defined($ifaces->{$iface})) && ($ifaces->{$iface} ne $sname . '/' . $old_name);
359             } else {
360             $errors .= "Missing interface number.\n";
361             }
362             } else {
363             $vs->{'apache-virtualserver-interface'} = '';
364             }
365             die $errors if $errors;
366              
367             my($file, $dir, $odir) = $self->getFileDir();
368            
369             if(!$vs->CreateMe() and $name ne $old_name) {
370             my $old_file = File::Spec->catfile($odir, "$old_name.cfg");
371             my $old_dir = File::Spec->catdir($odir, $old_name);
372             rename($old_file, $file)
373             or die "Failed to rename $old_file to $file: $!";
374             rename($old_dir, $dir)
375             or die "Failed to rename $old_dir to $dir: $!";
376             }
377             $vs->File($file);
378             if($vs->CreateMe()) {
379             File::Path::mkpath([$dir], 0, 0777);
380             die "Couldn't create directory $dir: $!" unless -d $dir;
381             Wizard::Examples::Apache::Directory::createDefault($self, $dir);
382             }
383             $vs->Modified(1);
384             $self->Store($wiz, 1);
385             $self->Action_Reset($wiz);
386             }
387              
388              
389             sub Action_ModifyVServer {
390             my $self = shift;
391             $self->Action_ModifyItem(shift, shift || 'Modify virtual server',
392             shift || 'Action_EditVServer', 'Virtual WWW server');
393             }
394              
395             sub Action_EditVServer {
396             my $self = shift; my $wiz = shift;
397             $self->Load($wiz);
398             $self->FirstParams($wiz, $self->{'virtualserver'}, "Continue editing");
399             }
400              
401             sub Action_DeleteVServer {
402             shift->Action_ModifyVServer(shift, 'Delete this virtual server',
403             'Action_DeleteVServer2');
404             }
405              
406             sub Action_DirectoryMenu {
407             shift->Action_ModifyVServer(shift, 'Manage directory configurations on this virtual server',
408             'Wizard::Examples::Apache::Directory::Action_Enter');
409             }
410              
411              
412             sub Action_DeleteVServer2 {
413             my $self = shift; my $wiz = shift;
414             my($prefs, $basedir, $host, $server) = $self->init();
415             my $hname = $host->{'apache-host-name'};
416             my $sname = $server->{'apache-server-name'};
417             my $name = $wiz->param('apache-virtualserver') || die "Missing virtual WWW server name";
418             my $file = File::Spec->catfile($basedir, $hname, $sname, "$name.cfg");
419             my $dir = File::Spec->catdir($basedir, $hname, $sname, $name);
420             my $vserver = Wizard::SaveAble->new($file);
421              
422             if ($vserver->{'apache-virtualserver-isdefault'}) {
423             return (['Wizard::Elem::Data', 'descr' => 'ERROR: ',
424             'value' => 'Default virtual server can not be deleted'],
425             $self->Action_Reset($wiz));
426             }
427              
428             $self->{'virtualserver'}=$vserver;
429             $self->Store($wiz);
430             my $https = $isHttps->{$vserver->{'apache-virtualserver-http_mode'}} || '';
431              
432             (['Wizard::Elem::Title', 'value' => 'Deleting an Apache server'],
433             ['Wizard::Elem::Data', 'descr' => 'Virtual WWW server name',
434             'value' => $vserver->{'apache-virtualserver-name'}],
435             ['Wizard::Elem::Data', 'descr' => 'Virtual WWW server root',
436             'value' => $vserver->{'apache-virtualserver-root'}],
437             ['Wizard::Elem::Data', 'descr' => 'Virtual WWW server admin',
438             'value' => $vserver->{'apache-virtualserver-admin'}],
439             ['Wizard::Elem::Data', 'descr' => 'Virtual WWW server HTTP port',
440             'value' => $vserver->{'apache-virtualserver-http-port'}],
441             ($https ? (['Wizard::Elem::Data', 'descr' => 'Virtual WWW server HTTPS port',
442             'value' => $vserver->{'apache-virtualserver-https-port'}],
443             ['Wizard::Elem::Data', 'descr' => 'Virtual WWW Server key file',
444             'value' => $vserver->{'apache-virtualserver-sslkeyfile'}],
445             ['Wizard::Elem::Data', 'descr' => 'Virtual WWW Server certificate file',
446             'value' => $vserver->{'apache-virtualserver-sslcrtfile'}]) : ()),
447             ['Wizard::Elem::Submit', 'value' => 'Yes, delete it',
448             'id' => 1, 'name' => 'Action_DeleteVServer3'],
449             (-d $dir ? ['Wizard::Elem::Submit',
450             'value' => 'Yes, delete it, including data directory',
451             'id' => 2, 'name' => 'Action_DeleteVServer4'] : ()),
452             ['Wizard::Elem::BR'],
453             ['Wizard::Elem::Submit', 'value' => 'Return to Server Menu',
454             'name' => 'Wizard::Examples::Apache::Server::Action_Reset',
455             'id' => 96],
456             ['Wizard::Elem::Submit', 'value' => 'Return to Host Menu',
457             'name' => 'Wizard::Examples::Apache::Host::Action_Reset',
458             'id' => 97],
459             ['Wizard::Elem::Submit', 'value' => 'Return to Top Menu',
460             'name' => 'Wizard::Examples::Apache::Action_Reset',
461             'id' => 98],
462             ['Wizard::Elem::Submit', 'value' => 'Exit Apache Wizard',
463             'id' => 99]);
464             }
465              
466              
467             sub Action_DeleteVServer3 {
468             my($self, $wiz) = @_;
469             $self->DeleteItem($wiz);
470             $self->Action_Reset($wiz);
471             }
472              
473             sub Action_DeleteVServer4 {
474             my($self, $wiz) = @_;
475             $self->DeleteItem($wiz,1);
476             $self->Action_Reset($wiz);
477             }