442 lines
18 KiB
Perl
442 lines
18 KiB
Perl
|
#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('<Button-1>', 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('<Button-1>', 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('<Button-1>', 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('<Button-1>', 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, "</etc/hosts") ||print "Could not open hosts";
|
||
|
open (NEW, ">/etc/hosts.txt")||print "Could not open hosts.txt";
|
||
|
select (NEW);
|
||
|
while (<OLD>) {
|
||
|
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, "</etc/hosts") ||print "Could not open hosts";
|
||
|
open (NEW, ">/etc/hosts.txt")||print "Could not open hosts.txt";
|
||
|
select (NEW);
|
||
|
while (<OLD>) {
|
||
|
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();
|
||
|
}
|