Commit 3e243483 authored by Dele Olajide's avatar Dele Olajide

ofmeet plugin version 0.2.3

Simplified build, removed classes folder in WEB-INF
Changed default value for voip gateway to false
Removed some redundant and duplicate jar file in jitsivideobridge lib
Removed tinder.jar and whack.jar which caused ComponentManagerFactory.getComponentManager() to fail with OF 3.11
parent 0cf8db1a
......@@ -49,6 +49,16 @@
Openfire Meetings Plugin Changelog
</h1>
<p><b>0.2.3</b> -- Nov 14th, 2015</p>
<ul>
<li>Simplified build, removed classes folder in WEB-INF</li>
<li>Changed default value for voip gateway to false</li>
<li>Removed some redundant and duplicate jar file in jitsivideobridge lib</li>
<li>Removed tinder.jar and whack.jar which caused ComponentManagerFactory.getComponentManager() to fail with OF 3.11</li>
</ul>
<p><b>0.2.2</b> -- Oct 9th, 2015</p>
<ul>
......
# The amount of memory that the java process can consume.
# Use the format that is in use for java's -Xmx switch
# The default is 3072m
# Only effective on linux, 64 bit
# VIDEOBRIDGE_MAX_MEMORY=3072m
# Uncomment the next line to enable the remote debugging of the video bridge
# VIDEOBRIDGE_DEBUG_OPTIONS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"
\ No newline at end of file
......@@ -5,8 +5,8 @@
<name>Openfire Meetings</name>
<description>Provides high quality, scalable video conferences using Jitsi Meet and Jitsi Videobridge</description>
<author>Ignite Realtime</author>
<version>0.2.2</version>
<date>10/09/2015</date>
<version>0.2.3</version>
<date>11/14/2015</date>
<minServerVersion>3.9.9</minServerVersion>
<adminconsole>
......
# Server Installation for Jitsi Meet
This describes configuring a server `jitsi.example.com`. You will need to
change references to that to match your host, and generate some passwords for
`YOURSECRET1` and `YOURSECRET2`.
There are also some complete [example config files](https://github.com/jitsi/jitsi-meet/tree/master/doc/example-config-files/) available, mentioned in each section.
## Install prosody and otalk modules
```sh
apt-get install lsb-release
echo deb http://packages.prosody.im/debian $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list
wget --no-check-certificate https://prosody.im/files/prosody-debian-packages.key -O- | sudo apt-key add -
apt-get update
apt-get install prosody-trunk
apt-get install git lua-zlib lua-sec-prosody lua-dbi-sqlite3 liblua5.1-bitop-dev liblua5.1-bitop0
git clone https://github.com/andyet/otalk-server.git
cd otalk-server
cp -r mod* /usr/lib/prosody/modules
```
## Configure prosody
Modify the config file in `/etc/prosody/prosody.cfg.lua` (see also the example config file):
- modules to enable/add: compression, bosh, smacks, carbons, mam, lastactivity, offline, pubsub, adhoc, websocket, http_altconnect
- comment out: `c2s_require_encryption = true`, and `s2s_secure_auth = false`
- change `authentication = "internal_hashed"`
- add this:
```
daemonize = true
cross_domain_bosh = true;
storage = {archive2 = "sql2"}
sql = { driver = "SQLite3", database = "prosody.sqlite" }
default_archive_policy = "roster"
```
- configure your domain by editing the example.com virtual host section section:
```
VirtualHost "jitsi.example.com"
authentication = "anonymous"
ssl = {
key = "/var/lib/prosody/jitsi.example.com.key";
certificate = "/var/lib/prosody/jitsi.example.com.crt";
}
```
- and finally configure components:
```
Component "conference.jitsi.example.com" "muc"
Component "jitsi-videobridge.jitsi.example.com"
component_secret = "YOURSECRET1"
```
Generate certs for the domain:
```sh
prosodyctl cert generate jitsi.example.com
```
Restart prosody XMPP server with the new config
```sh
prosodyctl restart
```
## Install nginx
```sh
apt-get install nginx
```
Add nginx config for domain in `/etc/nginx/nginx.conf`:
```
tcp_nopush on;
types_hash_max_size 2048;
server_names_hash_bucket_size 64;
```
Add a new file `jitsi.example.com` in `/etc/nginx/sites-available` (see also the example config file):
```
server {
listen 80;
server_name jitsi.example.com;
# set the root
root /srv/jitsi.example.com;
index index.html;
location ~ ^/([a-zA-Z0-9]+)$ {
rewrite ^/(.*)$ / break;
}
# BOSH
location /http-bind {
proxy_pass http://localhost:5280/http-bind;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
}
# xmpp websockets
location /xmpp-websocket {
proxy_pass http://localhost:5280;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
tcp_nodelay on;
}
}
```
Add link for the added configuration
```sh
cd /etc/nginx/sites-enabled
ln -s ../sites-available/jitsi.example.com jitsi.example.com
```
## Fix firewall if needed
```sh
ufw allow 80
ufw allow 5222
```
## Install Jitsi Videobridge
```sh
wget https://download.jitsi.org/jitsi-videobridge/linux/jitsi-videobridge-linux-{arch-buildnum}.zip
unzip jitsi-videobridge-linux-{arch-buildnum}.zip
```
Install JRE if missing:
```
apt-get install default-jre
```
In the user home that will be starting Jitsi Videobridge create `.sip-communicator` folder and add the file `sip-communicator.properties` with one line in it:
```
org.jitsi.impl.neomedia.transform.srtp.SRTPCryptoContext.checkReplay=false
```
Start the videobridge with:
```sh
./jvb.sh --host=localhost --domain=jitsi.example.com --port=5347 --secret=YOURSECRET1 &
```
Or autostart it by adding the line in `/etc/rc.local`:
```sh
/bin/bash /root/jitsi-videobridge-linux-{arch-buildnum}/jvb.sh --host=localhost --domain=jitsi.example.com --port=5347 --secret=YOURSECRET1 </dev/null >> /var/log/jvb.log 2>&1
```
## Deploy Jitsi Meet
Checkout and configure Jitsi Meet:
```sh
cd /srv
git clone https://github.com/jitsi/jitsi-meet.git
mv jitsi-meet/ jitsi.example.com
```
Edit host names in `/srv/jitsi.example.com/config.js` (see also the example config file):
```
var config = {
hosts: {
domain: 'jitsi.example.com',
muc: 'conference.jitsi.example.com',
bridge: 'jitsi-videobridge.jitsi.example.com'
},
useNicks: false,
bosh: '//jitsi.example.com/http-bind', // FIXME: use xep-0156 for that
desktopSharing: 'false' // Desktop sharing method. Can be set to 'ext', 'webrtc' or false to disable.
//chromeExtensionId: 'diibjkoicjeejcmhdnailmkgecihlobk', // Id of desktop streamer Chrome extension
//minChromeExtVersion: '0.1' // Required version of Chrome extension
};
```
Restart nginx to get the new configuration:
```sh
invoke-rc.d nginx restart
```
## Install [Turn server](https://github.com/andyet/otalk-server/tree/master/restund)
```sh
apt-get install make gcc
wget http://creytiv.com/pub/re-0.4.7.tar.gz
tar zxvf re-0.4.7.tar.gz
ln -s re-0.4.7 re
cd re-0.4.7
sudo make install PREFIX=/usr
cd ..
wget http://creytiv.com/pub/restund-0.4.2.tar.gz
wget https://raw.github.com/andyet/otalk-server/master/restund/restund-auth.patch
tar zxvf restund-0.4.2.tar.gz
cd restund-0.4.2/
patch -p1 < ../restund-auth.patch
sudo make install PREFIX=/usr
cp debian/restund.init /etc/init.d/restund
chmod +x /etc/init.d/restund
cd /etc
wget https://raw.github.com/andyet/otalk-server/master/restund/restund.conf
```
Configure addresses and ports as desired, and the password to be configured in prosody:
```
realm jitsi.example.com
# share this with your prosody server
auth_shared YOURSECRET2
# modules
module_path /usr/lib/restund/modules
turn_relay_addr [turn ip address]
```
Configure prosody to use it in `/etc/prosody/prosody.cfg.lua`. Add to your virtual host:
```
turncredentials_secret = "YOURSECRET2";
turncredentials = {
{ type = "turn", host = "turn.address.ip.configured", port = 3478, transport = "tcp" }
}
```
Add turncredentials module in the "modules_enabled" section
Reload prosody if needed
```
prosodyctl restart
```
## Running behind NAT
In case of videobridge being installed on a machine behind NAT, add the following extra lines to the file `~/.sip-communicator/sip-communicator.properties` (in the home of user running the videobridge):
```
org.jitsi.videobridge.NAT_HARVESTER_LOCAL_ADDRESS=<Local.IP.Address>
org.jitsi.videobridge.NAT_HARVESTER_PUBLIC_ADDRESS=<Public.IP.Address>
```
So the file should look like this at the end:
```
org.jitsi.impl.neomedia.transform.srtp.SRTPCryptoContext.checkReplay=false
org.jitsi.videobridge.NAT_HARVESTER_LOCAL_ADDRESS=<Local.IP.Address>
org.jitsi.videobridge.NAT_HARVESTER_PUBLIC_ADDRESS=<Public.IP.Address>
```
# Hold your first conference
You are now all set and ready to have your first meet by going to http://jitsi.example.com
## Enabling recording
Currently recording is only supported for linux-64 and macos. To enable it, add
the following properties to sip-communicator.properties:
```
org.jitsi.videobridge.ENABLE_MEDIA_RECORDING=true
org.jitsi.videobridge.MEDIA_RECORDING_PATH=/path/to/recordings/dir
org.jitsi.videobridge.MEDIA_RECORDING_TOKEN=secret
```
where /path/to/recordings/dir is the path to a pre-existing directory where recordings
will be stored (needs to be writeable by the user running jitsi-videobridge),
and "secret" is a string which will be used for authentication.
Then, edit the Jitsi-Meet config.js file and set:
```
enableRecording: true
```
Restart jitsi-videobridge and start a new conference (making sure that the page
is reloaded with the new config.js) -- the organizer of the conference should
now have a "recoriding" button in the floating menu, near the "mute" button.
The MIT License (MIT)
Copyright (c) 2013 ESTOS GmbH
Copyright (c) 2013 BlueJimp SARL
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Jitsi Meet - Secure, Simple and Scalable Video Conferences
====
Jitsi Meet is an OpenSource (MIT) WebRTC JavaScript application that uses [Jitsi Videobridge](https://jitsi.org/videobridge) to provide high quality, scalable video conferences. You can see [Jitsi Meet in action](http://youtu.be/7vFUVClsNh0) here at the 482 session of the VoIP Users Conference.
You can also try it out yourself at https://meet.jit.si .
Jitsi Meet allows for very efficient collaboration. It allows users to stream their desktop or only some windows. It also supports shared document editing with Etherpad and remote presentations with Prezi.
## Install
Installing Jitsi Meet is quite a simple experience even though it requires installing a few other components first, such as Jitsi Videobridge, a web server such as Nginx and an XMPP one like Prosody.
You can find information on how to deploy Jitsi Meet in the [installation instructions](https://jitsi.org/meet/deploy)
You may also find it helpful to have a look at our sample [config files](https://github.com/jitsi/jitsi-meet/tree/master/doc/example-config-files/)
## Discuss
Please use the [Jitsi dev mailing list](http://lists.jitsi.org/pipermail/dev/) to discuss feature requests before opening an issue on github.
## Acknowledgements
Jitsi Meet started out as a sample conferencing application using Jitsi Videobridge. It was originally developed by Philipp Hancke who then contributed it to the community where development continues with joint forces!
This diff is collapsed.
......@@ -20,8 +20,6 @@ import org.jitsi.jicofo.xmpp.ConferenceIqProvider;
import org.jitsi.jicofo.xmpp.IQUtils;
import org.jitsi.util.*;
import org.jitsi.videobridge.osgi.ServiceUtils2;
import org.jivesoftware.smack.packet.*;
import org.osgi.framework.*;
......
......@@ -38,9 +38,10 @@ public class JicofoPlugin
private File pluginDirectory;
public void initializePlugin(PluginManager manager, File pluginDirectory)
public void initializePlugin(ComponentManager componentManager, PluginManager manager, File pluginDirectory)
{
boolean added = false;
this.componentManager = componentManager;
try
{
......@@ -67,7 +68,6 @@ public class JicofoPlugin
System.setProperty(FocusManager.FOCUS_USER_NAME_PNAME, (new JID(focusUserJid)).getNode());
System.setProperty(FocusManager.FOCUS_USER_PASSWORD_PNAME, focusUserPassword);
ComponentManager componentManager = ComponentManagerFactory.getComponentManager();
String subdomain = "ofmeet-focus";
FocusComponent component = new FocusComponent(false);
componentManager.addComponent(subdomain, component);
......
......@@ -63,7 +63,7 @@ public class FocusAccountFactory
properties.put("ENCRYPTION_PROTOCOL_STATUS.DTLS-SRTP", "true");
properties.put(ProtocolProviderFactory.IS_USE_ICE, "true");
properties.put(ProtocolProviderFactory.IS_USE_GOOGLE_ICE, "true");
//properties.put(ProtocolProviderFactory.IS_USE_GOOGLE_ICE, "true");
properties.put(ProtocolProviderFactory.IS_ACCOUNT_DISABLED, "false");
properties.put(ProtocolProviderFactory.IS_PREFERRED_PROTOCOL, "false");
properties.put(ProtocolProviderFactory.IS_SERVER_OVERRIDDEN, "false");
......
......@@ -112,7 +112,7 @@ public class CallControlComponent extends AbstractComponent
properties.setProperty("gov.nist.javax.sip.SERVER_LOG", logDir + "sip_server.log");
properties.setProperty("gov.nist.javax.sip.DEBUG_LOG", logDir + "sip_debug.log");
if (JiveGlobals.getBooleanProperty("org.jitsi.videobridge.ofmeet.sip.enabled", true))
if (JiveGlobals.getBooleanProperty("org.jitsi.videobridge.ofmeet.sip.enabled", false))
{
Log.info("CallControlComponent - enabling SIP gateway ");
......
......@@ -37,13 +37,13 @@ public class JigasiPlugin
private File pluginDirectory;
public void initializePlugin(PluginManager manager, File pluginDirectory)
public void initializePlugin(ComponentManager componentManager, PluginManager manager, File pluginDirectory)
{
Log.info("JigasiPlugin - initializePlugin");
this.pluginDirectory = pluginDirectory;
this.componentManager = componentManager;
ComponentManager componentManager = ComponentManagerFactory.getComponentManager();
String subdomain = "ofmeet-call-control";
CallControlComponent component = new CallControlComponent(pluginDirectory);
boolean added = false;
......
......@@ -21,6 +21,8 @@ import org.jivesoftware.util.*;
import org.slf4j.*;
import org.slf4j.Logger;
import org.xmpp.component.*;
import org.xmpp.component.ComponentManager;
import org.xmpp.component.ComponentManagerFactory;
/**
* Implements <tt>org.jivesoftware.openfire.container.Plugin</tt> to integrate
......@@ -30,8 +32,7 @@ import org.xmpp.component.*;
* @author Damian Minkov
*/
public class PluginImpl
implements Plugin,
PropertyEventListener
implements PropertyEventListener
{
/**
* The logger.
......@@ -138,8 +139,10 @@ public class PluginImpl
* located
* @see Plugin#initializePlugin(PluginManager, File)
*/
public void initializePlugin(PluginManager manager, File pluginDirectory)
public void initializePlugin(ComponentManager componentManager, PluginManager manager, File pluginDirectory)
{
this.componentManager = componentManager;
Log.info("PluginImpl initializePlugin "+ pluginDirectory);
String enableRecording = JiveGlobals.getProperty("org.jitsi.videobridge.ofmeet.media.record", "false");
......@@ -183,9 +186,6 @@ public class PluginImpl
minVal);
checkNatives(pluginDirectory);
ComponentManager componentManager
= ComponentManagerFactory.getComponentManager();
String subdomain = "ofmeet-jitsi-videobridge"; //ComponentImpl.SUBDOMAIN;
PluginImpl.component = new ComponentImpl();
boolean added = false;
......
......@@ -44,6 +44,8 @@ import org.jivesoftware.openfire.user.UserNotFoundException;
import org.jivesoftware.openfire.muc.*;
import org.jivesoftware.openfire.group.*;
import org.jivesoftware.openfire.security.SecurityAuditManager;
import org.xmpp.component.ComponentManager;
import org.xmpp.component.ComponentManagerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -76,6 +78,7 @@ public class OfMeetPlugin implements Plugin, ClusterEventListener {
public File pluginDirectory;
private TaskEngine taskEngine = TaskEngine.getInstance();
private UserManager userManager = XMPPServer.getInstance().getUserManager();
private ComponentManager componentManager;
public static OfMeetPlugin self;
......@@ -94,8 +97,9 @@ public class OfMeetPlugin implements Plugin, ClusterEventListener {
return jitsiPlugin;
}
public void initializePlugin(final PluginManager manager, final File pluginDirectory) {
public void initializePlugin(final PluginManager manager, final File pluginDirectory)
{
componentManager = ComponentManagerFactory.getComponentManager();
ContextHandlerCollection contexts = HttpBindManager.getInstance().getContexts();
this.manager = manager;
......@@ -103,17 +107,25 @@ public class OfMeetPlugin implements Plugin, ClusterEventListener {
self = this;
try {
Log.info("OfMeet Plugin - Initialize jitsi videobridge ");
jitsiPlugin = new PluginImpl();
jitsiPlugin.initializePlugin(manager, pluginDirectory);
try {
Log.info("OfMeet Plugin - Initialize jitsi videobridge ");
Log.info("OfMeet Plugin - Initialize SIP gateway ");
jitsiPlugin = new PluginImpl();
jitsiPlugin.initializePlugin(componentManager, manager, pluginDirectory);
}
catch (Exception e1) {
Log.error("Could NOT Initialize jitsi videobridge", e1);
}
jigasiPlugin = new JigasiPlugin();
jigasiPlugin.initializePlugin(manager, pluginDirectory);
try {
Log.info("OfMeet Plugin - Initialize SIP gateway ");
Log.info("OfMeet Plugin - Initialize jitsi conference focus");
jigasiPlugin = new JigasiPlugin();
jigasiPlugin.initializePlugin(componentManager, manager, pluginDirectory);
}
catch (Exception e1) {
Log.error("Could NOT Initialize jitsi videobridge", e1);
}
String domain = XMPPServer.getInstance().getServerInfo().getXMPPDomain();
String userName = "focus";
......@@ -149,8 +161,10 @@ public class OfMeetPlugin implements Plugin, ClusterEventListener {
{
@Override public void run()
{
Log.info("OfMeet Plugin - Initialize jitsi conference focus");
jicofoPlugin = new JicofoPlugin();
jicofoPlugin.initializePlugin(manager, pluginDirectory);
jicofoPlugin.initializePlugin(componentManager, manager, pluginDirectory);
}
}, 5000);
......@@ -182,6 +196,7 @@ public class OfMeetPlugin implements Plugin, ClusterEventListener {
context.addServlet(new ServletHolder(new XMPPServlet()),"/server");
WebAppContext context2 = new WebAppContext(contexts, pluginDirectory.getPath(), "/ofmeet");
context2.setClassLoader(this.getClass().getClassLoader());
context2.setWelcomeFiles(new String[]{"index.html"});
String securityEnabled = JiveGlobals.getProperty("ofmeet.security.enabled", "true");
......@@ -193,7 +208,7 @@ public class OfMeetPlugin implements Plugin, ClusterEventListener {
}
} catch (Exception e) {
Log.error("Could NOT start open fire meetings");
Log.error("Could NOT start open fire meetings", e);
}
}
......@@ -272,9 +287,9 @@ public class OfMeetPlugin implements Plugin, ClusterEventListener {
public void leftCluster()
{
Log.info("OfMeet Plugin - leftCluster");
jitsiPlugin.initializePlugin(manager, pluginDirectory);
jigasiPlugin.initializePlugin(manager, pluginDirectory);
jicofoPlugin.initializePlugin(manager, pluginDirectory);
jitsiPlugin.initializePlugin(componentManager, manager, pluginDirectory);
jigasiPlugin.initializePlugin(componentManager, manager, pluginDirectory);
jicofoPlugin.initializePlugin(componentManager, manager, pluginDirectory);
}
@Override
......@@ -289,9 +304,9 @@ public class OfMeetPlugin implements Plugin, ClusterEventListener {
{
Log.info("OfMeet Plugin - markedAsSeniorClusterMember");
jitsiPlugin.initializePlugin(manager, pluginDirectory);
jigasiPlugin.initializePlugin(manager, pluginDirectory);
jicofoPlugin.initializePlugin(manager, pluginDirectory);
jitsiPlugin.initializePlugin(componentManager, manager, pluginDirectory);
jigasiPlugin.initializePlugin(componentManager, manager, pluginDirectory);
jicofoPlugin.initializePlugin(componentManager, manager, pluginDirectory);
}
public void processMeetingPlanner()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment