Installing rtorrent and rutorrent web interface on a Debian 6 system

Here is how to install rtorrent and the rutorrent web interface (password protected) on a Debian 6 system.

We need to install some packages first

apt-get install subversion apache2 libapache2-mod-scgi php5 php5-cli php5-cgi php5-curl mktorrent unrar unzip php5-geoip curl libncurses5-dev pkg-config libcurl4-openssl-dev libsigc++-2.0-dev libterm-readline-gnu-perl automake libapache2-mod-php5 php5-xmlrpc libtool libcppunit-dev

Install XMLRPC to enable rtorrent and rutorrent to work together – These commands should be run using sudo or a root account

mkdir /install
cd /install
svn checkout xmlrpc-c
cd xmlrpc-c
make install

Compile the latest Libtorrent version – Again run these commands with privileges

cd /install
tar xzvf libtorrent-0.13.2.tar.gz
cd libtorrent-0.13.2
make install

Compile rtorrent

tar xzvf rtorrent-0.9.2.tar.gz
cd rtorrent-0.9.2
./configure --with-xmlrpc-c
make install

Now we must place the rtorrent configuration file in our home directory. Get out of root if you are in so and in the home directory of the user that you want to run rutorrent from, using nano or your other favourite editor, paste the following into a file called .rtorrent.rc.

    Make sure to read through and change /home/user/folder to the location of your homefolder!

# This is an example resource file for rTorrent. Copy to
# ~/.rtorrent.rc and enable/modify the options as needed. Remember to
# uncomment the options you wish to enable.

# Maximum and minimum number of peers to connect to per torrent.
#min_peers = 40
#max_peers = 100

# Same as above but for seeding completed torrents (-1 = same as downloading)
#min_peers_seed = 10
#max_peers_seed = 50

# Maximum number of simultanious uploads per torrent.
#max_uploads = 15

# Global upload and download rate in KiB. “0” for unlimited.
#download_rate = 0
#upload_rate = 0

# Default directory to save the downloaded torrents.
directory = /home/user/download

# Default session directory. Make sure you don’t run multiple instance
# of rtorrent using the same session directory. Perhaps using a
# relative path?
session = /home/user/session

# Watch a directory for new torrents, and stop those that have been
# deleted.
#schedule = watch_directory,5,5,load_start=./watch/*.torrent
#schedule = untied_directory,5,5,stop_untied=

# Close torrents when diskspace is low.
#schedule = low_diskspace,5,60,close_low_diskspace=100M

# Stop torrents when reaching upload ratio in percent,
# when also reaching total upload in bytes, or when
# reaching final upload ratio in percent.
# example: stop at ratio 2.0 with at least 200 MB uploaded, or else ratio 20.0
#schedule = ratio,60,60,”stop_on_ratio=200,200M,2000″

# The ip address reported to the tracker.
#ip =
#ip =

# The ip address the listening socket and outgoing connections is
# bound to.
#bind =
#bind =

# Port range to use for listening.
port_range = 56500-56510

# Start opening ports at a random position within the port range.
#port_random = no

# Check hash for finished torrents. Might be usefull until the bug is
# fixed that causes lack of diskspace not to be properly reported.
#check_hash = no

# Set whetever the client should try to connect to UDP trackers.
#use_udp_trackers = yes

# Alternative calls to bind and ip that should handle dynamic ip’s.
#schedule = ip_tick,0,1800,ip=rakshasa
#schedule = bind_tick,0,1800,bind=rakshasa

# Encryption options, set to none (default) or any combination of the following:
# allow_incoming, try_outgoing, require, require_RC4, enable_retry, prefer_plaintext
# The example value allows incoming encrypted connections, starts unencrypted
# outgoing connections but retries with encryption if they fail, preferring
# plaintext to RC4 encryption after the encrypted handshake
# encryption = allow_incoming,enable_retry,prefer_plaintext

# Enable DHT support for trackerless torrents or when all trackers are down.
# May be set to “disable” (completely disable DHT), “off” (do not start DHT),
# “auto” (start and stop DHT as needed), or “on” (start DHT immediately).
# The default is “off”. For DHT to work, a session directory must be defined.
# dht = auto

# UDP port to use for DHT.
# dht_port = 6881

# Enable peer exchange (for torrents not marked private)
# peer_exchange = yes

# Do not modify the following parameters unless you know what you’re doing.

# Hash read-ahead controls how many MB to request the kernel to read
# ahead. If the value is too low the disk may not be fully utilized,
# while if too high the kernel might not be able to keep the read
# pages in memory thus end up trashing.
#hash_read_ahead = 10

# Interval between attempts to check the hash, in milliseconds.
#hash_interval = 100

# Number of attempts to check the hash while using the mincore status,
# before forcing. Overworked systems might need lower values to get a
# decent hash checking rate.
#hash_max_tries = 10
scgi_port = Continue reading

Installing GCC compiler on OSX Lion

If you’re like me and tried to compile an application from source on your mac, you probably received an error saying you had no C compiler installed. By default OSX Lion does not come with one installed, so we are going to install GCC which will allow us to compile our program.

The most straight forward way to do this:

1. Download and install Apple’s XCode. This should link you to the Mac App store and you can install XCode from there very easily.
2. Now that XCode is installed: Open it up. Click XCode -> Preferences -> Downloads tab -> Click install ‘Command Line Tools’. This will install, among other things, the GCC compiler.

And that is it. You can now compile from source!

Fixing locale warning

If you ever encounter this annoying message on a linux box, the solution is quite simple.

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = “en_US.UTF-8”
are supported and installed on your system.
perl: warning: Falling back to the standard locale (“C”).
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

Quite simply enter this command:

sudo locale-gen en_US.UTF-8

You should no longer receive this warning.

How to setup a PPTP VPN on Debian 6

This guide will teach you how to setup and install a functioning PPTP VPN server on Debian 6 squeeze. This will allow you to tunnel all your traffic through your server. This guide should also work for any other linux based distribution.

The first step is to install the pptpd package for the VPN.
apt-get install pptpd

Now in your favourite editor we need to open /etc/pptpd.conf. Scroll down until you see

These two lines need to be uncommented, so should look like this

Now we can add the user accounts we want to be able to connect through the VPN. Open up /etc/ppp/chap-secrets in your favourite editor. It should look something like this
# Secrets for authentication using CHAP
# client server secret IP addresses

Below those lines we can add users, seperate each user by a new line. Say for example we want to enter the username mark with a password cats, our file would look like this
# Secrets for authentication using CHAP
# client server secret IP addresses
mark pptpd cats *

We now need to open the file /etc/ppp/pptpd-options and locate ms-dns. These will look like this

Uncomment both of these and replace them with DNS servers. I will be using the free Google DNS servers in this tutorial. Your file should now look like this

The next step is to open /etc/sysctl.conf in your favourite editor, to enable packet forwarding. Locate the line the line below, and uncomment #net.ipv4.ip_forward=1.
# Uncomment the next line to enable packet forwarding for IPv4

You can now issue the command below, so that IP forwarding will take effect without a reboot.
echo 1 > /proc/sys/net/ipv4/ip_forward

Now we need to create an iptables rule so that our VPN traffic can pass through without issues. This command will depend on if you are running any virtualisation such as being on an XEN or OpenVZ VPS. You should issue below command to figure out the internet interface. In most cases it will be eth0 (No virtualisation or XEN) on OpenVZ it will most likely be venet0

Once we have found out the right interface we can issue the command below. Replace eth0 with the correct interface that you discovered in the step above.
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

The VPN will now work, however this iptables rule will disappear upon reboot of the server, therefore not allowing the VPN to work. To fix this we will issue the command
iptables-save > /etc/iptables.conf

Now edit the file /etc/network/interfaces at below the interface listed there add
pre-up iptables-restore < /etc/iptables.conf

My /etc/network/interfaces looks like this
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp
pre-up iptables-restore < /etc/iptables.conf

The final step is to issue the command
/etc/init.d/pptpd restart

Congratulations! You should now have a functioning PPTPD tunnel in which you can tunnel traffic to your server.

How to setup an NTP server


NTP or network time protocol, is a protocol for synchronising computer clocks, which relies on a pool of time servers that accurately distribute the time to client systems. Due to the distributed nature of NTP, the project relies on people helping out by adding their server to the pool, to distribute time for others. As the number of NTP users grows each day, so does the number of servers required, to meet this exponential demand.

Contributing to the NTP project is very simple and quick and uses only a few megabytes outgoing bandwidth a day, from my experience. The quote below sums up the bandwidth requirements quite nicely.

Currently most servers get about 5-15 NTP packets per second with spikes a couple of times a day of 60-120 packets per second. This is roughly equivalent to 10-15Kbit/sec with spikes of 50-120Kbit/sec. The project steadily acquires more timeservers, so the load should not increase dramatically for each server. In plain terms, you probably need at least 384-512Kbit bandwidth (in and out-going).


apt-get install ntp
Assuming there were no errors during the setup, you should see a message saying: Starting NTP server: ntpd.

Next, we need to edit our ntp.conf

nano /etc/ntp.conf

There is not much that needs to be changed here, however, by default NTP has a few default servers listed in the config file. These default pool servers are fine if you are intending to run NTP as a client only, and not a server. However since we are running a NTP server, we must pick some specific, accurate NTP servers.

Take a look at the lists here and choose a few IPs that you will add to your ntp.conf. Edit the server choice section of the configuration file, it should look something like mine does below.

# maps to about 1000 low-stratum NTP servers. Your server will
# pick a different set every time it starts up. Please consider joining the
# pool:
server iburst
server iburst
server ibusrt
server iburst

Now close and save the file.

Issue /etc/init.d/ntp restart so that the changes take effect. NTP will slowly adjust your clock to the correct time, don’t be alarmed if you don’t have the right time straight away, this will take some time.

Issue ntpq -p to check that NTP is polling servers for the time.

Adding server to the pool

The system setup is now complete, so we can now add our IP to the NTP pool to start contributing!

Visit you must create and sign in for an account. Once that is done, at the above link, type your IP address into the ‘Add my server’ box. Make sure it has automatically selected the correct location of your server, if not let them know in the comment box. Press submit and you are now part of the pool! All that is left, is to select your connection speed on the server management page that will have loaded for you. The general rule of thumb is that the faster speed you select, the more NTP requests you will receive. It is recommended to fill this in accurately, however.

Visit To check the ‘score’ of your server. It will be quite low initially as the time slowly syncs, however your score will eventually reach up to 20. Note that it must be above 10 for your server to be able to distribute time to people.

If you would like to do some further reading on NTP and configuration, I suggest the following links:

If you have any questions or have noticed any inaccuracies in the guide, please let me know in the comments.

Tips on logging an IRC channel

There are many reasons why you may want to log an IRC channel. Perhaps you want to record conversation, for later viewing, or use it to generate statistics. While this post will hopefully cover the basic ideas, it is by no means a tutorial on how to set things up. That will come at a later stage.

The first thing to consider is, how important is logging the IRC channel to you?
Do you need it logged 24/7?

The Eggdrop route…

If you are after a 24/7 solution, then you might want to consider setting up an Eggdrop Bot, which is an open source IRC bot which is very flexible and easy to use. To run this, you could use a cheap VPS or a shell account.

  • A shell account is essentially a limited access account, to a server, connecting using SSH or telnet.
  • A VPS is much different, it is a Virtual Private Server. Giving you root access of a virtualised system.

Advantages of an Eggdrop Bot:
+Very stable, expect great uptime.
+Highly configurable – Includes many great options to choose what is logged and what is not.
+Load TCL scripts to protect your channel, manage user privileges, etc.
+Great community support and documentation (Oldest IRC bot still in development, with a great community)

-Steep learning curve for beginners (No GUI)

If you are serious about archiving your channel chat, then I would highly recommend an Eggdrop Bot. The advantages highly outweigh the minor disadvantage for new users.

Example Logfile:

[00:42] h1ll37: yeah it screwed up the bootloader of TinyXP >< [00:42] -Dajori- Eventyret from [00:42] -m4t- hey, is there a preferred way to switch versions of gcc? eg. from 4.4 to 4.5? [00:42] -GH9897969x987l- hi all [00:42] -Eventyret- Dajori: ? [00:42] -m4t- switch the symlinks in /usr/bin over

Please note that the usernames are wrapped in ‘< >‘ characters in the logfiles, not ‘-‘. The page doesn’t seem to like the ‘< >‘ characters.

The client route…

If you are not so worried about not having 24/7 logfiles, and not having to worry about an Eggdrop Bot then I would recommend you log using your existing IRC client.

XChat is a great client, which has the option to create logfiles of the channels you are on, found in the settings menu. By default it will just create one large log file per channel, however you can change the logfile settings, to rotate the logfiles more often. See for more info.

+Easy to setup and use.
+Quite configurable.

-Don’t expect great uptimes.

Example logfile output:

Oct 06 17:28:49 -delarue- mordy; packets are 1444 bytes; the funny thing though is that I can see them on both sides with tcpdump.
Oct 06 17:29:18 -delarue- so that would suggest against MTU .. I would think.
Oct 06 17:29:54 -delarue- I thought it must be config problem on the receive side until I tried the same config under kvm and the IPSEC works just fine ..
Oct 06 17:30:01 -mordy- try setting your MTU a bit lower, see what happens
Oct 06 17:30:03 -lulzfish_4- Linux-CLI: strange… what distro is that, again?

Please note that the usernames are wrapped in ‘< >‘ characters in the logfiles, not ‘-‘. The page doesn’t seem to like the ‘< >‘ characters.

Final thoughts…

At the end of the day, it is really up to you which option of logging you choose. There are many other clients and bots, which can achieve the logging effect, however personally I think that Eggdrop and xChat are two good ways to log your channels.

Location of xChat logfiles

I just wanted to document this for other people that may have this annoying query in the future.

There is not much information about where xChat and X-Chat Aqua store their logfiles!

The location of the logfiles is

~/.xchat2/xchatlogs/ where ~/ is the location of your home folder.

The .xchat2 folder is indeed hidden, which made it tricky to first locate.

On the older versions of X-Chat Aqua on Mac, the logfiles were stored in
~/Library/Application Support/X-Chat Aqua/xchatlogs

Running scripts in background

I recently came across this problem when experimenting with the PieSpy Bot.

It uses a sh script to launch a java command within, however the output, and subsequent display, stays attached. As soon as I exited the SSH session the processes is killed!

There is a simple solution. We must run it in the background. This also works with many other things that need to be launched into the background

To launch the script we are running sh ./ Instead, put an & on the end of the command, so the new command will look like sh ./ & This will run the process in the background!

As I mentioned above, this solution applies to not just sh scripts. The PieSpy Bot uses the sh script to launch a java command. So if we open up the sh script it has the code

java -Djava.awt.headless=true -classpath .:./lib/pircbot.jar org.jibble.socnet.SocialNetworkBot ./config.ini

Once again, we put the & on the end of the command and it will launch into the background

java -Djava.awt.headless=true -classpath .:./lib/pircbot.jar org.jibble.socnet.SocialNetworkBot ./config.ini &

Adding users to sudoers list in Debian/Ubuntu

When setting up a new system, or adding new user accounts. You may find that you receive this message when using the sudo command.

username not in the sudoers file. This incident will be reported.

There is a simple solution. We must add the user account to the sudoers file.

Note: You must be logged into the root account, or already have sudo access to run this command.

Open up Terminal or SSH and type:

sudo adduser username sudo

Replace username with the account that you would like to have sudo access.

The account should now has sudo access.