summaryrefslogtreecommitdiffstats
path: root/bin/drakids
diff options
context:
space:
mode:
authorPascal Rigaux <pixel@mandriva.com>2007-04-25 10:08:25 +0000
committerPascal Rigaux <pixel@mandriva.com>2007-04-25 10:08:25 +0000
commita95fcedc93ec2562876d50d3a4698ed4b32706d3 (patch)
tree4ed3320564f548d0873c375278ded5aa9506de0e /bin/drakids
parent85fe8d04eedc2b7ea353e247bd6737aedb7efac6 (diff)
downloaddrakx-net-a95fcedc93ec2562876d50d3a4698ed4b32706d3.tar
drakx-net-a95fcedc93ec2562876d50d3a4698ed4b32706d3.tar.gz
drakx-net-a95fcedc93ec2562876d50d3a4698ed4b32706d3.tar.bz2
drakx-net-a95fcedc93ec2562876d50d3a4698ed4b32706d3.tar.xz
drakx-net-a95fcedc93ec2562876d50d3a4698ed4b32706d3.zip
re-sync after the big svn loss
Diffstat (limited to 'bin/drakids')
-rw-r--r--bin/drakids267
1 files changed, 267 insertions, 0 deletions
diff --git a/bin/drakids b/bin/drakids
new file mode 100644
index 0000000..d786cd2
--- /dev/null
+++ b/bin/drakids
@@ -0,0 +1,267 @@
+#!/usr/bin/perl
+
+use strict;
+use lib qw(/usr/lib/libDrakX);
+use common;
+use standalone;
+
+use Socket;
+use mygtk2 qw(gtknew);
+use ugtk2 qw(:dialogs);
+use POSIX qw(strftime);
+use dbus_object;
+use network::ifw;
+
+use Gtk2::SimpleList;
+
+use ugtk2 qw(:create :helpers :wrappers);
+
+my $loglist = create_attack_list();
+$loglist->get_selection->set_mode('single');
+
+my $blacklist = create_attack_list();
+$blacklist->get_selection->set_mode('multiple');
+
+my $whitelist = Gtk2::SimpleList->new(addr => 'hidden',
+ N("Allowed addresses") => 'text',
+ );
+$whitelist->get_selection->set_mode('multiple');
+$whitelist->set_headers_clickable(1);
+$whitelist->get_column(0)->signal_connect('clicked', \&sort_by_column, $whitelist->get_model);
+$whitelist->get_column(0)->set_sort_column_id(0);
+
+my $w = ugtk2->new(N("Interactive Firewall"),
+ icon => "/usr/lib/libDrakX/icons/drakfirewall.png");
+
+my $ifw = network::ifw->new(dbus_object::system_bus(), sub {
+ my ($_con, $msg) = @_;
+ my $member = $msg->get_member;
+ if ($member eq 'Attack') {
+ handle_log($msg->get_args_list);
+ } elsif ($member eq 'Blacklist') {
+ handle_blacklist($msg->get_args_list);
+ } elsif ($member eq 'Whitelist') {
+ handle_whitelist($msg->get_args_list);
+ } elsif ($member eq 'Clear') {
+ clear_lists();
+ } elsif ($member eq 'Init') {
+ handle_init();
+ } elsif ($member eq 'ManageRequest') {
+ $w->{window}->present;
+ }
+});
+init_lists();
+
+gtkadd($w->{window},
+ gtknew('Notebook', children => [
+ gtknew('Label', text => N("Log")),
+ gtknew('VBox', spacing => 5, children => [
+ 1, gtknew('ScrolledWindow', width => 600, height => 400, child => $loglist),
+ 0, gtknew('HButtonBox', layout => 'edge', children_loose => [
+ gtknew('Button', text => N("Clear logs"), clicked => \&clear_log),
+ gtknew('Button', text => N("Blacklist"), clicked => sub { blacklist(get_selected_log_seq()) }),
+ gtknew('Button', text => N("Whitelist"), clicked => sub { whitelist(get_selected_log()) }),
+ gtknew('Button', text => N("Close"), clicked => sub { Gtk2->main_quit })
+ ]),
+ ]),
+ gtknew('Label', text => N("Blacklist")),
+ gtknew('VBox', spacing => 5, children => [
+ 1, gtknew('ScrolledWindow', width => 600, height => 400, child => $blacklist),
+ 0, gtknew('HButtonBox', layout => 'edge', children_loose => [
+ gtknew('Button', text => N("Remove from blacklist"), clicked => sub { unblacklist(get_selected_blacklist()) }),
+ gtknew('Button', text => N("Move to whitelist"), clicked => sub {
+ my @addr = get_selected_blacklist();
+ unblacklist(@addr);
+ whitelist(@addr);
+ }),
+ gtknew('Button', text => N("Close"), clicked => sub { Gtk2->main_quit })
+ ]),
+ ]),
+ gtknew('Label', text => N("Whitelist")),
+ gtknew('VBox', spacing => 5, children => [
+ 1, gtknew('ScrolledWindow', width => 600, height => 400, child => $whitelist),
+ 0, gtknew('HButtonBox', layout => 'edge', children_loose => [
+ gtknew('Button', text => N("Remove from whitelist"), clicked => sub { unwhitelist(get_selected_whitelist()) }),
+ gtknew('Button', text => N("Close"), clicked => sub { Gtk2->main_quit })
+ ]),
+ ]),
+ ]),
+);
+$w->show;
+Gtk2->main;
+
+ugtk2::exit(0);
+
+sub sort_by_column {
+ my ($column, $model) = @_;
+ my $col_id = $column->get_sort_column_id;
+ my ($old_id, $old_order) = $model->get_sort_column_id;
+ $model->set_sort_column_id($col_id, $old_id == $col_id && $old_order ne 'descending' ? 'ascending' : 'descending');
+}
+
+sub handle_init() {
+ $ifw->attach_object;
+ init_lists();
+}
+
+sub list_remove_addr {
+ my ($list, @addr) = @_;
+ #- workaround buggy Gtk2::SimpleList array abstraction, it destroys references
+ @$list = map { member($_->[0], @addr) ? () : [ @$_ ] } @$list;
+}
+
+#- may throw an exception
+sub init_blacklist() {
+ my @packets = $ifw->get_blacklist;
+ while (my @blacklist = splice(@packets, 0, 8)) {
+ handle_blacklist(@blacklist);
+ }
+}
+
+sub clear_blacklist() {
+ @{$blacklist->{data}} = ();
+}
+
+sub handle_blacklist {
+ attack_list_add($blacklist, network::ifw::attack_to_hash(\@_));
+}
+
+sub get_selected_blacklist() {
+ uniq(map { $blacklist->{data}[$_][0] } $blacklist->get_selected_indices);
+}
+
+sub blacklist {
+ my @seq = @_;
+ eval { $ifw->set_blacklist_verdict($_, 1) foreach @seq };
+ $@ and err_dialog(N("Interactive Firewall"), N("Unable to contact daemon"));
+}
+
+sub unblacklist {
+ my @addr = @_;
+ eval { $ifw->unblacklist($_) foreach @addr };
+ if (!$@) {
+ list_remove_addr($blacklist->{data}, @addr);
+ } else {
+ err_dialog(N("Interactive Firewall"), N("Unable to contact daemon"));
+ }
+}
+
+#- may throw an exception
+sub init_whitelist() {
+ handle_whitelist($_) foreach $ifw->get_whitelist;
+}
+
+sub clear_whitelist() {
+ @{$whitelist->{data}} = ();
+}
+
+sub handle_whitelist {
+ my ($addr) = @_;
+ push @{$whitelist->{data}}, [ $addr, network::ifw::resolve_address(network::ifw::get_ip_address($addr)) ];
+}
+
+sub get_selected_whitelist() {
+ uniq(map { $whitelist->{data}[$_][0] } $whitelist->get_selected_indices);
+}
+
+sub whitelist {
+ my @addr = @_;
+ eval { $ifw->whitelist($_) foreach @addr };
+ $@ and err_dialog(N("Interactive Firewall"), N("Unable to contact daemon"));
+}
+
+sub unwhitelist {
+ my @addr = @_;
+ eval { $ifw->unwhitelist($_) foreach @addr };
+ if (!$@) {
+ list_remove_addr($whitelist->{data}, @addr);
+ } else {
+ err_dialog(N("Interactive Firewall"), N("Unable to contact daemon"));
+ }
+}
+
+sub init_lists() {
+ eval {
+ init_loglist();
+ init_blacklist();
+ init_whitelist();
+ };
+ $@ and print "$@\n", err_dialog(N("Interactive Firewall"), N("Unable to contact daemon"));
+}
+
+sub clear_lists() {
+ clear_loglist();
+ clear_blacklist();
+ clear_whitelist();
+}
+
+sub create_attack_list() {
+ my $attacklist = Gtk2::SimpleList->new(addr => 'hidden',
+ seq => 'hidden',
+ timestamp => 'hidden',
+ N("Date") => 'text',
+ N("Attacker") => 'text',
+ N("Attack type") => 'text',
+ N("Service") => 'text',
+ N("Network interface") => 'text',
+ N("Protocol") => 'text',
+ );
+ $attacklist->set_headers_clickable(1);
+ foreach (0, 1, 2) {
+ $attacklist->get_column($_)->signal_connect('clicked', \&sort_by_column, $attacklist->get_model);
+ #- sort on timestamp if Date column is clicked
+ #- sort columns include hidden columns while list columns don't
+ $attacklist->get_column($_)->set_sort_column_id($_ == 0 ? 1 : $_ + 2);
+ }
+ $attacklist;
+}
+
+sub attack_list_add {
+ my ($attacklist, $attack) = @_;
+ push @{$attacklist->{data}}, [
+ $attack->{addr},
+ $attack->{seq},
+ $attack->{timestamp},
+ $attack->{date},
+ $attack->{hostname},
+ $attack->{type},
+ $attack->{service},
+ $attack->{indev},
+ $attack->{protocol},
+ ];
+}
+
+#- may throw an exception
+sub init_loglist() {
+ my @packets = $ifw->get_reports(1);
+ while (my @attack = splice(@packets, 0, 10)) {
+ handle_log(@attack);
+ }
+}
+
+sub clear_loglist() {
+ @{$loglist->{data}} = ();
+}
+
+sub handle_log {
+ attack_list_add($loglist, network::ifw::attack_to_hash(\@_));
+}
+
+sub get_selected_log_seq() {
+ uniq(map { $loglist->{data}[$_][1] } $loglist->get_selected_indices);
+}
+sub get_selected_log() {
+ uniq(map { $loglist->{data}[$_][0] } $loglist->get_selected_indices);
+}
+
+sub clear_log {
+ eval {
+ $ifw->clear_processed_reports;
+ $ifw->send_alert_ack;
+ };
+ if (!$@) {
+ clear_loglist();
+ } else {
+ err_dialog(N("Interactive Firewall"), N("Unable to contact daemon"));
+ }
+}