I am pushing my work for dynamic plugins to a branch for evaluation. This is a working prototype and currently works only with Robust at this stage.

Here is the list of current features...

*dynamic/modular configuration - The application will look in the default ini for its configuration section. If none is found, it will look in a named directory for its modular config file. If no file is found, it will, then, look in a url provided in the module for a "bootstrap" ini that will be downloaded and written to the specified ini.

*remote repositories - Remote repositories may be managed from the console. A repository may be added, enabled, disabled or removed. When a registered repository is enabled, suitable plugins for the application will be listed when searching for available plugins.

*dynamic plugins - Registering a repository and searching for available plugins will list possible candidates for extending the application. The plugins may be added and removed from the application. After adding a plugin to the application, it may enabled or disabled. It's meta data may also be viewed. Plugins contained in the local ./bin directory are immediately available, but should not be included in the ServiceConnectors list.

Other possibilities include managing plugins by categories and management by version,



I needed to add an interface for the mono-addins extension type and to be able to send the plugins our main IConfigSource. It should be possible to use the existing IServiceConnector for this, but it would make several changes to the existing framework - such as eliminating the ServiceConnectors line in the Robust.ini and eliminating the parametrized constructor in existing work. I opted to add the interface instead, at least for the prototype. For my work, I would have no problems breaking the current framework to use the single interface, but I won't make that call on my own. And I have no issues with using the specific interface for dynamic plugins either. It works OK, The only drawback that I have encountered so-far is this: you cannot add a dynamic plugin to the ServiceConnectors list in the ini or they will try to load twice.

The work was done in two stages. First was the support for modular configuration. The virtual methods added to ServerConnector are related to this.

The second stage was adding the support for plugins.


I have been merging master with this as of f7dcd3300837f Fri Oct 19 03:12:58 2012 +0100 .


** Testing:

get the code: OpenSim repo - connector_plugin branch

Build the code as usual and run an instance of Robust on a convenient port. Note RegistryLocation and ConfigDirectory in the [Startup] section of your Robust.ini and set them appropriately.

see the commands with "help repository" and "help plugin"

I have setup an example repository that can be used for testing. Add it with...

repo add http://bluewallvirtual.com/plugins


Then, look for available plugins with...

plugin list available


Then, add a plugin...

plugin add 0


Then, you can enable the plugin to have it get the bootstrap ini...

plugin enable 0


At this point, the plugin will be disabled by configuration, so disable it in the console...

plugin disable 0


Now find your new configuration file and edit it for your needs. When you have finished editing your ini enable the plugin...

plugin enable 0


Now you should be able to use it. You can also see the meta data...

plugin info 0


You can check the state of your installed plugins...

plugin list installed

Your plugin will show: 0) [ ] ...

plugin disable 0
plugin list installed

Your plugin will show: 0) [X] ...


You can remove the plugin...

plugin remove 0



Source for the example plugins is at http://github.com/BlueWall
Config file: http://bluewallvirtual.com/configs/SlipStream.Example.xml

To make a repository...

1) Prepare a place to serve your configs and repository on your web server
2) Edit the meta data and the ConfigURL property in SlipStreamConnector.cs
3) Build your plugin in the addon-modules directory like a region module
4) Pack the dll: mautil p bin/MyPlugin.dll
5) Copy all packed files to a directory, then cd to that directory
6) Build the repo: mautil rb ./
7) Copy the directory contents to your repository on your web server
8) Copy config xml to your config url on your web server

Clean your registry by deleting the directory pointed to in "RegistryLocation" in your Robust.ini. You're all set.

Hopefully this covers enough ground to get started. I think there would be no issues with existing code moving it to master after some discussion, then we could get more people to look at it and iron out any wrinkles. When it is stable, then we can use the framework in the region server (which is about 85-90% there) to have dynamic region modules too in our next release.

Thanks!
-BlueWall



_______________________________________________
Opensim-dev mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/opensim-dev

Reply via email to