This post is roughly 10 years old; originally published on August 9, 2014! The information presented here may be out of date and inaccurate.
Willie is an IRC bot written in Python
that I’ve recently started using. This blog post describes how to install Willie
on Debian and as usual I will be using virtualenv
to isolate this Python
application from the rest of the system.
First you’ll need Python.
sudo apt-get install libpython2.7 python2.7 python2.7-dev python2.7-minimal
The following will also be required to enable all the features Willie supports.
sudo apt-get install enchant python2.7-dev libxslt1-dev libxml2-dev
Remove any apt
installed Python packages that we are about to replace.
The versions of these packages in the Debian repositories soon get stale.
sudo apt-get purge python-setuptools python-virtualenv python-pip python-profiler
Install pip
.
wget https://bootstrap.pypa.io/get-pip.py
sudo python2.7 get-pip.py
Use pip
to install virtualenv
.
sudo pip install virtualenv --upgrade
Create a “Snakepit” directory for storing all the Python virtual environments.
mkdir ~/Snakepit
The following will create a new virtualenv called willie
using Python
2.7 as the interpreter.
virtualenv -p /usr/bin/python2.7 ~/Snakepit/willie
Activate the virtualenv for Willie.
source ~/Snakepit/willie/bin/activate
Your shell prompt will change, something like (willie)user@host:~$
,
while a virtualenv is being worked on to indicate which virtualenv is
currently active.
While working on a virtualenv you can pip
install what you need or
manually install any Python libraries safe in the knowledge you will
not upset any other virtualenvs or the global packages in the process.
Very useful for developing a new branch which may have different
library requirements than the current stable release.
When you are finished working in a virtualenv you can deactivate it by
simply executing deactivate
.
I’ve decided to use Python 2.7 to run Willie and therefore have to
install backports.ssl_match_hostname
which is not required if you use
Python 3.3.
pip install willie backports.ssl_match_hostname
Willie has no external dependencies, besides Python. However, some of the modules do have external dependencies. So install the following Python modules so that I can make use of everything Willie can do.
pip install feedparser pytz lxml praw pyenchant pygeoip ipython --upgrade
I am not going to explain to how to configure Willie because all that good stuff is very well documented by the project.
But for reference, my default.cfg
looks something like this:
[core]
nick = nicofyourbot
user = nicofyourbot
name = Give You Bot A Name
host = chat.freenode.net
use_ssl = true
verify_ssl = true
port = 6697
owner = nicofthebotowner
channels = #example
nickserv_password = ************
prefix = \.
timeout = 120
[db]
userdb_type = sqlite
userdb_file = /home/username/.willie/willie.db
From this point on I assume you’ve completed the first run
configuration of Willie and have .willie/default.cfg
in your home
directory.
Add the following to /etc/init.d/willie
.
#!/bin/sh
### BEGIN INIT INFO
# Provides: willie
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Should-Start: $network
# Should-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Willie IRC Bot.
# Description: Start and stops the Willie IRC bot for a given user.
### END INIT INFO
# NOTE! Replace with the user you want to run Willie.
willie_USER="yourusername"
HOMEDIR=$(getent passwd $willie_USER | awk -F: '{print $6}')
DAEMON="$HOMEDIR/Snakepit/willie/bin/willie"
CONFIG="$HOMEDIR/.willie/default.cfg"
startd() {
if [ -f ${CONFIG} ]; then
echo "Starting Willie for $willie_USER"
start-stop-daemon -c $willie_USER -u $willie_USER -x $DAEMON -S -- --config ${CONFIG} --fork --quiet
else
echo "Couldn't start Willie for $willie_USER (no $CONFIG found)"
fi
}
stopd() {
echo "Stopping Willie for $willie_USER"
willie_PID=$(pgrep -fu $willie_USER $DAEMON)
if [ -z "$willie_PID" ]; then
echo "Willie for USER $willie_USER: not running."
else
kill -15 $willie_PID
fi
}
status() {
willie_PID=$(pgrep -fu $willie_USER $DAEMON)
if [ -z "$willie_PID" ]; then
echo "Willie for USER $willie_USER: not running."
else
echo "Willie for USER $willie_USER: running (pid $willie_PID)"
fi
}
case "$1" in
start) startd ;;
stop) stopd ;;
restart|reload|force-reload) stopd && startd ;;
status) status ;;
*) echo "Usage: /etc/init.d/willie {start|stop|reload|force-reload|restart|status}"
exit 1
;;
esac
exit 0
Set the permissions.
sudo chmod +x /etc/init.d/willie
Check that you can start/stop Willie.
sudo /etc/init.d/willie start
sudo /etc/init.d/willie status
sudo /etc/init.d/willie stop
Add willie
to the startup/shutdown sequence.
sudo update-rc.d willie defaults
And that’s it. Willie is now running as a daemon inside a virtualenv.