Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

519 lines
17 KiB

######################################################
# Company : ActiveState Tool Corp.
# Author : James A. Snyder ( [email protected] )
# Date : 7/11/98
# Copyright © 1998 ActiveState Tool Corp., all rights reserved.
#
######################################################
# MetabaseConfig.pm
package MetabaseConfig;
use Win32::OLE;
use strict;
eval('use Win32::Service;');
if(Win32::IsWinNT && $@) {
print $@;
}
######################################################
# ScriptMap flags
sub MD_SCRIPTMAPFLAG_SCRIPT_ENGINE{1};
sub MD_SCRIPTMAPFLAG_CHECK_PATH_INFO{4};
######################################################
# Access Permission Flags
sub MD_ACCESS_READ { 0x00000001 }; # // Allow for Read
sub MD_ACCESS_WRITE { 0x00000002 }; # // Allow for Write
sub MD_ACCESS_EXECUTE { 0x00000004 }; # // Allow for Execute
sub MD_ACCESS_SCRIPT { 0x00000200 }; # // Allow for Script execution
sub MD_ACCESS_NO_REMOTE_WRITE { 0x00000400 }; # // Local host access only
sub MD_ACCESS_NO_REMOTE_READ { 0x00001000 }; # // Local host access only
sub MD_ACCESS_NO_REMOTE_EXECUTE { 0x00002000 }; # // Local host access only
sub MD_ACCESS_NO_REMOTE_SCRIPT { 0x00004000 }; # // Local host access only
######################################################
$MetabaseConfig::LogObject = undef;
# Set the reference to the Log object
sub SetLogObject {
$MetabaseConfig::LogObject = shift;
if(!$MetabaseConfig::LogObject->isa("Log")) {
$MetabaseConfig::LogObject = undef;
}
}
$MetabaseConfig::StatusStarted = 4;
$MetabaseConfig::StatusStopped = 1;
sub StopIISAdmin {
my $output = `net stop IISAdmin /y`;
if($?) {
return "oops there was a problem stopping the IISAdmin service\n";
}
$output = `net start`;
my @output = split($/, $output);
my $grep_results = grep(/IIS Admin Service/, @output);
if($grep_results) {
return "oops we thought we stopped the IISAdmin service when we didn't\n";
}
# MetabaseConfig::StopService('W3SVC') || return "Error stopping the W3SVC service";
# MetabaseConfig::StopService('MSFTPSVC') || return "Error stopping the MSFTPSVC service";
# MetabaseConfig::StopService('IISADMIN') || return "Error stopping the IISADMIN service";
# my $result = `net stop IISADMIN /y`;
}
sub StartIISAdmin {
MetabaseConfig::StartService('IISADMIN') || return "Error starting the IISADMIN service";
MetabaseConfig::StartService('W3SVC') || return "Error starting the W3SVC service";
MetabaseConfig::StartService('MSFTPSVC') || return "Error starting the MSFTPSVC service";
# my $result = `net start IISADMIN /y`;
# $result = `net start W3SVC /y`;
# $result = `net start MSFTPSVC /y`;
}
######################################################
# StopIISAdmin();
sub StopService {
my $service = shift;
my $status = {};
my $rv = Win32::Service::GetStatus('', $service, $status);
if(!$rv) {
print Win32::FormatMessage(Win32::GetLastError()), "\n";
$MetabaseConfig::LogObject->ERROR("Could not GetStatus of $service service in first attempt MetabaseConfig::StopIISAdmin: $!") if $MetabaseConfig::LogObject;
return 1;
}
if($status->{'CurrentState'} != $MetabaseConfig::StatusStopped) {
$rv = Win32::Service::StopService('', $service);
if(!$rv) {
print Win32::FormatMessage(Win32::GetLastError()), "\n";
$MetabaseConfig::LogObject->ERROR("Could not stop $service service in MetabaseConfig::StopIISAdmin: $!") if $MetabaseConfig::LogObject;
return $rv;
}
while($status->{'CurrentState'} != $MetabaseConfig::StatusStopped) {
sleep(10);
$rv = Win32::Service::GetStatus('', $service, $status);
if(!$rv) {
print Win32::FormatMessage(Win32::GetLastError()), "\n";
$MetabaseConfig::LogObject->ERROR("Could not GetStatus of $service service in MetabaseConfig::StopIISAdmin: $!") if $MetabaseConfig::LogObject;
return $rv;
}
}
}
$MetabaseConfig::LogObject->TRACE("$service service is stopped in MetabaseConfig::StopIISAdmin") if $MetabaseConfig::LogObject;
return 1;
}
######################################################
# StartIISAdmin();
sub StartService {
my $service = shift;
my $status = {};
my $rv = Win32::Service::GetStatus('', $service, $status);
if(!$rv) {
$MetabaseConfig::LogObject->ERROR("Could not GetStatus of $service service in first attempt MetabaseConfig::StartIISAdmin: $!") if $MetabaseConfig::LogObject;
return 1;
}
if($status->{'CurrentState'} != $MetabaseConfig::StatusStarted) {
$rv = Win32::Service::StartService('', $service);
if(!$rv) {
$MetabaseConfig::LogObject->ERROR("Could not start $service service in MetabaseConfig::StartIISAdmin: $!") if $MetabaseConfig::LogObject;
return $rv;
}
while($status->{'CurrentState'} != $MetabaseConfig::StatusStarted) {
sleep(5);
$rv = Win32::Service::GetStatus('', $service, $status);
if(!$rv) {
$MetabaseConfig::LogObject->ERROR("Could not GetStatus of $service service in MetabaseConfig::StartIISAdmin: $!") if $MetabaseConfig::LogObject;
return $rv;
}
}
}
$MetabaseConfig::LogObject->TRACE("$service service is started in MetabaseConfig::StartIISAdmin") if $MetabaseConfig::LogObject;
return 1;
}
@MetabaseConfig::ServerStash = ();
######################################################
# StashRunningServers()
sub StashRunningServers {
my $index = 1;
my $path = 'IIS://localhost/W3SVC/';
my $testPath = $path . $index;
my $server;
$MetabaseConfig::LogObject->TRACE("Stashing running web servers in MetabaseConfig::StashRunningServers") if $MetabaseConfig::LogObject;
while ( ($server = Win32::OLE->GetObject($testPath)) )
{
$MetabaseConfig::ServerStash[$index] = ($server->Status() == 2);
$index++;
$testPath = $path . $index;
}
}
######################################################
# StartStashedServers()
sub StartStashedServers {
my $index = 1;
my $path = 'IIS://localhost/W3SVC/';
my $testPath = $path . $index;
my $server;
my $wasStarted;
$MetabaseConfig::LogObject->TRACE("Starting stashed web servers MetabaseConfig::StartStashedServers") if $MetabaseConfig::LogObject;
foreach $wasStarted (@MetabaseConfig::ServerStash) {
if($wasStarted == 1) {
$server = Win32::OLE->GetObject($testPath);
if(!$server) {
$MetabaseConfig::LogObject->ERROR("Could not GetObject($testPath) in MetabaseConfig::StartStashedServers: " . Win32::OLE->LastError()) if $MetabaseConfig::LogObject;
} else {
$server->Start();
}
}
$index++;
$testPath = $path . $index;
}
}
######################################################
# StartWWW( $dwWebServerID );
sub StartWWW
{
my $serverID = $_[0];
my $path = 'IIS://localhost/W3SVC/' . $serverID;
my $server = Win32::OLE->GetObject($path);
$MetabaseConfig::LogObject->TRACE("Starting WWWServer: $path") if $MetabaseConfig::LogObject;
if(!$server) {
$MetabaseConfig::LogObject->ERROR("Could not GetObject($path) in MetabaseConfig::StartWWW: " . Win32::OLE->LastError()) if $MetabaseConfig::LogObject;
return undef;
}
$server->Start();
}
######################################################
# StopWWW( $dwWebServerID );
sub StopWWW
{
my $serverID = $_[0];
my $path = 'IIS://localhost/W3SVC/' . $serverID;
my $server = Win32::OLE->GetObject($path);
$MetabaseConfig::LogObject->TRACE("Stopping WWWServer: $path") if $MetabaseConfig::LogObject;
if(!$server) {
$MetabaseConfig::LogObject->ERROR("Could not GetObject($path) in MetabaseConfig::StopWWW: " . Win32::OLE->LastError()) if $MetabaseConfig::LogObject;
return undef;
}
$server->Stop();
}
######################################################
# $arrayRef = EnumWebServers();
sub EnumWebServers
{
my $index = 1;
my $path = 'IIS://localhost/W3SVC/';
my $testPath = $path . $index;
my $server;
my @webServers = ();
while ( ($server=Win32::OLE->GetObject($testPath)) )
{
$webServers[$index] = $server->{ServerComment};
$index++;
$testPath = $path . $index;
}
return \@webServers;
}
######################################################
# GetFileExtMapping($dwServerID, $szVirDir, $szFileExt)
sub GetFileExtMapping
{
if( @_ < 3 )
{
# die "Not enough Parameters for GetFileExtMapping()\n";
}
my $server = '';
my $szVirDirPath = '';
my $dwServerID = shift;
my $szVirDir = shift;
my $szFileExt = shift;
my $scriptMap = '';
# Create string that contains the Path to our Virutal directory or the WebServer's Root
$szVirDirPath = 'IIS://localhost/W3SVC/' . $dwServerID . '/ROOT';
$MetabaseConfig::LogObject->TRACE("Getting file extension mapping: $szFileExt") if $MetabaseConfig::LogObject;
if( length($szVirDir) )
{
$szVirDirPath = $szVirDirPath . "/" . $szVirDir;
}
# Get the IIsVirtualDir Automation Object
$server = Win32::OLE->GetObject($szVirDirPath);
if(!$server) {
$MetabaseConfig::LogObject->ERROR("Could not GetObject($szVirDirPath) in MetabaseConfig::GetFileExtMapping: " . Win32::OLE->LastError) if $MetabaseConfig::LogObject;
return;
}
foreach $scriptMap (@{$server->{ScriptMaps}}) {
if($scriptMap =~ /^$szFileExt,/i) {
return $scriptMap;
}
}
}
######################################################
# RemoveFileExtMapping($dwServerID, $szVirDir, $szFileExt)
sub RemoveFileExtMapping
{
if( @_ < 3 )
{
# die "Not enough Parameters for AddFileExtMapping()\n";
}
my $szVirDirPath = '';
my @newScriptMap = ();
my $dwServerID = shift;
my $szVirDir = shift;
my $szFileExt = shift;
my $virDir;
my $ScriptMap = '';
if(GetFileExtMapping($dwServerID, $szVirDir, $szFileExt) eq '') {
return 1;
}
# Create string that contains the Path to our Virutal directory or the WebServer's Root
$szVirDirPath = 'IIS://localhost/W3SVC/' . $dwServerID . '/ROOT';
if( length($szVirDir) )
{
$szVirDirPath = $szVirDirPath . "/" . $szVirDir;
}
# Get the IIsVirtualDir Automation Object
$virDir = Win32::OLE->GetObject($szVirDirPath);
if(!$virDir) {
$MetabaseConfig::LogObject->ERROR("Could not GetObject($szVirDirPath) in MetabaseConfig::RemoveFileExtMapping: " . Win32::OLE->LastError()) if $MetabaseConfig::LogObject;
return;
}
$MetabaseConfig::LogObject->TRACE("Removing file extension mapping: $szFileExt") if $MetabaseConfig::LogObject;
foreach $ScriptMap (@{$virDir->{ScriptMaps}}) {
if($ScriptMap !~ /^$szFileExt,/i) {
push(@newScriptMap, $ScriptMap);
}
}
# set the ScriptsMaps property to our new script map array
$virDir->{ScriptMaps} = \@newScriptMap;
# Save the new script mappings
$virDir->SetInfo();
}
######################################################
# AddFileExtMapping($dwServerID, $szVirDir, $szFileExt, $lpszExec, $dwFlags, $szMethodExclusions)
sub AddFileExtMapping
{
if( @_ < 6 )
{
# die "Not enough Parameters for AddFileExtMapping()\n";
}
my $server = '';
my $szVirDirPath = '';
my $scriptMapping = '';
my @newScriptMap = ();
my $dwServerID = shift;
my $szVirDir = shift;
my $szFileExt = shift;
my $szExecPath = shift;
my $dwFlags = shift;
my $szMethodExc = shift;
if(GetFileExtMapping($dwServerID, $szVirDir, $szFileExt) ne '') {
return 1;
}
# Create string that contains the Path to our Virutal directory or the WebServer's Root
$szVirDirPath = 'IIS://localhost/W3SVC/' . $dwServerID . '/ROOT';
if( length($szVirDir) )
{
$szVirDirPath = $szVirDirPath . "/" . $szVirDir;
}
# Get the IIsVirtualDir Automation Object
$server = Win32::OLE->GetObject($szVirDirPath);
if(!$server) {
$MetabaseConfig::LogObject->ERROR("Could not GetObject($szVirDirPath) in MetabaseConfig::AddFileExtMapping: " . Win32::OLE->LastError()) if $MetabaseConfig::LogObject;
return;
}
# create our new script mapping entry
$scriptMapping = "$szFileExt,$szExecPath,$dwFlags";
# make sure the length of szMethodExc is greater than 2 before adding szMethodExc to the script mapping
if( length($szMethodExc) > 2 )
{
$scriptMapping = $scriptMapping . ",$szMethodExc";
}
$MetabaseConfig::LogObject->TRACE("Adding file extension mapping: $scriptMapping") if $MetabaseConfig::LogObject;
@newScriptMap = @{$server->{ScriptMaps}};
push(@newScriptMap, $scriptMapping);
$server->{ScriptMaps} = \@newScriptMap;
# Save the new script mappings
$server->SetInfo();
}
######################################################
# CreateVirDir( $dwServerID, $szPath, $szName, $dwAccessPerm, $bEnableDirBrowse, $bAppRoot);
sub CreateVirDir
{
if( @_ < 6 )
{
# die "Not enough Parameters for CreateVirDir()\n";
}
# Local Variables
my $serverPath;
my $server;
my $virDir;
my $dwServerID = shift;
my $szPath = shift;
my $szName = shift;
my $dwAccessPerm = shift;
my $bEnableDirBrowse = shift;
my $bAppRoot = shift;
if($szPath eq "" || $szName eq "")
{
die "Incorrect Parameter to CreateVirDir() ...\n";
}
# Create string that contains the Path to our Webserver's Root
$serverPath = 'IIS://localhost/W3SVC/' . $dwServerID . '/Root';
$MetabaseConfig::LogObject->TRACE("Creating virtual directory: $szName") if $MetabaseConfig::LogObject;
# Get the IIsWebServer Automation Object
$server = Win32::OLE->GetObject($serverPath);
if(!$server) {
$MetabaseConfig::LogObject->ERROR("Could not GetObject($serverPath) in MetabaseConfig::CreateVirDir: " . Win32::OLE->LastError()) if $MetabaseConfig::LogObject;
return;
}
# Create Our Virutual Directory or get it if it already exists
$virDir = $server->Create('IIsWebVirtualDir', $szName);
if( not UNIVERSAL::isa($virDir, 'Win32::OLE') )
{
$MetabaseConfig::LogObject->ERROR("Did not create IIsWebVirtualDir object in MetabaseConfig::CreateVirDir: " . Win32::OLE->LastError()) if $MetabaseConfig::LogObject;
$virDir = $server->GetObject('IIsWebVirtualDir', $szName);
if(!$virDir) {
$MetabaseConfig::LogObject->ERROR("Could not GetObject($szName) in MetabaseConfig::CreateVirDir: " . Win32::OLE->LastError()) if $MetabaseConfig::LogObject;
return;
}
}
$virDir->{Path} = $szPath;
$virDir->{AppFriendlyName} = $szName;
$virDir->{EnableDirBrowsing} = $bEnableDirBrowse;
$virDir->{AccessRead} = $dwAccessPerm & MD_ACCESS_READ;
$virDir->{AccessWrite} = $dwAccessPerm & MD_ACCESS_WRITE;
$virDir->{AccessExecute} = $dwAccessPerm & MD_ACCESS_EXECUTE;
$virDir->{AccessScript} = $dwAccessPerm & MD_ACCESS_SCRIPT;
$virDir->{AccessNoRemoteRead} = $dwAccessPerm & MD_ACCESS_NO_REMOTE_READ;
$virDir->{AccessNoRemoteScript} = $dwAccessPerm & MD_ACCESS_NO_REMOTE_SCRIPT;
$virDir->{AccessNoRemoteWrite} = $dwAccessPerm & MD_ACCESS_NO_REMOTE_WRITE;
$virDir->{AccessNoRemoteExecute} = $dwAccessPerm & MD_ACCESS_NO_REMOTE_EXECUTE;
$virDir->AppCreate($bAppRoot);
$virDir->SetInfo();
}
######################################################
# DeleteVirDir( $dwServerID, $szVirDir );
sub DeleteVirDir
{
my $dwServerID = $_[0];
my $szVirDir = $_[1];
my $szPath = '';
my $server = '';
if($dwServerID eq "" || $szVirDir eq "")
{
# die "Incorrect Parameter to DeleteVirDir() ...\n";
}
# Create string that contains the Path to our Webserver's Root
$szPath = 'IIS://localhost/W3SVC/' . $dwServerID . '/Root';
$MetabaseConfig::LogObject->TRACE("Deleting virtual directory: $szPath") if $MetabaseConfig::LogObject;
# Get the IIsWebServer Automation Object
$server = Win32::OLE->GetObject($szPath);
if(!$server) {
$MetabaseConfig::LogObject->ERROR("Could not GetObject($szPath) in MetabaseConfig::DeleteVirDir: " . Win32::OLE->LastError()) if $MetabaseConfig::LogObject;
return;
}
$server->Delete( "IIsWebVirtualDir", $szVirDir );
$server->SetInfo();
}
1;