Skip to content

Instantly share code, notes, and snippets.

@themouette
Created January 12, 2017 16:51
Show Gist options
  • Save themouette/40bbd9fa23012fb7591267c90973f38c to your computer and use it in GitHub Desktop.
Save themouette/40bbd9fa23012fb7591267c90973f38c to your computer and use it in GitHub Desktop.
Install an irc bouncer

IRC is cool, but IRC is volatile. Here is how to install [ZNC](http://wiki.znc.in) on an LXC machine.

> Note that irssi/weechat/whateverircclient in a screen/tmux would do as > well

First, ask for a LXC container to [snoc@gandi.net](mailto:snoc@gandi.net).

Once you get your container, follow those steps:

## Secure Your Container

### Provision Your SSH Key

On your host machine:

` bash ssh-copy-id -i ~/.ssh/id.pub root@{yourname}.lxc.gandi.net`

### Disable SSH Password Authentication

` bash ssh root@{yourname}.lxc.gandi.net grep -q '^PasswordAuthentication' /etc/ssh/sshd_config && \ sed -i 's/^PasswordAuthentication.*$/PasswordAuthentication no/' /etc/ssh/sshd_config || \ echo 'PasswordAuthentication no' >> /etc/ssh/sshd_config grep -q '^ChallengeResponseAuthentication' /etc/ssh/sshd_config && \ sed -i 's/^ChallengeResponseAuthentication.*$/ChallengeResponseAuthentication no/' /etc/ssh/sshd_config || \ echo 'ChallengeResponseAuthentication no' >> /etc/ssh/sshd_config service ssh restart`

Before exiting, open another console and make sure you can still ssh into the container.

### Change Password

` bash passwd`

## Install ZNC and dependencies

We use the recommanded install for wheezy (from [official website](http://wiki.znc.in/User:Resistance/Debian_Package_Repository_for_ZNC))

` bash apt-get install debian-keyring debian-archive-keyring wget wget --quiet http://packages.temporal-intelligence.net/repo.gpg.key -O - | \ apt-key add - echo 'deb http://packages.temporal-intelligence.net/znc/debian/ wheezy main' > \ /etc/apt/sources.list.d/znc.list apt-get update ; apt-get install znc`

## Configure ZNC

` bash useradd -c "ZNC IRC bouncer" -s /bin/bash -m znc su znc -c 'znc --makeconf' [ .. ] Checking for list of available modules... [ >> ] ok [ !! ] WARNING: config [/home/znc/.znc/configs/znc.conf] already exists. [ ** ] [ ** ] -- Global settings -- [ ** ] [ ?? ] Listen on port (1025 to 65534): 6697 [ ?? ] Listen using SSL (yes/no) [no]: yes [ ?? ] Listen using both IPv4 and IPv6 (yes/no) [yes]: yes [ .. ] Verifying the listener... [ >> ] ok [ ** ] Enabled global modules [webadmin] [ ** ] [ ** ] -- Admin user settings -- [ ** ] [ ?? ] Username (alphanumeric): themouette [ ?? ] Enter password: [ ?? ] Confirm password: [ ?? ] Nick [themouette]: [ ?? ] Alternate nick [themouette_]: [ ?? ] Ident [themouette]: [ ?? ] Real name [Got ZNC?]: Julien Muetton [ ?? ] Bind host (optional): [ ** ] Enabled user modules [chansaver, controlpanel] [ ** ] [ ?? ] Set up a network? (yes/no) [yes]: no [ ** ] [ .. ] Writing config [/home/znc/.znc/configs/znc.conf]... [ !! ] This config already exists. [ ?? ] Are you sure you want to overwrite it? (yes/no) [no]: yes [ .. ] Overwriting config [/home/znc/.znc/configs/znc.conf]... [ >> ] ok [ ** ] [ ** ] To connect to this ZNC you need to connect to it as your IRC server [ ** ] using the port that you supplied. You have to supply your login info [ ** ] as the IRC server password like this: user/network:pass. [ ** ] [ ** ] Try something like this in your IRC client... [ ** ] /server <znc_server_ip> +6697 themouette:<pass> [ ** ] [ ** ] To manage settings, users and networks, point your web browser to [ ** ] https://<znc_server_ip>:6697/ [ ** ] [ ?? ] Launch ZNC now? (yes/no) [yes]: no`

## Set as Daemon

Copy the following into /etc/init.d/znc

` sh #! /bin/sh ### BEGIN INIT INFO # Provides: znc # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: ZNC IRC bouncer # Description: ZNC is an IRC bouncer ### END INIT INFO PATH=/sbin:/usr/sbin:/bin:/usr/bin DESC="ZNC daemon" NAME=znc DAEMON=/usr/bin/$NAME DATADIR=/home/znc/.znc/ DAEMON_ARGS="--datadir=$DATADIR" PIDDIR=/var/run/znc PIDFILE=$PIDDIR/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME USER=znc GROUP=znc # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 # Read configuration variable file if it is present [ -r /etc/default/$NAME ] && . /etc/default/$NAME # Load the VERBOSE setting and other rcS variables . /lib/init/vars.sh # Define LSB log_* functions. # Depend on lsb-base (>= 3.2-14) to ensure that this file is present # and status_of_proc is working. . /lib/lsb/init-functions # # Function that starts the daemon/service # do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started if [ ! -d $PIDDIR ] then mkdir $PIDDIR fi chown $USER:$GROUP $PIDDIR start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test --chuid $USER > /dev/null || return 1 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --chuid $USER -- $DAEMON_ARGS > /dev/null || return 2 } # # Function that stops the daemon/service # do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME --chuid $USER RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 # Wait for children to finish too if this is a daemon that forks # and if the daemon is only ever run from this initscript. # If the above conditions are not satisfied then add some other code # that waits for the process to drop all resources that could be # needed by services started subsequently. A last resort is to # sleep for some time. start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON --chuid $USER [ "$?" = 2 ] && return 2 # Many daemons don't delete their pidfiles when they exit. rm -f $PIDFILE return "$RETVAL" } # # Function that sends a SIGHUP to the daemon/service # do_reload() { start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME --chuid $USER return 0 } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; status) status_of_proc -p $PIDFILE "$DAEMON" "$NAME" && exit 0 || exit $? ;; reload) log_daemon_msg "Reloading $DESC" "$NAME" do_reload log_end_msg $? ;; restart) log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) echo "Usage: $SCRIPTNAME {status|start|stop|reload|restart}" >&2 exit 3 ;; esac`

Then

` bash chmod 755 /etc/init.d/znc update-rc.d znc defaults service znc start`

## Configure ZNC

Open your browser at [https://yourname.lxc.gandi.net:6697](https://yourname.lxc.gandi.net:6697)

Connect to the admin panel.

Go to Your Settings and add the following networks:

  • freenode (Servers of this IRC network: irc.freenode.net:6667)
  • gandi (Servers of this IRC network: irc.scalix.gandi.net 6667)

### Automatic Away Status

While editing the network, enable the simple_away plugin.

### Fix Encoding

In the ZNC web interface, go to Your Settings > `ZNC Behavior`:

Select Don't ensure any encoding at all (legacy mode, not recommended)

In Every network configuration, set Server encoding to: Don't ensure any encoding at all (legacy mode, not recommended)

### Get Date In Logs

In the ZNC web interface, go to Your Settings > ZNC Behavior, set Timestamp Format to [%d/%m %H:%M:%S]

> Do not declare your channels in ZNC, just use the chansaver plugin (enabled > by default)

## Configure Your Client

All you need to know is that to connect to gandi network, you need to authenticate as yourZncUsername/gandi and to connect to freenode yourZncUsername/freenode.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment