mturk 2004/02/29 05:10:45 Added: jk/native2/server/isapi install4iis.js Log: Installation script for jk2. Helps setting isapi_redirector2.dll as IIS filter and creates desired virtual directory wit execute permissions. Revision Changes Path 1.1 jakarta-tomcat-connectors/jk/native2/server/isapi/install4iis.js Index: install4iis.js =================================================================== /*
* 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 <[EMAIL PROTECTED]> * 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) { TRACE("Unable to find the " + _IIS_FILTERS + " for " + webServer.ServerComment); return null; } 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; case "f": params.FilterName = args.optarg; case "d": params.FilterDesc = args.optarg; case "l": params.FilterLib = args.optarg; case "v": params.WebName = args.optarg; case "h": Usage(args); return 0; } } 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); } if (!checkFilterExists(params)) { ERROR(args, "The specified filter library could not be found...\n" + "File " + params.WebPath + "\\" + params.FilterLib + " does not exist."); } if (args.argc && (args.optind > (args.argc - 1))) tchome = args.argv(args.argc + 1); 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); --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]