You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdenetwork/ksirc/puke/user_monitor.ks

441 lines
12 KiB

&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 <sysadmin\@polarcom.com>\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");