Erweiterungen für OpenSim-Server selbstgestrickt

* Technical issues about Simulators
* Technische Fragen zu Simulatoren

Erweiterungen für OpenSim-Server selbstgestrickt

Beitragvon Sheera Khan » Mo 11. Apr 2016, 10:50

Translate to English translate to German Translate to French Translate to Italian Translate to Spanish Translate to Portuguese Translate to Czech Перевести на русский язык 翻译成中国

Huhus liebe Programmierer,

wenn sich jemand mal in die Arbeit mit dem OpenSimulator Quälcode einarbeiten möchte, habe ich hier einen schönen Startpunkt:
http://www.gridtalk.de/showthread.php?tid=2062&pid=24589#pid24589.
Moni fasst kurz und knapp die wichtigsten Schritte zum Schreiben eigener Erweiterungen zusammen und demonstriert das an einer eigenen OSSL-Funktion zum Lesen bzw. Schreiben von Daten auf die lokale Festplatte. Das hätte zwar kaum Chancen in den offiziellen OpenSim-Zweig aufgenommen zu werden, aber für eigene Experimente ist es doch sehr lehrreich - Vielen Dank Moni :-)

Ciaoo

Sheera
Benutzeravatar
Sheera Khan
 
Beiträge: 969
Registriert: Fr 22. Mär 2013, 14:18

Re: Erweiterungen für OpenSim-Server selbstgestrickt

Beitragvon Sheera Khan » Mo 11. Apr 2016, 13:50

Translate to English translate to German Translate to French Translate to Italian Translate to Spanish Translate to Portuguese Translate to Czech Перевести на русский язык 翻译成中国

Huhus,

und nun etwas detaillierter, weil da ein paar klitze-kleine Stolperfallen lauern ^^ Ich beschreibe hier mal den Ablauf auf einer openSUSE 13.2 Linux-Distribution. Hinweise für andere Distros (z.B. Windows^^) können dann bei Bedarf ergänzt werden... ACHTUNG: es wird technisch!

1) Vorbereiten der Maschine
Damit wir Quältexte in Binärcode übersetzen können benötigen wir einen Compiler und etwas Entwicklungsumgebung. Bei openSUSE geht das relativ einfach mit YaST:
Software installieren oder löschen - Anzeigen - Schemata - .NET-Entwicklung (oder Kernel-Entwicklung oder C/C++-Entwicklung) auswählen - Suche: nant eingeben, Bestätigen und warten^^
Hinweise für andere Distributionen finden sich im Opensimulator-Wiki: http://opensimulator.org/wiki/Build_Instructions

2) Download und Vorbereiten des Quellcodes
Für den ersten Versuch nehmen wir den Download der letzten Stable-Version von OpenSimulator:
Qullcode-Download hier: http://opensimulator.org/wiki/Download/de oder die Originaladresse: http://opensimulator.org/wiki/Download. Unter Linux ist die Datei mit der Endung tar.gz üblicher, .zip ginge aber auch ... Der Download landet bei mir im Verzeichnis ~/Downloads
Code: Alles auswählen
sheera@schleppi:~> mkdir OpenSimulator
sheera@schleppi:~> cd OpenSimulator
sheera@schleppi:~/Opensimulator> mv ~/Downloads/opensim-0.8.2.1-source.tar.gz .
sheera@schleppi:~/Opensimulator> tar xvf opensim-0.8.2.1-source.tar.gz
sheera@schleppi:~/Opensimulator> cd opensim-0.8.2.1-source/
sheera@schleppi:~/Opensimulator/opensim-0.8.2.1-source> ./runprebuild.sh


3) Änderungen an den Quelltexten
Hier greife ich mal die Beispiele von Moni aus dem o.g. Forumsbeitrag auf. Der Simulator-Quellcode muss an drei Stellen geändert werden:
a - Die Implementation der eigentlichen Funktion
b - Die Signatur des Methodenaufrufs muss der API hinzugefügt werden (das sog. Interface)
c - Der ScriptBaseClass muss eine Methode hinzugefügt werden, die die obige Implementation der Funktion aufruft (der sog. Stub)
(Anm. d. Red.: Ich habe mal C programmiert... ich finde das hier unglaublich umständlich^^ Aber bei größeren Projekten macht es trotzdem Sinn...)

a - Die Implementation
Der Quellcode der beiden Funktionen (oops - Methoden^^) selbst ist vergleichsweise selbsterklärend. Dieser muss nun an geeigneter Stelle in den Quellcode des Simulators integriert werden. Dazu bearbeiten wir die Datei OSSL_Api.cs mit dem Texteditor des Vertrauens (ja, in meinem Fall ist das der vi):
Code: Alles auswählen
sheera@schleppi:~/Opensimulator/opensim-0.8.2.1-source> vi ./OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs

Ich habe Monis Quellcode fast ganz am Ende der Datei eingefügt zusammen mit kleinen Kommentaren. Jeder Programmierer weiß, wie wichtig es ist, die richtige Klammer-Ebene zu treffen^^. Daher habe ich jeweils ein paar Zeilen vor und nach dem einzufügenden Quelltext mit aufgenommen. Der Anweisungsblock gehört also vor die letzten beiden schließenden Klammern in der Datei.
Code: Alles auswählen
       .  .  .
            }
        }

       // Erweiterungen (nach MoniTill, 10.04.2016,  http://www.gridtalk.de/showthread.php?tid=2062&pid=24589#pid24589)
       public string osMessageRead (int kanal)
       {
        CheckThreatLevel(ThreatLevel.VeryHigh, "osMessageRead");

        m_host.AddScriptLPS(1);
        string verzeichnis ="./tmpMessage/";    // /bin/tmpMessage
        int maxmessage = 10;            // Maximale Datei-/Kanalnummer   

        if (kanal < 0 || kanal > maxmessage)
        {
          return "";
        }
        string theXFiles = verzeichnis+kanal.ToString();
        StreamReader file = File.OpenText(theXFiles);
        string s = file.ReadToEnd();
        file.Close();

        StreamWriter writer = new StreamWriter(theXFiles);
        writer.Write("");
        writer.Close();

        return s;
       }

       public int osMessageWrite (int kanal,string message)
       {
        CheckThreatLevel(ThreatLevel.VeryHigh, "osMessageWrite");

        m_host.AddScriptLPS(1);
        string verzeichnis ="./tmpMessage/";    // /bin/tmpMessage
        int maxmessage = 10;            // Maximale Datei-/Kanalnummer
        if (kanal < 0 || kanal > maxmessage)
        {
          return -1;
        }


        string theXFiles =verzeichnis+kanal.ToString();

        StreamWriter writer = new StreamWriter(theXFiles);
        writer.Write(message);

        writer.Close();
        return 0;
       }
       // Ende der Erweiterungen

    }
}



b - Die Signatur
Als nächtes kommt die Bekanntgabe der Syntax der neu hinzugefügten Methodenaufruf in der API dran, die sog. Signaturen der Methoden. Dazu muss wieder eine Datei bearbeitet werden:
Code: Alles auswählen
sheera@schleppi:~/Opensimulator/opensim-0.8.2.1-source> vi ./OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs

Wieder müssen ein paar Zeilen an der korrekten Position ergänzt werden. Auch hier entscheide ich mich für das Dateiende und begrenze den Block mit Kommentaren:
Code: Alles auswählen
        .  .  .
        LSL_Integer osRegexIsMatch(string input, string pattern);

        // Erweiterungen (nach MoniTill, 10.04.2016,  http://www.gridtalk.de/showthread.php?tid=2062&pid=24589#pid24589)
        string osMessageRead (int kanal);
        int osMessageWrite (int kanal,string message);
        // Ende der Erweiterungen
    }
}


c - Der Stub
Zu guter Letzt müssen noch zwei Stubs für die beiden neu erstellten Methoden angelegt werden, die gemäß der soeben deklarierten API aufgerufen werden und dann die eigentlichen Funktionen - err Methoden - aufrufen...
Code: Alles auswählen
sheera@schleppi:~/Opensimulator/opensim-0.8.2.1-source> vi ./OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs

Auch hier bleibe ich bei meinem Schema, dass die eigenen Ergänzungen durch Kommentare begrenzt am Ende der Datei eingefügt werden. Wieder ist auf die korrekte Platzierung des Code-Blocks innerhalb der Verschachtelung zu achten:
Code: Alles auswählen
        .  .  .
        }
        // Erweiterungen (nach MoniTill, 10.04.2016,  http://www.gridtalk.de/showthread.php?tid=2062&pid=24589#pid24589)
        public string osMessageRead(int kanal)
        {
            return m_OSSL_Functions.osMessageRead(kanal);
        }

        public int osMessageWrite(int kanal,string message)
        {
            return m_OSSL_Functions.osMessageWrite(kanal,message);
        }
        // Ende der Erweiterungen
    }
}


Damit sind die Arbeiten am Quellcode selbst abgeschlossen.

4) Übersetzen des Quellcodes in Binärcode
Vorausgesetzt alle benötigte Software ist installiert ist dies hier der einfachste Teil des Projekts. Es reicht der Aufruf des Kommandos nant:
Code: Alles auswählen
sheera@schleppi:~/Opensimulator/opensim-0.8.2.1-source> nant
        .  .  .
BUILD SUCCEEDED

Total time: 8 seconds.
sheera@schleppi:~/Opensimulator/opensim-0.8.2.1-source>


Wegen der Begrenzung der Größe von Forumposts mache ich hier an dieser Stelle eine kurze Unterbrechung ;-)
Benutzeravatar
Sheera Khan
 
Beiträge: 969
Registriert: Fr 22. Mär 2013, 14:18

Re: Erweiterungen für OpenSim-Server selbstgestrickt

Beitragvon Sheera Khan » Mo 11. Apr 2016, 14:44

Translate to English translate to German Translate to French Translate to Italian Translate to Spanish Translate to Portuguese Translate to Czech Перевести на русский язык 翻译成中国

Fortsetzung des obigen postings ...

5) Konfigurieren des selbstgestrickten Simulators
Der neue Simulator muss nun für die Bedingungen des MetroGrids konfiguriert werden. Dazu kopiere ich die benötigten Dateien (der Inhalt des Verzeichnisses bin) an die Stelle, wo sich meine anderen Simulatoren finden (~/Simulatoren) und kopiere die Konfigurationsdateien aus der MetroEdition in das Verzeichnis mit meiner eigenen Simulatorversion:
Code: Alles auswählen
sheera@schleppi:~/OpenSimulator/opensim-0.8.2.1-source> mkdir ~/Simulatoren/MyOpenSim
sheera@schleppi:~/OpenSimulator/opensim-0.8.2.1-source> cp -r bin ~/Simulatoren/MyOpenSim
sheera@schleppi:~/OpenSimulator/opensim-0.8.2.1-source> cd ~/Simulatoren/
sheera@schleppi:~/Simulatoren> cp MetroPolis-0.8.2-DEV-Plus/bin/OpenSim.ini MyOpenSim/bin/
sheera@schleppi:~/Simulatoren> cp MetroPolis-0.8.2-DEV-Plus/bin/config-include/GridCommon.ini MyOpenSim/bin/config-include/
sheera@schleppi:~/Simulatoren> cp MetroPolis-0.8.2-DEV-Plus/bin/Regions/Regions.ini MyOpenSim/bin/Regions/

In der Regions.ini befindet sich eine für den Test geeignete Definition einer Region.

In der Implementation der beiden neuen Methoden wurde der ThreatLevel auf "VeryHigh" festgelegt. In der Standard-Konfiguration werden diese Methoden also aus Sicherheitsgründen nicht ausgeführt. Für unseren Test müssen wir die Funktionen daher erst freischalten. Dies erfolgt bei der 0.8.2 noch in der OpenSim.ini, neuere Versionen verwenden dafür u.U. eine eigene Konfigurationsdatei. Wir suchen in der Datei OpenSim.ini nach der Zeichenfolge "Allow_" und ergänzen wieder am Ende die Zeilen:
Code: Alles auswählen
    .  .  .
    ;; *** Threat-Level=VeryHigh
    .  .  .
    Allow_osSetRot = ESTATE_OWNER, ESTATE_MANAGER
    ;; Erweiterungen
    Allow_osMessageRead = ESTATE_OWNER, ESTATE_MANAGER
    Allow_osMessageWrite = ESTATE_OWNER, ESTATE_MANAGER
    ;; Ende der Erweiterungen
    ;;
    ;; *** Threat-Level=Severe
    .  .  . 


Die neuen Anweisungen sind so implementiert, dass sie die Dateien im Verzeichnis tmpMessage unterhalb von bin ablegen bzw. lesen wollen. Dann sollte das auch existieren;-)
Code: Alles auswählen
sheera@schleppi:~/Simulatoren> mkdir MyOpenSim/bin/tmpMessage


6 Start des Simulators
Nun steht einem Start des Simulators nichts mehr im Wege. In meinem Fall sorgen dafür die folgenden Anweisungen:
Code: Alles auswählen
sheera@schleppi:~/Simulatoren> cd MyOpenSim/bin/
sheera@schleppi:~/Simulatoren/MyOpenSim/bin> export LANG=C
sheera@schleppi:~/Simulatoren/MyOpenSim/bin> export MONO_THREADS_PER_CPU=2048
sheera@schleppi:~/Simulatoren/MyOpenSim/bin> export MONO_GC_PARAMS=nursery-size=64m
sheera@schleppi:~/Simulatoren/MyOpenSim/bin> mono OpenSim.exe


Nach einer kurzen Zeit kann man sich dann einloggen und den abschließenden Test inWorld durchführen...

7 Test der neuen OSSL-Funktionen inWorld
Nach dem Einloggen erstelle ich einen Prim mit dem folgenden LSL-Script (wieder von Moni direkt übernommen):
Code: Alles auswählen
default
{
   state_entry()
   {
     //***************************************************************
     // Nur einmalig, damit die Dateien zum Auslesen vorhanden sind
     integer a;
     for(;a < 11; ++a) osMessageWrite(a,"");
     //***************************************************************
   
      llListen  (0,"",NULL_KEY,"");
     llSetTimerEvent(0.5);

   }

 listen(integer channel, string name, key id, string message)
 {
  osMessageWrite(0,message);
 }
 
 timer()
 {
 
  string message = osMessageRead(1);
   if (message != "")
   {
    llSay(0, message);
   }
 }
}


Der Prim speichert jede Zeile, die er im open Chat hört in der Datei namens "0" im Verzeichnis tmpMessages (s.o.) ab. Umgekehrt wird der Inhalt einer Datei namens 1 in dem Verzeichnis im open Chat vorgelesen. Testen wir's... Im Chat wurde "Sodele, ein Test zwo drei vier" gesagt. Was steht in der Datei 0?
Code: Alles auswählen
sheera@schleppi:~/SecondLife/MyOpenSim/bin> cat tmpMessage/0
Sodele, ein Test zwo drei vier


Klappte doch ganz gut. Was passiert, wenn ich eine Datei 1 anlege und dort einen Text hineinschreibe?
Code: Alles auswählen
sheera@schleppi:~/SecondLife/MyOpenSim/bin> echo "Hallo Du da..." > tmpMessage/1

Sekundenbruchteile später steht der Text im open Chat - Ein voller Erfolg :-)

8 Anmerkungen
In diesem Forumsbeitrag ging es um die prinzipielle Möglichkeit, den OpenSimulator-Code mit eigenen Erweiterungen zu versehen, speziell darum eigene Script-Befehle zu implementieren. Für die Sicherheit seines Simulators ist man anschließend aber selber verantwortlich!
Einige Vorgehensweisen sind distributionsabhängig oder persönlichen Vorlieben geschuldet. Es gibt da ganz sicher auch andere Wege... Wichtig war mir nur, dass man, wenn man sich genau an die Anweisungen hält, erstmal ein lauffähiges Beispiel hat, von dem aus man dann seine eigenen Explorationen beginnen kann.
Ich würde meine Erweiterungen der Scriptsprache nicht unbedingt mit os beginnen lassen sondern andere Anfangsbuchstaben wählen, z.B. skMessageRead und skMessageWrite für Sheera Khans private Erweiterungen... Damit vermeidet man Konflikte mit eventuellen späteren Erweiterungen der OSSL durch das Core-Dev-Team...

Ciaoo und viel Spaß mit eigenen Experimenten ^^ Berichtet davon!

Sheera
Benutzeravatar
Sheera Khan
 
Beiträge: 969
Registriert: Fr 22. Mär 2013, 14:18

Und wie ist das mit der aktuellen OpenSimulator-Software?

Beitragvon Sheera Khan » Mi 13. Apr 2016, 13:40

Translate to English translate to German Translate to French Translate to Italian Translate to Spanish Translate to Portuguese Translate to Czech Перевести на русский язык 翻译成中国

Huhu liebe Programmierer,

ihr glaubt doch nicht, dass ich euch mit der alten 0.8er abspeisen werde, oder? Hier ein paar Anmerkungen, wie man sich an der aktuellen 0.9.0-DEV austobt...

ACHTUNG!!! Die 0.9er ist derzeit der aktive Entwickler-Zweig und da kann es vorkommen, dass sich der Quellcode nicht fehlerfrei übersetzen lässt bzw. der übersetzte Simulator nicht fehlerfrei (u.U sogar gar nicht) läuft. Das muss dann nicht unbedingt eure Schuld sein, das kann auch eine noch nicht fertiggestellte Änderung eines Core-Entwicklers sein.

1) Quellcode besorgen
Der Quellcode von OpenSimulator wird in einer speziellen Verwaltungssoftware gespeichert - dem git-Repository. Um eine lokale Kopie des Repositories für eigene Experimente anzulegen benötigen wir die entsprechenden Software-Tools. Unter openSUSE ganz einfach: YaST - Software installieren oder löschen - Suche git - bestätigen - die Abhängigkeiten abnicken - warten...

Den Download der Quellcodes erledigt das Kommando git:
Code: Alles auswählen
sheera@schleppi:~/OpenSimulator> git clone git://opensimulator.org/git/opensim

Dabei wird ein Verzeichnis namens opensim angelegt, in dem sich der neue Quellcode befindet. Dieses Verzeichnis ist übrigens etwas umfangreicher als das opensim-source-Verzeichnis aus dem vorangegangenen Beitrag ...

2) Änderungen vornehmen
Für dieses Beispiel nehmen wir wieder die gleichen Änderungen vor wie im vorigen Beitrag. D.h. wir wechseln in das neue Verzeichnis und ändern die entsprechenden Dateien genau wie wir es oben getan haben.
Code: Alles auswählen
sheera@schleppi:~/OpenSimulator> cd opensim
sheera@schleppi:~/OpenSimulator/opensim> vi ./OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
sheera@schleppi:~/OpenSimulator/opensim> vi ./OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
sheera@schleppi:~/OpenSimulator/opensim> vi ./OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs


3) Quellcode übersetzen
Dieser Schritt ist genauso wie oben beschrieben:
Code: Alles auswählen
sheera@schleppi:~/OpenSimulator/opensim> ./runprebuild.sh
sheera@schleppi:~/OpenSimulator/opensim> nant


4) Konfiguration des Simulators
Die 0.9-Dev ist natürlich nicht für das Metropolis-Grid konfiguriert. Daher müssen wir die GridConfig-Datei und die Regions.ini aus der vorherigen lauffähigen Version (z.B. unserer 0.8.2) herüberkopieren und die OpenSim.ini bearbeiten.
Code: Alles auswählen
sheera@schleppi:~/OpenSimulator/opensim> cp -r bin ~/Simulatoren
sheera@schleppi:~/OpenSimulator/opensim> cd ~/Simulatoren
sheera@schleppi:~/Simulatoren> cp bin-0.8.2/Regions/Regions.ini bin-0.9.0-DEV/Regions/
sheera@schleppi:~/Simulatoren> cp bin-0.8.2/config-include/GridCommon.ini bin-0.9.0-DEV/config-include/
sheera@schleppi:~/Simulatoren> cp bin-0.9.0-DEV/OpenSim.ini.example bin-0.9.0-DEV/OpenSim.ini
sheera@schleppi:~/Simulatoren> vi bin-0.9.0-DEV/OpenSim.ini


In der OpenSim.ini müssen wir fast am Ende der Datei ein Kommentarzeichen (;) entfernen, damit der Simulator für Grid und Hypergrid konfiguriert wird:
Code: Alles auswählen
    .  .  . 
    ; Include-Architecture = "config-include/Grid.ini"
    Include-Architecture = "config-include/GridHypergrid.ini"
    ; Include-Architecture = "config-include/SimianGrid.ini"
    .  .  . 


5) Weitere Vorarbeiten
Wie beim vorigen Beitrag auch müssen wir das tmpMessage-Verzeichnis erstellen und die neuen Funktionen freischalten. Die neuere OpenSimulator-Versionen verwenden dafür eine eigene Datei: config-include/osslEnable.ini
Code: Alles auswählen
sheera@schleppi:~/Simulatoren> mkdir bin-0.9.0-DEV/tmpMessage
sheera@schleppi:~/Simulatoren> vi bin-0.9.0-DEV/config-include/osslEnable.ini


In der Datei werden exakt dieselben Änderungen vorgenommen wie im vorigen Beitrag beschrieben:
Code: Alles auswählen
        .  .  .
        ;; *** Threat-Level=VeryHigh
        .  .  .
        Allow_osSetRot = ESTATE_OWNER, ESTATE_MANAGER
        ;; Erweiterungen
        Allow_osMessageRead = ESTATE_OWNER, ESTATE_MANAGER
        Allow_osMessageWrite = ESTATE_OWNER, ESTATE_MANAGER
        ;; Ende der Erweiterungen
        ;;
        ;; *** Threat-Level=Severe
        .  .  .


6) Start des Simulators und Test
Diese Schritte unterscheiden sich nicht wesentlich vom oben beschriebenen Vorgehen, man muss nur in das richtige Verzeichnis wechseln ^^

Viel Spaß mit eigenen Experimenten und ich würde mich sehr freuen, wenn ich Rückmeldungen erhalte, auch über mögliche Fehler in meinen Mitschriften... Ich hab's zwar getestet, aber man kann ja immer mal eine Kleinigkeit übersehen (zumal es beim Testen ja auch nie so geradlinig läuft wie im Tutorial beschrieben).

Ciaoo

Sheera
Benutzeravatar
Sheera Khan
 
Beiträge: 969
Registriert: Fr 22. Mär 2013, 14:18


Zurück zu OpenSim Server

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste



Powered by phpBB

Deutsche Übersetzung durch phpBB.de
.

Style designed by Artodia.