aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ManaTools/Shared/Hosts.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ManaTools/Shared/Hosts.pm')
-rw-r--r--lib/ManaTools/Shared/Hosts.pm216
1 files changed, 216 insertions, 0 deletions
diff --git a/lib/ManaTools/Shared/Hosts.pm b/lib/ManaTools/Shared/Hosts.pm
new file mode 100644
index 0000000..d3b7fc9
--- /dev/null
+++ b/lib/ManaTools/Shared/Hosts.pm
@@ -0,0 +1,216 @@
+# 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::Shared::Hosts;
+
+use Moose;
+use diagnostics;
+use Config::Hosts;
+use Net::DBus;
+use utf8;
+
+# costants by Config::Hosts
+my $is_ip = 1;
+my $is_host = -1;
+my $is_none = 0;
+
+has 'configHosts' => (
+ is => 'rw',
+ init_arg => undef,
+ builder => '_initialize'
+);
+
+has 'dbusConnectionParams' => (
+ is => 'ro',
+ isa => 'HashRef',
+ builder => '_initDBusConnectionParams',
+);
+
+sub _initialize {
+ my $self = shift();
+ $self->configHosts(Config::Hosts->new());
+}
+
+sub _initDBusConnectionParams {
+ my $self = shift();
+ my %dbusConnParams = ( 'servicePath' => 'org.freedesktop.hostname1', 'objectPath' => '/org/freedesktop/hostname1' );
+ return \%dbusConnParams;
+}
+
+=pod
+
+=head2 _getHosts
+
+=head3 OUTPUT
+
+ @result: array of hashes; each one of them represent a host definition from the hosts configuration file
+
+ NOTE: the 'hosts' item into each hash is an array: it contains the hostname and -eventually- the aliases
+
+=head3 DESCRIPTION
+
+retrieve data from the hosts file (/etc/hosts) using the Config::Hosts module
+
+=cut
+
+sub _getHosts {
+ my $self = shift();
+ # $self->configHosts(Config::Hosts->new());
+ my $hosts = $self->configHosts->read_hosts();
+ my @result = ();
+ while( my ($key, $value) = each(%{$hosts})){
+ if($self->configHosts->determine_ip_or_host($key) == $is_ip){
+ my $tmp = {};
+ $tmp = $self->configHosts->query_host($key);
+ $tmp->{'ip'} = $key;
+ push @result,$tmp;
+ }
+ }
+ return @result;
+}
+
+sub _insertHost {
+ my $self = shift();
+ # remember that the order matters!
+ my $ip = shift();
+ my @host_definitions = @_;
+ # $self->configHosts = Config::Hosts->new();
+ return $self->configHosts->insert_host(ip => $ip, hosts => @host_definitions);
+}
+
+sub _dropHost {
+ my $self = shift();
+ my $host_ip = shift();
+ return $self->configHosts->delete_host($host_ip);
+}
+
+sub _modifyHost {
+ my $self = shift();
+ my $host_ip = shift();
+ my @host_definitions = @_;
+ return $self->configHosts->update_host($host_ip, hosts => @host_definitions);
+}
+
+sub _writeHosts {
+ my $self = shift();
+ return $self->configHosts->write_hosts();
+}
+
+sub _dbus_connection {
+ my $self = shift();
+ my %params = %{$self->dbusConnectionParams()};
+ my $bus = Net::DBus->system;
+ my $service = $bus->get_service($params{'servicePath'});
+ my $object = $service->get_object($params{'objectPath'});
+ return $object;
+}
+
+sub _dbus_inquiry {
+ my $self = shift();
+ my $required_field = shift();
+ my $object = $self->_dbus_connection();
+ my %params = %{$self->dbusConnectionParams()};
+ my $properties = $object->GetAll($params{'servicePath'});
+ return $properties->{$required_field} if(defined($properties->{$required_field}));
+ return 0;
+}
+
+sub _dbus_setup {
+ my $self = shift();
+ my $attribute = shift();
+ my $value = shift();
+ my $object = $self->_dbus_connection();
+ if($attribute eq "Hostname")
+ {
+ $object->SetHostname($value,1);
+ }
+ elsif($attribute eq "PrettyHostname")
+ {
+ $object->SetPrettyHostname($value,1);
+ }
+ elsif($attribute eq "StaticHostname")
+ {
+ $object->SetStaticHostname($value,1);
+ }
+ elsif($attribute eq "Chassis")
+ {
+ $object->SetChassis($value,1);
+ }
+ elsif($attribute eq "IconName")
+ {
+ $object->SetIconName($value,1);
+ }
+}
+
+sub _getLocalHostName {
+ my $self = shift();
+ return $self->_dbus_inquiry('Hostname');
+}
+
+sub _getLocalPrettyHostName {
+ my $self = shift();
+ return $self->_dbus_inquiry('PrettyHostname');
+}
+
+sub _getLocalStaticHostName {
+ my $self = shift();
+ return $self->_dbus_inquiry('StaticHostname');
+}
+
+sub _getLocalChassis {
+ my $self = shift();
+ return $self->_dbus_inquiry('Chassis');
+}
+
+sub _getLocalIconName {
+ my $self = shift();
+ return $self->_dbus_inquiry('IconName');
+}
+
+sub _setLocalHostName {
+ my $self = shift();
+ my $hostname = shift();
+ $self->_dbus_setup('Hostname',$hostname);
+}
+
+sub _setLocalPrettyHostName {
+ my $self = shift();
+ my $value = shift();
+ $self->_dbus_setup('PrettyHostname',$value);
+}
+
+sub _setLocalStaticHostName {
+ my $self = shift();
+ my $value = shift();
+ $self->_dbus_setup('StaticHostname',$value);
+}
+
+sub _setLocalIconName {
+ my $self = shift();
+ my $value = shift();
+ $self->_dbus_setup('IconName',$value);
+}
+
+sub _setLocalChassis {
+ my $self = shift();
+ my $value = shift();
+ $self->_dbus_setup('Chassis',$value);
+}
+
+1;