To add or delete hosts and users, ptadmin.pl must be ran as root. Normal user may only kill their own processes.
#! /usr/bin/perl
use Tk;
# anderson.stephen@gmail.com
# Copyright (C) 2006 Stephen W. Anderson
#
#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
#of the License, 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.
# 02/18/01 - Birth of ptadmin.
# Updated for Ubuntu 01/07/05
# Fixed Add User - will now create home directory, add encrypted password
# Process listing will no longer list the ps -ef command used to get the processes
# Widened the GUI so all buttons are readable
# Fixed the order of the added host entries (e.g. IP, fqdn, hostname, alias)
#
$computer =`hostname`;
$seconds_time = time();
$time = localtime($seconds_time);
chomp($computer);
chomp($time);
my $mw = MainWindow->new;
$mw->geometry("710x375+0+0");
$mw->title("$computer - $time");
$mw->iconname("ptadmin");
$mw->iconmask();
$mw->iconmask("info");
$mw->client();
$mw->client("ptadmin");
#----------------- Main Window
my $f = $mw->Frame(-highlightbackground => 'blue',
-highlightthickness => 4)->pack(-side => 'top');
$lb = $f->Scrolled("Listbox", -selectmode => "single", -width => "100", -height => "5",
-scrollbars => 'osoe');
@dfk = `df -k`;
$how_many = scalar @dfk;
for ($count=0;$count<$how_many;$count++){
chomp($dfk[$count]);
}
$lb->insert('end', @dfk);
$lb->bind('', sub {
my $selected = $lb->get($lb->curselection());
});
foreach $part_disk (@dfk){
@part_use = split (/\s+/, $part_disk);
$part_use[4] =~ s/%//;
#Change this number to the percentage that you desire
$part_limit = 95;
if (($part_use[4] > $part_limit) && ($part_use[4] cmp 'Use')) {
$lb->insert('end', "Warning! $part_use[0] Usage Percentage exceeds $part_limit");
}
else {
#do nothing
}
}
$lb->pack(-side => 'top', -fill => 'both', -expand => 1);
@proc = `ps -ef|grep -v "ps -ef"`;
$how_many = scalar @proc;
for ($count=0;$count<$how_many;$count++){
chomp($proc[$count]);
}
$lb4 = $f->Scrolled("Listbox", -selectmode => "single",
-height => "5",-width => "100",
-scrollbars => 'osoe')->pack(-side=>'bottom',
-fill => 'both', -expand => 1);
$lb4->insert('end',@proc);
$lb4->bind('', sub {
my $selected4 = $lb4->get($lb4->curselection());
});
@hosts = `cat /etc/hosts`;
$how_many = scalar @hosts;
for ($count=0;$count<$how_many;$count++){
chomp($hosts[$count]);
$hosts[$count] =~ s/\t/ /g;
}
$lb2 = $f->Scrolled("Listbox", -selectmode => "single",
-height=> "5", -width => "60",
-scrollbars => 'osoe')->pack(-side=>'right',
-fill => 'both', -expand => 1);
$lb2->insert('end',@hosts);
$lb2->bind('', sub {
my $selected1 = $lb2->get($lb2->curselection());
});
@users = `cat /etc/passwd | awk -F : '{if (\$3 > 99) print \$1" " \$3" " \$4" " \$5}'`;
$how_many = scalar @users;
for ($count=0;$count<$how_many;$count++){
chomp($users[$count]);
}
$lb3 = $f->Scrolled("Listbox", -selectmode => "single",
-height=> "5", -width => "40",
-scrollbars => 'osoe')->pack(-side=>'left',
-fill => 'both', -expand => 1);
$lb3->insert('end',@users);
$lb3->bind('', sub {
my $selected3 = $lb3->get($lb3->curselection());
});
my $g = $mw->Frame(-highlightbackground => 'blue',
-highlightthickness => 4);
my $but = $g->Button(-text => "Exit",
-command => sub { exit } )->pack(-side => "right",
-fill => "x");
my $but1 = $g->Button(-text => "Ping",
-command => \&ping)->pack(-side => "right",
-fill => "x");
my $but2 = $g->Button(-text => "Kill Process",
-command => \&kill_proc)->pack(-side => "right",
-fill => "x");
my $but3 = $g->Button(-text => "Refresh",
-command => \&StatsClear)->pack(-side => "right",
-fill => "x");
my $but5 = $g->Button(-text => "Hosts",
-command => \&HostClear)->pack(-side => "right",
-fill => "x");
my $but4 = $g->Button(-text => "Add Host",
-command => \&add_host)->pack(-side => "right",
-fill => "x");
my $but6 = $g->Button(-text => "Delete Host",
-command => \&DelHost)->pack(-side => "right",
-fill => "x");
my $but8 = $g->Button(-text => "Add User",
-command => \&UserAdd)->pack(-side => "right",
-fill => "x");
my $but7 = $g->Button(-text => "Delete User",
-command => \&UserDel)->pack(-side => "right",
-fill => "x");
$f->pack(-side => 'top', -fill => 'x');
$g->pack(-side => 'top', -fill => 'x');
MainLoop;
sub ping {
if (!$lb2->selectionIncludes('active')){
print "Select a host to Ping!";
}
else{
my $selected1 = $lb2->get($lb2->curselection());
@ip = split (/ /, $selected1);
chomp ($ip[0]);
if (!`ping -c 1 $ip[0]`) {
$lb2->delete(0, 'end');
$lb2->insert('end',"IP appears to be invalid!");
}
else {
`ping -c 3 $ip[0]>ptping.txt`;
@ping_results = `cat ptping.txt`;
$how_many = scalar @ping_results;
for ($count=0;$count<$how_many;$count++){
chomp($ping_results[$count]);
}
$lb2->delete(0, 'end');
$lb2->insert('end',@ping_results);
}
}
}
sub kill_proc {
if (!$lb4->selectionIncludes('active')){
print "Select a process to kill!";
}
else{
my $selected4 = $lb4->get($lb4->curselection());
@proc = split (/\s+/,$selected4);
`kill -9 $proc[1]`;
$lb4->delete(0, 'end');
@proc = `ps -ef`;
$how_many = scalar @proc;
for ($count=0;$count<$how_many;$count++){
chomp($proc[$count]);
}
$lb4->insert('end',@proc);
}
}
sub disk {
$lb->delete(0, 'end');
@dfk = `df -k`;
$how_many = scalar @dfk;
for ($count=0;$count<$how_many;$count++){
chomp($dfk[$count]);
}
$lb->insert('end', @dfk);
foreach $part_disk (@dfk){
@part_use = split (/\s+/, $part_disk);
$part_use[4] =~ s/%//;
$part_limit = 95;
if ($part_use[4] > $part_limit && $part_use[4] ne "Use") {
$lb->insert('end', "Warning! $part_use[0] Usage Percentage exceeds $part_limit%");
}
else {
#does nothing
}
}
}
sub add_host {
if (! Exists ($HostAdd)) {
$HostAdd = $mw->Toplevel();
$HostAdd ->title("ptadmin - Add Host");
$HostAdd->geometry("290x210+0+0");
$b1 = $HostAdd->Frame(-highlightbackground => 'blue',
-highlightthickness => 4)->pack(side=>'top', -fill => 'x');
$b2 = $b1->Frame(-highlightbackground => 'blue',
-highlightthickness => 4)->pack(side=>'top', -fill => 'x');
$b2->Label(-text => "Host Name" ) ->pack(-side => 'top');
$b2->Entry(-width => 25, -textvariable => \$hostname)
->pack(-side => 'top');
$b2->Label(-text => "IP Address" ) ->pack(-side => 'top');
$b2->Entry(-width => 16, -textvariable => \$ipaddress)
->pack(-side => 'top');
$b2->Label(-text => "Fully Qualified Name (hostname.domainname)" )
->pack(-side => 'top');
$b2->Entry(-width => 25, -textvariable => \$fqdn)
->pack(-side => 'top');
$b2->Label(-text => "Alias" ) ->pack(-side => 'top');
$b2->Entry(-width => 15, -textvariable => \$alias)
->pack(-side => 'top');
$b1->Button(-text => "Cancel", -command => sub {$HostAdd->destroy})
->pack(-side => 'right');
$b1->Button(-text => "Add the Host", -command => \&host_end)
->pack(-side => 'right');
} else {
$HostAdd->raise();
}
}
sub host_end {
$line_cnt=`cat /etc/hosts|wc -l`;
open(OLD, " open (NEW, ">/etc/hosts.txt")||print "Could not open hosts.txt";
select (NEW);
while () {
print NEW $_;
if ($. == $line_cnt && $ipaddress ne "") {
print NEW "$ipaddress\t$fqdn\t$hostname\t$alias\n";
}
}
close (OLD);
close (NEW);
select (STDOUT);
rename ("/etc/hosts", "/etc/hosts.orig")||print "HELP1";
rename("/etc/hosts.txt", "/etc/hosts")||print "HELP";
@hosts = `cat /etc/hosts`;
$how_many = scalar @hosts;
for ($count=0;$count<$how_many;$count++){
chomp($hosts[$count]);
$hosts[$count] =~ s/\t/ /g;
}
$lb2->delete(0, 'end');
$lb2->insert('end',@hosts);
$HostAdd->destroy;
}
sub DelHost {
if (!$lb2->selectionIncludes('active')){
print "Select Host!";
}
else{
my $selected1 = $lb2->get($lb2->curselection());
@hosts = `cat /etc/hosts`;
$how_many = scalar @hosts;
for ($count=0;$count<$how_many;$count++){
chomp($hosts[$count]);
$hosts[$count] =~ s/\t/ /g;
if ($hosts[$count] eq $selected1){
$delete_line=$count+1;
}
}
$line_cnt=`cat /etc/hosts|wc -l`;
open(OLD, " open (NEW, ">/etc/hosts.txt")||print "Could not open hosts.txt";
select (NEW);
while () {
next if ($. == $delete_line);
print NEW $_;
}
close (OLD);
close (NEW);
select (STDOUT);
rename ("/etc/hosts", "/etc/hosts.orig")||print "HELP1";
rename("/etc/hosts.txt", "/etc/hosts")||print "HELP";
@hosts = `cat /etc/hosts`;
$how_many = scalar @hosts;
for ($count=0;$count<$how_many;$count++){
chomp($hosts[$count]);
$hosts[$count] =~ s/\t/ /g;
}
$lb2->delete(0, 'end');
$lb2->insert('end',@hosts);
}
}
sub UserDel {
if (!$lb3->selectionIncludes('active')){
print "Select User!";
}
else{
if (! Exists ($UserWarn)) {
$UserWarn = $mw->Toplevel();
$UserWarn ->title("ptadmin Warning!");
$UserWarn->geometry("200x80+0+0");
$b1 = $UserWarn->Frame(-highlightbackground => 'blue',
-highlightthickness => 4)->pack(side=>'top', -fill => 'x');
$b2 = $b1->Frame(-highlightbackground => 'blue',
-highlightthickness => 4)->pack(side=>'top', -fill => 'x');
$b2->Label(-text => "Warning! User directories \n will be permanently removed!" ) ->pack(-side => 'top');
$b1->Button(-text => "Remove the User!", -command => \&RemoveUser)
->pack(-side => 'right');
$b1->Button(-text => "Cancel", -command => sub {$UserWarn->destroy})
->pack(-side => 'right');
} else {
$UserWarn->raise();
}
}
}
sub RemoveUser{
my $selected3 = $lb3->get($lb3->curselection());
my @login = split (/\s+/, $selected3);
`/usr/sbin/userdel -r $login[0]`;
@users = `cat /etc/passwd | awk -F : '{if (\$3 > 99) print \$1" " \$3" " \$4" " \$5}'`;
$how_many = scalar @users;
for ($count=0;$count<$how_many;$count++){
chomp($users[$count]);
}
$lb3->delete(0, 'end');
$lb3->insert('end',@users);
$UserWarn->destroy;
}
sub UserAdd {
if (! Exists ($UserAdd)) {
$UserAdd = $mw->Toplevel();
$UserAdd ->title("ptadmin - Add User");
$UserAdd->geometry("240x215+0+0");
$b1 = $UserAdd->Frame(-highlightbackground => 'blue',
-highlightthickness => 4)->pack(side=>'top', -fill => 'x');
$b2 = $b1->Frame(-highlightbackground => 'blue',
-highlightthickness => 4)->pack(side=>'top', -fill => 'x');
$b2->Label(-text => 'Login (Required)' ) ->pack(-side => 'top');
$b2->Entry(-width => 25, -textvariable => \$login)
->pack(-side => 'top');
$b2->Label(-text => 'User Name (Optional)' ) ->pack(-side => 'top');
$b2->Entry(-width => 25, -textvariable => \$username)
->pack(-side => 'top');
$b2->Label(-text => 'Password (Required)' ) ->pack(-side => 'top');
$b2->Entry(-width => 25, -show => "*",
-textvariable => \$password) ->pack(-side => 'top');
$b2->Label(-text => 'Home Directory (Required)' ) ->pack(-side => 'top');
$b2->Entry(-width => 25, -textvariable => \$homedir)
->pack(-side => 'top');
$b1->Button(-text => "Add the User", -command => \&AddUser)
->pack(-side => 'right');
$b1->Button(-text => "Cancel", -command => sub {$UserAdd->destroy})
->pack(-side => 'right');
} else {
$UserAdd->raise();
}
}
sub AddUser {
$enc_password = crypt($password,L3);
`/usr/sbin/useradd -c "$username" -m -d "$homedir" -p $enc_password $login`;
@users = `cat /etc/passwd | awk -F : '{if (\$3 > 99) print \$1" " \$3" " \$4" " \$5}'`;
$how_many = scalar @users;
for ($count=0;$count<$how_many;$count++){
chomp($users[$count]);
}
$lb3->delete(0, 'end');
$lb3->insert('end',@users);
$UserAdd->destroy;
}
sub HostClear{
@hosts = `cat /etc/hosts`;
$how_many = scalar @hosts;
for ($count=0;$count<$how_many;$count++){
chomp($hosts[$count]);
$hosts[$count] =~ s/\t/ /g;
}
$lb2->delete(0, 'end');
$lb2->insert('end',@hosts);
}
sub UserClear {
@users = `cat /etc/passwd | awk -F : '{if (\$3 > 99) print \$1" " \$3" " \$4" " \$5}'`;
$how_many = scalar @users;
for ($count=0;$count<$how_many;$count++){
chomp($users[$count]);
}
$lb3->delete(0, 'end');
$lb3->insert('end',@users);
}
sub ProcClear {
$lb4->delete(0, 'end');
@proc = `ps -ef`;
$how_many = scalar @proc;
for ($count=0;$count<$how_many;$count++){
chomp($proc[$count]);
}
$lb4->insert('end',@proc);
}
sub StatsClear {
disk();
HostClear();
UserClear();
ProcClear();
}