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

system.verbs.builtins.mainResponder.utilities.getConfigInfo

on getConfigInfo (flIncludeHeader=true) {
	<<Get general config info about Frontier, mainResponder, and Manila.
	local (mailtext = "", indentlevel = 0);
	local (fldebug = false); //should false except when you're working on the script
	on add (s) {
		mailtext = mailtext + string.filledstring ("   ", indentlevel) + s + "\r\n"};
	on addOnOff (label, bool) {
		local (s = label + ": ");
		if bool {
			s = s + "On"}
		else {
			s = s + "Off"};
		add (s)};
	
	add ("Frontier configuration on " + clock.now () + "."); indentlevel++;
	add ("");
	bundle { //Installation information
		if flIncludeHeader {
			add ("Installation information:"); indentlevel++;
			add ("");
			add ("Frontier version: " + Frontier.version ());
			local (os = "Windows");
			if system.environment.isMac {
				if system.environment.isCarbon {
					os = "Mac OS X"}
				else {
					os = "Mac OS"}};
			add ("Operating System: " + os);
			local (osVersion = system.environment.osVersionString);
			if system.environment.isCarbon {
				osVersion = string.replace (osVersion, "16", "10")};
			add ("OS Version: " + osVersion);
			add ("IP address: " + tcp.dns.getMyDottedId ());
			add ("Frontier folder: " + file.folderfrompath (frontier.getprogrampath ()));
			add (""); indentlevel--}};
	bundle { //About you and your computer
		add ("About you and your computer:"); indentlevel++;
		add ("");
		add ("Name: " + user.prefs.name);
		add ("Organization: " + user.prefs.organization);
		add ("Mail address: " + user.prefs.mailAddress);
		add ("Outgoing mail server: " + user.prefs.mailHost);
		addOnOff ("Web server", inetd.isDaemonRunning (@user.inetd.config.http));
		add ("Port: " + user.inetd.config.http.port);
		add ("Log folder: " + user.log.prefs.folder);
		add (""); indentlevel--};
	bundle { //Safety and performance
		add ("Safety and performance:"); indentlevel++;
		add ("");
		addOnOff ("Save changed databases every minute", config.mainResponder.prefs.flSaveDatabasesEveryMinute);
		add (""); indentlevel--};
	bundle { //Proxy server
		add ("Proxy server:"); indentlevel++;
		add ("");
		add ("Domain: " + user.webbrowser.proxy.domain);
		add ("Port: " + user.webbrowser.proxy.port);
		add ("Username: " + user.webbrowser.proxy.username);
		add (""); indentlevel--};
	bundle { //Installed tools
		add ("Installed tools:"); indentlevel++;
		add ("");
		local (adrItem);
		for adrItem in @user.tools.databases {
			if adrItem^.flInstalled {
				add (nameOf (adrItem^))}};
		add (""); indentlevel--};
	bundle { //Open Databases
		add ("Open Databases:"); indentlevel++;
		add ("");
		on visit (f) {
			local (fname = file.fileFromPath (f));
			local (folder = file.folderFromPath (f));
			local (folderName = file.fileFromPath (folder));
			folderName = string.popTrailing (folderName, file.getPathChar ());
			local (size = string.megabyteString (file.size (f)));
			add (folderName + "/" + fname + ": " + size)};
		table.visitOpenDatabases (@visit);
		add (""); indentlevel--};
	bundle { //Tools folder contents
		add ("Tools folder:"); indentlevel++;
		add ("");
		local (f);
		fileloop (f in Frontier.tools.getToolsFolderPath ()) {
			local (fname = file.fileFromPath (f));
			local (size = string.megabyteString (file.size (f)));
			add (fname + ": " + size)};
		add (""); indentlevel--};
	bundle { //agents
		add ("Agents:"); indentlevel++;
		add ("");
		local (adrItem);
		for adrItem in @system.agents {
			add (nameOf (adrItem^))};
		add (""); indentlevel--};
	bundle { //threads
		add ("Threads:"); indentlevel++;
		add ("");
		local (adrItem);
		for adrItem in @user.scheduler.threads {
			local (flDefined = true, flEnabled = true);
			if not defined (adrItem^) {
				flDefined = false}
			else {
				if not (adrItem^^.enabled) {
					flEnabled = false}};
			local (threadName = nameOf (adrItem^));
			if not flDefined {
				add (threadName + ": [not defined]")}
			else {
				if not flEnabled {
					add (threadName + ": [disabled]")}
				else {
					add (threadName + ": " + adrItem^)}}};
		add (""); indentlevel--};
	bundle { //XML-RPC
		add ("XML-RPC:"); indentlevel++;
		add ("");
		local (ctOutgoingAsynchMessages = 0);
		if defined (user.betty.queueOutgoing.table) {
			ctOutgoingAsynchMessages = sizeOf (user.betty.queueOutgoing.table)};
		addOnOff ("Allow by IP Only", user.betty.prefs.flAllowByIPOnly);
		<<addOnOff ("Keep Asynch Client Log", user.betty.prefs.flKeepAsynchClientLog)
		addOnOff ("Keep Server Log", user.betty.prefs.flKeepServerLog);
		add ("RPC Client Default Path: " + user.betty.prefs.rpcClientDefaultPath);
		add ("RPC Client Default Timeout: " + user.betty.prefs.rpcClientDefaultTimeout);
		add ("# Pending Asynch Messages: " + ctOutgoingAsynchMessages);
		add ("");
		add ("Handlers:"); indentlevel++;
		add ("");
		local (adr);
		for adr in @user.betty.rpcHandlers {
			local (name = nameOf (adr^));
			local (type = typeOf (adr^));
			local (val = "");
			case type {
				tableType {
					val = sizeOf (adr^) + " items"};
				scriptType {
					val = sizeOf (adr^) + " lines"};
				addressType {
					val = adr^}};
			if val == "" {
				add (name)}
			else {
				add (name + ": " + val)}};
		add ("");
		indentlevel--;
		addOnOff ("RPC2 responder enabled", defined (user.webserver.responders.RPC2.enabled) and user.webserver.responders.RPC2.enabled);
		add (""); indentlevel--};
	bundle { //SOAP
		add ("SOAP:"); indentlevel++;
		add ("");
		add ("RPC Client Default Timeout: " + user.soap.prefs.rpcClientDefaultTimeout);
		add ("");
		add ("Handlers:"); indentlevel++;
		add ("");
		local (adr);
		for adr in @user.soap.rpcHandlers {
			local (name = nameOf (adr^));
			local (type = typeOf (adr^));
			local (val = "");
			case type {
				tableType {
					val = sizeOf (adr^) + " items"};
				scriptType {
					val = sizeOf (adr^) + " lines"};
				addressType {
					val = adr^}};
			if val == "" {
				add (name)}
			else {
				add (name + ": " + val)}};
		add ("");
		indentlevel--;
		addOnOff ("SOAP responder enabled", defined (user.webserver.responders.soap.enabled) and user.webserver.responders.soap.enabled);
		add (""); indentlevel--};
	on doSimpleTable (adrTable) {
		local (adrItem);
		for adrItem in adrTable {
			local (name = nameOf (adrItem^));
			local (lowerName = string.lower (name));
			if lowerName contains "password" or lowerName contains "serialnum" {
				continue};
			local (value);
			local (size = sizeOf (adrItem^));
			case typeOf (adrItem^) {
				outlineType {
					value = "outline: " + size + " lines"};
				scriptType {
					value = "script: " + size + " lines"};
				wpTextType {
					value = "wp-text: " + size + " characters"};
				tableType {
					value = "table: " + size + " items"};
				menubarType {
					value = "menubar: " + size + " lines"}}
			else {
				value = string (adrItem^)};
			add (name + ": " + value)}};
	on addTableAsSection (title, adrTable) {
		local (nameAddress = string.popFileFromAddress (string (adrTable)));
		title = title + " (" + nameAddress + "): ";
		add (title); indentLevel++;
		add ("");
		doSimpleTable (adrTable);
		add (""); indentLevel--};
	bundle { //Webserver
		bundle { //Responders
			add ("Responders:"); indentlevel++;
			add ("");
			local (adr);
			for adr in @user.webserver.responders {
				local (name = nameOf (adr^));
				while (typeOf (adr^) == addressType) {
					adr = adr^};
				local (flEnabled = adr^.enabled);
				addOnOff (name, flEnabled)};
			add (""); indentlevel--};
		bundle { //Webserver stats
			add ("Webserver stats:"); indentlevel++;
			add ("");
			add ("Hits: " + user.webserver.stats.hits);
			add ("Max connections: " + user.webserver.stats.maxConnections);
			add ("Max memory available: " + user.webserver.stats.maxMemAvail);
			add ("Min memory available: " + user.webserver.stats.minMemAvail);
			add ("Up since: " + user.webserver.stats.upSince);
			if defined (user.webserver.stats.wormHits) {
				add ("Worm hits: " + user.webserver.stats.wormHits)};
			add (""); indentlevel--};
		bundle { //Webserver prefs
			add ("Webserver prefs:"); indentlevel++;
			add ("");
			add ("Default responder: " + user.webserver.prefs.defaultResponder);
			addOnOff ("Debugging", user.webserver.prefs.fldebug);
			addOnOff ("Domain stats", user.webserver.prefs.flDomainStats);
			addOnOff ("DNS Lookups", user.webserver.prefs.flUseDns);
			add (""); indentlevel--};
		bundle { //Webserver prefilters
			add ("Webserver PreFilters:"); indentlevel++;
			add ("");
			local (adrItem);
			for adrItem in @user.webserver.preFilters {
				if typeOf (adrItem^) == addressType {
					add (nameOf (adrItem^) + ": " + adrItem^)}
				else {
					add (nameOf (adrItem^))}};
			add (""); indentlevel--};
		bundle { //Webserver postfilters
			add ("Webserver PostFilters:"); indentlevel++;
			add ("");
			local (adrItem);
			for adrItem in @user.webserver.postFilters {
				if typeOf (adrItem^) == addressType {
					add (nameOf (adrItem^) + ": " + adrItem^)}
				else {
					add (nameOf (adrItem^))}};
			add (""); indentlevel--}};
	bundle { //Manila
		on doThemesTable (adrTable) {
			local (adrItem);
			for adrItem in adrTable {
				local (enabledString = "enabled");
				if not adrItem^.flEnabled {
					enabledString = "disabled"};
				add (nameOf (adrItem^) + ": " + enabledString)}};
		bundle { //Manila callbacks
			add ("Manila callbacks:"); indentlevel++;
			add ("");
			local (adrItem);
			for adrItem in @config.manila.callbacks {
				add (nameOf (adrItem^) + ":"); indentLevel++;
				local (sizeTable = sizeOf (adrItem^));
				if sizeTable < 1 {
					add ("[Empty]")}
				else {
					local (adrCallback);
					for adrCallback in adrItem {
						if typeOf (adrCallback^) == addressType {
							add (nameOf (adrCallback^) + ": " + adrCallback^)}
						else {
							add (nameOf (adrCallback^))}}};
				indentLevel--};
			add (""); indentlevel--};
		bundle { //Manila dg themes
			add ("Manila discussion group themes:"); indentlevel++;
			add ("");
			doThemesTable (@config.manila.discussionGroupThemes);
			add (""); indentlevel--};
		bundle { //Manila hosting
			add ("Manila hosting:"); indentlevel++;
			add ("");
			local (adrItem);
			for adrItem in @config.manila.hosting.sites {
				local (name = nameOf (adrItem^));
				add (name + ":");indentLevel++;
				doSimpleTable (adrItem);
				indentLevel--};
			add (""); indentlevel--};
		bundle { //Manila prefs
			add ("Manila prefs (config.manila.prefs):"); indentlevel++;
			add ("");
			doSimpleTable (@config.manila.prefs);
			add (""); indentlevel--};
		bundle { //Manila sites
			add ("Manila sites:"); indentlevel++;
			add ("");
			add ("# sites in config.manila.sites: " + sizeOf (config.manila.sites));
			add (""); indentlevel--};
		bundle { //Manila stats
			add ("Manila stats:"); indentlevel++;
			add ("");
			add ("# referers tables: " + sizeOf (config.manila.stats.referers));
			if defined (config.manila.stats.reports) {
				add ("# reports: " + sizeOf (config.manila.stats.reports))};
			if defined (config.manila.stats.sites.allTime) {
				add ("# all-time sites stats: " + sizeOf (config.manila.stats.sites.allTime))};
			if defined (config.manila.stats.sites.hourly) {
				add ("# hourly sites stats: " + sizeOf (config.manila.stats.sites.hourly))};
			if defined (config.manila.stats.sites.today) {
				add ("# today sites stats: " + sizeOf (config.manila.stats.sites.today))};
			add (""); indentlevel--};
		bundle { //Manila themes
			add ("Manila themes:"); indentlevel++;
			add ("");
			doThemesTable (@config.manila.themes);
			add (""); indentlevel--}};
	bundle { //mainResponder
		addTableAsSection ("mainResponder global URLs", @config.mainResponder.urls);
		addTableAsSection ("mainResponder prefs", @config.mainResponder.prefs);
		addTableAsSection ("mainResponder globals", @config.mainResponder.globals);
		bundle { //mainResponder legal macros
			add ("mainResponder legal macros:"); indentlevel++;
			add ("");
			local (adrItem);
			for adrItem in @config.mainResponder.prefs.legalMacros {
				local (name = nameOf (adrItem^));
				case typeOf (adrItem^) {
					booleanType {
						add (name + ": " + adrItem^)};
					tableType {
						if (sizeOf (adrItem^) == 2) and (defined (adrItem^.flLegal)) and (defined (adrItem^.flParams)) {
							add (name + ": [takes params]: " + adrItem^.flLegal)}
						else {
							add (name + ": [misconfigured]")}}}};
			add (""); indentlevel--};
		bundle { //mainResponder search queue
			add ("mainResponder search queue:"); indentlevel++;
			add ("");
			if defined (config.mainResponder.data.searchQueue) {
				add ("# items: " + sizeOf (config.mainResponder.data.searchQueue))}
			else {
				add ("Empty")};
			add (""); indentlevel--};
		bundle { //mainResponder callbacks
			add ("mainResponder callbacks:"); indentlevel++;
			add ("");
			local (adrItem);
			for adrItem in @config.mainResponder.callbacks {
				add (nameOf (adrItem^) + ":"); indentLevel++;
				local (sizeTable = sizeOf (adrItem^));
				if sizeTable < 1 {
					add ("[Empty]")}
				else {
					local (adrCallback);
					for adrCallback in adrItem {
						if typeOf (adrCallback^) == addressType {
							add (nameOf (adrCallback^) + ": " + adrCallback^)}
						else {
							add (nameOf (adrCallback^))}}};
				indentLevel--};
			add (""); indentlevel--};
		bundle { //mainResponder domains
			add ("mainResponder domains (config.mainResponder.domains):"); indentlevel++;
			add ("");
			local (adrItem);
			for adrItem in @config.mainResponder.domains {
				local (name = nameOf (adrItem^));
				if typeOf (adrItem^) == tableType {
					if defined (adrItem^.siteTree.directory.outline) {
						add (name + " [siteTree]:");
						indentLevel++;
						add (string (adrItem^.siteTree.directory.outline));
						add ("");
						indentLevel--}
					else {
						add (name + ": table " + sizeOf (adrItem^) + " items")}}
				else {
					add (name + ": " + string (adrItem^))}};
			add (""); indentlevel--}};
	bundle { //user table
		if defined (user.applescripts.prefs) {
			addTableAsSection ("AppleScript", @user.applescripts.prefs)};
		if defined (user.backups) {
			addTableAsSection ("Backups", @user.backups)};
		if defined (user.batchExporter) {
			addTableAsSection ("BatchExporter", @user.batchExporter)};
		bundle { //user.callbacks
			add ("user.callbacks:"); indentlevel++;
			add ("");
			local (adrItem);
			for adrItem in @user.callbacks {
				add (nameOf (adrItem^) + ":"); indentLevel++;
				local (sizeTable = sizeOf (adrItem^));
				if sizeTable < 1 {
					add ("[Empty]")}
				else {
					local (adrCallback);
					for adrCallback in adrItem {
						if typeOf (adrCallback^) == addressType {
							add (nameOf (adrCallback^) + ": " + adrCallback^)}
						else {
							add (nameOf (adrCallback^))}}};
				indentLevel--};
			add (""); indentlevel--};
		if defined (user.com) {
			addTableAsSection ("COM", @user.com)};
		bundle { //user.databases
			add ("user.databases:"); indentlevel++;
			add ("");
			local (adrItem);
			for adrItem in @user.databases {
				add (nameOf (adrItem^) + ":"); indentLevel++;
				doSimpleTable (adrItem);
				indentLevel--};
			add (""); indentlevel--};
		if defined (user.export) {
			addTableAsSection ("Export", @user.export)};
		if defined (user.html.glossary) {
			add ("user.html.glossary:"); indentlevel++;
			add ("");
			add ("# items: " + sizeOf (user.html.glossary));
			add (""); indentlevel--};
		if defined (user.html.macros) {
			add ("user.html.macros:"); indentlevel++;
			add ("");
			add ("# items: " + sizeOf (user.html.macros));
			add (""); indentlevel--};
		if defined (user.html.renderers) {
			add ("user.html.renderers:"); indentlevel++;
			add ("");
			add ("# items: " + sizeOf (user.html.renderers));
			add (""); indentlevel--};
		if defined (user.html.prefs) {
			addTableAsSection ("HTML prefs", @user.html.prefs)};
		if defined (user.menus) {
			addTableAsSection ("Menus", @user.menus)};
		if defined (user.prefs) {
			addTableAsSection ("Basic prefs", @user.prefs)};
		if defined (user.prefs.dates) {
			addTableAsSection ("Dates", @user.prefs.dates)};
		if defined (user.prefs.dialogs) {
			addTableAsSection ("Dialogs", @user.prefs.dialogs)};
		if defined (user.prefs.fonts) {
			addTableAsSection ("Fonts", @user.prefs.fonts)};
		if defined (user.prefs.search) {
			addTableAsSection ("Search", @user.prefs.search)};
		if defined (user.rootUpdates.prefs) {
			addTableAsSection ("Root Updates prefs", @user.rootUpdates.prefs)};
		if defined (user.rootUpdates.servers) {
			add ("user.rootUpdates.Servers:"); indentlevel++;
			add ("");
			local (adrItem);
			for adrItem in @user.rootUpdates.Servers {
				add (nameOf (adrItem^) + ":"); indentLevel++;
				doSimpleTable (adrItem);
				indentLevel--};
			add (""); indentlevel--};
		if defined (user.unix.scripts) {
			addTableAsSection ("Unix scripts", @user.unix.scripts)};
		if defined (user.webBrowser) {
			addTableAsSection ("WebBrowser", @user.webBrowser)}};
	bundle { //Misc
		if defined (system.verbs.traps) {
			addTableAsSection ("Traps", @system.verbs.traps)};
		if defined (system.verbs.extensions) {
			addTableAsSection ("Extensions", @system.verbs.extensions)};
		bundle { //root table sizes
			add ("Top-level table sizes:"); indentLevel++;
			add ("");
			local (adrItem);
			for adrItem in @root {
				local (name = nameOf (adrItem^));
				local (size = sizeOf (adrItem^));
				if typeOf (adrItem^) != tableType {
					add (name + ": Not a table, which surprises us.")}
				else {
					add (name + ": " + size + " items")}};
			
			add ("");indentLevel--}};
	bundle { //Guest Databases folders
		on doFolder (name) {
			add (name + " folder:"); indentlevel++;
			add ("");
			local (f);
			fileloop (f in Frontier.getSubFolder (name)) {
				local (fname = file.fileFromPath (f));
				fname = string.popTrailing (fname, file.getPathChar ());
				if file.isFolder (f) {
					add (fname + ": [folder]")}
				else {
					local (size = string.megabyteString (file.size (f)));
					add (fname + ": " + size)}};
			add (""); indentlevel--};
		doFolder ("apps");
		doFolder ("ops");
		doFolder ("www")};
	
	if fldebug {
		wp.newTextObject (mailText, @temp.FrontierConfiguration);
		edit (@temp.FrontierConfiguration)};
	
	return (mailText)}



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.