diff options
author | Adam Frisby | 2009-03-04 22:14:40 +0000 |
---|---|---|
committer | Adam Frisby | 2009-03-04 22:14:40 +0000 |
commit | f3aac0fa4af4b503e9fdffe866ca7c179d41f6aa (patch) | |
tree | b896779b8a5b2809e15b5d6ca309c7c149fcf96c | |
parent | * For now, restore file extension for default oar name I accidentally removed... (diff) | |
download | opensim-SC_OLD-f3aac0fa4af4b503e9fdffe866ca7c179d41f6aa.zip opensim-SC_OLD-f3aac0fa4af4b503e9fdffe866ca7c179d41f6aa.tar.gz opensim-SC_OLD-f3aac0fa4af4b503e9fdffe866ca7c179d41f6aa.tar.bz2 opensim-SC_OLD-f3aac0fa4af4b503e9fdffe866ca7c179d41f6aa.tar.xz |
* Fleshed out the MRM Module a little.
* Please don't use this yet, it represents a very heavy security risk if you enable it.
6 files changed, 87 insertions, 44 deletions
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Host.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Host.cs index 41d368d..dcb70b4 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Host.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Host.cs | |||
@@ -1,12 +1,15 @@ | |||
1 | using System; | 1 | using System; |
2 | using System.Collections.Generic; | 2 | using System.Collections.Generic; |
3 | using System.Reflection; | ||
3 | using System.Text; | 4 | using System.Text; |
5 | using log4net; | ||
4 | 6 | ||
5 | namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | 7 | namespace OpenSim.Region.OptionalModules.Scripting.Minimodule |
6 | { | 8 | { |
7 | class Host : IHost | 9 | class Host : IHost |
8 | { | 10 | { |
9 | private readonly IObject m_obj; | 11 | private readonly IObject m_obj; |
12 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
10 | 13 | ||
11 | public Host(IObject m_obj) | 14 | public Host(IObject m_obj) |
12 | { | 15 | { |
@@ -17,5 +20,10 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
17 | { | 20 | { |
18 | get { return m_obj; } | 21 | get { return m_obj; } |
19 | } | 22 | } |
23 | |||
24 | public ILog Console | ||
25 | { | ||
26 | get { return m_log; } | ||
27 | } | ||
20 | } | 28 | } |
21 | } | 29 | } |
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IHost.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IHost.cs index e47a278..8f95ba7 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IHost.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IHost.cs | |||
@@ -1,11 +1,13 @@ | |||
1 | using System; | 1 | using System; |
2 | using System.Collections.Generic; | 2 | using System.Collections.Generic; |
3 | using System.Text; | 3 | using System.Text; |
4 | using log4net; | ||
4 | 5 | ||
5 | namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | 6 | namespace OpenSim.Region.OptionalModules.Scripting.Minimodule |
6 | { | 7 | { |
7 | interface IHost | 8 | public interface IHost |
8 | { | 9 | { |
9 | IObject Object { get; } | 10 | IObject Object { get; } |
11 | ILog Console { get; } | ||
10 | } | 12 | } |
11 | } | 13 | } |
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IWorld.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IWorld.cs index 087f94f..2f1388e 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/IWorld.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/IWorld.cs | |||
@@ -4,7 +4,7 @@ using System.Text; | |||
4 | 4 | ||
5 | namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | 5 | namespace OpenSim.Region.OptionalModules.Scripting.Minimodule |
6 | { | 6 | { |
7 | interface IWorld | 7 | public interface IWorld |
8 | { | 8 | { |
9 | IObject[] Objects { get; } | 9 | IObject[] Objects { get; } |
10 | IHeightmap Terrain { get; } | 10 | IHeightmap Terrain { get; } |
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/MiniModule.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/MiniModule.cs index 2e91142..ae8d632 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/MiniModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/MiniModule.cs | |||
@@ -1,47 +1,65 @@ | |||
1 | using System; | 1 | using System; |
2 | using System.CodeDom.Compiler; | 2 | using System.CodeDom.Compiler; |
3 | using System.Collections.Generic; | ||
3 | using System.IO; | 4 | using System.IO; |
4 | using System.Reflection; | 5 | using System.Reflection; |
5 | using System.Text; | 6 | using System.Text; |
6 | using log4net; | 7 | using log4net; |
7 | using Microsoft.CSharp; | 8 | using Microsoft.CSharp; |
8 | using Nini.Config; | 9 | using Nini.Config; |
10 | using OpenMetaverse; | ||
9 | using OpenSim.Region.Framework.Interfaces; | 11 | using OpenSim.Region.Framework.Interfaces; |
10 | using OpenSim.Region.Framework.Scenes; | 12 | using OpenSim.Region.Framework.Scenes; |
11 | 13 | ||
12 | namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | 14 | namespace OpenSim.Region.OptionalModules.Scripting.Minimodule |
13 | { | 15 | { |
14 | class MiniModule : IRegionModule | 16 | public class MiniModule : IRegionModule |
15 | { | 17 | { |
16 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 18 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
17 | private Scene m_scene; | 19 | private Scene m_scene; |
18 | 20 | ||
21 | private readonly Dictionary<UUID,MiniModuleBase> m_scripts = new Dictionary<UUID, MiniModuleBase>(); | ||
19 | 22 | ||
20 | private static readonly CSharpCodeProvider CScodeProvider = new CSharpCodeProvider(); | 23 | private static readonly CSharpCodeProvider CScodeProvider = new CSharpCodeProvider(); |
21 | 24 | ||
22 | public void Initialise(Scene scene, IConfigSource source) | 25 | public void Initialise(Scene scene, IConfigSource source) |
23 | { | 26 | { |
24 | m_scene = scene; | 27 | if (source.Configs["MRM"] != null) |
25 | scene.EventManager.OnRezScript += EventManager_OnRezScript; | 28 | { |
29 | if (source.Configs["MRM"].GetBoolean("Enabled", false)) | ||
30 | { | ||
31 | m_log.Info("[MRM] Enabling MRM Module"); | ||
32 | m_scene = scene; | ||
33 | scene.EventManager.OnRezScript += EventManager_OnRezScript; | ||
34 | } | ||
35 | else | ||
36 | { | ||
37 | m_log.Info("[MRM] Disabled MRM Module (Express)"); | ||
38 | } | ||
39 | } | ||
40 | else | ||
41 | { | ||
42 | m_log.Info("[MRM] Disabled MRM Module (Omission)"); | ||
43 | } | ||
26 | } | 44 | } |
27 | 45 | ||
28 | void EventManager_OnRezScript(uint localID, OpenMetaverse.UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource) | 46 | void EventManager_OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource) |
29 | { | 47 | { |
30 | if(true) | 48 | if (script.StartsWith("//MiniMod:C#")) |
31 | return; | ||
32 | |||
33 | if(engine == "MiniMod") | ||
34 | { | 49 | { |
35 | if(script.StartsWith("//MiniMod:C#")) | 50 | m_log.Info("[MRM] Found C# MRM"); |
36 | { | 51 | IWorld m_world = new World(m_scene); |
37 | IWorld m_world = new World(m_scene); | 52 | IHost m_host = new Host(new SOPObject(m_scene, localID)); |
38 | IHost m_host = new Host(new SOPObject(m_scene, localID)); | 53 | |
39 | 54 | MiniModuleBase mmb = (MiniModuleBase) AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap( | |
40 | MiniModuleBase mmb = (MiniModuleBase) AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap( | 55 | CompileFromDotNetText(script, itemID.ToString()), |
41 | CompileFromDotNetText(script, itemID.ToString()), | 56 | "OpenSim.MiniModule"); |
42 | "OpenSim.MiniModule"); | 57 | m_log.Info("[MRM] Created MRM Instance"); |
43 | mmb.InitMiniModule(m_world, m_host); | 58 | mmb.InitMiniModule(m_world, m_host); |
44 | } | 59 | m_scripts[itemID] = mmb; |
60 | |||
61 | m_log.Info("[MRM] Starting MRM"); | ||
62 | mmb.Start(); | ||
45 | } | 63 | } |
46 | } | 64 | } |
47 | 65 | ||
@@ -52,7 +70,10 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
52 | 70 | ||
53 | public void Close() | 71 | public void Close() |
54 | { | 72 | { |
55 | 73 | foreach (KeyValuePair<UUID, MiniModuleBase> pair in m_scripts) | |
74 | { | ||
75 | pair.Value.Stop(); | ||
76 | } | ||
56 | } | 77 | } |
57 | 78 | ||
58 | public string Name | 79 | public string Name |
@@ -78,8 +99,16 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
78 | 99 | ||
79 | // Output assembly name | 100 | // Output assembly name |
80 | string OutFile = Path.Combine("MiniModules", Path.Combine( | 101 | string OutFile = Path.Combine("MiniModules", Path.Combine( |
81 | m_scene.RegionInfo.RegionID.ToString(), | 102 | m_scene.RegionInfo.RegionID.ToString(), |
82 | FilePrefix + "_compiled_" + uuid + ".dll")); | 103 | FilePrefix + "_compiled_" + uuid + ".dll")); |
104 | |||
105 | // Create Directories for Assemblies | ||
106 | if (!Directory.Exists("MiniModules")) | ||
107 | Directory.CreateDirectory("MiniModules"); | ||
108 | string tmp = Path.Combine("MiniModules", m_scene.RegionInfo.RegionID.ToString()); | ||
109 | if (!Directory.Exists(tmp)) | ||
110 | Directory.CreateDirectory(tmp); | ||
111 | |||
83 | try | 112 | try |
84 | { | 113 | { |
85 | File.Delete(OutFile); | 114 | File.Delete(OutFile); |
@@ -87,26 +116,26 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
87 | catch (IOException e) | 116 | catch (IOException e) |
88 | { | 117 | { |
89 | throw new Exception("Unable to delete old existing " + | 118 | throw new Exception("Unable to delete old existing " + |
90 | "script-file before writing new. Compile aborted: " + | 119 | "script-file before writing new. Compile aborted: " + |
91 | e); | 120 | e); |
92 | } | 121 | } |
93 | 122 | ||
94 | // DEBUG - write source to disk | 123 | // DEBUG - write source to disk |
95 | string srcFileName = FilePrefix + "_source_" + | 124 | string srcFileName = FilePrefix + "_source_" + |
96 | Path.GetFileNameWithoutExtension(OutFile) + ext; | 125 | Path.GetFileNameWithoutExtension(OutFile) + ext; |
97 | try | 126 | try |
98 | { | 127 | { |
99 | File.WriteAllText(Path.Combine(Path.Combine( | 128 | File.WriteAllText(Path.Combine(Path.Combine( |
100 | "MiniModules", | 129 | "MiniModules", |
101 | m_scene.RegionInfo.RegionID.ToString()), | 130 | m_scene.RegionInfo.RegionID.ToString()), |
102 | srcFileName), Script); | 131 | srcFileName), Script); |
103 | } | 132 | } |
104 | catch (Exception ex) //NOTLEGIT - Should be just FileIOException | 133 | catch (Exception ex) //NOTLEGIT - Should be just FileIOException |
105 | { | 134 | { |
106 | m_log.Error("[Compiler]: Exception while " + | 135 | m_log.Error("[Compiler]: Exception while " + |
107 | "trying to write script source to file \"" + | 136 | "trying to write script source to file \"" + |
108 | srcFileName + "\": " + ex.ToString()); | 137 | srcFileName + "\": " + ex.ToString()); |
109 | } | 138 | } |
110 | 139 | ||
111 | // Do actual compile | 140 | // Do actual compile |
112 | CompilerParameters parameters = new CompilerParameters(); | 141 | CompilerParameters parameters = new CompilerParameters(); |
@@ -120,7 +149,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
120 | // TODO: Add Libraries | 149 | // TODO: Add Libraries |
121 | parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, | 150 | parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, |
122 | "OpenSim.Region.OptionalModules.dll")); | 151 | "OpenSim.Region.OptionalModules.dll")); |
123 | 152 | parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, | |
153 | "log4net.dll")); | ||
124 | 154 | ||
125 | parameters.GenerateExecutable = false; | 155 | parameters.GenerateExecutable = false; |
126 | parameters.OutputAssembly = OutFile; | 156 | parameters.OutputAssembly = OutFile; |
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/MiniModuleBase.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/MiniModuleBase.cs index a886158..9ce4506 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/MiniModuleBase.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/MiniModuleBase.cs | |||
@@ -1,6 +1,6 @@ | |||
1 | namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | 1 | namespace OpenSim.Region.OptionalModules.Scripting.Minimodule |
2 | { | 2 | { |
3 | abstract class MiniModuleBase | 3 | public abstract class MiniModuleBase |
4 | { | 4 | { |
5 | private IWorld m_world; | 5 | private IWorld m_world; |
6 | private IHost m_host; | 6 | private IHost m_host; |
@@ -21,7 +21,7 @@ | |||
21 | get { return m_host; } | 21 | get { return m_host; } |
22 | } | 22 | } |
23 | 23 | ||
24 | protected abstract void Start(); | 24 | public abstract void Start(); |
25 | protected abstract void Stop(); | 25 | public abstract void Stop(); |
26 | } | 26 | } |
27 | } | 27 | } |
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index df25c28..dd71b44 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example | |||
@@ -1058,3 +1058,6 @@ InterregionComms = "RESTComms" | |||
1058 | ; - the second number indicates how many scrips failed to compile | 1058 | ; - the second number indicates how many scrips failed to compile |
1059 | ; - "oar error" if supplied, provides the error message from the OAR load | 1059 | ; - "oar error" if supplied, provides the error message from the OAR load |
1060 | channel_notify = -800 | 1060 | channel_notify = -800 |
1061 | |||
1062 | [MRM] | ||
1063 | Enabled = false ; Enables the Mini Region Modules Script Engine. WARNING: SECURITY RISK. \ No newline at end of file | ||