From bcb704366cb5e333a626c18c308c7e0448a8e69f Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdenetwork@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- ksirc/puke/user_monitor.ks | 440 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 440 insertions(+) create mode 100644 ksirc/puke/user_monitor.ks (limited to 'ksirc/puke/user_monitor.ks') diff --git a/ksirc/puke/user_monitor.ks b/ksirc/puke/user_monitor.ks new file mode 100644 index 00000000..a0b2a56a --- /dev/null +++ b/ksirc/puke/user_monitor.ks @@ -0,0 +1,440 @@ +&docommand("/load pbase.pm"); +&docommand("/load pwidget.pm"); +&docommand("/load pframe.pm"); +&docommand("/load ptablevw.pm"); +&docommand("/load plistbox.pm"); +&docommand("/load pboxlayout.pm"); +&docommand("/load plabel.pm"); +&docommand("/load pmenudta.pm"); +&docommand("/load ppopmenu.pm"); +&docommand("/load pbutton.pm"); +&docommand("/load ppushbt.pm"); +&docommand("/load palistbox.pm"); +&docommand("/load plined.pm"); + +use Net::SMTP; + +my $WHO = "$ENV{HOME}/who_online.pl"; +my $INFO = "$ENV{HOME}/mysql_fetch"; + +my %ALLOW_MULT = (); +$ALLOW_MULT{'asj'} = 1; +$ALLOW_MULT{'administrator'} = 1; + +@PAGE_PPL = ('andrew', 'lee', 'william', 'seamus', 'gerry', 'jason', 'derik'); + +$PUKE_DEF_HANDLER{-999} = sub {}; + +package UserList; + +@ISA = qw(PFrame); + +sub new { + my $class = shift; + my $self = $class->SUPER::new($class, @_); + + $self->create(); + + my $gm = new PBoxLayout($self, $PBoxLayout::TopToBottom, 5); + + my $list_box = new PListBox($self); + $gm->addWidget($list_box, 5); + + my $event_list = new PListBox($self); + $event_list->setMaximumSize(110, 2000); + $event_list->setMinimumSize(110, 1); + # $event_list->setFrameStyle($PFrame::Box|$PFrame::Raised); + $event_list->setFrameStyle(0); + $event_list->setBackgroundColor($self->backgroundColor()); + # Turn off the widget so people can't click in it + $event_list->setEnabled(0); + $event_list->setAutoScrollBar(0); + $event_list->setScrollBar(0); + $gm->addWidget($event_list, 5); + + my $gm_but = new PBoxLayout($PBoxLayout::LeftToRight, 5); + $gm->addLayout($gm_but, 5); + + my $refresh_but = new PPushButton($self); + $refresh_but->setMaximumSize(25, 2000); + $refresh_but->setMinimumSize(25, 25); + $refresh_but->installHandler($::PUKE_BUTTON_PRESSED_ACK, sub { } ); + $refresh_but->installHandler($::PUKE_BUTTON_RELEASED_ACK, sub { } ); + $refresh_but->installHandler($::PUKE_BUTTON_CLICKED_ACK, sub { &::docommand("refresh_users"); } ); + $refresh_but->setText("&Refresh Users"); + $gm_but->addWidget($refresh_but, 5); + + my $page_dialog = new pageDialog(); + $page_dialog->resize(265, 250); + + my $page_but = new PPushButton($self); + $page_but->setMaximumSize(25, 2000); + $page_but->setMinimumSize(25, 25); + $page_but->installHandler($::PUKE_BUTTON_PRESSED_ACK, sub { } ); + $page_but->installHandler($::PUKE_BUTTON_RELEASED_ACK, sub { } ); + $page_but->installHandler($::PUKE_BUTTON_CLICKED_ACK, sub { $self->{'page_dialog'}->show(); } ); + $page_but->setText("&Page"); + $gm_but->addWidget($page_but, 5); + + + my $user_count = new PLabel($self); + $user_count->setMaximumSize(25, 2000); + $user_count->setMinimumSize(25, 25); + $user_count->setFrameStyle($PFrame::Box|$PFrame::Raised); + $gm->addWidget($user_count, 5); + + $user_count->setText($list_box->{count}); + + my $menu = new PPopupMenu(); + my $menu_online = $menu->insertText("Online Time"); + $menu->installMenu($menu_online, sub { &::say("online " . $self->{'list_box'}->currentText() . "\n"); }); + my $menu_info = $menu->insertText("User Information"); + $menu->installMenu($menu_info, sub { my $user = $self->{'list_box'}->currentText(); print `$INFO $user`; }); + my $menu_info2 = $menu->insertText("Connection Information"); + $menu->installMenu($menu_info2, sub { my $exec = "$WHO info " . $self->{'list_box'}->currentText(); print `$exec`; }); + + my $menu_rem = $menu->insertText("Remove User From List"); + $menu->installMenu($menu_rem, sub { + my $user = $self->{'list_box'}->currentText(); + my $count = $self->{'list_box'}->current(); + $self->{'list_box'}->removeItem($count); + if($users_online->{$user} > 0){ + $users_online->{$user}--; + } + if($users_online->{$user} == 0){ + delete $users_online->{$user}; + } + }); + my $menu_kill = $menu->insertText("Disconnect User"); + $menu->installMenu($menu_kill, sub { my $exec = "$WHO reset " . $self->{'list_box'}->currentText(); print "Running: $exec\n"; system($exec); }); + + # Install listner for mouse events + + $list_box->installHandler($::PUKE_WIDGET_EVENT_MOUSEBUTTONPRESS, + sub {$self->popupMenu(@_)}); + $list_box->installHandler($::PUKE_WIDGET_EVENT_MOUSEBUTTONRELEASE, + sub {$self->popdownMenu(@_)}); + + + @$self{'gm', 'list_box', 'user_count', 'max', 'event_list', 'menu', 'page_dialog', 'page_but', 'gm_but'} = ($gm, $list_box, $user_count, 0, $event_list, $menu, $page_dialog, $page_but, $gm_but); + + return $self; + +} + +sub DESTROY { + # $self->hide(); + $self->{'gm'}->DESTROY; + delete $self->{'gm'}; + delete $self->{'gm2'}; + $self->{'list_box'}->DESTROY; + delete $self->{'list_box'}; + $self->{'use_count'}->DESTROY; + delete $self->{'use_count'}; + + $self->SUPER::DESTROY(); +} + +sub popupMenu { + my $self = shift; + my $arg = shift; + + my($x, $y, $b, $s) = unpack("i4", $arg->{'cArg'}); + # print "$x $y $b $s\n"; + + # Only popup for button 2 + $self->{'menu'}->popupAtCurrent() if $b == 2; +} + +sub popdownMenu { + my $self = shift; + + $self->{'menu'}->hide(); +} + +sub addEvent { + my $self = shift; + + my $event_list = $self->{'event_list'}; + + while($event_list->{count} >= 10){ + $event_list->removeItem($event_list->{count}); + } + + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); + + my $text = sprintf("%02d:%02d:%02d " . shift(), $hour, $min, $sec); + + $event_list->insertText($text, 0); +} + +sub insertText { + my $self = shift; + + $self->{'list_box'}->insertText(@_); + + if($self->{'list_box'}->{count} > $self->{'max'}){ + $self->{'max'} = $self->{'list_box'}->{count}; + } + + $self->{'user_count'}->setText("C: " . $self->{'list_box'}->{count} . " M: " . $self->{'max'}); +} + +sub removeItem { + my $self = shift; + + $self->{'list_box'}->removeItem(@_); + + $self->{'user_count'}->setText("C: " . $self->{'list_box'}->{count} . " M: " . $self->{'max'}); +} + +sub text { + my $self = shift; + + return $self->{'list_box'}->text(@_); +} + +sub count { + my $self = shift; + + return $self->{'list_box'}->{count}; +} + +sub AUTOLOAD { + my $self = shift; + + return if $AUTOLOAD =~ /::DESTROY$/; + + $AUTOLOAD =~ /.+::(.+)/; + return $self->{'list_box'}->$1(@_); +} + +package pageDialog; + +@ISA = qw(PFrame); + +sub new { + my $class = shift; + my $self = $class->SUPER::new($class, @_); + $self->create(); + + my $gm = new PBoxLayout($self, $PBoxLayout::TopToBottom, 5); + + my $ppl_label = new PLabel($self); + $ppl_label->setText("Person to page:"); + $ppl_label->setMaximumSize(25, 2000); + $ppl_label->setMinimumSize(25, 25); + $gm->addWidget($ppl_label, 5); + + my $page_ppl = new PListBox($self); + $gm->addWidget($page_ppl, 5); + + my $msg_label = new PLabel($self); + $msg_label->setText("Message to page:"); + $msg_label->setMaximumSize(25, 2000); + $msg_label->setMinimumSize(25, 25); + $gm->addWidget($msg_label, 5); + + my $page_msg = new PLineEdit($self); + $page_msg->setMaximumSize(25, 2000); + $page_msg->setMinimumSize(25, 25); + $page_msg->setMaxLength(49); + $page_msg->installHandler($::PUKE_EVENT_UNKOWN, sub {}); + $gm->addWidget($page_msg, 5); + + my $send_but = new PPushButton($self); + $send_but->setMaximumSize(25, 2000); + $send_but->setMinimumSize(25, 25); + $send_but->installHandler($::PUKE_BUTTON_PRESSED_ACK, sub { } ); + $send_but->installHandler($::PUKE_BUTTON_RELEASED_ACK, sub { } ); + $send_but->installHandler($::PUKE_BUTTON_CLICKED_ACK, sub { &::docommand("msg #polarcom page " . $self->{'page_ppl'}->currentText() . " " . $self->{'page_msg'}->text()); $self->hide() } ); + $send_but->setText("&Send"); + $gm->addWidget($send_but, 5); + + $self->setCaption("Page User"); + + @$self{'gm', 'page_ppl', 'page_msg', 'send_but', 'msg_label', 'ppl_label'} = + ($gm, $page_ppl, $page_msg, $send_but, $msg_label, $ppl_label); + + return $self; + +} + +sub show { + my $self = shift; + my $page_ppl = $self->{'page_ppl'}; + + $self->hide(); + + my $c = $page_ppl->current(); + + $page_ppl->clear(); + my $person; + foreach $person (@main::PAGE_PPL) { + $page_ppl->insertText($person, -1); + } + $page_ppl->setCurrentItem($c); + + $self->resize(265, 250); + $self->recreate(0, 0, 265, 250, 1); + +# $self->SUPER::show(); +# +# $self->resize(265,250); +# $self->move(400,270); + +} + + +package main; + + +if($online == undef){ + $online = new UserList(); + $online->setCaption("Users Online"); + $online->show(); + $online->resize(196,740); + $online->move(823,0); + + eval { + $main::polar = new PWidget(); + $main::polar->fetchWidget("199.247.156.200_toplevel"); + $main::polar->move(0,0); + $main::polar->resize(816, 740); + }; + if($@) { + eval { + $main::polar = new PWidget(); + $main::polar->fetchWidget("199.247.156.200_#polarcom_toplevel"); + $main::polar->move(0,0); + $main::polar->resize(816, 740); + }; + } + $users_online = {}; +} + +sub hook_online_mon { + my $channel = shift; + my $msg = shift; + return unless $channel eq '#polarcom'; + return unless $msg =~ /Login|Logoff/; + return if $msg =~ /administrator/; + + if($msg =~ /ice: Login (\S+)/){ + my $nick = $1; + #return if $nick =~ /administrator/; + $nick =~ s/(\S+)\@\S+/$1/g; + $online->addEvent("On: $nick"); + if($users_online->{$nick} > 0){ + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); + my $date; + chomp($date = `date`); + my $times = $users_online->{$nick} + 1; + &say("$date Duplicate login for $nick, logged on $times times") if (($main::nick eq 'action') || ($nick eq 'administrator')); + $online->addEvent("Duplicate: $nick"); + if($ALLOW_MULT{$nick} != 1){ + my $exec = "$WHO reset " . $nick; + print "*I* Running: $exec\n"; + system($exec); + my $smtp = new Net::SMTP->new; + $smtp->mail("sysadmin\@polarcom.com"); + $smtp->to("$nick\@polarcom.com", "sysadmin\@polarcom.com"); + $smtp->data(); + $smtp->datasend("To: $nick\@polarcom.com\n"); + $smtp->datasend("From: Polarcom System Admin \n"); + $smtp->datasend("Subject: Security Alert\n\n\n"); + $smtp->datasend("To: $nick\n"); + $smtp->datasend("Your account was simultaneously access by 2 or more users.\n"); + $smtp->datasend("The second user was automatically terminated.\n\n"); + $smtp->datasend("If you have any question, please email sysadmin\@polarcom.com\n"); + $smtp->datasend("-- Security Monitor\n"); + $smtp->datasend(); + $smtp->quit(); + } + else { + print "*I* $nick not being removed, in exclude list\n"; + } + } + # Make the list sorted + my $i = 0; + SEARCH: while($online->text($i) ne undef){ + + if(($online->text($i) cmp $nick) >= 0){ + last SEARCH; + } + $i++; + } + $online->insertText($nick, $i); + $users_online->{$nick}++; + } + elsif($msg =~ /ice: Logoff (\S+)/){ + my $i = 0; + my $nick = $1; + $nick =~ s/(\S+)\@\S+/$1/g; + # print "Trying to logoff: $nick\n"; + $online->addEvent("Off: $nick"); + if($users_online->{$nick} > 0){ + # print "$nick in list\n"; + $users_online->{$nick}--; + if($users_online->{$nick} == 0){ + delete $users_online->{$nick}; + } + while($online->text($i) ne undef){ + if($online->text($i) eq $nick){ + # print "Removing $i for $nick which is really: " . $online->text($i) . "\n"; + $online->removeItem($i); + return; + } + $i++; + } + } + } +} + +&addhook("public", "online_mon"); + +sub hook_get_users { + my $mesg = shift; + + if($mesg =~ /^send users online/){ + my $reply = 'Online: '; + for($i = 0; $i <= $online->count(); $i++){ + $reply .= $online->text($i) . " "; + } + &msg($who, $reply); + } + if($mesg = /Online: (.+)\s+$/){ + &tell("*I* Updating user list from $who"); + $online->addEvent("Update user list: $who"); + my $users = $1; + while($online->count() > 0){ + $online->removeItem(0); + } + $users_online = {}; + foreach $user (split(/\s+/, $users)){ + $users_online->{$user}++; + $online->insertText($user, -1); + } + } +} + +&addhook("msg", "get_users"); + +sub cmd_refresh_users { + $online->clear(); + $users_online = {}; + my $output = `$WHO list`; + my @users = split(/\n/, $output); + # while($online->count() > 0){ + # $online->removeItem(0); + #} + foreach $user (@users){ + $user =~ s/(\S+)\@\S+/$1/g; + next if $user eq ''; + next if $user =~ /administrator/; + $users_online->{$user}++; + $online->insertText($user, -1); + } +} + +&addcmd("refresh_users"); -- cgit v1.2.1