.. _introduction: Setting up πϱTorrent ==================== Requirements ------------ πϱTorrent is written in Python. Aside from Python, you'll need the following python packages, depending on your setup: - jinja2 - beaker If you're not using the built-in simple HTTPD, you will need: - flup (WSGIServer) Future: - simplejson (not yet but will soon) as well as rtorrent with XMLRPC support. πϱTorrent has only been tested on GNU/Linux, so this would be an advantage as well. .. TERRIBLE NAME vvvvvv Deciding on your setup ---------------------- πϱTorrent supports two ways of connecting to rTorrent. Through a HTTPD (such as `lighttpd `_ or directly via SCGI. To run the web interface, πϱTorrent can either serve pages using a FastCGI-aware HTTPD (`lighttpd`_, but also Apache and Nginx) or it can simply run it's own built-in *basic* HTTPD. A professional HTTPD such as `lighttpd`_ is recommended, but the built-in HTTPD works well if you don't need extreme performance and is a lot easier to set up. Now that all the option have been layed out, you have a few options. HTTPD for everything ~~~~~~~~~~~~~~~~~~~~ This approach uses a professional-grade HTTPD for everything: Serving web pages and providing a HTTP XMLRPC interface to rTorrent. HTTPD for serving webpages, πϱTorrent for SCGI ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This uses a HTTPD to serve πϱTorrent pages, and uses πϱTorrent's direct SCGI capabilities to communicate with rTorrent. πϱTorrent for everything (serving webpages and SCGI) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This uses πϱTorrent's built-in HTTPD to serve web pages and uses πϱTorrent's direct SCGI ability to talk to rTorrent. πϱTorrent for serving webpages, HTTPD for communication ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This uses a HTTPD to talk to rTorrent, but use πϱTorrent's built-in HTTPD to serve web pages. Notes ~~~~~ Personally I suggest using a professional HTTPD (like `lighttpd`_) to serve the pages and using πϱTorrent's direct SCGI capabilities to talk to rTorrent directly over a unix socket file. But really, there's not a huge difference. If you just want to try out pyroTorrent, the built-in HTTPD is fine. Alternatively you can use `lighttpd`_'s SCGI capabilities to act as middle man for the communication between rtorrent and πϱTorrent. (πϱTorrent will then talk over HTTP using XMLRPC instead of SCGI) Getting started --------------- Throughout the entire setup manual we will make the following assumptions: - You know your way around the terminal - at least a bit. - You are smart enough to adjust exemplary paths to your own. Our setup is as follows: (Compare it to your own, or how you will be wanting to set it up) - The *user* ``rtorrent`` runs ``rtorrent``. - The *user* ``rtorrent`` has a folder called ``pyroTorrent`` in it's home directory, (*/home/rtorrent*) this is the directory containing the pyroTorrent source code. Now, depending on your setup, you may or may not use a professional HTTPD: - The HTTPD users and groups are *lighttpd* (at least in the lighttpd example) - You know how to configure your HTTPD (lighttpd in our case); your webroot directory is assumed to be */var/www*. It doesn't matter to πϱTorrent but the examples use this directory. AT ALL TIMES make sure you use the appropriate paths. The setup process can be divided chronologically into a few parts: - Configuring rTorrent. - Configuring communication for rTorrent. - Testing a basic πϱTorrent. - Configuring how to serve the πϱTorrent webpages. rTorrent configuration ---------------------- To communicate with rTorrent, rTorrent needs to expose a XMLRPC interface. Most likely this feature is already compiled into your rTorrent, and you only need to enable it. SCGI ~~~~ In your *.rtorrent.rc* file, you need at least this line: .. code-block:: bash scgi_local = /tmp/rtorrent.sock Where */tmp/rtorrent.sock* is the path to the socket file rtorrent will create for communication. If you want to use the HTTPD as a *middle man* for communication, you'll need to make sure the socket is writable by the HTTPD as well. An interesting problem is that you have to make it writable every time you restart rTorrent. (or find a nice way to set up the permissions) Or, if you prefer a network socket to a unix socket: .. code-block:: bash scgi_port = localhost:5000 Although this is typically not the most safe way, as any local user can connect to rTorrent now. Encoding ~~~~~~~~ Having this option in your *.rtorrent.rc* is also recommended: .. code-block:: bash encoding_list = UTF-8 to ensure all the encoding is in UTF-8. Wrapping up ~~~~~~~~~~~ Restart rtorrent once you've changed the configuration. If the socket file is created (and you're using the ``scgi_local`` option) then you've set up your *.rtorrent.rc* correctly. Now, don't forget to make it writable by the web server if you want to use the HTTPD to communicate. Further reading ~~~~~~~~~~~~~~~ rTorrent also has a page on how to `Set up XMLRPC `_. SCGI communication ------------------ If you are going to use πϱTorrent to directly to talk rTorrent instead of via a HTTPD, you can skip this chapter. Lighttpd ~~~~~~~~ Lighttpd is known to work well with πϱTorrent. Setting up SCGI ``````````````` We need ``mod_scgi`` for the rtorrent <-> HTTPD connection. We need to include ``mod_scgi``, so put this in your configuration file: .. code-block:: lua server.modules += ("mod_scgi") Add this to your configuration file: .. code-block:: lua scgi.server = ( "/RPC2" => ( "127.0.0.1" => ( "socket" => "/home/rtorrent/rtorrentsock/rpc.socket", "disable-time" => 0, "check-local" => "disable" ) ) ) Again, make notice of the path */home/rtorrent/rtorrentsock/rpc.socket* that you set in `rTorrent configuration`_ (or, alternatively a host + port, have a look at lighttpd's official documentation on how to set this up, it'll be very similar) Now we can test your SCGI setup. Don't forget to restart lighttpd to make sure the configuration changes have been loaded. Apache ~~~~~~ TODO. Nginx ~~~~~ TODO. Testing SCGI ------------ Onto the testing of the communication. πϱTorrent offers a little test file called ``test.py``: .. code-block:: python from model.rtorrent import RTorrent import socket import sys from config import rtorrent_config from lib.config_parser import parse_config_part, RTorrentConfigException targets = [] for x in rtorrent_config: try: info = parse_config_part(rtorrent_config[x], x) except RTorrentConfigException, e: print 'Invalid config: ', e sys.exit(1) targets.append(info) for x in targets: r = RTorrent(x) try: print '[', x['name'], '] libTorrent version:', r.get_libtorrent_version() except socket.error, e: print 'Failed to connect to libTorrent:', str(e) Which should return your rTorrent version on success, and otherwise will tell you what went wrong. However, we cannot yet test our connection with πϱTorrent since we did not yet create a basic πϱTorrent configuration file. See `Basic πϱTorrent configuration`_ on how to do this. Once you've done this, verify that πϱTorrent works: .. code-block:: bash $ python test.py [ sheeva ] libTorrent version: 0.12.6 Serving webpages ---------------- To actually view any content, we still need to set up the page serving. Using the built-in HTTPD ~~~~~~~~~~~~~~~~~~~~~~~~ Anyway, you'll typically have to select that you want to use the built-in HTTPD in the config file, and just run ``πϱtorrent.py``. To enable the built-in HTTPD, make sure the value ``USE_OWN_HTTPD`` in ``config.py`` is set to ``True``: .. code-block:: python USE_OWN_HTTPD = True Lighttpd ~~~~~~~~ Serving the webpages with `lighttpd`_ is recommended, as it has recieved a lot more testing than the built-in HTTPD, along with many other reasons. It is however, more complicated to set up. Setting up FCGI ``````````````` We need to include ``mod_fastcgi``, so put this in your configuration file: .. code-block:: lua server.modules += ("mod_fastcgi") Somewhere on top, but below the *server.modules =* line, (or just add it to your standard set of modules). In some cases a mod_fastcgi.conf file is shipped with your distribution instead. You can use this file by including it, but make sure it doesn't do any weird stuff like set up PHP. (Who would want that anyway?) .. code-block:: lua include "mod_fastcgi.conf" There. Now we should have fastcgi support for lighttpd. If this went too fast, have a look at the lighttpd documentation. Setting up FCGI to talk to πϱTorrent ```````````````````````````````````` This is the tricky part. You'll need to ensure that a couple of things work: - An empty file is required in your document root to prevent 404's before the FCGI contact is made. - You have the appropriate *rewrite-once* rule. - You have the correct *fastcgi.server* line. .. code-block:: lua url.rewrite-once = ( "^/torrent" => "torrent.tfcgi" ) fastcgi.server += ( ".tfcgi" => ( "torrentfcgi" => ( "socket" => "/tmp/torrent.sock-1", "docroot" => "/home/rtorrent/pyrotorrent" ) ) ) And don't forget to create the empty file: .. code-block:: lua touch /var/www/torrent.tfcgi Where */var/www* is my *var.basedir* in the lighttpd configuration file. Using spawn-fcgi ```````````````` To spawn an instance of πϱTorrent, we use the program called *spawn-fcgi*. It's probably in your package manager; install it. Run the following command as root, obviously again adjust whatever parameters you need to adjust. .. code-block:: bash /usr/bin/spawn-fcgi /home/rtorrent/pyrotorrent/pyrotorrent.py \ -s /tmp/torrent.sock-1 \ -u lighttpd -g lighttpd \ -d /home/rtorrent/pyrotorrent/ Where the socket path is defined by *-s*, the user and group of the pid are set with *-u* and *-g*, and finally, the directory to change to is defined by *-d*. Now that you've spawned a πϱTorrent process, let's check that it's still alive: .. code-block:: bash # ps xua | grep python lighttpd 31639 84.5 1.6 12276 8372 ? Rs 19:57 0:01 /usr/bin/python2.6 /home/rtorrent/pyrotorrent/pyrotorrent.py πϱTorrent configuration ----------------------- The πϱTorrent configuration file is trivial. Basic πϱTorrent configuration ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A basic configuration file (just enough for the famous ``test.py``) looks like this: .. code-block:: python ## Exemplary SCGI setup using unix socket #rtorrent_config = { # 'sheeva': { # 'scgi' : { # 'unix-socket' : '/tmp/rtorrent.sock' # } # } #} # ## Exemplary SCGI setup using scgi over network #rtorrent_config = { # 'sheeva': { # 'scgi' : { # 'host' : '192.168.1.70', # 'port' : 80 # } # } #} # Exemplary HTTP setup using remote XMLRPC server. (SCGI is handled by the HTTPD # in this case) rtorrent_config = { 'sheeva' : { 'http' : { 'host' : '192.168.1.70', 'port' : 80, 'url' : '/RPC2', } } } With examples for all of the three communication methods, uncomment the one you want to use and comment the other ones. (And make sure you adjust the information such as host, port or path) πϱTorrent configuration for webpages ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To actually serve webpages over FCGI, we need to extend the configuration file a bit: .. code-block:: python # Place all your globals here # Base URL for your HTTP website BASE_URL = '/torrent' # HTTP URL for the static files STATIC_URL = BASE_URL + '/static' # Use built-in HTTPD? USE_OWN_HTTPD = False # Default background BACKGROUND_IMAGE = 'cat.jpg' USE_AUTH = True torrent_users = { 'USER NAME' : { 'targets' : ['sheeva', 'sheevareborn'], 'background-image' : 'space1.png', 'password' : 'FILL IN PASSWORD' } } ## Exemplary SCGI setup using unix socket #rtorrent_config = { # 'sheeva' : { # 'scgi' : { # 'unix-socket' : '/tmp/rtorrent.sock' # } # } #} # ## Exemplary SCGI setup using scgi over network #rtorrent_config = { # 'sheeva' : { # 'scgi' : { # 'host' : '192.168.1.70', # 'port' : 80 # } # } #} # Exemplary HTTP setup using remote XMLRPC server. (SCGI is handled by the HTTPD # in this case) rtorrent_config = { 'sheeva' : { 'http' : { 'host' : '192.168.1.70', 'port' : 80, 'url' : '/RPC2', } } , 'sheevareborn' : { 'http' : { 'host' : '42.42.42.42', 'port' : 80, 'url' : '/RPC2', } } } Make sure the *BASE_URL* matches the URL you set in your HTTPD setup. πϱTorrent configuration for serving downloaded files ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ πϱTorrent can also act as direct download server for torrent files. Upon clicking on a torrent you will be presented with a list of files contained by that torrent. With the configuration below, the files will become clickable as well, upon which you will be offered to download the file. .. code-block:: python # Example configuration with file downloading enabled rtorrent_config = { 'woensdag' : { 'http' : { 'host' : '127.0.0.1', 'port' : 8080, 'url' : '/RPC2', }, 'storage_mode' : { 'local_path' : '/home/torrent/woensdag', 'remote_path' : '/home/rtorrent' } } As you can see, the rtorrent entry ``woensdag`` has an extra ``storage_mode`` property. There are currently 2 possible ways of configuring downloads. 1. rtorrent runs on the same machine as πϱTorrent 2. rtorrent runs on another machine, but πϱTorrent can access this machine's filesystem through a mounted directory. local setup ``````````` As you no doubt have guessed, the configuration above is the remote setup. To configure a locally running rtorrent simply drop the ``remote_path`` from the configuration, and set the ``local_path`` property to ``/``. remote setup ```````````` In this configuration ``local_path`` represents the path to the local mount point. ``remote_path`` is the path on the remote host running rtorrent, mounted by the local machine. To summerize, in the above configuration we have mounted the remote directory ``/home/rtorrent`` on the local directory ``/home/torrent/woensdag`` When you're done ---------------- Congratulations. (Some stuff here on what to do if you ran into problems, and also hint that people can now start looking at the code to add features, or how to request features) Oh, and enjoy πϱTorrent.