123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 |
- /*
- * Copyright (c) Contributors, http://opensimulator.org/
- * See CONTRIBUTORS.TXT for a full list of copyright holders.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of the OpenSim Project nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Reflection;
- using System.Text;
- using System.Threading;
- using System.Timers;
- using log4net;
- using OpenSim.Framework.Console;
- using OpenSim.Framework.Statistics;
- namespace OpenSim.Framework.Servers
- {
- /// <summary>
- /// Common base for the main OpenSimServers (user, grid, inventory, region, etc)
- /// </summary>
- public abstract class BaseOpenSimServer
- {
- private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
- /// <summary>
- /// This will control a periodic log printout of the current 'show stats' (if they are active) for this
- /// server.
- /// </summary>
- private System.Timers.Timer m_periodicDiagnosticsTimer = new System.Timers.Timer(60 * 60 * 1000);
- protected ConsoleBase m_console;
- /// <summary>
- /// Time at which this server was started
- /// </summary>
- protected DateTime m_startuptime;
- /// <summary>
- /// Record the initial startup directory for info purposes
- /// </summary>
- protected string m_startupDirectory = Environment.CurrentDirectory;
- /// <summary>
- /// Server version information. Usually VersionInfo + information about svn revision, operating system, etc.
- /// </summary>
- protected string m_version;
- protected BaseHttpServer m_httpServer;
- public BaseHttpServer HttpServer
- {
- get { return m_httpServer; }
- }
- /// <summary>
- /// Holds the non-viewer statistics collection object for this service/server
- /// </summary>
- protected IStatsCollector m_stats;
- public BaseOpenSimServer()
- {
- m_startuptime = DateTime.Now;
- m_version = VersionInfo.Version;
- m_periodicDiagnosticsTimer.Elapsed += new ElapsedEventHandler(LogDiagnostics);
- m_periodicDiagnosticsTimer.Enabled = true;
- }
- /// <summary>
- /// Print statistics to the logfile, if they are active
- /// </summary>
- protected void LogDiagnostics(object source, ElapsedEventArgs e)
- {
- StringBuilder sb = new StringBuilder("DIAGNOSTICS\n\n");
- sb.Append(GetUptimeReport());
-
- if (m_stats != null)
- {
- sb.Append(m_stats.Report());
- }
-
- m_log.Debug(sb);
- }
-
- /// <summary>
- /// Return a report about the uptime of this server
- /// </summary>
- /// <returns></returns>
- protected string GetUptimeReport()
- {
- StringBuilder sb = new StringBuilder(String.Format("Time now is {0}\n", DateTime.Now));
- sb.Append(String.Format("Server has been running since {0}, {1}\n", m_startuptime.DayOfWeek, m_startuptime));
- sb.Append(String.Format("That is an elapsed time of {0}\n", DateTime.Now - m_startuptime));
-
- return sb.ToString();
- }
- /// <summary>
- /// Performs initialisation of the scene, such as loading configuration from disk.
- /// </summary>
- public virtual void Startup()
- {
- m_log.Info("[STARTUP]: Beginning startup processing");
- EnhanceVersionInformation();
- m_log.Info("[STARTUP]: Version " + m_version + "\n");
- }
- /// <summary>
- /// Should be overriden and referenced by descendents if they need to perform extra shutdown processing
- /// </summary>
- public virtual void Shutdown()
- {
- m_log.Info("[SHUTDOWN]: Shutdown processing on main thread complete. Exiting...");
- Environment.Exit(0);
- }
- /// <summary>
- /// Runs commands issued by the server console from the operator
- /// </summary>
- /// <param name="command">The first argument of the parameter (the command)</param>
- /// <param name="cmdparams">Additional arguments passed to the command</param>
- public virtual void RunCmd(string command, string[] cmdparams)
- {
- switch (command)
- {
- case "help":
- Notice("quit - equivalent to shutdown.");
- Notice("show info - show server information (e.g. startup path).");
- if (m_stats != null)
- Notice("show stats - show statistical information for this server");
- Notice("show threads - list tracked threads");
- Notice("show uptime - show server startup time and uptime.");
- Notice("show version - show server version.");
- Notice("shutdown - shutdown the server.\n");
- break;
- case "show":
- if (cmdparams.Length > 0)
- {
- Show(cmdparams[0]);
- }
- break;
- case "quit":
- case "shutdown":
- Shutdown();
- break;
- }
- }
- /// <summary>
- /// Outputs to the console information about the region
- /// </summary>
- /// <param name="ShowWhat">What information to display (valid arguments are "uptime", "users")</param>
- public virtual void Show(string ShowWhat)
- {
- switch (ShowWhat)
- {
- case "info":
- Notice("Version: " + m_version);
- Notice("Startup directory: " + m_startupDirectory);
- break;
- case "stats":
- if (m_stats != null)
- {
- Notice(m_stats.Report());
- }
- break;
-
- case "threads":
- // m_console.Notice("THREAD", Process.GetCurrentProcess().Threads.Count + " threads running:");
- // int _tc = 0;
- // foreach (ProcessThread pt in Process.GetCurrentProcess().Threads)
- // {
- // _tc++;
- // m_console.Notice("THREAD", _tc + ": ID: " + pt.Id + ", Started: " + pt.StartTime.ToString() + ", CPU time: " + pt.TotalProcessorTime + ", Pri: " + pt.BasePriority.ToString() + ", State: " + pt.ThreadState.ToString());
- // }
- List<Thread> threads = ThreadTracker.GetThreads();
- if (threads == null)
- {
- Notice("Thread tracking is only enabled in DEBUG mode.");
- }
- else
- {
- int tc = 0;
- Notice(threads.Count + " threads are being tracked:");
- foreach (Thread t in threads)
- {
- tc++;
- Notice(tc + ": ID: " + t.ManagedThreadId.ToString() + ", Name: " + t.Name + ", Alive: " + t.IsAlive.ToString() + ", Pri: " + t.Priority.ToString() + ", State: " + t.ThreadState.ToString());
- }
- }
- break;
- case "uptime":
- Notice(GetUptimeReport());
- break;
- case "version":
- Notice("Version: " + m_version);
- break;
- }
- }
- /// <summary>
- /// Console output is only possible if a console has been established.
- /// That is something that cannot be determined within this class. So
- /// all attempts to use the console MUST be verified.
- /// </summary>
- private void Notice(string msg)
- {
- if (m_console != null)
- {
- m_console.Notice(msg);
- }
- }
- /// <summary>
- /// Enhance the version string with extra information if it's available.
- /// </summary>
- protected void EnhanceVersionInformation()
- {
- string buildVersion = string.Empty;
- // Add subversion revision information if available
- // Try file "svn_revision" in the current directory first, then the .svn info.
- // This allows to make the revision available in simulators not running from the source tree.
- // FIXME: Making an assumption about the directory we're currently in - we do this all over the place
- // elsewhere as well
- string svnRevisionFileName = "svn_revision";
- string svnFileName = "../.svn/entries";
- string inputLine;
- int strcmp;
- if (File.Exists(svnRevisionFileName))
- {
- StreamReader RevisionFile = File.OpenText(svnRevisionFileName);
- buildVersion = RevisionFile.ReadLine();
- buildVersion.Trim();
- RevisionFile.Close();
- }
- if (string.IsNullOrEmpty(buildVersion) && File.Exists(svnFileName))
- {
- StreamReader EntriesFile = File.OpenText(svnFileName);
- inputLine = EntriesFile.ReadLine();
- while (inputLine != null)
- {
- // using the dir svn revision at the top of entries file
- strcmp = String.Compare(inputLine, "dir");
- if (strcmp == 0)
- {
- buildVersion = EntriesFile.ReadLine();
- break;
- }
- else
- {
- inputLine = EntriesFile.ReadLine();
- }
- }
- EntriesFile.Close();
- }
- if (!string.IsNullOrEmpty(buildVersion))
- {
- m_version += ", SVN build r" + buildVersion;
- }
- else
- {
- m_version += ", SVN build revision not available";
- }
- // Add operating system information if available
- string OSString = "";
- if (System.Environment.OSVersion.Platform != PlatformID.Unix)
- {
- OSString = System.Environment.OSVersion.ToString();
- }
- else
- {
- OSString = Util.ReadEtcIssue();
- }
- if (OSString.Length > 45)
- {
- OSString = OSString.Substring(0, 45);
- }
- m_version += ", OS " + OSString;
- }
- }
- }
|