Installing Quassel core on QNAP NAS

I haven’t been on IRC for over a decade. But lately, I’ve decided that I should spend more time in my local hackerspace’s IRC channel. Previously I used mIRC, but since my computer isn’t on all day, and I’d like the ability to be connected from multiple devices at the same time under the same nick, I decided that I maybe should use a bouncer. Enter Quassel. It seems to do what I want (for now) and here’s how I got the core up and running on my NAS (639). It was relatively painless thanks to a few guys (sorry, I forgot your nicks) on the Quassel IRC channel who pointed me in the direction of the statically linked core.

Update (07/05/2012): This did not work for me with Quassel 0.8.0. The staticly linked build needs a newer version of GLIBC than what’s present on my NAS. If your NAS has GLIBC 2.7 or later, you’re good to go.

  1. Install ipkg if not already installed.
  2. Telnet into your NAS as admin (you can't login with any other account even if they have admin privileges).
  3. Install other prerequisites: ipkg install coreutils openssl
  4. mkdir /share/MD0_DATA/.quasselcore
  5. cd /share/MD0_DATA/.quasselcore
  6. Download the statically linked Quassel core: wget
  7. bunzip2 quasselcore-static-0.7.3.bz2
  8. chmod +x quasselcore-static-0.7.3.bz2
  9. Create a new user to run Quassel under: adduser -h /share/MD0_DATA/.quasselcore/home quassel
  10. mkdir home/.config/
  11. cd home/.config/
  12. Using your favourite text editor create openssl.cnf in the current directory with the following contents:
    # OpenSSL configuration file.
    # Establish working directory.
    dir                    = .
    [ ca ]
    default_ca                = CA_default
    [ CA_default ]
    serial                    = $dir/serial
    database              = $dir/certindex.txt
    new_certs_dir             = $dir/certs
    certificate               = $dir/cacert.pem
    private_key               = $dir/private/cakey.pem
    default_days              = 365
    default_md                = md5
    preserve              = no
    email_in_dn               = no
    nameopt                   = default_ca
    certopt                   = default_ca
    policy                    = policy_match
    [ policy_match ]
    countryName               = match
    stateOrProvinceName           = match
    organizationName          = match
    organizationalUnitName            = optional
    commonName                = supplied
    emailAddress              = optional
    [ req ]
    default_bits              = 1024           # Size of keys
    default_keyfile               = key.pem        # name of generated keys
    default_md                = md5            # message digest algorithm
    string_mask               = nombstr        # permitted characters
    distinguished_name            = req_distinguished_name
    req_extensions                = v3_req
    [ req_distinguished_name ]
    # Variable name              Prompt string
    #-------------------------     ----------------------------------
    0.organizationName            = Organization Name (company)
    organizationalUnitName            = Organizational Unit Name (department, division)
    emailAddress              = Email Address
    emailAddress_max          = 40
    localityName              = Locality Name (city, district)
    stateOrProvinceName           = State or Province Name (full name)
    countryName               = Country Name (2 letter code)
    countryName_min               = 2
    countryName_max               = 2
    commonName                = Common Name (hostname, IP, or your name)
    commonName_max                = 64
    # Default values for the above, for consistency and less typing.
    # Variable name              Value
    #------------------------      ------------------------------
    0.organizationName_default        = My Company
    localityName_default          = My Town
    stateOrProvinceName_default       = State or Providence
    countryName_default           = US
    [ v3_ca ]
    basicConstraints          = CA:TRUE
    subjectKeyIdentifier          = hash
    authorityKeyIdentifier            = keyid:always,issuer:always
    [ v3_req ]
    basicConstraints          = CA:FALSE
    subjectKeyIdentifier          = hash
  13. Create the SSL cert: openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout quasselCert.pem -out quasselCert.pem -config openssl.cnf
  14. Setup an autorun script if you haven't already done so before.
  15. Add the following line to your autorun script: /share/MD0_DATA/.qpkg/Optware/bin/coreutils-su -c "/share/MD0_DATA/.quasselcore/quasselcore-static-0.7.3" - quassel
  16. This should start Quassel core whenever you restart your NAS. Otherwise, you can use screen to start a persistent session and run Quassel core ( /share/MD0_DATA/.quasselcore/quasselcore-static-0.7.3 ) from there.
  17. Connect to the core with the Quassel client and configure the core from there. Note: I did not install PostgreSQL and since this core is only to serve my limited needs, I sent with the local SQLite