Project

General

Profile

Build Core On Ubuntu » History » Version 10

verschdl, 11/30/2010 11:16 AM
Added the default port to start/stop script, coz' leaving it empty (--port=$PORT) didn't worked out on my debian lenny host…

1 6 seezer
h1. Building Quassel core from source on Ubuntu
2 1 miohtama
3 6 seezer
These instructions tell how to build the latest quassel core for your Ubuntu server.
4 6 seezer
Since it scales better with many users and huge amounts of history, using PostgreSQL database as backend will be explained, too.
5 1 miohtama
6 7 seezer
h3. Make sure repositores are up-to-date
7 6 seezer
8 1 miohtama
<pre>
9 1 miohtama
sudo apt-get update
10 1 miohtama
</pre>
11 1 miohtama
12 7 seezer
h3. Install required dependencies and build tools
13 6 seezer
14 1 miohtama
<pre>
15 6 seezer
sudo apt-get install git-core qt4-dev-tools libqt4-dev libqt4-sql-sqlite screen
16 1 miohtama
</pre>
17 1 miohtama
18 6 seezer
Also install the sql driver for your planned backend.
19 6 seezer
20 6 seezer
- For sqlite (Quassels default, suggested for single user setups):
21 1 miohtama
<pre>
22 6 seezer
sudo apt-get install libqt4-sql-sqlite
23 6 seezer
</pre>
24 6 seezer
25 6 seezer
- For PostgreSQL (suggested for multiuser setups):
26 6 seezer
<pre>
27 6 seezer
sudo apt-get install libqt4-sql-psql
28 6 seezer
</pre>
29 6 seezer
30 7 seezer
h3. Get the sources
31 6 seezer
32 6 seezer
<pre>
33 9 johu
git clone git://gitorious.org/quassel/quassel.git
34 1 miohtama
</pre>
35 1 miohtama
36 7 seezer
h3. Build it
37 6 seezer
38 4 seezer
<pre>
39 1 miohtama
mkdir quassel/build
40 1 miohtama
cd quassel/build
41 1 miohtama
cmake -DWANT_CORE=1 -DWANT_QTCLIENT=0 -DWANT_MONO=0 ../
42 4 seezer
make
43 1 miohtama
optional step: make install
44 1 miohtama
</pre>
45 1 miohtama
46 1 miohtama
Another common option to cmake would be:
47 6 seezer
<pre>
48 6 seezer
-DINSTALL_PREFIX=/path/where/it/should/be/installed
49 6 seezer
</pre>
50 4 seezer
Otherwise /usr/local/ is used as the install prefix.
51 5 seezer
52 6 seezer
h2. Optional Step: Use PostgreSQL as backend
53 1 miohtama
54 7 seezer
h3. Setup PostgreSQL database master user
55 6 seezer
56 1 miohtama
* "Follow these Ubuntu specific instructions":https://help.ubuntu.com/community/PostgreSQL
57 2 miohtama
58 7 seezer
h3. Setup quassel PostgreSQL database. The database password will be asked later by the Quassel client configuration wizard.
59 1 miohtama
60 1 miohtama
<pre>
61 1 miohtama
sudo -i
62 1 miohtama
sudo -u postgres psql
63 1 miohtama
postgres=# CREATE USER quassel ENCRYPTED PASSWORD 'somepassword';
64 1 miohtama
CREATE ROLE
65 1 miohtama
postgres=# CREATE DATABASE quassel WITH OWNER quassel ENCODING 'UTF8';
66 1 miohtama
CREATE DATABASE
67 1 miohtama
</pre>
68 1 miohtama
69 6 seezer
h2. Optional Step: Create SSL certificate:
70 1 miohtama
71 1 miohtama
<pre>
72 1 miohtama
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout ~/.config/quassel-irc.org/quasselCert.pem -out ~/.config/quassel-irc.org/quasselCert.pem
73 1 miohtama
</pre>
74 1 miohtama
75 1 miohtama
h2. Running Core
76 1 miohtama
77 1 miohtama
"Screen":http://www.debuntu.org/2006/07/04/72-how-to-screen-the-ultimate-admin-tool is a terminal tool which allwos you to leave terminal sessions running background even when you are logged out.
78 1 miohtama
79 1 miohtama
We run quassel in screen so that core keeps running as long as it is killed or the server is restarted
80 1 miohtama
81 1 miohtama
<pre>
82 1 miohtama
screen
83 4 seezer
cd quassel/build
84 1 miohtama
./quasselcore
85 1 miohtama
</pre>
86 1 miohtama
87 1 miohtama
Now you can shut down your terminal and the quassel core still keeps running. 
88 1 miohtama
89 1 miohtama
Later we can reattach to this screen session to check out the quassel core terminal output to see if there has been any problems. Login in and type:
90 1 miohtama
91 1 miohtama
<pre>
92 1 miohtama
screen -x
93 1 miohtama
</pre>
94 1 miohtama
95 1 miohtama
Now you should how you left your terminal last time you shut it down.
96 1 miohtama
97 1 miohtama
98 1 miohtama
h2. Starting using it
99 1 miohtama
100 1 miohtama
Configuration wizard will guide you through the rest of the setup when you connect to your Quassel core using Quassel client for the first time. Remember to choose PostgreSQL backend instead of SQLite when asked.
101 8 yitsushi
102 8 yitsushi
103 8 yitsushi
h2. Start as Daemon
104 8 yitsushi
105 8 yitsushi
*make install*, create a user *quasselcore* with *quassel* group and create the */etc/init.d/quasselcore*:
106 8 yitsushi
107 8 yitsushi
<pre>
108 8 yitsushi
### BEGIN INIT INFO
109 8 yitsushi
# Provides:          quasselcore
110 8 yitsushi
# Required-Start:    $network $local_fs
111 8 yitsushi
# Required-Stop:
112 8 yitsushi
# Should-Start:
113 8 yitsushi
# Should-Stop:
114 8 yitsushi
# Default-Start:     2 3 4 5
115 8 yitsushi
# Default-Stop:      0 1 6
116 8 yitsushi
# Short-Description: distributed IRC client using a central core component
117 8 yitsushi
# Description:       This is the core component of Quassel. A modern,
118 8 yitsushi
#                    cross-platform, distributed IRC client, meaning that one
119 8 yitsushi
#                    (or multiple) client(s) can attach to and detach from this
120 8 yitsushi
#                    central core. It's much like the popular combination
121 8 yitsushi
#                    of screen and a text-based IRC client such as WeeChat.
122 8 yitsushi
### END INIT INFO
123 8 yitsushi
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
124 8 yitsushi
125 8 yitsushi
DAEMON=/usr/local/bin/quasselcore
126 8 yitsushi
NAME=quasselcore
127 8 yitsushi
DESC="distributed IRC core"
128 8 yitsushi
LOGDIR=/var/log/quassel
129 10 verschdl
PORT=4242
130 8 yitsushi
131 8 yitsushi
PIDFILE=/var/run/quasselcore.pid
132 8 yitsushi
133 8 yitsushi
test -x $DAEMON || exit 0
134 8 yitsushi
135 8 yitsushi
. /lib/lsb/init-functions
136 8 yitsushi
137 8 yitsushi
DAEMON_OPTS=""
138 8 yitsushi
DIETIME=10
139 8 yitsushi
STARTIME=3
140 8 yitsushi
LOGFILE=$LOGDIR/core.log
141 8 yitsushi
DATADIR=/var/cache/quassel
142 8 yitsushi
DAEMONUSER=quasselcore
143 8 yitsushi
144 8 yitsushi
if [ -f /etc/default/$NAME ] ; then
145 8 yitsushi
    . /etc/default/$NAME
146 8 yitsushi
fi
147 8 yitsushi
148 8 yitsushi
if [ -n "$DAEMONUSER" ] ; then
149 8 yitsushi
    if getent passwd | grep -q "^$DAEMONUSER:"; then
150 8 yitsushi
        # Obtain the uid and gid
151 8 yitsushi
        DAEMONUID=`getent passwd |grep "^$DAEMONUSER:" | awk -F : '{print $3}'`
152 8 yitsushi
        DAEMONGID=`getent passwd |grep "^$DAEMONUSER:" | awk -F : '{print $4}'`
153 8 yitsushi
    else
154 8 yitsushi
        log_failure_msg "The user $DAEMONUSER, required to run $NAME does not exist."
155 8 yitsushi
        exit 1
156 8 yitsushi
    fi
157 8 yitsushi
fi
158 8 yitsushi
159 8 yitsushi
set -e
160 8 yitsushi
161 8 yitsushi
running_pid() {
162 8 yitsushi
    pid=$1
163 8 yitsushi
    name=$2
164 8 yitsushi
    [ -z "$pid" ] && return 1
165 8 yitsushi
    [ ! -d /proc/$pid ] &&  return 1
166 8 yitsushi
    cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -n 1 |cut -d : -f 1`
167 8 yitsushi
    [ "$cmd" != "$name" ] &&  return 1
168 8 yitsushi
    return 0
169 8 yitsushi
}
170 8 yitsushi
171 8 yitsushi
running() {
172 8 yitsushi
    [ ! -f "$PIDFILE" ] && return 1
173 8 yitsushi
    pid=`cat $PIDFILE`
174 8 yitsushi
    running_pid $pid $DAEMON || return 1
175 8 yitsushi
    return 0
176 8 yitsushi
}
177 8 yitsushi
178 8 yitsushi
start_server() {
179 8 yitsushi
    start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile \
180 8 yitsushi
        --background --chuid $DAEMONUSER --exec $DAEMON \
181 8 yitsushi
        -- --logfile=$LOGFILE --loglevel=$LOGLEVEL --configdir=$DATADIR \
182 8 yitsushi
           --port=$PORT \
183 8 yitsushi
           $DAEMON_OPTS
184 8 yitsushi
    errcode=$?
185 8 yitsushi
    return $errcode
186 8 yitsushi
}
187 8 yitsushi
188 8 yitsushi
stop_server() {
189 8 yitsushi
    start-stop-daemon --stop --quiet --pidfile $PIDFILE --user $DAEMONUSER \
190 8 yitsushi
        --exec $DAEMON
191 8 yitsushi
    errcode=$?
192 8 yitsushi
    return $errcode
193 8 yitsushi
}
194 8 yitsushi
195 8 yitsushi
force_stop() {
196 8 yitsushi
    [ ! -e "$PIDFILE" ] && return
197 8 yitsushi
    if running ; then
198 8 yitsushi
        kill -15 $pid
199 8 yitsushi
    # Is it really dead?
200 8 yitsushi
        sleep "$DIETIME"s
201 8 yitsushi
        if running ; then
202 8 yitsushi
            kill -9 $pid
203 8 yitsushi
            sleep "$DIETIME"s
204 8 yitsushi
            if running ; then
205 8 yitsushi
                echo "Cannot kill $NAME (pid=$pid)!"
206 8 yitsushi
                exit 1
207 8 yitsushi
            fi
208 8 yitsushi
        fi
209 8 yitsushi
    fi
210 8 yitsushi
    rm -f $PIDFILE
211 8 yitsushi
}
212 8 yitsushi
213 8 yitsushi
case "$1" in
214 8 yitsushi
  start)
215 8 yitsushi
    log_daemon_msg "Starting $DESC" "$NAME"
216 8 yitsushi
        # Check if it's running first
217 8 yitsushi
        if running ;  then
218 8 yitsushi
            log_progress_msg "apparently already running"
219 8 yitsushi
            log_end_msg 0
220 8 yitsushi
            exit 0
221 8 yitsushi
        fi
222 8 yitsushi
        if start_server ; then
223 8 yitsushi
            [ -n "$STARTTIME" ] && sleep $STARTTIME # Wait some time
224 8 yitsushi
            if  running ;  then
225 8 yitsushi
                log_end_msg 0
226 8 yitsushi
            else
227 8 yitsushi
                log_end_msg 1
228 8 yitsushi
            fi
229 8 yitsushi
        else
230 8 yitsushi
            log_end_msg 1
231 8 yitsushi
        fi
232 8 yitsushi
    ;;
233 8 yitsushi
  stop)
234 8 yitsushi
        log_daemon_msg "Stopping $DESC" "$NAME"
235 8 yitsushi
        if running ; then
236 8 yitsushi
            stop_server
237 8 yitsushi
            log_end_msg $?
238 8 yitsushi
        else
239 8 yitsushi
            log_progress_msg "apparently not running"
240 8 yitsushi
            log_end_msg 0
241 8 yitsushi
            exit 0
242 8 yitsushi
        fi
243 8 yitsushi
        ;;
244 8 yitsushi
  force-stop)
245 8 yitsushi
        $0 stop
246 8 yitsushi
        if running; then
247 8 yitsushi
            # If it's still running try to kill it more forcefully
248 8 yitsushi
            log_daemon_msg "Stopping (force) $DESC" "$NAME"
249 8 yitsushi
            force_stop
250 8 yitsushi
            log_end_msg $?
251 8 yitsushi
        fi
252 8 yitsushi
    ;;
253 8 yitsushi
  restart|force-reload)
254 8 yitsushi
        log_daemon_msg "Restarting $DESC" "$NAME"
255 8 yitsushi
        stop_server
256 8 yitsushi
        # Wait some sensible amount, some server need this
257 8 yitsushi
        [ -n "$DIETIME" ] && sleep $DIETIME
258 8 yitsushi
        start_server
259 8 yitsushi
        [ -n "$STARTTIME" ] && sleep $STARTTIME
260 8 yitsushi
        running
261 8 yitsushi
        log_end_msg $?
262 8 yitsushi
    ;;
263 8 yitsushi
  status)
264 8 yitsushi
        log_daemon_msg "Checking status of $DESC" "$NAME"
265 8 yitsushi
        if running ; then
266 8 yitsushi
            log_success_msg "running"
267 8 yitsushi
            log_end_msg 0
268 8 yitsushi
        else
269 8 yitsushi
            log_success_msg "apparently not running"
270 8 yitsushi
            log_end_msg 1
271 8 yitsushi
            exit 1
272 8 yitsushi
        fi
273 8 yitsushi
        ;;
274 8 yitsushi
  reload)
275 8 yitsushi
        log_warning_msg "Reloading $NAME daemon: not implemented, as the daemon"
276 8 yitsushi
        log_warning_msg "cannot re-read the config file (use restart)."
277 8 yitsushi
        ;;
278 8 yitsushi
279 8 yitsushi
  *)
280 8 yitsushi
    N=/etc/init.d/$NAME
281 8 yitsushi
      echo "Usage: $N {start|stop|force-stop|restart|force-reload|status}" >&2
282 8 yitsushi
    exit 1
283 8 yitsushi
    ;;
284 8 yitsushi
esac
285 8 yitsushi
286 8 yitsushi
exit 0
287 8 yitsushi
</pre>
288 8 yitsushi
289 8 yitsushi
And now...
290 8 yitsushi
Binary: /usr/local/bin/quasselcore
291 8 yitsushi
The logfile is: /var/log/quassel/core.log
292 8 yitsushi
PID-file: /var/run/quasselcore.pid
293 8 yitsushi
Data dir (confi, cert): /var/cache/quassel
294 8 yitsushi
Daemon-user: quasselcore
295 8 yitsushi
296 8 yitsushi
Ok... Start: 
297 8 yitsushi
<pre>
298 8 yitsushi
/etc/init.d/quasselcore start
299 8 yitsushi
</pre>