From 6bd8dc465e276ae5fca1637f8fedb71f65b13f54 Mon Sep 17 00:00:00 2001 From: nico Date: Mon, 14 Nov 2011 02:38:35 +0000 Subject: [PATCH] packages/sslh: use new service functions, with quirks to allow more than one instance to run simultaneously git-svn-id: svn://svn.openwrt.org/openwrt/packages@29091 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- net/sslh/Makefile | 4 +- net/sslh/files/sslh.init | 125 +++++---------------------------------- 2 files changed, 17 insertions(+), 112 deletions(-) diff --git a/net/sslh/Makefile b/net/sslh/Makefile index 4a568a175..3703f9087 100644 --- a/net/sslh/Makefile +++ b/net/sslh/Makefile @@ -1,5 +1,5 @@ # -# Copyright (C) 2009-2010 OpenWrt.org +# Copyright (C) 2009-2011 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=sslh PKG_VERSION:=1.9 -PKG_RELEASE:=1 +PKG_RELEASE:=2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=http://rutschle.net/tech/ diff --git a/net/sslh/files/sslh.init b/net/sslh/files/sslh.init index 8de272596..b30f04848 100644 --- a/net/sslh/files/sslh.init +++ b/net/sslh/files/sslh.init @@ -1,27 +1,20 @@ #!/bin/sh /etc/rc.common # Copyright (C) 2009-2011 OpenWrt.org -NAME=sslh -PROG=/usr/sbin/sslh START=95 -PIDCOUNT=0 -EXTRA_COMMANDS="killclients" -EXTRA_HELP=" killclients Kill ${NAME} processes except servers and yourself" -sslh_start() -{ +# XXX: pid-files are useless because sslh forks after creating them +SERVICE_USE_PID= + +start_instance() { local section="$1" # check if section is enabled (default) local enabled - config_get_bool enabled "${section}" enable 1 - [ "${enabled}" -eq 0 ] && return 1 + config_get_bool enabled "${section}" 'enabled' '0' + [ ${enabled} -gt 0 ] || return 1 - # increase pid file count to handle multiple instances correctly - PIDCOUNT="$(( ${PIDCOUNT} + 1 ))" - - # prepare parameters (initialise with pid file) - local args="-P /var/run/${NAME}.${PIDCOUNT}.pid" + local args="" local val # A) listen parameter config_get vals "${section}" listen @@ -46,104 +39,16 @@ sslh_start() config_get_bool verbosed "${section}" verbose 0 [ "${verbosed}" -ne 0 ] && append args "-v" - # execute program and return its exit code - [ "${verbosed}" -ne 0 ] && echo "${initscript}: section ${section} started via ${PROG} ${args}" - ${PROG} ${args} - return $? + # XXX: allow more that one instance to run simultaneously + SERVICE_MATCH_NAME=1 SERVICE_NAME="sslh-dummy-$$" \ + service_start /usr/sbin/sslh ${args} } -start() -{ - config_load "${NAME}" - config_foreach sslh_start sslh +start() { + config_load 'sslh' + config_foreach start_instance 'sslh' } -stop() -{ - local pidfile - local rc=0 - - # killing all server processes - for pidfile in `ls /var/run/${NAME}.*.pid` - do - start-stop-daemon -q -K -s KILL -p "${pidfile}" -n "${NAME}" - [ $? -ne 0 ] && rc=1 - rm -f "${pidfile}" - done - [ -z "${pidfile}" ] && echo "${initscript}: no pid files, if you get problems with start then try killclients" - [ ${rc} -ne 0 ] && echo "${initscript}: inconsistency in pid files, if you get problems with start then try killclients" -} - -killclients() -{ - local ignore='' - local server - local pid - local connection - local proto - local address - - # if this script is run from inside a client session, then ignore that session - pid="$$" - while [ "${pid}" -ne 0 ] - do - # get parent process id - pid=`cut -d ' ' -f 4 "/proc/${pid}/stat"` - [ "${pid}" -eq 0 ] && break - - # check if pid is connected to a client connection - # a) get established connection for pid - connection=`netstat -tupn 2>/dev/null | sed "s/[ ]\+/ /g" | grep -e "ESTABLISHED ${pid}/"` - [ -z "${connection}" ] && continue - # get connection details for foreign address - proto=`echo ${connection} | cut -d ' ' -f 1` - address=`echo ${connection} | cut -d ' ' -f 5` - - # b) get pid for foreign address, only possible if foreign address is from this machine itself - connection=`netstat -tupn 2>/dev/null | sed "s/[ ]\+/ /g" | grep -e "^${proto}.*${address}.*ESTABLISHED.*/${NAME}"` - [ -z "${connection}" ] && continue - # check that the local address (field 4) corresponds to the foreign address of the previous connection - server=`echo ${connection} | cut -d ' ' -f 4` - [ "${server}" != "${address}" ] && continue - # get pid from connection - server=`echo ${connection} | cut -d ' ' -f 7 | cut -d '/' -f 1` - - # check if client connection - grep -F -q -e "${PROG}" "/proc/${server}/cmdline" && { - append ignore "${server}" - break - } - done - - # get all server pids that should be ignored - for server in `cat /var/run/${NAME}.*.pid` - do - append ignore "${server}" - done - - # get all running pids and kill client connections - local skip - for pid in `pidof "${NAME}"` - do - # check if correct program, otherwise process next pid - grep -F -q -e "${PROG}" "/proc/${pid}/cmdline" || { - continue - } - - # check if pid should be ignored (servers, ourself) - skip=0 - for server in ${ignore} - do - if [ "${pid}" == "${server}" ] - then - skip=1 - break - fi - done - [ "${skip}" -ne 0 ] && continue - - # kill process - echo "${initscript}: Killing ${pid}..." - kill -KILL ${pid} - done +stop() { + service_stop /usr/sbin/sslh }