# # 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 .= $_, ); 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 = ) !~ /^[\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 = ) !~ /[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 = ; 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 = ; 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"); } }