|
|
|
&docommand("/load pbase.pm");
|
|
|
|
&docommand("/load pwidget.pm");
|
|
|
|
&docommand("/load pframe.pm");
|
|
|
|
&docommand("/load ptablevw.pm");
|
|
|
|
&docommand("/load plistbox.pm");
|
|
|
|
&docommand("/load pboxtqlayout.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");
|