diff options
Diffstat (limited to 'lib/ManaTools/Module/Hosts.pm')
-rw-r--r-- | lib/ManaTools/Module/Hosts.pm | 530 |
1 files changed, 530 insertions, 0 deletions
diff --git a/lib/ManaTools/Module/Hosts.pm b/lib/ManaTools/Module/Hosts.pm new file mode 100644 index 0000000..faae3f0 --- /dev/null +++ b/lib/ManaTools/Module/Hosts.pm @@ -0,0 +1,530 @@ +# vim: set et ts=4 sw=4: +#***************************************************************************** +# +# Copyright (c) 2013-2015 Matteo Pasotti <matteo.pasotti@gmail.com> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2, as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +#***************************************************************************** + +package ManaTools::Module::Hosts; + +use Modern::Perl '2011'; +use autodie; +use Moose; +use POSIX qw(ceil); +use utf8; + +use Glib; +use yui; +use ManaTools::Shared qw(trim); +use ManaTools::Shared::GUI; +use ManaTools::Shared::Hosts; + +extends qw( ManaTools::Module ); + + +has '+icon' => ( + default => "/usr/lib/libDrakX/icons/IC-Dhost-48.png" +); + +has '+name' => ( + default => "Hostmanager", +); + +=head1 VERSION + +Version 1.0.0 + +=cut + +our $VERSION = '1.0.0'; + +has 'dialog' => ( + is => 'rw', + init_arg => undef +); + +has 'table' => ( + is => 'rw', + init_arg => undef +); + +has 'cfgHosts' => ( + is => 'rw', + init_arg => undef +); + +has 'sh_gui' => ( + is => 'rw', + init_arg => undef, + builder => '_SharedUGUIInitialize' +); + +has 'loc' => ( + is => 'rw', + init_arg => undef, + builder => '_localeInitialize' +); + +sub _localeInitialize { + my $self = shift(); + + # TODO fix domain binding for translation + $self->loc(ManaTools::Shared::Locales->new(domain_name => 'drakx-net') ); + # TODO if we want to give the opportunity to test locally add dir_name => 'path' +} + +sub _SharedUGUIInitialize { + my $self = shift(); + + $self->sh_gui(ManaTools::Shared::GUI->new() ); +} + +#============================================================= + +=head2 start + +=head3 INPUT + + $self: this object + +=head3 DESCRIPTION + + This method extends Module::start and is invoked to + start host manager + +=cut + +#============================================================= +sub start { + my $self = shift; + + $self->_manageHostsDialog(); +}; + +#============================================================= + +=head2 _changeHostNameDialog + +=head3 INPUT + + $self: this object + + $headerString: a title for the dialog + +=head3 DESCRIPTION + + This method display a dialog allowing the user + to change the hostname + +=cut + +#============================================================= +sub _changeHostNameDialog { + my $self = shift; + + my $headerString = shift(); + + my $factory = yui::YUI::widgetFactory; + my $dlg = $factory->createPopupDialog(); + my $layout = $factory->createVBox($dlg); + + my $hbox_header = $factory->createHBox($layout); + my $vbox_content = $factory->createVBox($layout); + my $hbox_footer = $factory->createHBox($layout); + + # header + my $labelDescription = $factory->createLabel($hbox_header,$headerString); + + # content + my $firstHbox = $factory->createHBox($vbox_content); + my $secondHbox = $factory->createHBox($vbox_content); + my $thirdHbox = $factory->createHBox($vbox_content); + my $fourthHbox = $factory->createHBox($vbox_content); + my $fifthHbox = $factory->createHBox($vbox_content); + my $sixthHbox = $factory->createHBox($vbox_content); + + my $labelHostName = $factory->createLabel($secondHbox,$self->loc->N("Hostname")); + $labelHostName->setWeight($yui::YD_HORIZ, 10); + my $textHostName = $factory->createInputField($secondHbox,""); + $textHostName->setWeight($yui::YD_HORIZ, 30); + + my $labelPrettyHostName = $factory->createLabel($thirdHbox,$self->loc->N("Pretty Hostname")); + $labelPrettyHostName->setWeight($yui::YD_HORIZ, 10); + my $textPrettyHostName = $factory->createInputField($thirdHbox,""); + $textPrettyHostName->setWeight($yui::YD_HORIZ, 30); + + my $labelStaticHostName = $factory->createLabel($fourthHbox,$self->loc->N("Static Hostname")); + $labelStaticHostName->setWeight($yui::YD_HORIZ, 10); + my $textStaticHostName = $factory->createInputField($fourthHbox,""); + $textStaticHostName->setWeight($yui::YD_HORIZ, 30); + + my $labelChassis = $factory->createLabel($fifthHbox,$self->loc->N("Chassis")); + $labelChassis->setWeight($yui::YD_HORIZ, 10); + my $textChassis = $factory->createInputField($fifthHbox,""); + $textChassis->setWeight($yui::YD_HORIZ, 30); + + my $labelIconName = $factory->createLabel($sixthHbox,$self->loc->N("Icon Name")); + $labelIconName->setWeight($yui::YD_HORIZ, 10); + my $textIconName = $factory->createInputField($sixthHbox,""); + $textIconName->setWeight($yui::YD_HORIZ, 30); + + $textHostName->setValue($self->cfgHosts->_getLocalHostName()); + $textPrettyHostName->setValue($self->cfgHosts->_getLocalPrettyHostName()); + $textStaticHostName->setValue($self->cfgHosts->_getLocalStaticHostName()); + $textChassis->setValue($self->cfgHosts->_getLocalChassis()); + $textIconName->setValue($self->cfgHosts->_getLocalIconName()); + + # footer + my $cancelButton = $factory->createPushButton($factory->createLeft($hbox_footer),$self->loc->N("&Cancel")); + my $okButton = $factory->createPushButton($factory->createRight($hbox_footer),$self->loc->N("&OK")); + + while(1){ + my $event = $dlg->waitForEvent(); + my $eventType = $event->eventType(); + + #event type checking + if ($eventType == $yui::YEvent::CancelEvent) { + last; + } + elsif ($eventType == $yui::YEvent::WidgetEvent) { + # widget selected + my $widget = $event->widget(); + if ($widget == $cancelButton) { + last; + } + elsif($widget == $okButton) { + $self->cfgHosts->_setLocalHostName($textHostName->value()); + $self->cfgHosts->_setLocalPrettyHostName($textPrettyHostName->value()); + $self->cfgHosts->_setLocalStaticHostName($textStaticHostName->value()); + $self->cfgHosts->_setLocalChassis($textChassis->value()); + $self->cfgHosts->_setLocalIconName($textIconName->value()); + last; + } + } + } + + destroy $dlg; +} + +sub _manipulateHostDialog { + my $self = shift; + + my $headerString = shift(); + my $boolEdit = shift(); + + my $hostIpString = ""; + my $hostNameString = ""; + my $hostAliasesString = ""; + + if($boolEdit == 1){ + $hostIpString = shift(); + $hostNameString = shift(); + $hostAliasesString = shift(); + } + + my $factory = yui::YUI::widgetFactory; + my $dlg = $factory->createPopupDialog(); + my $layout = $factory->createVBox($dlg); + + my $hbox_header = $factory->createHBox($layout); + my $vbox_content = $factory->createVBox($layout); + my $hbox_footer = $factory->createHBox($layout); + + # header + my $labelDescription = $factory->createLabel($hbox_header,$headerString); + + # content + my $firstHbox = $factory->createHBox($vbox_content); + my $secondHbox = $factory->createHBox($vbox_content); + my $thirdHbox = $factory->createHBox($vbox_content); + + my $labelIPAddress = $factory->createLabel($firstHbox,$self->loc->N("IP Address")); + my $labelHostName = $factory->createLabel($secondHbox,$self->loc->N("Hostname")); + my $labelHostAlias = $factory->createLabel($thirdHbox,$self->loc->N("Host aliases")); + $labelIPAddress->setWeight($yui::YD_HORIZ, 10); + $labelHostName->setWeight($yui::YD_HORIZ, 10); + $labelHostAlias->setWeight($yui::YD_HORIZ, 10); + + my $textIPAddress = $factory->createInputField($firstHbox,""); + my $textHostName = $factory->createInputField($secondHbox,""); + my $textHostAlias = $factory->createInputField($thirdHbox,""); + $textIPAddress->setWeight($yui::YD_HORIZ, 30); + $textHostName->setWeight($yui::YD_HORIZ, 30); + $textHostAlias->setWeight($yui::YD_HORIZ, 30); + + if($boolEdit == 1){ + $textIPAddress->setValue($hostIpString); + $textHostName->setValue($hostNameString); + $textHostAlias->setValue($hostAliasesString); + } + + # footer + my $cancelButton = $factory->createPushButton($factory->createLeft($hbox_footer),$self->loc->N("&Cancel")); + my $okButton = $factory->createPushButton($factory->createRight($hbox_footer),$self->loc->N("&OK")); + + while(1){ + my $event = $dlg->waitForEvent(); + my $eventType = $event->eventType(); + + #event type checking + if ($eventType == $yui::YEvent::CancelEvent) { + last; + } + elsif ($eventType == $yui::YEvent::WidgetEvent) { + # widget selected + my $widget = $event->widget(); + if ($widget == $cancelButton) { + last; + } + elsif($widget == $okButton) { + my $res = undef; + my @hosts_toadd; + push @hosts_toadd, $textHostName->value(); + if(ManaTools::Shared::trim($textHostAlias->value()) ne ""){ + push @hosts_toadd, $textHostAlias->value(); + } + if($boolEdit == 0){ + $res = $self->cfgHosts->_insertHost($textIPAddress->value(),[@hosts_toadd]); + }else{ + $res = $self->cfgHosts->_modifyHost($textIPAddress->value(),[@hosts_toadd]); + } + $res = $self->cfgHosts->_writeHosts(); + last; + } + } + } + + destroy $dlg; +} + +#============================================================= + +=head2 _addHostDialog + +=head3 INPUT + + $self: this object + +=head3 DESCRIPTION + +This subroutine creates the Host dialog to add host definitions + +=cut + +#============================================================= + +sub _addHostDialog { + my $self = shift(); + return $self->_manipulateHostDialog($self->loc->N("Add the information"),0); +} + +#============================================================= + +=head2 _edtHostDialog + +=head3 INPUT + +=over 4 + +=item $self: this object + +=item B<$hostIp> : the ip of the host entry that we want to modify + +=item B<$hostName> : the name of the host entry we want to modify + +=item B<$hostAliases> : aliases of the host entry we want to modify + +=back + +=head3 DESCRIPTION + +This subroutine creates the Host dialog to modify host definitions + +=cut + +#============================================================= + +sub _edtHostDialog { + my $self = shift(); + my $hostIp = shift(); + my $hostName = shift(); + my $hostAliases = shift(); + return $self->_manipulateHostDialog($self->loc->N("Modify the information"),1,$hostIp,$hostName,$hostAliases); +} + +#============================================================= + +=head2 setupTable + +=head3 INPUT + + $self: this object + + $data: reference to the array containaing the host data to show into the table + +=head3 DESCRIPTION + +This subroutine populates a previously created YTable with the hosts data +retrieved by the Config::Hosts module + +=cut + +#============================================================= +sub setupTable { + my $self = shift(); + + my @hosts = $self->cfgHosts->_getHosts(); + # clear table + $self->table->deleteAllItems(); + foreach my $host (@hosts){ + my $tblItem; + my $aliases = join(',',@{$host->{'hosts'}}); + if(scalar(@{$host->{'hosts'}}) > 1){ + $aliases =~s/^$host->{'hosts'}[0]\,*//g; + }elsif(scalar(@{$host->{'hosts'}}) == 1){ + $aliases = ""; + } + $tblItem = new yui::YTableItem($host->{'ip'},$host->{'hosts'}[0],$aliases); + $self->table->addItem($tblItem); + } +} + +sub _manageHostsDialog { + my $self = shift; + + ## TODO fix for manatools + my $appTitle = yui::YUI::app()->applicationTitle(); + my $appIcon = yui::YUI::app()->applicationIcon(); + ## set new title to get it in dialog + my $newTitle = $self->loc->N("Manage hosts definitions"); + yui::YUI::app()->setApplicationTitle($newTitle); + + my $factory = yui::YUI::widgetFactory; + my $optional = yui::YUI::optionalWidgetFactory; + + + $self->dialog($factory->createMainDialog()); + my $layout = $factory->createVBox($self->dialog); + + my $hbox_header = $factory->createHBox($layout); + my $headLeft = $factory->createHBox($factory->createLeft($hbox_header)); + my $headRight = $factory->createHBox($factory->createRight($hbox_header)); + + my $logoImage = $factory->createImage($headLeft, $appIcon); + my $labelAppDescription = $factory->createLabel($headRight,$newTitle); + $logoImage->setWeight($yui::YD_HORIZ,0); + $labelAppDescription->setWeight($yui::YD_HORIZ,3); + + my $hbox_content = $factory->createHBox($layout); + + my $tableHeader = new yui::YTableHeader(); + $tableHeader->addColumn($self->loc->N("IP Address")); + $tableHeader->addColumn($self->loc->N("Hostname")); + $tableHeader->addColumn($self->loc->N("Host Aliases")); + my $leftContent = $factory->createLeft($hbox_content); + $leftContent->setWeight($yui::YD_HORIZ,45); + $self->table($factory->createTable($leftContent,$tableHeader)); + + # initialize Config::Hosts + $self->cfgHosts(ManaTools::Shared::Hosts->new()); + $self->setupTable(); + + my $rightContent = $factory->createRight($hbox_content); + $rightContent->setWeight($yui::YD_HORIZ,10); + my $topContent = $factory->createTop($rightContent); + my $vbox_commands = $factory->createVBox($topContent); + my $addButton = $factory->createPushButton($factory->createHBox($vbox_commands),$self->loc->N("A&dd")); + my $edtButton = $factory->createPushButton($factory->createHBox($vbox_commands),$self->loc->N("&Edit")); + my $remButton = $factory->createPushButton($factory->createHBox($vbox_commands),$self->loc->N("&Remove")); + my $hnButton = $factory->createPushButton($factory->createHBox($vbox_commands),$self->loc->N("&Hostname")); + $addButton->setWeight($yui::YD_HORIZ,1); + $edtButton->setWeight($yui::YD_HORIZ,1); + $remButton->setWeight($yui::YD_HORIZ,1); + $hnButton->setWeight($yui::YD_HORIZ,1); + + my $hbox_foot = $factory->createHBox($layout); + my $vbox_foot_left = $factory->createVBox($factory->createLeft($hbox_foot)); + my $vbox_foot_right = $factory->createVBox($factory->createRight($hbox_foot)); + my $aboutButton = $factory->createPushButton($vbox_foot_left,$self->loc->N("&About")); + my $cancelButton = $factory->createPushButton($vbox_foot_right,$self->loc->N("&Cancel")); + my $okButton = $factory->createPushButton($vbox_foot_right,$self->loc->N("&OK")); + + # main loop + while(1) { + my $event = $self->dialog->waitForEvent(); + my $eventType = $event->eventType(); + + #event type checking + if ($eventType == $yui::YEvent::CancelEvent) { + last; + } + elsif ($eventType == $yui::YEvent::WidgetEvent) { +### Buttons and widgets ### + my $widget = $event->widget(); + if ($widget == $cancelButton) { + last; + } + elsif ($widget == $addButton) { + $self->_addHostDialog(); + $self->setupTable(); + } + elsif ($widget == $edtButton) { + my $tblItem = yui::toYTableItem($self->table->selectedItem()); + if($tblItem->cellCount() >= 3){ + $self->_edtHostDialog($tblItem->cell(0)->label(),$tblItem->cell(1)->label(),$tblItem->cell(2)->label()); + }else{ + $self->_edtHostDialog($tblItem->cell(0)->label(),$tblItem->cell(1)->label(),""); + } + $self->setupTable(); + } + elsif ($widget == $remButton) { + # implement deletion dialog + if($self->sh_gui->ask_YesOrNo({title => $self->loc->N("Confirmation"), text => $self->loc->N("Are you sure to drop this host?")}) == 1){ + my $tblItem = yui::toYTableItem($self->table->selectedItem()); + # drop the host using the ip + $self->cfgHosts->_dropHost($tblItem->cell(0)->label()); + # write changes + $self->cfgHosts->_writeHosts(); + $self->setupTable(); + } + }elsif ($widget == $hnButton) { + $self->_changeHostNameDialog("Change the HostName FQDN"); + $self->setupTable(); + }elsif ($widget == $aboutButton) { + $self->sh_gui->AboutDialog({ + name => $appTitle, + version => $VERSION, + credits => "Copyright (c) 2013-2015 by Matteo Pasotti", + license => "GPLv2", + description => $self->loc->N("Graphical manager for hosts definitions"), + authors => "Matteo Pasotti <matteo.pasotti\@gmail.com>" + } + ); + }elsif ($widget == $okButton) { + # write changes + $self->cfgHosts->_writeHosts(); + last; + } + } + } + + $self->dialog->destroy() ; + + #restore old application title + yui::YUI::app()->setApplicationTitle($appTitle); +} + +1; |