From 2f3083d9c4300f8fcde286f128d8a4b3605fb8fe Mon Sep 17 00:00:00 2001 From: Julien Malik Date: Wed, 27 Aug 2014 23:42:00 +0200 Subject: [PATCH] first working version --- conf/config.js | 215 +++++++++++++++++++++++++++++++++++++++++++++++ conf/init-script | 174 ++++++++++++++++++++++++++++++++++++++ conf/logrotate | 10 +++ conf/nginx.conf | 14 +++ manifest.json | 46 ++++++++++ scripts/install | 77 +++++++++++++++++ scripts/remove | 15 ++++ scripts/upgrade | 4 + 8 files changed, 555 insertions(+) create mode 100644 conf/config.js create mode 100644 conf/init-script create mode 100644 conf/logrotate create mode 100644 conf/nginx.conf create mode 100644 manifest.json create mode 100644 scripts/install create mode 100644 scripts/remove create mode 100644 scripts/upgrade diff --git a/conf/config.js b/conf/config.js new file mode 100644 index 0000000..0e34ea5 --- /dev/null +++ b/conf/config.js @@ -0,0 +1,215 @@ +var conf = {}; + +// Run the Kiwi server under a different user/group +conf.user = "kiwiirc"; +conf.group = "kiwiirc"; + + +// Log file location +conf.log = "/var/log/ynh-kiwiirc.log"; + +/* + * Server listen blocks + */ + +// Do not edit this line! +conf.servers = []; + +// Example server block +conf.servers.push({ + port: 7778, + address: "0.0.0.0" +}); + +// Example SSL server block +//conf.servers.push({ +// port: 7777, +// address: "0.0.0.0", +// +// ssl: true, +// ssl_key: "server.key", +// ssl_cert: "cert.pem" +//}); + +// Network interface for outgoing connections +conf.outgoing_address = { + IPv4: '0.0.0.0' + //IPv6: '::' +}; + + +// Do we want to enable the built in Identd server? +conf.identd = { + enabled: false, + port: 113, + address: "0.0.0.0" +}; + + + + + + +// Where the client files are +conf.public_http = "client/"; + +// Max connections per connection. 0 to disable +conf.max_client_conns = 5; + +// Max connections per server. 0 to disable. +// Setting is ignored if: +// - There is a WEBIRC password configured for the server, +// - Kiwi is configured to send the client's ip as a username for the server, or +// - Kiwi is running in restricted server mode. +conf.max_server_conns = 0; + +/* +* Default encoding to be used by the server +* As specified and limited to iconv-lite library support. +*/ +conf.default_encoding = 'utf8'; + + +/* +* Default GECOS (real name) for IRC connections +* %n will be replaced with the users nick +* %h will be replaced with the users hostname +*/ +//conf.default_gecos = 'Web IRC Client'; + + + +/* + * Client side plugins + * Array of URLs that will be loaded into the browser when the client first loads up + * See http://github.com/prawnsalad/KiwiIRC/wiki/Client-plugins + */ +conf.client_plugins = [ + // "http://server.com/kiwi/plugins/myplugin.html" +]; + + + + +// Directory to find the server modules +conf.module_dir = "../server_modules/"; + +// Which modules to load +conf.modules = []; + + + + +// WebIRC passwords enabled for this server +conf.webirc_pass = { + //"irc.network.com": "configured_webirc_password", + //"127.0.0.1": "foobar" +}; + +// Some IRCDs require the clients IP via the username/ident +conf.ip_as_username = [ + //"irc.network.com", + //"127.0.0.1" +]; + +// Whether to verify IRC servers' SSL certificates against built-in well-known certificate authorities +conf.reject_unauthorised_certificates = false; + + + +/* + * Reverse proxy settings + * Reverse proxies that have been reported to work can be found at: + * https://kiwiirc.com/docs/installing/proxies + */ + +// Whitelisted HTTP proxies in CIDR format +conf.http_proxies = ["127.0.0.1/32"]; + +// Header that contains the real-ip from the HTTP proxy +conf.http_proxy_ip_header = "x-forwarded-for"; + +// Base HTTP path to the KIWI IRC client (eg. /kiwi) +conf.http_base_path = "YNH_BASE_PATH"; + + +/* + * SOCKS (version 5) proxy settings + * This feature is only available on node 0.10.0 and above. + * Do not enable it if you're running 0.8 or below or Bad Things will happen. + */ +conf.socks_proxy = {}; + +// Enable proxying outbound connections through a SOCKS proxy +conf.socks_proxy.enabled = false; + +// Proxy *all* outbound connections through a SOCKS proxy +conf.socks_proxy.all = false; + +// Use SOCKS proxy for these hosts only (if conf.sock_proxy.all === false) +conf.socks_proxy.proxy_hosts = [ + "irc.example.com" +]; + +// Host and port for the SOCKS proxy +conf.socks_proxy.address = '127.0.0.1'; +conf.socks_proxy.port = 1080; + +// Username and password for the SOCKS proxy +// Set user to null to disable password authentication +conf.socks_proxy.user = null; +conf.socks_proxy.pass = null; + + + +// Default quit message +conf.quit_message = "http://www.kiwiirc.com/ - A hand-crafted IRC client"; + + +// Default settings for the client. These may be changed in the browser +conf.client = { + server: 'irc.kiwiirc.com', + port: 6697, + ssl: true, + channel: '#kiwiirc', + channel_key: '', + nick: 'kiwi_?', + settings: { + theme: 'relaxed', + channel_list_style: 'tabs', + scrollback: 250, + show_joins_parts: true, + show_timestamps: false, + use_24_hour_timestamps: true, + mute_sounds: false, + show_emoticons: true, + count_all_activity: true + }, + window_title: 'Kiwi IRC' +}; + +// List of themes available for the user to choose from +conf.client_themes = [ + 'relaxed', + 'mini', + 'cli', + 'basic' +]; + + +// If set, the client may only connect to this 1 IRC server +//conf.restrict_server = "irc.kiwiirc.com"; +//conf.restrict_server_port = 6667; +//conf.restrict_server_ssl = false; +//conf.restrict_server_channel = "#kiwiirc"; +//conf.restrict_server_channel_key = ""; +//conf.restrict_server_password = ""; +//conf.restrict_server_nick = "kiwi_"; + + + + +/* + * Do not amend the below lines unless you understand the changes! + */ +module.exports.production = conf; diff --git a/conf/init-script b/conf/init-script new file mode 100644 index 0000000..c1132a9 --- /dev/null +++ b/conf/init-script @@ -0,0 +1,174 @@ +#! /bin/sh +### BEGIN INIT INFO +# Provides: kiwiirc +# Required-Start: $network $syslog +# Required-Stop: $network $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: KiwiIRC Blogging Platform +# Description: KiwiIRC: Just a blogging platform +### END INIT INFO + +# Kindly stolen from http://docs.kiwiirc.org/pl/installation/deploy/ + +# Do NOT "set -e" + +# PATH should only include /usr/* if it runs after the mountnfs.sh script +PATH=/sbin:/usr/sbin:/bin:/usr/bin +DESC="KiwiIRC" +NAME=ynh-kiwiirc +GHOST_ROOT=/var/www/kiwiirc +GHOST_GROUP=kiwiirc +GHOST_USER=kiwiirc +DAEMON=/usr/bin/node +DAEMON_ARGS="$GHOST_ROOT/server/server.js -f" +PIDFILEDIR=/var/run/yunohost/kiwiirc +PIDFILE=$PIDFILEDIR/$NAME.pid +SCRIPTNAME=/etc/init.d/$NAME +LOGFILE="/var/log/ynh-kiwiirc.log" +export NODE_ENV=production + +# 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 +# I like to know what is going on +VERBOSE=yes + +# 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() +{ + # Set up folder structure + mkdir -p $PIDFILEDIR + chown -R $GHOST_USER:$GHOST_GROUP $PIDFILEDIR + # Return + # 0 if daemon has been started + # 1 if daemon was already running + # 2 if daemon could not be started + start-stop-daemon --start --quiet \ + --chuid $GHOST_USER:$GHOST_GROUP --chdir $GHOST_ROOT --background \ + --pidfile $PIDFILE --make-pidfile --exec $DAEMON --test > /dev/null \ + || return 1 + + start-stop-daemon --start --quiet \ + --chuid $GHOST_USER:$GHOST_GROUP --chdir $GHOST_ROOT --background \ + --pidfile $PIDFILE --make-pidfile --exec /bin/bash -- -c "exec $DAEMON $DAEMON_ARGS >> $LOGFILE 2>&1" \ + || return 2 + # Add code here, if necessary, that waits for the process to be ready + # to handle requests from services started subsequently which depend + # on this one. As a last resort, sleep for some dime. +} + +# +# 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 + 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/3/KILL/5 \ + --exec $DAEMON + [ "$?" = 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() { +# # +# # If the daemon can reload its configuration without +# # restarting (for example, when it is sent a SIGHUP), +# # then implement that here. +# # +# start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE \ +# --name $NAME +# 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 "$DAEMON" "$NAME" && exit 0 || exit $? + ;; +#reload|force-reload) + # + # If do_reload() is not implemented then leave this commented out + # and leave 'force-reload' as an alias for 'restart'. + # + #log_daemon_msg "Reloading $DESC" "$NAME" + #do_reload + #log_end_msg $? + #;; +restart|force-reload) + # + # If the "reload" option is implemented then remove the + # 'force-reload' alias + # + 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 {start|stop|restart|reload|force-reload}" >&2 + echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 + exit 3 + ;; +esac + +exit 0 + diff --git a/conf/logrotate b/conf/logrotate new file mode 100644 index 0000000..9dfc1dc --- /dev/null +++ b/conf/logrotate @@ -0,0 +1,10 @@ +YNH_LOGFILE +{ + weekly + missingok + rotate 12 + notifempty + compress + delaycompress + copytruncate +} \ No newline at end of file diff --git a/conf/nginx.conf b/conf/nginx.conf new file mode 100644 index 0000000..392d730 --- /dev/null +++ b/conf/nginx.conf @@ -0,0 +1,14 @@ +location YNH_LOCATION { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $http_host; + proxy_set_header X-NginX-Proxy true; + + proxy_pass http://127.0.0.1:7778YNH_LOCATION; + proxy_redirect default; + + # Websocket support (from version 1.4) + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; +} diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..c2e2b82 --- /dev/null +++ b/manifest.json @@ -0,0 +1,46 @@ +{ + "name": "KiwiIRC", + "id": "kiwiirc", + "description": { + "en": "Web IRC client", + "fr": "Client Web pour IRC" + }, + "developer": { + "name": "Julien Malik", + "email": "julien.malik@paraiso.me", + "url": "https://kiwiirc.com/" + }, + "multi_instance": "false", + "arguments": { + "install" : [ + { + "name": "domain", + "ask": { + "en": "Choose a domain for KiwiIRC", + "fr": "Choisissez un domaine pour KiwiIRC" + }, + "example": "domain.org" + }, + { + "name": "path", + "ask": { + "en": "Choose a path for KiwiIRC", + "fr": "Choisissez un path pour KiwiIRC" + }, + "example": "/irc", + "default": "/irc" + }, + { + "name": "public_site", + "ask": { + "en": "Is it a public KiwiIRC site ?", + "fr": "Est-ce un site public ?" + }, + "choices": ["Yes", "No"], + "default": "Yes" + } + ] + } +} + + diff --git a/scripts/install b/scripts/install new file mode 100644 index 0000000..f3516a6 --- /dev/null +++ b/scripts/install @@ -0,0 +1,77 @@ +#!/bin/bash + +# Retrieve arguments +domain=$1 +path=$2 +is_public=$3 + +# Check domain/path availability +sudo yunohost app checkurl $domain$path -a kiwiirc +if [[ ! $? -eq 0 ]]; then + exit 1 +fi + +echo "Install dependencies..." +sudo apt-get update +sudo apt-get install nodejs-legacy npm -y + +version=de1607bf1e9ba4429a10f895a6ec45c54daa3161 +echo "Downloading KiwiIRC $version..." +mkdir ../tmp +sudo wget -O ../tmp/kiwiirc-$version.tar.gz "https://github.com/prawnsalad/KiwiIRC/archive/de1607bf1e9ba4429a10f895a6ec45c54daa3161.tar.gz" + +echo "Deploying source files..." +cd ../tmp && tar xvzf ../tmp/kiwiirc-$version.tar.gz && cd ../scripts +final_path=/var/www/kiwiirc +sudo mkdir -p $final_path +sudo useradd -d $final_path kiwiirc + +sudo cp -r ../tmp/KiwiIRC-$version/* $final_path +#sudo cp ../conf/npm-shrinkwrap.json $final_path +sudo chown -R kiwiirc: $final_path + +echo "Installing KiwiIRC with NPM..." +sudo su --shell /bin/bash --command "cd $final_path && npm install --production --registry http://registry.npmjs.org" kiwiirc + +echo "Cleaning up install tree..." +sudo rm -rf $final_path/.npm + +echo "Deploying configuration..." +sed -i "s@YNH_BASE_PATH@${path}@g" ../conf/config.js +sudo cp ../conf/config.js $final_path/config.js +sudo chown kiwiirc: $final_path/config.js +sudo chmod 644 $final_path/config.js + +echo "Post install step... building client side" +sudo su --shell /bin/bash --command "cd $final_path && node $final_path/server/server.js build" kiwiirc + +echo "Setting up init script..." +logfile=/var/log/ynh-kiwiirc.log +sudo touch $logfile +sudo chown kiwiirc: $logfile +sed -i "s@YNH_FINALPATH@$final_path@g" ../conf/init-script +sed -i "s@YNH_LOGFILE@$logfile@g" ../conf/init-script +sudo cp ../conf/init-script /etc/init.d/ynh-kiwiirc +sudo chmod +x /etc/init.d/ynh-kiwiirc +sudo update-rc.d ynh-kiwiirc defaults +sudo service ynh-kiwiirc start +sudo yunohost service add ynh-kiwiirc -l $logfile + +echo "Setting up logrotate configuration..." +sed -i "s@YNH_LOGFILE@$logfile@g" ../conf/logrotate +sudo cp ../conf/logrotate /etc/logrotate.d/ynh-kiwiirc + +echo "Nginx configuration..." +sed -i "s@YNH_LOCATION@$path@g" ../conf/nginx.conf +sudo cp ../conf/nginx.conf /etc/nginx/conf.d/$domain.d/kiwiirc.conf + +if [ $is_public = "Yes" ]; then + sudo yunohost app setting kiwiirc skipped_uris -v "/" +fi +sudo yunohost app setting kiwiirc is_public -v $is_public + +echo "Reloading Nginx (sso enabled)..." +sudo service nginx reload +sudo yunohost app ssowatconf + +echo "Success !" diff --git a/scripts/remove b/scripts/remove new file mode 100644 index 0000000..d2e918b --- /dev/null +++ b/scripts/remove @@ -0,0 +1,15 @@ +#!/bin/bash + +domain=$(sudo yunohost app setting kiwiirc domain) + +sudo service ynh-kiwiirc stop +sudo update-rc.d ynh-kiwiirc remove +sudo rm /etc/init.d/ynh-kiwiirc +sudo yunohost service remove ynh-kiwiirc +sudo rm -f /etc/nginx/conf.d/$domain.d/kiwiirc.conf +sudo rm -f /var/log/ynh-kiwiirc.log +sudo rm -rf /var/run/yunohost/kiwiirc +sudo rm -f /etc/logrotate.d/ynh-kiwiirc + +# remove user so that it does not hold resource +sudo userdel --remove kiwiirc diff --git a/scripts/upgrade b/scripts/upgrade new file mode 100644 index 0000000..c429a3b --- /dev/null +++ b/scripts/upgrade @@ -0,0 +1,4 @@ +#!/bin/bash + +echo "TODO" +exit 1 \ No newline at end of file