From 72b508844940b72482ecbb2c837039b7c73d7f81 Mon Sep 17 00:00:00 2001 From: Koichiro IWAO Date: Tue, 29 May 2018 00:30:22 +0900 Subject: [PATCH] FreeBSD: separate rc script into xrdp and xrdp-sesman to improve fscd(8)[1] compatibility. fscd(8) monitors daemons and restarts after daemons crashed. We usually want to start, stop, and restart xrdp and xrdp-sesman separately because restarting xrdp-sesman means losing existing sessions. This change will enable fscd(8) not to restart xrdp-sesman together when only xrdp daemon crashes. Now rc.d/xrdp mainly has following commands: * start - starts xrdp * stop - stops xrdp * restart - stops xrdp, then starts it again * allstart - starts both xrdp and xrdp-sesman * allstop - stops both * allrestart - stops both, then start them again * status - returns status of xrdp rc.d/xrdp-sesman doesn't have all- prefixed commands. [1] https://www.freshports.org/sysutils/fsc/ --- instfiles/Makefile.am | 3 +- instfiles/rc.d/Makefile.am | 2 +- instfiles/rc.d/xrdp | 74 +++++++++++++++++++------------------- instfiles/rc.d/xrdp-sesman | 44 +++++++++++++++++++++++ 4 files changed, 85 insertions(+), 38 deletions(-) create mode 100644 instfiles/rc.d/xrdp-sesman diff --git a/instfiles/Makefile.am b/instfiles/Makefile.am index 8d39af0c..cc7e1446 100644 --- a/instfiles/Makefile.am +++ b/instfiles/Makefile.am @@ -97,5 +97,6 @@ endif if FREEBSD # must be tab below install-data-hook: - sed -i '' 's|%%PREFIX%%|$(prefix)|g' $(DESTDIR)$(sysconfdir)/rc.d/xrdp + sed -i '' 's|%%PREFIX%%|$(prefix)|g' $(DESTDIR)$(sysconfdir)/rc.d/xrdp \ + $(DESTDIR)$(sysconfdir)/rc.d/xrdp-sesman endif diff --git a/instfiles/rc.d/Makefile.am b/instfiles/rc.d/Makefile.am index 17993232..24e5c5cc 100644 --- a/instfiles/rc.d/Makefile.am +++ b/instfiles/rc.d/Makefile.am @@ -1,2 +1,2 @@ startscriptdir = $(sysconfdir)/rc.d -dist_startscript_SCRIPTS = xrdp +dist_startscript_SCRIPTS = xrdp xrdp-sesman diff --git a/instfiles/rc.d/xrdp b/instfiles/rc.d/xrdp index 9dec649e..b5dbcd25 100644 --- a/instfiles/rc.d/xrdp +++ b/instfiles/rc.d/xrdp @@ -1,6 +1,7 @@ #!/bin/sh # -# Copyright (c) 1992-2015 The FreeBSD Project. All rights reserved. +# Copyright (c) 1992-2018 The FreeBSD Project. All rights reserved. +# Copyright (c) 2015-2018 Koichiro Iwao # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions @@ -26,55 +27,56 @@ # $FreeBSD$ # # REQUIRE: DAEMON -# PROVIDE: xrdp xrdp_sesman +# PROVIDE: xrdp # +# Add the following line to /etc/rc.conf to enable xrdp: +# +# xrdp_enable="YES" +# xrdp_sesman_enable="YES" . /etc/rc.subr name="xrdp" -rcvar=xrdp_enable -xrdp_daemons="xrdp" +rcvar="xrdp_enable" -# Read settings and set default values. load_rc_config "$name" : ${xrdp_enable="NO"} -# Enable/disable dependent daemon. -if [ -n "${rcvar}" ] && checkyesno "xrdp_sesman_enable"; then - xrdp_daemons="xrdp xrdp_sesman" -fi +extra_commands="status allstart allstop allrestart" +command="%%PREFIX%%/sbin/xrdp" + +allstart_cmd="xrdp_allstart" +allstop_cmd="xrdp_allstop" +allrestart_cmd="xrdp_allrestart" -# Commands. -extra_commands="reload status" -start_cmd="xrdp_cmd" -stop_cmd="xrdp_cmd" -status_cmd="xrdp_cmd" -reload_cmd="xrdp_cmd" -rcvar_cmd="xrdp_cmd" +xrdp_allstart() +{ + run_rc_command "start" + + if checkyesno "xrdp_sesman_enable" && \ + ! %%PREFIX%%/etc/rc.d/xrdp-sesman forcestatus 1>/dev/null 2>&1; then + %%PREFIX%%/etc/rc.d/xrdp-sesman start || return 1 + fi +} -# Command wrapper to call each of them per daemon. -xrdp_cmd() { - local name rcvar command pidfile xrdp_daemons - # Prevent recursive calling. - unset "${rc_arg}_cmd" - # Stop processes in the reverse to order. - if [ "${rc_arg}" = "stop" ] ; then - xrdp_daemons=$(reverse_list ${xrdp_daemons}) +xrdp_allstop() +{ + if checkyesno "xrdp_sesman_enable" && \ + %%PREFIX%%/etc/rc.d/xrdp-sesman forcestatus 1>/dev/null 2>&1; then + %%PREFIX%%/etc/rc.d/xrdp-sesman stop || return 1 fi - # Apply to all the daemons. - for name in ${xrdp_daemons}; do - rcvar=${name}_enable - if [ "${name}" = "xrdp_sesman" ]; then - command="%%PREFIX%%/sbin/xrdp-sesman" - pidfile="/var/run/xrdp-sesman.pid" - else - command="%%PREFIX%%/sbin/${name}" - pidfile="/var/run/${name}.pid" - fi + run_rc_command "stop" +} + +xrdp_allrestart() +{ + if checkyesno "xrdp_sesman_enable" && \ + %%PREFIX%%/etc/rc.d/xrdp-sesman forcestatus 1>/dev/null 2>&1; then + %%PREFIX%%/etc/rc.d/xrdp-sesman restart || return 1 + fi - run_rc_command "${_rc_prefix}${rc_arg}" ${rc_extra_args} - done + run_rc_command "restart" } run_rc_command "$1" diff --git a/instfiles/rc.d/xrdp-sesman b/instfiles/rc.d/xrdp-sesman new file mode 100644 index 00000000..a4e96f8e --- /dev/null +++ b/instfiles/rc.d/xrdp-sesman @@ -0,0 +1,44 @@ +#!/bin/sh +# +# Copyright (c) 1992-2015 The FreeBSD Project. All rights reserved. +# Copyright (c) 2015-2018 Koichiro Iwao +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ +# +# REQUIRE: LOGIN +# PROVIDE: xrdp_sesman +# + +. /etc/rc.subr + +name="xrdp_sesman" +rcvar="xrdp_sesman_enable" + +load_rc_config "$name" +: ${xrdp_sesman_enable="NO"} + +extra_commands="status" +command="%%PREFIX%%/sbin/xrdp-sesman" + +run_rc_command "$1"