Monday, November 08, 2010 at 12:04 AM.

system.verbs.builtins.mainResponder.init

on init () {
	<<Changes:
		<<7/27/08; 2:28:11 PM by DW
			<<Init config.mainResponder.prefs.flUpdateNightly to false. The databases it updates are not part of the OPML Editor.
		<<11/9/07; 10:29:34 AM by DW
			<<config.mainResponder.prefs.flSaveDatabasesEveryMinute is false by default. Every time a database is saved it flashes the frontmost window. This is incredibly annoying if you're editing an outline. 
		<<11/14/05; 9:24:34 AM by DW
			<<Create system.temp.mainResponder if it doesn't already exist.
		<<3/10/03; 5:53:51 PM by JES
			<<Make sure that system.environment.isRadio is defined (and false).
		<<3/4/03; 3:19:15 PM by JES
			<<Return @config.mainResponder.
		<<9/3/02; 1:26:05 AM by JES
			<<Fixed a bonehead bug -- we were calling user.rootUpdates.init to initialize the user.rootUpdates.callbacks table. We should have called rootUpdates.init instead.
		<<8/28/02; 11:18:11 PM by JES
			<<Register admin site callbacks, and config.mainResponder.prefs.flLogRootUpdates.
		<<8/20/02; 12:38:52 AM by JES
			<<If the port 5335 listen configured at user.inetd.config.http2 is not installed, install it, based on the default http listen.
		<<8/18/02; 5:21:19 PM by JES
			<<Install the admin site pathEvaluation callback at config.mainresponder.callbacks.pathEvaluation.frontierAdminSite.
		<<8/1/02; 6:59:56 PM by JES
			<<Initialize new search engine prefs at config.mainResponder.search.prefs. No longer create config.mainresponder.data.searchQueue.
		<<06/22/00; 3:57:55 PM by PBS
			<<Set hashed cookies to true by default.
		<<06/17/00; 5:29:29 PM by PBS
			<<Now false by default: flKeepParamTable, flLog, flDiscussStatsNightly
		<<12/11/1999 at 5:29:32 AM by AR
			<<Commented out the code for hooking into the scheduler. This is now handled in mainResponder.startup.
		<<11/23/99; 4:10:06 PM by PBS
			<<Backups and discuss archiving now false by default.
		<<11/20/99; 4:29:29 PM by PBS
			<<Changed some defaults. Discuss archiving is true by default. Nightly updates are on by default; the default nightly update list contains Frontier, mainResponder, manila, and prefs.root. Save databases every minute is true by default. Logging database opens to the temp table is now false by default.
		<<11/16/99; 11:48:17 PM by PBS
			<<Set up prefs for flUpdateNightly, updateNightlyList, and securityLevel. The first two are prefs for automated nightly updates, the third is the security level for the Control Panel.
		<<10/25/99; 4:04:59 PM by PBS
			<<config.mainResponder.prefs.flControlPanel: if true, then the /controlPanel/ system website can be accessed. It's true by default.
		<<8/15/99; 9:53:42 AM by DW
			<<config.mainresponder.prefs.flLogReopenHourly, if true, we close the log file every hour. It will be re-opened by the next log.add call. In our work with the 6.1 kernel, we've determined that for busy servers this helps Frontier's memory utilization significantly, and the cost of re-opening the file once an hour is relatively small.
		<<8/15/99; 9:34:07 AM by DW
			<<Make sure that scheduler tasks are installed. This is also handled in mainResponder.install, but I don't want to ask people to run this script to go to 6.1, so we check to see if they're defined and if they're not we link them in.
		<<8/15/99; 8:26:14 AM by DW
			<<initialize config.mainresponder.prefs.flArchiveDiscuss and discussArchiveFolder.
		<<Wed, Mar 10, 1999 at 2:34:19 PM by PBS
			<<Initialize config.mainResponder.data.
			<<Initialize config.mainResponder.data.searchQueue.
		<<Wed, Mar 10, 1999 at 2:19:48 PM by PBS
			<<Initialize the config.mainresponder.search table.
			<<Set config.mainResponder.prefs.flSearchEngine to false by default.
				<<This means that this machine is not, by default, a search engine server.
			<<Set config.mainResponder.prefs.flLogMemAvail to false by default.
		<<Tue, Mar 9, 1999 at 4:12:13 PM by PBS
			<<Use Frontier.getSubFolder rather than mainResponder.getFolder.
		<<Sat, Mar 20, 1999 at 4:48:37 PM by PBS
			<<Added flConvertToMacText pref.
				<<On Macs, convert incoming latin text to Mac.
				<<On Windows the pref has no effect.
	on suretable (adrtable) {
		if not defined (adrtable^) {
			new (tabletype, adrtable)}};
	suretable (@config.mainresponder);
	bundle { //config.mainresponder.prefs
		suretable (@config.mainresponder.prefs);
		if not defined (config.mainresponder.prefs.backupFolder) {
			config.mainresponder.prefs.backupFolder = Frontier.getSubFolder ("/ops/backups/")};
		if not defined (config.mainresponder.prefs.defaultDiscussRoot) {
			config.mainresponder.prefs.defaultDiscussRoot = "discuss"};
		if not defined (config.mainresponder.prefs.defaultNewsRoot) {
			config.mainresponder.prefs.defaultNewsRoot = "default"};
		if not defined (config.mainresponder.prefs.flAllowPublicSearchSubmissions) { //PBS 3/9/99
			config.mainresponder.prefs.flAllowPublicSearchSubmissions = false};
		if not defined (config.mainresponder.prefs.flBackupNightly) {
			config.mainresponder.prefs.flBackupNightly = false}; //PBS 11/23/99: now false by default
		if not defined (config.mainresponder.prefs.flDiscussStatsNightly) {
			<<config.mainresponder.prefs.flDiscussStatsNightly = true
			config.mainresponder.prefs.flDiscussStatsNightly = false}; //PBS 06/17/00: Now false by default for 6.2.
		if not defined (config.mainresponder.prefs.flArchiveDiscuss) {
			config.mainresponder.prefs.flArchiveDiscuss = false}; //PBS 11/23/99: now false by default
		if not defined (config.mainresponder.prefs.discussArchiveFolder) {
			config.mainresponder.prefs.discussArchiveFolder = Frontier.getSubFolder ("/ops/discussArchive/")};
		if not defined (config.mainresponder.prefs.flControlPanel) { //PBS 10/25/99: pref for the /controlPanel/ site
			config.mainresponder.prefs.flControlPanel = true};
		if not defined (config.mainresponder.prefs.flDebug) {
			config.mainresponder.prefs.flDebug = false};
		if not defined (config.mainresponder.prefs.flKeepParamTable) {
			<<config.mainresponder.prefs.flKeepParamTable = true
			config.mainresponder.prefs.flKeepParamTable = false}; //PBS 06/17/00: Now false by default in 6.2.
		if not defined (config.mainresponder.prefs.flLog) {
			<<config.mainresponder.prefs.flLog = true
			config.mainresponder.prefs.flLog = false}; //PBS 06/17/00: HTTP logging now off by default in 6.2.
		if not defined (config.mainresponder.prefs.flLogMemavail) {
			config.mainresponder.prefs.flLogMemavail = false};
		if not defined (config.mainresponder.prefs.flLogDatabaseOpens) {
			config.mainresponder.prefs.flLogDatabaseOpens = false}; //PBS 11/20/99: now false by default, no to logging database opens to the temp table
		if not defined (config.mainresponder.prefs.flLogReopenHourly) {
			config.mainresponder.prefs.flLogReopenHourly = false};
		if not defined (config.mainresponder.prefs.flOpenAboutWindow) {
			config.mainresponder.prefs.flOpenAboutWindow = true};
		if not defined (config.mainresponder.prefs.flBuildPagesInBackground) {
			config.mainresponder.prefs.flBuildPagesInBackground = false}; //PBS 11/20/99: now false by default, no to building pages in the background
		if not defined (config.mainresponder.prefs.flProfiling) {
			config.mainresponder.prefs.flProfiling = false};
		if not defined (config.mainresponder.prefs.flSaveDatabasesEveryMinute) {
			config.mainresponder.prefs.flSaveDatabasesEveryMinute = false};
			<<PBS 11/20/99: save databases every minute is now true by default
			<<11/9/07; 10:30:34 AM by DW -- set false by default, see comment at top of script
		if not defined (config.mainResponder.prefs.flMembershipHashedCookies) { //PBS 06/22/00: true by default
			config.mainResponder.prefs.flMembershipHashedCookies = true};
		if not defined (config.mainresponder.prefs.flSearchEngine) {
			config.mainresponder.prefs.flSearchEngine = false};
		if not defined (config.mainresponder.prefs.flStats) {
			config.mainresponder.prefs.flStats = true};
		if not defined (config.mainresponder.prefs.flSubscriptions) {
			config.mainresponder.prefs.flSubscriptions = false};
		if not defined (config.mainresponder.prefs.hitsBetweenLogSaves) {
			config.mainresponder.prefs.hitsBetweenLogSaves = 100};
		if not defined (config.mainresponder.prefs.flConvertToMacText) { //PBS 3/20/99
			config.mainresponder.prefs.flConvertToMacText = true};
		if not defined (config.mainresponder.prefs.logFolder) {
			config.mainresponder.prefs.logFolder = Frontier.getSubFolder ("/ops/logs/")};
		if not defined (config.mainresponder.prefs.legalTags) {
			new (tabletype, @config.mainresponder.prefs.legalTags);
			config.mainresponder.prefs.legalTags.i = true;
			config.mainresponder.prefs.legalTags.pre = true};
		if not defined (config.mainresponder.prefs.flAllowByIpOnly) { //AR 11/04/1999
			config.mainresponder.prefs.flAllowByIpOnly = false};
		if not defined (config.mainresponder.prefs.allowedIpAddresses) { //AR 11/04/1999
			config.mainresponder.prefs.allowedIpAddresses = "127.0.0.1"};
		if not defined (config.mainResponder.prefs.flUpdateNightly) { //7/27/08 by DW
			config.mainResponder.prefs.flUpdateNightly = false};
		if not defined (config.mainResponder.prefs.updateNightlyList) { //PBS 11/16/99: list of gdbs to update nightly
			config.mainResponder.prefs.updateNightlyList = {"Frontier.root", "mainResponder.root", "manila.root", "prefs.root"}}; //PBS 11/20/99: update everything every night by default
		if not defined (config.mainResponder.prefs.securityLevel) { //PBS 11/16/99: set up security level pref
			config.mainResponder.prefs.securityLevel = 0};
		if not defined (config.mainResponder.prefs.flLogRootUpdates) {
			config.mainResponder.prefs.flLogRootUpdates = true}};
	bundle { //config.mainresponder.urls
		local (localhost = "localhost");
		suretable (@config.mainresponder.urls);
		bundle { //discuss urls
			local (basediscussurl = "http://" + localhost + "/htmlInterfaces/discussionGroup/");
			if not defined (config.mainResponder.urls.discussEditInBrowser) {
				config.mainResponder.urls.discussEditInBrowser = basediscussurl + "edit/editInBrowser$"};
			if not defined (config.mainResponder.urls.discussEditInFrontier) {
				config.mainResponder.urls.discussEditInFrontier = basediscussurl + "edit/editInFrontier$"};
			if not defined (config.mainResponder.urls.discussEnclosureDownloader) {
				config.mainResponder.urls.discussEnclosureDownloader = basediscussurl + "enclosureDownloader$"};
			if not defined (config.mainResponder.urls.discussEnclosureRPCer) {
				config.mainResponder.urls.discussEnclosureRPCer = basediscussurl + "enclosureRPCer$"};
			if not defined (config.mainResponder.urls.discussEnclosureViewer) {
				config.mainResponder.urls.discussEnclosureViewer = basediscussurl + "raw/messages/"};
			if not defined (config.mainResponder.urls.discussGetChangesFromWorkstation) {
				config.mainResponder.urls.discussGetChangesFromWorkstation = basediscussurl + "edit/getChangesFromWorkstation"};
			if not defined (config.mainResponder.urls.discussHomePage) {
				config.mainResponder.urls.discussHomePage = basediscussurl};
			if not defined (config.mainResponder.urls.discussMsgReader) {
				config.mainResponder.urls.discussMsgReader = basediscussurl + "msgReader$"};
			if not defined (config.mainResponder.urls.discussNewThread) {
				config.mainResponder.urls.discussNewThread = basediscussurl + "edit/newThread$"};
			if not defined (config.mainResponder.urls.discussPostEditedMessage) {
				config.mainResponder.urls.discussPostEditedMessage = basediscussurl + "edit/postEditedMsg"};
			if not defined (config.mainResponder.urls.discussPostMessage) {
				config.mainResponder.urls.discussPostMessage = basediscussurl + "edit/postMsg"};
			if not defined (config.mainResponder.urls.discussTopics) {
				config.mainResponder.urls.discussTopics = basediscussurl + "topics"}};
		bundle { //resources urls
			local (baseresourcesurl = "http://" + localhost + "/resources/");
			if not defined (config.mainresponder.urls.frontierLogo) {
				config.mainresponder.urls.frontierLogo = baseresourcesurl + "logos/logoWinNT.gif"};
			if not defined (config.mainresponder.urls.icons) {
				config.mainresponder.urls.icons = baseresourcesurl + "icons/"};
			if not defined (config.mainresponder.urls.imageCowSkull) {
				config.mainresponder.urls.imageCowSkull = baseresourcesurl + "userlandIcons/skull"}};
		bundle { //member urls
			local (basememberurl = "http://" + localhost + "/htmlInterfaces/logon/");
			if not defined (config.mainResponder.urls.memberCheckMail) {
				config.mainResponder.urls.memberCheckMail = basememberurl + "checkYourMail"};
			if not defined (config.mainResponder.urls.memberHome) {
				config.mainResponder.urls.memberHome = basememberurl + "welcome"};
			if not defined (config.mainResponder.urls.memberLogoff) {
				config.mainResponder.urls.memberLogoff = basememberurl + "logoffConfirm"};
			if not defined (config.mainResponder.urls.memberLogon) {
				config.mainResponder.urls.memberLogon = basememberurl}};
		bundle { //misc urls
			if not defined (config.mainResponder.urls.newsHome) {
				config.mainResponder.urls.newsHome = "http://" + localhost + "/"};
			if not defined (config.mainResponder.urls.searchHome) {
				config.mainResponder.urls.searchHome = "http://" + localhost + "/search/"};
			local (basepeopleurl = "http://" + localhost + "/htmlInterfaces/people/");
			if not defined (config.mainResponder.urls.prefsHome) {
				config.mainResponder.urls.prefsHome = basepeopleurl + "prefs/"};
			if not defined (config.mainResponder.urls.profilesHome) {
				config.mainResponder.urls.profilesHome = basepeopleurl + "profiles/"}}};
	bundle { //config.mainresponder.callbacks
		suretable (@config.mainresponder.callbacks);
		suretable (@config.mainresponder.callbacks.addMessage);
		suretable (@config.mainresponder.callbacks.controlAccess);
		suretable (@config.mainresponder.callbacks.editMessage);
		suretable (@config.mainresponder.callbacks.lightweightMacros);
		suretable (@config.mainresponder.callbacks.nightlyBackup);
		suretable (@config.mainResponder.callbacks.searchEngineSecurity); //PBS 3/9/99
		
		<<Add search engine callbacks.
		if not defined (config.mainResponder.callbacks.addMessage.index) {
			script.newScriptObject ("mainResponder.search.client.addMessageCallback (adrNewMsg)", @config.mainResponder.callbacks.addMessage.index);
			script.compile (@config.mainResponder.callbacks.addMessage.index)};
		if not defined (config.mainResponder.callbacks.editMessage.index) {
			script.newScriptObject ("mainResponder.search.client.addMessageCallback (adrEditedMsg)", @config.mainResponder.callbacks.editMessage.index);
			script.compile (@config.mainResponder.callbacks.editMessage.index)};
		
		<<Add security callback
		if not defined (config.mainResponder.callbacks.controlAccess.blockByIP) { //AR 11/04/1999
			script.newScriptObject ("mainResponder.security.blockHttpByIP ()", @config.mainResponder.callbacks.controlAccess.blockByIP)};
		
		<<Add pathEvaluation callback for the Admin site
		if not defined (config.mainresponder.callbacks.pathEvaluation) { //JES 8/18/02
			new (tableType, @config.mainresponder.callbacks.pathEvaluation)};
		if not defined (config.mainresponder.callbacks.pathEvaluation.frontierAdminSite) { //JES 8/18/02
			config.mainresponder.callbacks.pathEvaluation.frontierAdminSite = @mainResponder.adminSite.callbacks.pathEvaluation}};
	bundle { //config.mainresponder.data
		suretable (@config.mainresponder.data)};
		<<suretable (@config.mainresponder.data.searchQueue)
	bundle { //config.mainresponder.domains
		suretable (@config.mainresponder.domains);
		if sizeof (config.mainresponder.domains) == 0 {
			config.mainresponder.domains.default = Frontier.getSubFolder ("/www/")}};
	bundle { //config.mainresponder.globals
		suretable (@config.mainresponder.globals);
		if not defined (config.mainresponder.globals.allowDirectoryListings) { //PBS 11/19/99: default is now false
			config.mainresponder.globals.allowDirectoryListings = false};
		if not defined (config.mainresponder.globals.allowScriptListings) {
			config.mainresponder.globals.allowScriptListings = false};
		if not defined (config.mainresponder.globals.allowScriptsToRun) {
			config.mainresponder.globals.allowScriptsToRun = false};
		if not defined (config.mainresponder.globals.defaultDirectoryItems) {
			config.mainresponder.globals.defaultDirectoryItems = {"default.html", "default", "index.html", "index"}};
		if not defined (config.mainresponder.globals.defaultMembershipGroup) {
			config.mainresponder.globals.defaultMembershipGroup = "default"};
		if not defined (config.mainresponder.globals.flRender) {
			config.mainresponder.globals.flRender = false};
		if not defined (config.mainresponder.globals.flRenderingCache) {
			config.mainresponder.globals.flRenderingCache = false}};
	bundle { //config.mainresponder.search
		suretable (@config.mainresponder.search);
		if not defined (config.mainresponder.search.domain) {
			config.mainresponder.search.domain = "localhost"};
		if not defined (config.mainresponder.search.port) {
			config.mainresponder.search.port = 80};
		if not defined (config.mainresponder.search.addToIndex) {
			config.mainresponder.search.addToIndex = "mainResponder.search.index"};
		if not defined (config.mainresponder.search.restartIndex) {
			config.mainresponder.search.restartIndex = "mainResponder.search.restartIndex"};
		if not defined (config.mainresponder.search.sites) {
			suretable (@config.mainresponder.search.sites)};
		if not defined (config.mainResponder.search.prefs) {
			new (tableType, @config.mainResponder.search.prefs)};
		if not defined (config.mainResponder.search.prefs.flLogEnabled) {
			config.mainResponder.search.prefs.flLogEnabled = false};
		if not defined (config.mainResponder.search.prefs.flLogSearches) {
			config.mainResponder.search.prefs.flLogSearches = true};
		if not defined (config.mainResponder.search.prefs.flLogIndex) {
			config.mainResponder.search.prefs.flLogIndex = true};
		if not defined (config.mainResponder.search.prefs.flLogNoIndex) {
			config.mainResponder.search.prefs.flLogNoIndex = true};
		if not defined (config.mainResponder.search.prefs.flStoreFullText) {
			config.mainResponder.search.prefs.flStoreFullText = false};
		if not defined (config.mainResponder.search.prefs.minutesBetweenIndexes) {
			config.mainResponder.search.prefs.minutesBetweenIndexes = 60};
		if not defined (config.mainResponder.search.prefs.hoursToCacheSearchResults) {
			config.mainResponder.search.prefs.hoursToCacheSearchResults = 24}};
	bundle { //config.mainresponder.stats
		if not defined (config.mainResponder.stats) {
			new (tabletype, @config.mainResponder.stats)};
		if not defined (config.mainResponder.stats.ctDiscussionGroupReads) {
			config.mainResponder.stats.ctDiscussionGroupReads = 0}};
	bundle { //port 5335 listener
		if not defined (user.inetd.config.http2) {
			user.inetd.config.http2 = user.inetd.config.http;
			user.inetd.config.http2.port = 5336;
			if user.inetd.config.http2.startup {
				try {
					inetd.startOne (@user.inetd.config.http2)}}}};
	try { //register admin site callbacks
		if not defined (user.rootUpdates.callbacks) {
			rootUpdates.init ()};
		if not defined (user.rootUpdates.callbacks.afterInstallPart.mainResponder) {
			user.rootUpdates.callbacks.afterInstallPart.mainResponder = @mainResponder.adminSite.callbacks.logRootUpdate}};
	bundle { //miscellaneous clean-up
		if not defined (system.environment.isRadio) {
			system.environment.isRadio = false}};
	<<bundle //hook in to user.scheduler
		<<if not defined (user.scheduler.everyMinute.nirvanaServer)
			<<user.scheduler.everyMinute.nirvanaServer = @mainresponder.background.everyminute
		<<if not defined (user.scheduler.hourly.nirvanaServer)
			<<user.scheduler.hourly.nirvanaServer = @mainresponder.background.everyHour
		<<if not defined (user.scheduler.overnight.nirvanaServer)
			<<user.scheduler.overnight.nirvanaServer = @mainresponder.background.everynight
	bundle { //system.temp.mainResponder
		if not defined (system.temp.mainResponder) {
			new (tabletype, @system.temp.mainResponder)}};
	return (@config.mainResponder)}
<<bundle //test code
	<<local (ticks = clock.ticks ())
	<<for i = 1 to 100
		<<init ()
	<<dialog.notify ((double (clock.ticks ()) - ticks) / 60 + " secs.")
	<<



This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.