blob: ad7fc044aa5e556fb781a5fa777137d3231f30b3 [file] [log] [blame]
/*
* Copyright 1999-2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Description: Install script for Tomcat JK2 ISAPI redirector
* Author: Mladen Turk <mturk@apache.org>
* Version: $Revision: 1.0 $
*/
/**
* Global variables
*/
//var IIsWebService;
//var IIsWebServer;
//var IIsROOT;
//var AppParams;
/**
* Defaults
*/
_DEFAULT_SERVER_NAME = "Default Web Site";
_DEFAULT_DESCRIPTION = "JK2 ISAPI Redirector";
_DEFAULT_FILTER_NAME = "jakarta";
_DEFAULT_HEADERS = "X-Powered-By: Apache Software Foundation"
_DEFAULT_OPTIONS = "rbdi";
_DEFAULT_REGISTRY = "HKLM\\SOFTWARE\\Apache Software Foundation\\Jakarta Isapi Redirector\\2.0";
_DEFAULT_FILTERLIB = "isapi_redirector2.dll";
_DEFAULT_WORKERS2 = "\\conf\\workers2.properties";
/**
* Set this to false to disable TRACE messages;
*/
_DEBUG = true;
_TRACE_COUNTER = 1;
/**
* Constants variables
*/
_APP_INPROC = 0;
_APP_OUTPROC = 1;
_APP_POOLED = 2
_IIS_OBJECT = "IIS://LocalHost/W3SVC";
_IIS_SERVER = "IIsWebServer";
_IIS_WEBDIR = "IIsWebVirtualDir";
_IIS_FILTERS = "IIsFilters";
_IIS_FILTER = "IIsFilter";
function ERROR(args, sMsg)
{
WScript.Echo("Error processing " + args.script + "\n" + sMsg);
WScript.Quit(-1);
}
function RPAD(str, n)
{
var p;
p = str;
for (i = str.length; i < n; i++)
p += " ";
return p;
}
function HEX(num)
{
var digits = "0123456789ABCDEF";
var n = num;
var h = "";
for (i = 0; i < 8; i++) {
h = digits.charAt(n & 15) + h;
n = n >>> 4;
}
return h;
}
function TRACE(sMsg)
{
if (_DEBUG) {
var line = _TRACE_COUNTER + " ";
WScript.Echo(line.substring(0, 4) + sMsg);
++_TRACE_COUNTER;
}
}
function EXCEPTION(exception, func)
{
WScript.Echo(exception + " In function '" +
func + "'\nError number: " +
HEX(exception.number) + " - " + exception.description + "");
WScript.Quit(-1);
}
function Parameters()
{
this.ServerName = _DEFAULT_SERVER_NAME;
this.WebDescription = _DEFAULT_DESCRIPTION;
this.FilterName = _DEFAULT_FILTER_NAME;
this.FilterDesc = _DEFAULT_DESCRIPTION;
this.WebName = _DEFAULT_FILTER_NAME;
this.Headers = _DEFAULT_HEADERS;
this.WebOptions = _DEFAULT_OPTIONS;
this.RegistryKey = _DEFAULT_REGISTRY;
this.AppProtection = _APP_POOLED;
this.WebPath = "C:";
this.FilterLib = _DEFAULT_FILTERLIB;
}
function findWebServiceObject(clsName, objName)
{
var webService;
var webObjects;
try {
webService = GetObject(_IIS_OBJECT);
if (!clsName || !objName)
return webService;
webObjects = new Enumerator(webService);
while (!webObjects.atEnd()) {
TRACE(RPAD(webObjects.item().Class, 18) +
RPAD(webObjects.item().Name, 15) + webObjects.item().AdsPath);
if (webObjects.item().Class == clsName &&
webObjects.item().Name == objName)
return webObjects.item();
webObjects.moveNext();
}
}
catch(exception) {
EXCEPTION(exception, "findWebServiceObject");
}
return null;
}
function findWebServer(serverComment)
{
var webService;
var webObjects;
try {
webService = GetObject(_IIS_OBJECT);
webObjects = new Enumerator(webService);
while (!webObjects.atEnd()) {
if (webObjects.item().Class == _IIS_SERVER &&
webObjects.item().ServerComment == serverComment)
return webObjects.item();
webObjects.moveNext();
}
}
catch(exception) {
EXCEPTION(exception, "findWebServer");
}
return null;
}
function findDefaultWebServer()
{
return findWebServer(_DEFAULT_SERVER_NAME);
}
function findADSIObject(adsiObject, clsName, objName)
{
var adsiObjects;
try {
adsiObjects = new Enumerator(adsiObject);
while (!adsiObjects.atEnd()) {
TRACE(RPAD(adsiObjects.item().Class, 18) +
RPAD(adsiObjects.item().Name, 15) + adsiObjects.item().AdsPath);
if (adsiObjects.item().Class == clsName &&
adsiObjects.item().Name == objName)
return adsiObjects.item();
adsiObjects.moveNext();
}
}
catch(exception) {
EXCEPTION(exception, "findADSIObject");
}
return null;
}
function hasOption(optString, optName)
{
if (optString.indexOf(optName) == -1)
return false;
else {
/* Check if the option is dissabled using '-' prefix */
if (optString.indexOf("-" + optName) == -1)
return true;
else
return false;
}
}
function createVirtualDir(webRootDir, appParams)
{
var newDir;
try {
newDir = findADSIObject(webRootDir, _IIS_WEBDIR, appParams.WebName);
if (newDir == null) {
TRACE("Creating new directory...");
newDir = webRootDir.Create(_IIS_WEBDIR, appParams.WebName);
newDir.AppFriendlyName = appParams.WebDescription;
newDir.Path = appParams.WebPath;
newDir.AppCreate2(appParams.AppProtection);
newDir.HttpCustomHeaders = appParams.Headers;
}
else {
TRACE("Updating existing directory...");
}
TRACE("Setting directory options...");
newDir.AccessExecute = hasOption(appParams.WebOptions, "x");
newDir.AccessRead = hasOption(appParams.WebOptions, "r");
newDir.AccessWrite = hasOption(appParams.WebOptions, "w");
newDir.AccessScript = hasOption(appParams.WebOptions, "s");
newDir.ContentIndexed = hasOption(appParams.WebOptions, "i");
newDir.EnableDirBrowsing = hasOption(appParams.WebOptions, "b");
newDir.EnableDefaultDoc = hasOption(appParams.WebOptions, "d");
newDir.SetInfo();
TRACE("Virtual directory [/" + appParams.WebName + "] set.");
return newDir;
}
catch(exception) {
EXCEPTION(exception, "createVirtualDir");
}
return null;
}
function createISAPIFilter(webServer, appParams)
{
var filters;
var newFilter;
try {
filters = findADSIObject(webServer, _IIS_FILTERS, "Filters");
if (filters == null) {
//may have to create the website-level filters container
filters = webServer.create(_IIS_FILTERS, "Filters");
}
newFilter = findADSIObject(filters, _IIS_FILTER, appParams.FilterName);
if (newFilter == null) {
TRACE("Creating new ISAPI filter...");
newFilter = filters.Create(_IIS_FILTER, appParams.FilterName);
}
else {
TRACE("Updating existing filter...");
}
TRACE("Setting filter options...");
TRACE("Filters order " + filters.FilterLoadOrder);
newFilter.FilterPath = appParams.WebPath + "\\" + appParams.FilterLib;
newFilter.FilterDescription = appParams.FilterDesc;
newFilter.SetInfo();
if (filters.FilterLoadOrder.indexOf(appParams.FilterName) == -1) {
filters.FilterLoadOrder += ", " + appParams.FilterName;
filters.SetInfo();
}
TRACE("Filter [" + appParams.FilterName + "] set.");
return newFilter;
}
catch(exception) {
EXCEPTION(exception, "createISAPIFilter");
}
return null;
}
function createVirtualExecDir(webRootDir, appParams)
{
var op, rv;
op = appParams.WebOptions;
appParams.WebOptions = op + "+x-r-i-b-d";
rv = createVirtualDir(webRootDir, appParams);
appParams.WebOptions = op;
return rv;
}
function deleteADSIObject(adsiObject, clsName, objName)
{
var rv = false;
try {
adsiObject.Delete(clsName, objName);
rv = true;
}
catch(exception) {
/*
* Exception is thrown if the object doesn't exist
* Just ignore...
*/
}
return rv;
}
function Arguments()
{
this.argv = WScript.Arguments;
this.argc = WScript.Arguments.length;
this.optarg = null;
this.optind = 0;
this.optopt = null;
this.opterr = null;
this.program = WScript.FullName.toLowerCase();
this.program = this.program.substr(this.program.lastIndexOf("\\") + 1);
if (this.program.indexOf("wscript.exe") == -1)
_DEBUG = false;
this.script = WScript.ScriptName;
}
function getopt(args, ostr)
{
if (args.optind >= args.argc) {
return null;
}
try {
var opt = args.argv(args.optind);
if (opt.charAt(0) == "-") {
var oi = ostr.indexOf(opt.charAt(1));
if (oi == -1) {
args.opterr = "Invalid option switch " + opt;
args.optopt = null;
args.optarg = null;
return null;
}
++args.optind;
if (ostr.charAt(oi + 1) == ":") {
if (args.optind < args.argc) {
args.optarg = args.argv(args.optind);
++args.optind;
}
else {
args.opterr = "Missing required argument value for " + opt;
args.optopt = null;
args.optarg = null;
return null;
}
}
args.optopt = ostr.charAt(oi);
return args.optopt;
}
}
catch(exception) {
EXCEPTION(exception, "getopt");
}
return null;
}
function checkFileExists(fname)
{
var fso;
fso = new ActiveXObject("Scripting.FileSystemObject");
if (fso.FileExists(fname))
return true;
else
return false;
}
function checkFilterExists(params)
{
return checkFileExists(params.WebPath + "\\" + params.FilterLib);
}
function Usage(args)
{
var prn;
prn = "Usage: " + args.program + " " + args.script + " [option]... " + "[path] [tomcat_home]\n\n" +
" -s WEBSERVER Use the WEBSERVER [" + _DEFAULT_SERVER_NAME + "]\n" +
" -f FILTERNAME Use the FILTERNAME [" + _DEFAULT_FILTER_NAME + "]\n" +
" -d DESCRIPTION Filter description [" + _DEFAULT_DESCRIPTION + "]\n" +
" -v VIRTUALDIR Create the VIRTUALDIR [/" + _DEFAULT_FILTER_NAME + "]\n" +
" -l ISAPILIB Use the ISAPILIB [" + _DEFAULT_FILTERLIB + "]\n" +
" -h display this help and exit\n" +
"\n [path] Virtual directory path" +
"\n Set this to directory containing " + _DEFAULT_FILTERLIB +
"\n [tomcat_home] Path to the tomcat home directory";
WScript.Echo(prn);
}
function Main(args)
{
var params;
var opt;
var IIsWebService;
var IIsWebServer;
var IIsROOT;
var IIsFilters;
var IIsFilter;
var tchome = null;
var workers2 = null;
params = new Parameters();
while ((opt = getopt(args, "s:f:d:v:l:h"))) {
switch (opt) {
case "s":
params.ServerName = args.optarg;
break;
case "f":
params.FilterName = args.optarg;
break;
case "d":
params.FilterDesc = args.optarg;
break;
case "l":
params.FilterLib = args.optarg;
break;
case "v":
params.WebName = args.optarg;
break;
case "h":
default:
Usage(args);
return 0;
break;
}
}
TRACE("argc " + args.argc + " optind " + args.optind);
if (args.optind >= args.argc) {
/* Case when isapi_redirector2.dll is inside TOMCAT_HOME\bin */
params.WebPath = WScript.ScriptFullName.substr(0,
WScript.ScriptFullName.lastIndexOf("\\"));
tchome = params.WebPath.substr(0, params.WebPath.lastIndexOf("\\"));
}
else {
params.WebPath = args.argv(args.optind);
++args.optind;
}
if (!checkFilterExists(params)) {
ERROR(args, "The specified filter library could not be found...\n" +
"File " + params.WebPath + "\\" + params.FilterLib + " does not exist.");
}
if (args.optind < args.argc)
tchome = args.argv(args.optind);
else if (!tchome)
tchome = params.WebPath;
workers2 = tchome + _DEFAULT_WORKERS2 ;
if (!checkFileExists(workers2)) {
ERROR(args, "The specified configuration file could not be found...\n" +
"File " + workers2 + " does not exist.");
}
if ((IIsWebService = findWebServiceObject(null, null)) == null) {
ERROR(args, "Unable to find Web Service ADSI object\n" +
"Check the security settings...");
}
if ((IIsWebServer = findWebServer(params.ServerName)) == null) {
ERROR(args, "Unable to find Web Server ADSI object...\n" +
"The '" + params.ServerName + "' does not exists.");
}
if ((IIsROOT = findADSIObject(IIsWebServer, _IIS_WEBDIR, "ROOT")) == null) {
ERROR(args, "Unable to find Web Server ROOT direcrory.");
}
if (!createVirtualExecDir(IIsROOT, params)) {
ERROR(args, "Unable to create virual directory /" + params.WebName);
}
if (!createISAPIFilter(IIsWebServer, params)) {
/* TODO: roll-back virtual dir */
ERROR(args, "Unable to create the '" + params.FilterName + "' filter.");
}
/** Finaly set the registry entries
*/
var WshShell = WScript.CreateObject("WScript.Shell");
WshShell.RegWrite(_DEFAULT_REGISTRY + "\\extensionUri",
"/" + params.FilterName + "/" + params.FilterLib,
"REG_SZ");
WshShell.RegWrite(_DEFAULT_REGISTRY + "\\serverRoot",
tchome, "REG_SZ");
WshShell.RegWrite(_DEFAULT_REGISTRY + "\\workersFile",
workers2, "REG_SZ");
WshShell.RegWrite(_DEFAULT_REGISTRY + "\\authComplete", "0", "REG_SZ");
WshShell.RegWrite(_DEFAULT_REGISTRY + "\\threadPool", "20", "REG_SZ");
return 0;
}
/* The main program */
var args = new Arguments();
rv = Main(args);
WScript.Quit(rv);