START=60
-PID_FILE=/tmp/etc/znc/znc.pid
-ZNC_CONFIG=/tmp/etc/znc/configs/znc.conf
+ZNC_CONFIG_PATH=/tmp/etc/znc
+PID_FILE=${ZNC_CONFIG_PATH}/znc.pid
+ZNC_CONFIG=${ZNC_CONFIG_PATH}/configs/znc.conf
+
+EXTERNAL_CONFIG=0
+
+RUNAS_USER=
+RUNAS_GROUP=
add_param() {
echo "$1 = $2" >> $ZNC_CONFIG
}
+add_chan() {
+ chan=${1% *}
+ pass=${1#* }
+ echo " <Chan $chan>" >> $ZNC_CONFIG
+ [ "$chan" != "$pass" ] && echo " Key = $pass" >> $ZNC_CONFIG
+ echo " </Chan>" >> $ZNC_CONFIG
+}
+
znc_global() {
local znc="$1"
local anoniplimit
local maxbuffersize
local connectdelay
local serverthrottle
+ local znc_config_path
+ local znc_pem_file
+
+ config_get znc_config_path "$znc" znc_config_path
+ config_get RUNAS_USER "$znc" runas_user
+ config_get RUNAS_GROUP "$znc" runas_group
- config_get anoniplimit "$znc" anoniplimit
- config_get maxbuffersize "$znc" maxbuffersize
- config_get connectdelay "$znc" connectdelay
- config_get serverthrottle "$znc" serverthrottle
+ if [ "${znc_config_path}" ]
+ then
+ ZNC_CONFIG_PATH=$znc_config_path
+ EXTERNAL_CONFIG=1
+ else
+ mkdir -p $ZNC_CONFIG_PATH/configs/
+ [ ! -f "$ZNC_CONFIG" ] || rm "$ZNC_CONFIG"
- [ -z $anoniplimit ] || echo "AnonIPLimit = $anoniplimit" >> $ZNC_CONFIG
- [ -z $maxbuffersize ] || echo "MaxBufferSize = $maxbuffersize" >> $ZNC_CONFIG
- [ -z $connectdelay ] || echo "ConnectDelay = $connectdelay" >> $ZNC_CONFIG
- [ -z $serverthrottle ] || echo "ServerThrottle = $anoniplimit" >> $ZNC_CONFIG
+ config_get anoniplimit "$znc" anoniplimit
+ config_get maxbuffersize "$znc" maxbuffersize
+ config_get connectdelay "$znc" connectdelay
+ config_get serverthrottle "$znc" serverthrottle
+ config_get znc_pem_file "$znc" znc_ssl_cert
- echo "PidFile = $PID_FILE" >> $ZNC_CONFIG
+ [ -z $znc_pem_file -o -f $ZNC_CONFIG_PATH/znc.pem ] || ln -s "$znc_pem_file" $ZNC_CONFIG_PATH/znc.pem
- config_list_foreach "$znc" listener "add_param Listener"
- config_list_foreach "$znc" module "add_param LoadModule"
+ [ -z $anoniplimit ] || echo "AnonIPLimit = $anoniplimit" >> $ZNC_CONFIG
+ [ -z $maxbuffersize ] || echo "MaxBufferSize = $maxbuffersize" >> $ZNC_CONFIG
+ [ -z $connectdelay ] || echo "ConnectDelay = $connectdelay" >> $ZNC_CONFIG
+ [ -z $serverthrottle ] || echo "ServerThrottle = $anoniplimit" >> $ZNC_CONFIG
+
+ echo "PidFile = $PID_FILE" >> $ZNC_CONFIG
+
+ config_list_foreach "$znc" listener "add_param Listener"
+ config_list_foreach "$znc" module "add_param LoadModule"
+
+ add_param LoadModule "droproot ${RUNAS_USER:-nobody} ${RUNAS_GROUP:-nogroup}"
+ fi
}
add_user() {
config_get vhost "$user" vhost
echo "<User $user>" >> $ZNC_CONFIG
- echo " Pass = plain#$password" >> $ZNC_CONFIG
+
+ case "$password" in
+ "md5#"* | "sha256#"* | "plain#"*)
+ echo " Pass = $password" >> $ZNC_CONFIG
+ ;;
+ *)
+ echo " Pass = plain#$password" >> $ZNC_CONFIG
+ ;;
+ esac
+
echo " Nick = $nick" >> $ZNC_CONFIG
echo " AltNick = ${altnick:-$nick"_"}" >> $ZNC_CONFIG
echo " Ident = ${ident:-$nick}" >> $ZNC_CONFIG
config_list_foreach "$user" server "add_param \" Server\""
config_list_foreach "$user" module "add_param \" LoadModule\""
+ config_list_foreach "$user" channel "add_chan"
echo "</User>" >> $ZNC_CONFIG
}
start() {
- mkdir -p /tmp/etc/znc/configs/
- [ -f "$ZNC_CONFIG" ] && rm "$ZNC_CONFIG"
config_load znc
config_foreach znc_global znc
- config_foreach add_listener listener
- config_foreach add_user user
- chown -R nobody:nogroup /tmp/etc/znc
- su -s /bin/ash -c "/usr/bin/znc -d/tmp/etc/znc" nobody
+ if [ "$EXTERNAL_CONFIG" -eq 0 ]
+ then
+ config_foreach add_listener listener
+ config_foreach add_user user
+
+ chown -R ${RUNAS_USER:-nobody}:${RUNAS_GROUP:-nogroup} /tmp/etc/znc
+ fi
+
+ if [ "$EXTERNAL_CONFIG" -eq 1 -a "$RUNAS_USER" ]
+ then
+ local SU=$(which su)
+ if [ "$SU" ]
+ then
+ $SU -c "/usr/bin/znc -d$ZNC_CONFIG_PATH >/dev/null &" $RUNAS_USER
+ else
+ logger -s -t ZNC -p daemon.err "Could not run ZNC as user $RUNAS_USER: su not found."
+ exit 1
+ fi
+ else
+ /usr/bin/znc -d$ZNC_CONFIG_PATH >/dev/null &
+ fi
}
stop() {
- [ -f "$PID_FILE" ] && kill $(cat "$PID_FILE")
+ if [ -f "$PID_FILE" ]
+ then
+ kill $(cat "$PID_FILE")
+ else
+ killall znc
+ fi
}