Tue 17 October 2017 | by Arnaud | in XMPP | tags: XMPP python SàT

Salut à toi is a unique XMPP client. As its official description says, it's a "multipurpose, multi front-end, free (libre) and decentralized communication tool". It has been actively developed by Jérôme Poisson (Goffi) and Adrien Cossa (Souliane) since 2008. Today, I will focus on the use of "JP", a command-line interface. It can be used to send or receive files directly from a shell, pipe commands to or from XMPP, use XMPP easily in a script and of course play with pubsub nodes.

The following article describes uses of JP. Several of them are availabled in the trunk version of Salut-à-Toi.

Introduction

JP can be used to launch complexes commands in script, for debugging purpose or to explore XMPP services. JP is the command line interface and it connect to the daemon Salut-à-Toi (SàT). You can share the session between the front-ends:

JP of course.

Primitivus as a console front-end.

Livervia, a web based front-end.

Sententia an Emacs front-end (WIP).

Cagou an original mobile XMPP client based on SàT (WIP).

If you want to send a file easily, discover which services are available on a server, send messages in your scripts, manage your xmpp account, control video player, edit your blog post with your favorite editor, pipe streams, manage your pubsub nodes etc, JP is for you!

Usage

JP can be used as a command line tools or in a small shell environment.

First, we need to configure and launch the daemon sat.

$ sat

Your default profile will be connected. If you have no profile, JP can be used to create one.

$ jp profile create -j my_jid@example.org -x mypassword profile_name $ jp profile connect -p profile_name

Your password is saved in the sat settings. You can connect automatically with the option -c . It should be noted that SàT defines a default profile. It can be bypassed with the option -p .

$ echo "test message" | jp message send recipient@example.org -p profile_name -c

You can obtain help about a command with the option -h .

$ jp pubsub -h usage: jp pubsub [ -h ] { get,delete,edit,subscribe,unsubscribe,subscriptions,node,affiliations,search,hook,uri } ... positional arguments: { get,delete,edit,subscribe,unsubscribe,subscriptions,node,affiliations,search,hook,uri } get get pubsub item ( s ) delete delete an item edit edit an existing or new pubsub item subscribe subscribe to a node unsubscribe unsubscribe from a node subscriptions retrieve all subscriptions on a service node node handling affiliations retrieve all affiliations on a service search search items corresponding to filters hook trigger action on Pubsub notifications uri build URI optional arguments: -h, --help show this help message and exit

JP is a Swiss army knife. Let's discover its possibilities through a few examples.

Examples

$ jp -h usage: jp [ -h ] [ --version ] { file,input,uri,message,event,info,account,param,debug,ad-hoc,ticket,invitation,profile,shell,avatar,pipe,pubsub,bookmarks,roster,identity,blog } ... This software is a command line tool for XMPP. Get the latest version at http://salut-a-toi.org optional arguments: -h, --help show this help message and exit --version show programʼs version number and exit Available commands: { file,input,uri,message,event,info,account,param,debug,ad-hoc,ticket,invitation,profile,shell,avatar,pipe,pubsub,bookmarks,roster,identity,blog } file File sending/receiving input launch command with external input uri XMPP URI parsing/generation message messages handling event event management info Get various pieces of information on entities account XMPP account management param Save/load parameters template debug debugging tools ad-hoc Ad-hoc commands ticket tickets handling invitation invitation of user ( s ) without XMPP account profile profile commands shell launch jp in shell ( REPL ) mode avatar avatar uploading/retrieving pipe stream piping through XMPP pubsub PubSub nodes/items management bookmarks manage bookmarks roster Manage an entityʼs roster identity identity management blog blog/microblog management

Send a message

$ echo "Hello World" > filetest $ jp message send recipient@example.org < filetest

or

$ echo "test jp" | jp message send recipient@example.org

Send files

The following command allows to send the file file.txt to recipient@example.org.

$ jp file send file.txt recipient@example.org

Receive files

The following command allows to receive a file in the /tmp directory.

$ jp file receive -p agayon --path /tmp

Get information about a server

$ jp info version agayon.be Client name: Prosody Client version: 0 .10.0 Operating System: Linux

Get disco information

Query a Server

$ jp info disco agayon.be Features http://jabber.org/protocol/commands http://jabber.org/protocol/disco#info http://jabber.org/protocol/disco#items http://jabber.org/protocol/pubsub#auto-create http://jabber.org/protocol/pubsub#config-node http://jabber.org/protocol/pubsub#create-nodes http://jabber.org/protocol/pubsub#delete-any http://jabber.org/protocol/pubsub#delete-nodes http://jabber.org/protocol/pubsub#groupblog http://jabber.org/protocol/pubsub#instant-nodes http://jabber.org/protocol/pubsub#item-ids http://jabber.org/protocol/pubsub#meta-data http://jabber.org/protocol/pubsub#outcast-affiliation http://jabber.org/protocol/pubsub#persistent-items http://jabber.org/protocol/pubsub#publish http://jabber.org/protocol/pubsub#publish-options http://jabber.org/protocol/pubsub#publisher-affiliation http://jabber.org/protocol/pubsub#purge-nodes http://jabber.org/protocol/pubsub#retract-items http://jabber.org/protocol/pubsub#retrieve-affiliations http://jabber.org/protocol/pubsub#retrieve-default http://jabber.org/protocol/pubsub#retrieve-items http://jabber.org/protocol/pubsub#retrieve-subscriptions http://jabber.org/protocol/pubsub#subscribe https://salut-a-toi.org/spec/pubsub_admin:0 https://salut-a-toi/protocol/schema:0 jabber:iq:auth jabber:iq:last jabber:iq:private jabber:iq:roster jabber:iq:time jabber:iq:version msgoffline urn:xmpp:blocking urn:xmpp:carbons:1 urn:xmpp:carbons:2 urn:xmpp:http:upload urn:xmpp:http:upload:0 urn:xmpp:mam:0 urn:xmpp:order-by:0 urn:xmpp:ping urn:xmpp:time vcard-temp Identities ┌───────┬──────┬─────────────────┐ │catego │ type │ name │ ├┄┄┄┄┄┄┄┼┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┤ │store │ file │ HTTP File Upload│ │pubsub │ pep │ Prosody │ │server │ im │ Prosody │ └───────┴──────┴─────────────────┘ Extensions urn:xmpp:http:upload type: text-single var: max-file-size value: 1048576 urn:xmpp:http:upload:0 type: text-single var: max-file-size value: 1048576 Items ┌──────────────────────┬──┬────────────────────┐ │entity │ │ name │ ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┤ │test-pubsub.agayon.be │ │ │ │upload.agayon.be │ │ │ │auth.agayon.be │ │ │ │proxy.agayon.be │ │ │ │pubsub.agayon.be │ │ │ │chat.agayon.be │ │ Agayon.be chatrooms│ └──────────────────────┴──┴────────────────────┘

Query an account

$ jp info disco info@agayon.be Items ┌───────────────┬───────────────────────────────────────────────────┬─┐ │entity │ node │ │ ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┤ │info@agayon.be │ eu.siacs.conversations.axolotl.bundles:1948395845 │ │ │info@agayon.be │ http://jabber.org/protocol/activity │ │ │info@agayon.be │ http://jabber.org/protocol/mood │ │ │info@agayon.be │ eu.siacs.conversations.axolotl.devicelist │ │ │info@agayon.be │ storage:bookmarks │ │ └───────────────┴───────────────────────────────────────────────────┴─┘

Manage pubsub nodes

The following examples show how to manage pubsub nodes on the service pubsub.agayon.be.

Create a node

$ jp pubsub node create -s pubsub.agayon.be -n node_name

Subscribe to a node

$ jp pubsub subscribe -s pubsub.agayon.be -n node_name

Edit

The edit command allows to edit an item under a node.

$ jp pubsub edit -s pubsub.agayon.be -n node_name

The default text editor is opened. It is possible to directly edit a XML file. This command is useful for debugging purpose.

If you want to edit a post without having to edit xml directly, use jp blog edit.

As an example, you can try to edit the following xml file.

<entry xmlns= "http://www.w3.org/2005/Atom" > <author> <name> author@example.com </name> </author> <generator> JP (SàT) </generator> <title> I am a pubsub post ! </title> <content> This is the content of this great post. </content> </entry>

Once the file is saved, a notification appears in Gajim. For now, the name of the post is a hash.

Manage your XMPP Blog

It is possible to manage a post with XMPP. It is based on PEP, a simplified version of pubsub. If your server support PEP, JP can help you to manage this blog easily.

Publish a post

First, you need to define your preferred syntax. In this example, I select markdown. This option can also be set in any other frontend (e.g. Primitivus). Whereafter you can edit a new post with the syntax jp blog edit.

$ jp param set Composition Syntax markdown -p agayon $ jp blog edit

Your favorite editor open and you can edit your blog post with markdown syntax. When you save and close it, another file open. You can edit your settings:

{ "allow_comments" : true, }

You can verify the accessibility of your post with the following command:

$ jp blog get content: Great test ! Make testing great again ! Yuuuuuuge publication.

It is also possible to modify your last blog post simply with jp blog edit --last-item .

Your blog post are also visible on other clients like Movim (see below) and interfaces like Livervia.

Use jp shell:

In order to ease debugging of services, JP comes with a shell interface. You only need to launch jp shell . You can obtain help by typing ? .

$ jp shell cmd pubsub pubsub> ? Shell commands: Documented commands ( type help <topic> ) : ======================================== cmd do help shell use_clear version debug exit quit use verbose whoami Action commands: positional arguments: { get,delete,edit,subscribe,unsubscribe,subscriptions,node,affiliations,search,hook,uri } get get pubsub item ( s ) delete delete an item edit edit an existing or new pubsub item subscribe subscribe to a node unsubscribe unsubscribe from a node subscriptions retrieve all subscriptions on a service node node handling affiliations retrieve all affiliations on a service search search items corresponding to filters hook trigger action on Pubsub notifications uri build URI

Select a command

> cmd pubsub pubsub> use node urn:xmpp:microblog:0

Navigate into commands

> cmd bookmarks/list bookmarks/list> -c ... CMD result bookmarks/list> cmd .. bookmarks> cmd >

Example: List bookmarks

$ jp shell > cmd bookmarks bookmarks> cmd list bookmarks/list> ? Shell commands: Documented commands ( type help <topic> ) : ======================================== cmd do help shell use_clear version debug exit quit use verbose whoami Action commands: optional arguments: -h, --help show this help message and exit -p PROFILE, --profile PROFILE Use PROFILE profile key ( default: @DEFAULT@ ) --pwd PASSWORD Password used to connect profile, if necessary -c, --connect Connect the profile before doing anything else -l { all,local,private,pubsub } , --location { all,local,private,pubsub } storage location ( default: all ) -t { muc,url } , --type { muc,url } bookmarks type ( default: muc ) bookmarks/list> -t muc private: Movim [ movim@conference.movim.eu ] ( * ) Archlinux - blah blah [ archlinux-fr@chat.jabberfr.org ] bot [ bot@chat.agayon.be ] ( * )

Example: get disco information

> cmd info info> use jid pubsub.agayon.be info> disco Features http://jabber.org/protocol/disco#info http://jabber.org/protocol/disco#items http://jabber.org/protocol/pubsub http://jabber.org/protocol/pubsub#create-nodes http://jabber.org/protocol/pubsub#delete-items http://jabber.org/protocol/pubsub#delete-nodes http://jabber.org/protocol/pubsub#instant-nodes http://jabber.org/protocol/pubsub#item-ids http://jabber.org/protocol/pubsub#publish http://jabber.org/protocol/pubsub#publisher-affiliation http://jabber.org/protocol/pubsub#purge-nodes http://jabber.org/protocol/pubsub#retract-items http://jabber.org/protocol/pubsub#retrieve-items http://jabber.org/protocol/pubsub#retrieve-subscriptions http://jabber.org/protocol/pubsub#subscribe Identities ┌───────┬─────────┬───────────────────────┐ │catego │ type │ name │ ├┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┤ │pubsub │ service │ Prosody PubSub Service│ └───────┴─────────┴───────────────────────┘

More

Some alternatives

SleekXMPP

SleekXMPP is a xmpp python library. It provide two examples of pubsub clients. The first, pubsub_client.py can manage nodes and the second one, pubsub_events.py, can manage events.

./pubsub_client.py -j jid --password = passwd pubsub.agayon.be create node_name

Gajim

Gajim is a great desktop client. It can be used to post on pubsub nodes too.

Movim

Movim is a social network platform based on XMPP. It massively use pubsub to allow users to interact.

Conclusions

Salut-à-Toi is a great XMPP client. JP, its command-line interface, is a powerful tool. It can be useful to debug services, pubsub nodes and play with 'social' capacities of XMPP. It is actively developed and new features are coming. We will be soon able to make todolist or fill a bug ticket on a XMPP based system.

Links