diff options
Diffstat (limited to 'doc/distributed_devstate-XMPP.txt')
-rw-r--r-- | doc/distributed_devstate-XMPP.txt | 433 |
1 files changed, 0 insertions, 433 deletions
diff --git a/doc/distributed_devstate-XMPP.txt b/doc/distributed_devstate-XMPP.txt deleted file mode 100644 index 1a8c143b4..000000000 --- a/doc/distributed_devstate-XMPP.txt +++ /dev/null @@ -1,433 +0,0 @@ -=============================================================================== -=== -=== XMPP PubSub Distributed Device State -=== -=== Copyright (C) 2010, Digium, Inc. -=== Leif Madsen <lmadsen@digium.com> -=== -=============================================================================== - -------------------------------------------------------------------------------- ---- INTRODUCTION -------------------------------------------------------------------------------- - -This document describes installing and utilizing XMPP PubSub events to -distribute device state and message waiting indication (MWI) events between -servers. The difference between this method and OpenAIS (see -distributed_devstate.txt) is that OpenAIS can only be used in low latency -networks; meaning only on the LAN, and not across the internet. - -If you plan on distributing device state or MWI across the internet, then you -will require the use of XMPP PubSub events. - -------------------------------------------------------------------------------- - -------------------------------------------------------------------------------- ---- Tigase Installation -------------------------------------------------------------------------------- - --- Description -- - -Currently the only server supported for XMPP PubSub events is the Tigase open -source XMPP/Jabber environment. This is the server that the various Asterisk -servers will connect to in order to distribute the events. The Tigase server can -even be clustered in order to provide high availability for your device state; -however, that is beyond the scope of this document. - -For more information about Tigase, visit their web site: - - http://www.tigase.org - --- Download -- - -To download the Tigase environment, get the latest version at: - - http://www.tigase.org/en/filebrowser/tigase-server - --- Install -- - -The Tigase server requires a working Java environment, including both a JRE -(Java Runtime Environment) and a JDK (Java Development Kit), currently at least -version 1.6. - -For more information about how to install Tigase, see the web site: - - http://www.tigase.org/en/content/quick-start - -------------------------------------------------------------------------------- - -------------------------------------------------------------------------------- ---- Tigase Configuration -------------------------------------------------------------------------------- - -While installing Tigase, be sure you enable the PubSub module. Without it, the -PubSub events won't be accepted by the server, and your device state will not be -distributed. - -There are a couple of things you need to configure in Tigase before you start it -in order for Asterisk to connect. The first thing we need to do is generate the -self-signed certificate. To do this we use the keytool application. More -information can be found here: - - http://www.tigase.org/en/content/server-certificate - --- Generating the keystore file -- - -Generally, we need to run the following commands to generate a new keystore -file. - -# cd /opt/Tigase-4.3.1-b1858/certs - -Be sure to change the 'yourdomain' to your domain. - -# keytool -genkey -alias yourdomain -keystore rsa-keystore \ - -keyalg RSA -sigalg MD5withRSA - -The keytool application will then ask you for a password. Use the password -'keystore' as this is the default password that Tigase will use to load the -keystore file. - -You then need to specify your domain as the first value to be entered in the -security certificate. - -What is your first and last name? - [Unknown]: asterisk.mydomain.tld -What is the name of your organizational unit? - [Unknown]: -What is the name of your organization? - [Unknown]: -What is the name of your City or Locality? - [Unknown]: -What is the name of your State or Province? - [Unknown]: -What is the two-letter country code for this unit? - [Unknown]: -Is CN=asterisk.mydomain.tld, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct? - [no]: yes - -You will then be asked for another password, in which case you must just press -enter for the same password as Tigase will not work without them being the same. - -Enter key password for <mykey> - (RETURN if same as keystore password): - - --- Configuring init.properties -- - -The next step is to configure the init.properties file which is used by Tigase -to generate the tigase.xml file. Whenever you change the init.properties file -because sure to remove the current tigase.xml file so that it will be -regenerated at start up. - -# cd /opt/Tigase-4.3.1-b1858/etc - -Then edit the init.properties file and add the following: - -config-type=--gen-config-def ---admins=admin@asterisk.mydomain.tld ---virt-hosts=asterisk.mydomain.tld ---debug=server ---user-db=derby ---user-db-uri=jdbc:derby:/opt/Tigase-4.3.1-b1858 ---comp-name-1=pubsub ---comp-class-1=tigase.pubsub.PubSubComponent - -Be sure to change the domain in the --admin and --virt-hosts options. The most -important lines are --comp-name-1 and --comp-class-1 which tell Tigase to load -the PubSub module. - -------------------------------------------------------------------------------- - -------------------------------------------------------------------------------- ---- Running Tigase -------------------------------------------------------------------------------- - -You can then start the Tigase server with the tigase.sh script. - -# cd /opt/Tigase-4.3.1-b1858 -# ./scripts/tigase.sh start etc/tigase.conf - -------------------------------------------------------------------------------- - -------------------------------------------------------------------------------- ---- Adding Buddies to Tigase -------------------------------------------------------------------------------- - -At this time, Asterisk is not able to automatically register your peers for you, -so you'll need to use an external application to do the initial registration. - -Pidgin is an excellent multi-protocol instant messenger application which -supports XMPP. It runs on Linux, Windows, and OSX, and is open source. You can -get Pidgin from http://www.pidgin.im - -Then add the two buddies we'll use in Asterisk with Pidgin by connecting to -the Tigase server. For more information about how to register new buddies, see -the Pidgin documentation. - -Once the initial registration is done and loaded into Tigase, you no longer need -to worry about using Pidgin. Asterisk will then be able to load the peers into -memory at start up. - -The example peers we've used in the following documentation for our two nodes -are: - -server1@asterisk.mydomain.tld/astvoip1 -server2@asterisk.mydomain.tld/astvoip2 - -------------------------------------------------------------------------------- - -------------------------------------------------------------------------------- ---- Installing Asterisk -------------------------------------------------------------------------------- - -Install Asterisk as usual. However, you'll need to make sure you have the -res_jabber module compiled, which requires the iksemel development library. -Additionally, be sure you have the OpenSSL development library installed so you -can connect securly to the Tigase server. - -Make sure you check menuselect that res_jabber is selected so that it will -compile. - -# cd asterisk-source -# ./configure - -# make menuselect - ---> Resource Modules - -If you don't have jabber.conf in your existing configuration, because sure to -copy the sample configuration file there. - -# cd configs -# cp jabber.conf.sample /etc/asterisk/jabber.conf - -------------------------------------------------------------------------------- - -------------------------------------------------------------------------------- ---- Configuring Asterisk -------------------------------------------------------------------------------- - -We then need to configure our servers to communicate with the Tigase server. We -need to modify the jabber.conf file on the servers. The configurations below are -for a 2 server setup, but could be expanded for additional servers easily. - -The key note here is to note that the pubsub_node option needs to start with -pubsub, so for example, pubsub.asterisk.mydomain.tld. Without the 'pubsub' your -Asterisk system will not be able to distribute events. - -Additionally, you will need to specify each of the servers you need to connec to -using the 'buddy' option. - - --- Asterisk Server 1 -- - -[general] -debug=no ;;Turn on debugging by default. -;autoprune=yes ;;Auto remove users from buddy list. Depending on your - ;;setup (ie, using your personal Gtalk account for a test) - ;;you might lose your contacts list. Default is 'no'. -autoregister=yes ;;Auto register users from buddy list. -;collection_nodes=yes ;;Enable support for XEP-0248 for use with - ;;distributed device state. Default is 'no'. -;pubsub_autocreate=yes ;;Whether or not the PubSub server supports/is using - ;;auto-create for nodes. If it is, we have to - ;;explicitly pre-create nodes before publishing them. - ;;Default is 'no'. - -[asterisk] -type=client -serverhost=asterisk.mydomain.tld -pubsub_node=pubsub.asterisk.mydomain.tld -username=server1@asterisk.mydomain.tld/astvoip1 -secret=welcome -distribute_events=yes -status=available -usetls=no -usesasl=yes -buddy=server2@asterisk.mydomain.tld/astvoip2 - - --- Asterisk Server 2 -- - -[general] -debug=yes ;;Turn on debugging by default. -;autoprune=yes ;;Auto remove users from buddy list. Depending on your - ;;setup (ie, using your personal Gtalk account for a test) - ;;you might lose your contacts list. Default is 'no'. -autoregister=yes ;;Auto register users from buddy list. -;collection_nodes=yes ;;Enable support for XEP-0248 for use with - ;;distributed device state. Default is 'no'. -;pubsub_autocreate=yes ;;Whether or not the PubSub server supports/is using - ;;auto-create for nodes. If it is, we have to - ;;explicitly pre-create nodes before publishing them. - ;;Default is 'no'. - -[asterisk] -type=client -serverhost=asterisk.mydomain.tld -pubsub_node=pubsub.asterisk.mydomain.tld -username=server2@asterisk.mydomain.tld/astvoip2 -secret=welcome -distribute_events=yes -status=available -usetls=no -usesasl=yes -buddy=server1@asterisk.mydomain.tld/astvoip1 - -------------------------------------------------------------------------------- - -------------------------------------------------------------------------------- ---- Basic Testing of Asterisk with XMPP PubSub -------------------------------------------------------------------------------- - -Once you have Asterisk installed with XMPP PubSub, it is time to test it out. - -We need to start up our first server and make sure we get connected to the XMPP -server. We can verify this with an Asterisk console command to determine if -we're connected. - -On Asterisk 1 we can run 'jabber show connected' to verify we're connected to -the XMPP server. - -*CLI> jabber show connected -Jabber Users and their status: - User: server1@asterisk.mydomain.tld/astvoip1 - Connected ----- - Number of users: 1 - -The command above has given us output which verifies we've connected our first -server. - -We can then check the state of our buddies with the 'jabber show buddies' CLI -command. - -*CLI> jabber show buddies -Jabber buddy lists -Client: server1@asterisk.mydomain.tld/astvoip1 - Buddy: server2@asterisk.mydomain.tld - Resource: None - Buddy: server2@asterisk.mydomain.tld/astvoip2 - Resource: None - -The output above tells us we're not connected to any buddies, and thus we're not -distributing state to anyone (or getting it from anyone). That makes sense since -we haven't yet started our other server. - -Now, let's start the other server and verify the servers are able to establish -a connection between each other. - -On Asterisk 2, again we run the 'jabber show connected' command to make sure -we've connected successfully to the XMPP server. - -*CLI> jabber show connected -Jabber Users and their status: - User: server2@asterisk.mydomain.tld/astvoip2 - Connected ----- - Number of users: 1 - -And now we can check the status of our buddies. - -*CLI> jabber show buddies -Jabber buddy lists -Client: server2@scooter/astvoip2 - Buddy: server1@asterisk.mydomain.tld - Resource: astvoip1 - node: http://www.asterisk.org/xmpp/client/caps - version: asterisk-xmpp - Jingle capable: yes - Status: 1 - Priority: 0 - Buddy: server1@asterisk.mydomain.tld/astvoip1 - Resource: None - -Excellent! So we're connected to the buddy on Asterisk 1, and we could run the -same command on Asterisk 1 to verify the buddy on Asterisk 2 is seen. - -------------------------------------------------------------------------------- - -------------------------------------------------------------------------------- ---- Testing Distributed Device State -------------------------------------------------------------------------------- - -The easiest way to test distributed device state is to use the DEVICE_STATE() -diaplan function. For example, you could have the following piece of dialplan -on every server: - -[devstate_test] - -exten => 1234,hint,Custom:mystate - -exten => set_inuse,1,Set(DEVICE_STATE(Custom:mystate)=INUSE) -exten => set_not_inuse,1,Set(DEVICE_STATE(Custom:mystate)=NOT_INUSE) - -exten => check,1,NoOp(Custom:mystate is ${DEVICE_STATE(Custom:mystate)}) - - -Now, you can test that the cluster-wide state of "Custom:mystate" is what -you would expect after going to the CLI of each server and adjusting the state. - -server1*CLI> console dial set_inuse@devstate_test - ... - -server2*CLI> console dial check@devstate_test - -- Executing [check@devstate_test:1] NoOp("OSS/dsp", "Custom:mystate is INUSE") in new stack - -Various combinations of setting and checking the state on different servers can -be used to verify that it works as expected. Also, you can see the status of -the hint on each server, as well, to see how extension state would reflect the -state change with distributed device state: - -server2*CLI> core show hints - -= Registered Asterisk Dial Plan Hints =- - 1234@devstate_test : Custom:mystate State:InUse Watchers 0 - - -One other helpful thing here during testing and debugging is to enable debug -logging. To do so, enable debug on the console in /etc/asterisk/logger.conf. -Also, enable debug at the Asterisk CLI. - -*CLI> core set debug 1 - -When you have this debug enabled, you will see output during the processing of -every device state change. The important thing to look for is where the known -state of the device for each server is added together to determine the overall -state. - -------------------------------------------------------------------------------- - -------------------------------------------------------------------------------- ---- Notes On Large Installations -------------------------------------------------------------------------------- - -On larger installations where you want a fully meshed network of buddies (i.e. -all servers have all the buddies of the remote servers), you may want some -method of distributing those buddies automatically so you don't need to modify -all servers (N+1) every time you add a new server to the cluster. - -The problem there is that you're confined by what's allowed in XEP-0060, and -unfortunately that means modifying affiliations by individual JID (as opposed to -the various subscription access models, which are more flexible). - -See here for details: -http://xmpp.org/extensions/xep-0060.html#owner-affiliations - -One method for making this slightly easier is to utilize the #exec functionality -in configuration files, and dynamically generate the buddies via script that -pulls the information from a database, or to #include a file which is -automatically generated on all the servers when you add a new node to the -cluster. - -Unfortunately this still requires a reload of res_jabber.so on all the servers, -but this could also be solved through the use of the Asterisk Manager Interface -(AMI). - -So while this is not the ideal situation, it is programmatically solvable with -existing technologies and features found in Asterisk today. - -------------------------------------------------------------------------------- - -------------------------------------------------------------------------------- ---- Questions, Comments, and Bug Reports -------------------------------------------------------------------------------- - -Please utilize the Asterisk issue tracker for all bug reports at -https://issues.asterisk.org |