212 lines
5.7 KiB
Perl
212 lines
5.7 KiB
Perl
#
|
|
# Uninstall.pl
|
|
#
|
|
# Author: Michael Smith (mikes@ActiveState.com)
|
|
#
|
|
# Copyright © 1998 ActiveState Tool Corp., all rights reserved.
|
|
#
|
|
###########################################################
|
|
|
|
use Win32::Registry;
|
|
use File::Find;
|
|
use MetabaseConfig;
|
|
|
|
my $data_file = $ARGV[0];
|
|
my $ENVIRONMENT_KEY = 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment';
|
|
|
|
ReadData();
|
|
Warn();
|
|
UninstallDependents();
|
|
CleanPath();
|
|
RemoveIISVirtDirs();
|
|
RemoveIISScriptMaps();
|
|
RemoveLinesFromFiles();
|
|
RemoveDirectories();
|
|
RemoveFiles();
|
|
CallInstallShield();
|
|
sleep(3);
|
|
exit(0);
|
|
|
|
sub ReadData {
|
|
print "Reading uninstall data...\n";
|
|
my $data = '';
|
|
$rv = open(DATA, "<$data_file");
|
|
if($rv) {
|
|
map($data .= $_, <DATA>);
|
|
close(DATA);
|
|
eval($data);
|
|
}else{
|
|
die "Error reading uninstallation data file. Aborting!!";
|
|
}
|
|
}
|
|
|
|
sub Warn {
|
|
print "This will uninstall $app_name. Do you wish to continue?\n";
|
|
print "[y|N] ==>";
|
|
my $response = '';
|
|
while(($response = <STDIN>) !~ /^[\nyn]/i){};
|
|
if($response !~ /^y/i) {
|
|
print "Aborting $app_name uninstallation!\n";
|
|
exit(0);
|
|
}
|
|
}
|
|
|
|
sub UninstallDependents {
|
|
my $RegObj = 0;
|
|
my $UninstallString = '';
|
|
my $type = 0;
|
|
my $rv = 0;
|
|
|
|
foreach $dependent (@$dependents) {
|
|
print "$dependent is dependent on $app_name\n" .
|
|
"and will not function correctly without it.\n" .
|
|
"Would you like to uninstall $dependent?\n" .
|
|
"[y|n] ==>";
|
|
while(($response = <STDIN>) !~ /[yn]/i){};
|
|
|
|
if($response =~ /y/i) {
|
|
$rv = $HKEY_LOCAL_MACHINE->Open("software\\microsoft\\windows\\currentversion\\uninstall\\$dependent", $RegObj);
|
|
if($rv) {
|
|
$rv = $RegObj->QueryValueEx("UninstallString", $type, $UninstallString);
|
|
if($rv) {
|
|
$RegObj->Close();
|
|
print $UninstallString;
|
|
print "Uninstalling $dependent...\n";
|
|
$rv = (system($UninstallString) ? 0 : 1);
|
|
}
|
|
}
|
|
|
|
if(!$rv) {
|
|
print "Error uninstalling $dependent!\n\n";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
sub CleanPath {
|
|
if(@$path_info) {
|
|
print "Cleaning PATH...\n";
|
|
my $path = '';
|
|
if(Win32::IsWinNT) {
|
|
my $Environment = 0;
|
|
if($HKEY_LOCAL_MACHINE->Open($ENVIRONMENT_KEY, $Environment)) {
|
|
if($Environment->QueryValueEx("PATH", $type, $path)) {
|
|
for $dir (@$path_info) {
|
|
$dir =~ s/\\/\\\\/g;
|
|
$path =~ s/$dir;?//ig;
|
|
}
|
|
$Environment->SetValueEx("PATH", -1, $type, $path);
|
|
}
|
|
}
|
|
} else {
|
|
my $file = "$ENV{'SystemDrive'}/autoexec.bat";
|
|
if(open(FILE, "<$file")) {
|
|
my @statements = <FILE>;
|
|
close(FILE);
|
|
my $path = '';
|
|
for $statement (@statements) {
|
|
if($statement =~ /\s+path\s?=/i) {
|
|
$path = $statement;
|
|
for $dir (@$path_info) {
|
|
$dir =~ s/\\/\\\\/g;
|
|
$path =~ s/$dir;?//ig;
|
|
}
|
|
}
|
|
}
|
|
if(open(FILE, ">$file")) {
|
|
print FILE @statements;
|
|
close(FILE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
sub RemoveIISVirtDirs {
|
|
if(@$iis_virt_dir) {
|
|
print "Removing IIS4 virtual directories...\n";
|
|
for $virt_dir (@$iis_virt_dir) {
|
|
$rv = MetabaseConfig::DeleteVirDir(1, $virt_dir);
|
|
if($rv =~ /^Error/i){
|
|
print "$rv\n";
|
|
system('pause');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
sub RemoveIISScriptMaps {
|
|
if(keys %$iis_script_map) {
|
|
print "Removing IIS4 script maps...\n";
|
|
my $virt_dir = '';
|
|
for $key (keys %$iis_script_map) {
|
|
print "Virtual Directory ==> $key\n";
|
|
for $script_map (@{$iis_script_map->{$key}}) {
|
|
print "\t$key ==> $script_map\n";
|
|
$virt_dir = $key;
|
|
$virt_dir = ($virt_dir eq '.' ? '' : $virt_dir);
|
|
$rv = MetabaseConfig::RemoveFileExtMapping(1, $virt_dir, $script_map);
|
|
if($rv =~ /^Error/i){
|
|
print "$rv\n";
|
|
system('pause');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
sub RemoveLinesFromFiles {
|
|
my $file;
|
|
|
|
foreach $file (keys %$lines_in_file) {
|
|
open(FILE, "<$file") or next;
|
|
my @lines = <FILE>;
|
|
close(FILE);
|
|
open(FILE, ">$file") or next;
|
|
LINE: foreach $line (@lines) {
|
|
chomp $line;
|
|
for ($offset = 0; $offset <= $#{$$lines_in_file{$file}}; $offset++) {
|
|
if ($line eq $$lines_in_file{$file}[$offset]) {
|
|
splice(@{$$lines_in_file{$file}}, $offset, 1);
|
|
next LINE;
|
|
}
|
|
}
|
|
print FILE "$line\n";
|
|
}
|
|
close(FILE);
|
|
}
|
|
}
|
|
|
|
sub RemoveDirectories {
|
|
if(@$directory) {
|
|
print "Removing directories...\n";
|
|
for $dir (@$directory) {
|
|
finddepth(\&DeleteFiles, $dir);
|
|
rmdir($dir);
|
|
}
|
|
}
|
|
}
|
|
|
|
sub RemoveFiles {
|
|
if(@$file) {
|
|
print "Removing files...\n";
|
|
for $file (@$file) {
|
|
unlink($file);
|
|
}
|
|
}
|
|
}
|
|
|
|
sub CallInstallShield {
|
|
print "Calling InstallShield...\n";
|
|
system("start $is_uninstall_string");
|
|
}
|
|
|
|
sub DeleteFiles {
|
|
if(-d $File::Find::name) {
|
|
rmdir("$File::Find::name");
|
|
} else {
|
|
unlink("$File::Find::name");
|
|
}
|
|
}
|
|
|