summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bin/drakhosts271
1 files changed, 271 insertions, 0 deletions
diff --git a/bin/drakhosts b/bin/drakhosts
new file mode 100644
index 0000000..32c6fd1
--- /dev/null
+++ b/bin/drakhosts
@@ -0,0 +1,271 @@
+#!/usr/bin/perl
+#
+# Copyright (C) 2005 by Mandriva aginies _ateuh_ mandriva.com
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# 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.
+
+my $version = "0.1";
+
+# i18n: IMPORTANT: to get correct namespace (drakhosts instead of libDrakX)
+BEGIN { unshift @::textdomains, 'drakhosts' }
+
+use lib qw(/usr/lib/libDrakX);
+use standalone;
+use strict;
+use common;
+use network::network;
+
+use ugtk2 qw(:ask :wrappers :create :dialogs);
+
+use constant FALSE => 0;
+
+
+my $HOSTS = "/etc/hosts";
+my @listhosts;
+
+use constant COLUMN_IP => 0;
+use constant COLUMN_HOSTNAME => 1;
+use constant COLUMN_ALIAS => 2;
+use constant NUM_COLUMNS => 3;
+
+require_root_capability();
+
+my %size_groups = map { $_ => Gtk2::SizeGroup->new('horizontal') } qw(label widget);
+my $label_and_widgets = sub {
+ my ($label, $widget) = @_;
+ gtkpack_(Gtk2::HBox->new(0,5),
+ 0, gtkadd_widget($size_groups{label}, $label),
+ 1, gtkadd_widget($size_groups{widget}, $widget),
+ );
+};
+
+
+sub get_host_data() {
+# 127.0.0.1 localhost.localdomain localhost
+# 10.0.1.253 guibpiv.guibland.com
+ foreach (cat_($HOSTS)) {
+ my ($ip, $name, $alias) = /^(\d\S*)\s+(\S*)\s+(.*)$/;
+ $ip and push @listhosts, {
+ ip => $ip,
+ hostname => $name,
+ alias => $alias,
+ };
+ }
+}
+
+sub write_conf_hosts() {
+ output($HOSTS, "# generated by drakhosts\n");
+ foreach my $a (@listhosts) {
+ append_to_file($HOSTS, "$a->{ip} $a->{hostname} $a->{alias}\n");
+ }
+}
+
+sub add_modify_entry {
+ my ($treeview, $wanted) = @_;
+ my $model = $treeview->get_model;
+ my $selection = $treeview->get_selection;
+ my $iter;
+ my ($i, $ip, $hostname, $alias, $oldip);
+ undef $i;
+ undef $iter;
+
+ $_ = Gtk2::Entry->new foreach $ip, $hostname, $alias;
+
+# test if modify or add a host
+
+ my $dialog = _create_dialog();
+ $dialog->set_transient_for($::main_window);
+ $dialog->set_title("Drakhosts $wanted entry");
+ $dialog->set_modal(1);
+ $dialog->set_resizable(1);
+ $dialog->set_size_request(300, -1);
+
+ if ($wanted =~ /modify/) {
+ $iter = $selection->get_selected;
+ $iter or info_dialog(N("Error"), N("Please add an host to be able to modify it.")) and return;
+ my $path = $model->get_path($iter);
+ $i = ($path->get_indices)[0];
+ $ip->set_text($listhosts[$i]{ip});
+ $hostname->set_text($listhosts[$i]{hostname});
+ $alias->set_text($listhosts[$i]{alias});
+ $oldip = $listhosts[$i]{ip};
+ }
+
+ my $text;
+ $text = N("Please modify information") if $wanted =~ /modify/;
+ $text = N("Please delete information") if $wanted =~ /delete/;
+ $text = N("Please add information") if $wanted =~ /add/;
+
+ gtkpack_($dialog->vbox,
+ 0, gtkadd(Gtk2::Frame->new($text),
+ gtkpack_(gtkset_border_width(Gtk2::VBox->new, 5),
+ 0, $label_and_widgets->(N("IP address:"), $ip),
+ 0, $label_and_widgets->(N("Host name:"), $hostname),
+ 0, $label_and_widgets->(N("Host Aliases:"), $alias),
+ ),
+ ),
+ 0, create_okcancel({
+ cancel_clicked => sub { $dialog->destroy },
+ ok_clicked => sub {
+ is_ip($ip->get_text) or err_dialog(N("Error!"), N("Please enter a valid IP address.")) and return;
+ my $testip = chomp_($ip->get_text);
+ my $toldip = chomp_($oldip);
+ if ($testip !~ /$toldip/ || $wanted =~ /add/) {
+ foreach my $a (@listhosts) {
+ if ($a->{ip} =~ /$testip/) {
+ err_dialog(N("Error!"), N("Same IP is already in %s file.", $HOSTS)) and return;
+ }
+ }
+ }
+ if ($wanted =~ /add/) {
+ $iter = $model->append;
+ $i = "-1";
+ push @listhosts, {
+ ip => $ip->get_text,
+ hostname => $hostname->get_text,
+ alias => $alias->get_text,
+ };
+ }
+ $listhosts[$i]{hostname} = $hostname->get_text;
+ $listhosts[$i]{alias} = $alias->get_text;
+ $listhosts[$i]{ip} = $ip->get_text;
+ $model->set($iter,
+ COLUMN_IP, $listhosts[$i]{ip},
+ COLUMN_HOSTNAME, $listhosts[$i]{hostname},
+ COLUMN_ALIAS, $listhosts[$i]{alias},
+ );
+ $dialog->destroy;
+# write_conf_hosts();
+ },
+ },
+ ),
+ );
+ $dialog->show_all;
+}
+
+sub remove_entry {
+ my ($treeview) = @_;
+ my $model = $treeview->get_model;
+ my $selection = $treeview->get_selection;
+ my $iter = $selection->get_selected;
+ if ($iter) {
+ my $path = $model->get_path($iter);
+ my $i = ($path->get_indices)[0];
+ ask_okcancel("Remove entry ?", "Remove $listhosts[$i]{hostname}") or return;
+ $model->remove($iter);
+ splice @listhosts, $i, 1;
+ }
+# write_conf_hosts();
+}
+
+sub create_model() {
+ get_host_data();
+ my $model = Gtk2::ListStore->new("Glib::String", "Glib::String", "Glib::String");
+ foreach my $a (@listhosts) {
+ my $iter = $model->append;
+ $model->set($iter,
+ COLUMN_IP, $a->{ip},
+ COLUMN_HOSTNAME, $a->{hostname},
+ COLUMN_ALIAS, $a->{alias},
+ );
+ }
+ return $model;
+}
+
+# add colum to model
+sub add_columns {
+ my $treeview = shift;
+ my $model = $treeview->get_model;
+ each_index {
+ my $renderer = Gtk2::CellRendererText->new;
+ $renderer->set(editable => 0);
+ $renderer->set_data(column => $::i);
+ $treeview->insert_column_with_attributes(-1, $_, $renderer, 'text' => $::i);
+ } N("IP address"), N("Host name"), N("Host Aliases");
+}
+
+
+###############
+# Main Program
+###############
+# create model
+my $model = create_model();
+
+my $window = ugtk2->new("Drakhosts");
+$::main_window = $window->{real_window};
+$window->{rwindow}->set_size_request(500, 400) unless $::isEmbedded;
+my $W = $window->{window};
+$W->signal_connect(delete_event => sub { ugtk2->exit });
+
+my $treeview = Gtk2::TreeView->new_with_model($model);
+$treeview->set_rules_hint(1);
+$treeview->get_selection->set_mode('single');
+add_columns($treeview);
+
+$treeview->signal_connect(button_press_event => sub {
+ my (undef, $event) = @_;
+ my $selection = $treeview->get_selection;
+ my $iter = $selection->get_selected;
+ if ($iter) {
+ add_modify_entry($treeview, "modify") if $event->type eq '2button-press';
+ }
+ });
+
+my $okcancel = create_okcancel({
+ cancel_clicked => sub { ugtk2->exit },
+ ok_clicked => sub { write_conf_hosts(); ugtk2->exit },
+ },
+ );
+
+
+
+# main interface
+$W->add(gtkpack_(Gtk2::VBox->new(0,0),
+ if_(!$::isEmbedded, 0, Gtk2::Banner->new('IC-Dhost-48', N("DrakHOSTS manage hosts definitions"))),
+ #if_($::isEmbedded, 0, Gtk2::Label->new("Here you can add, remove and alter hosts definition.")),
+ 1, gtkpack_(gtkset_border_width(Gtk2::HBox->new, 0),
+ 1, create_scrolled_window($treeview),
+ 0, gtkpack_(gtkset_border_width(create_vbox('start', 3)),
+ 0, gtksignal_connect(Gtk2::Button->new(N("Add")), clicked => sub {
+ eval { add_modify_entry($treeview, "add") };
+ my $err = $@;
+ if ($err) {
+ err_dialog(N("Error"), N("Failed to add host.") . "\n\n" . $err);
+ }
+ }),
+ 0, gtksignal_connect(Gtk2::Button->new(N("Modify")), clicked => sub {
+ eval { add_modify_entry($treeview, "modify") };
+ my $err = $@;
+ if ($err) {
+ err_dialog(N("Error"), N("Failed to Modify host.") . "\n\n" . $err);
+ }
+ }),
+ 0, gtksignal_connect(Gtk2::Button->new(N("Remove")), clicked => sub {
+ eval { remove_entry($treeview) };
+ my $err = $@;
+ if ($err) {
+ err_dialog(N("Error"), N("Failed to remove host.") . "\n\n" . $err);
+ }
+ }),
+ if_($::isEmbedded, 0, gtksignal_connect(Gtk2::Button->new(N("Quit")), clicked => sub { ugtk2->exit })),
+ ),
+ ),
+ 0, $okcancel,
+ ),
+ );
+
+$W->show_all;
+Gtk2->main;