aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ManaTools/Module/Hosts.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ManaTools/Module/Hosts.pm')
-rw-r--r--lib/ManaTools/Module/Hosts.pm530
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 &lt;matteo.pasotti\@gmail.com&gt;"
+ }
+ );
+ }elsif ($widget == $okButton) {
+ # write changes
+ $self->cfgHosts->_writeHosts();
+ last;
+ }
+ }
+ }
+
+ $self->dialog->destroy() ;
+
+ #restore old application title
+ yui::YUI::app()->setApplicationTitle($appTitle);
+}
+
+1;