From 64dd780905ae339a0a57e4aba541799016816a1a Mon Sep 17 00:00:00 2001 From: Darik Horn Date: Fri, 3 Oct 2014 13:30:24 -0400 Subject: [PATCH] Create a non-forking softetherd for upstart and systemd. Implement a daemon that expects to be invoked by a new-style init like upstart or systemd as: /usr/sbin/softetherd [vpnbridge|vpnclient|vpnserver] Alternatively, if the command line argument is empty, then use the `SOFTETHER_MODE` environment variable instead. Conflicts: src/bin/hamcore/strtable_en.stb --- configure.ac | 1 + src/Makefile.am | 3 + src/bin/hamcore/strtable_en.stb | 1 + src/softetherd/Makefile.am | 28 ++++++++ src/softetherd/softetherd.c | 114 ++++++++++++++++++++++++++++++++ 5 files changed, 147 insertions(+) create mode 100644 src/softetherd/Makefile.am create mode 100644 src/softetherd/softetherd.c diff --git a/configure.ac b/configure.ac index 94639c44..165623ae 100644 --- a/configure.ac +++ b/configure.ac @@ -36,6 +36,7 @@ AC_CONFIG_FILES([ src/vpnclient/Makefile src/vpnbridge/Makefile src/vpncmd/Makefile + src/softetherd/Makefile ]) diff --git a/src/Makefile.am b/src/Makefile.am index 1d041d47..39874dba 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -27,3 +27,6 @@ SUBDIRS += libsoftether bin/hamcore # These are the final build products. SUBDIRS += vpnserver vpnclient vpnbridge vpncmd + +# This is a daemon for upstart and systemd. +SUBDIRS += softetherd diff --git a/src/bin/hamcore/strtable_en.stb b/src/bin/hamcore/strtable_en.stb index 02f53f45..8c3eeb8a 100644 --- a/src/bin/hamcore/strtable_en.stb +++ b/src/bin/hamcore/strtable_en.stb @@ -1063,6 +1063,7 @@ SVC_HIDE_TRAY_MSG This will hide the tasktray icons when starting %S in user mo # Concerning services (UNIX) +UNIX_DAEMON_HELP SoftEther VPN non-forking daemon for upstart and systemd.\nCommand Usage:\n %S vpnbridge - Enable bridging features.\n %S vpnclient - Enable client features.\n %S vpnserver - Enable all features.\nThe parameter can be set in the SOFTETHER_MODE environment variable.\n\n UNIX_SVC_HELP %S service program\nCopyright (c) SoftEther VPN Project. All Rights Reserved.\n\n%S command usage:\n %S start - Start the %S service.\n %S stop - Stop the %S service if the service has been already started.\n\n UNIX_SVC_STARTED The %S service has been started.\n UNIX_SVC_STOPPING Stopping the %S service ...\n diff --git a/src/softetherd/Makefile.am b/src/softetherd/Makefile.am new file mode 100644 index 00000000..9decf930 --- /dev/null +++ b/src/softetherd/Makefile.am @@ -0,0 +1,28 @@ +# Copyright 2014 Darik Horn +# +# This file is part of SoftEther. +# +# SoftEther is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 2 of the License, or (at your option) +# any later version. +# +# SoftEther is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# SoftEther. If not, see . + + +include $(top_srcdir)/autotools/softether.am + +sbin_PROGRAMS = \ + softetherd + +softetherd_SOURCES = \ + softetherd.c + +softetherd_LDADD = \ + $(top_builddir)/src/libsoftether/libsoftether.la diff --git a/src/softetherd/softetherd.c b/src/softetherd/softetherd.c new file mode 100644 index 00000000..ca3d3352 --- /dev/null +++ b/src/softetherd/softetherd.c @@ -0,0 +1,114 @@ +// SoftEther VPN daemon for upstart and systemd. +// +// Copyright 2014 Darik Horn +// +// This file is part of SoftEther. +// +// SoftEther is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation, either version 2 of the License, or (at your option) +// any later version. +// +// SoftEther is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +// details. +// +// You should have received a copy of the GNU General Public License along with +// SoftEther. If not, see . + + +#include + +#define VPN_EXE + +#include +#include +#include +#include +#include +#include +#include +#include + +void DaemonUsage(char *name) +{ + UniPrint(_UU("UNIX_DAEMON_HELP"), name, name, name); +} + + +void DaemonStartProcess() +{ + // This environment variable is exported by upstart. + char *upstart_job = getenv("UPSTART_JOB"); + + InitCedar(); + StInit(); + StStartServer(false); + + // Notify upstart that softetherd is ready. + if (upstart_job != NULL) + { + unsetenv("UPSTART_JOB"); + raise(SIGSTOP); + } +} + + +void DaemonStopProcess() +{ + StStopServer(); + StFree(); + FreeCedar(); +} + + +int main(int argc, char *argv[]) +{ + // This environment variable is sourced and exported by the init process from /etc/default/softether. + char *softether_mode = getenv("SOFTETHER_MODE"); + + InitMayaqua(false, false, argc, argv); + + // Check for an explicit invocation. (eg: "/usr/sbin/softetherd vpnserver") + if (argc >= 2) + { + if (StrCmpi(argv[1], "vpnbridge") == 0 + || StrCmpi(argv[1], "vpnclient") == 0 + || StrCmpi(argv[1], "vpnserver") == 0) + { + UnixExecService(argv[1], DaemonStartProcess, DaemonStopProcess); + FreeMayaqua(); + return 0; + } + + // Exit status codes 150..199 are reserved for the application by the LSB. + fprintf(stderr, "Error: Unrecognized parameter: %s\n", argv[1]); + fflush(stderr); + FreeMayaqua(); + return 150; + } + + // Alternatively, use the environment variable. + if (softether_mode != NULL) + { + if (StrCmpi(softether_mode, "vpnbridge") == 0 + || StrCmpi(softether_mode, "vpnclient") == 0 + || StrCmpi(softether_mode, "vpnserver") == 0) + { + UnixExecService(softether_mode, DaemonStartProcess, DaemonStopProcess); + FreeMayaqua(); + return 0; + } + + // Exit status codes 150..199 are reserved for the application by the LSB. + fprintf(stderr, "Error: Unrecognized environment variable: SOFTETHER_MODE=%s\n", softether_mode); + fflush(stderr); + FreeMayaqua(); + return 151; + } + + DaemonUsage(argv[0]); + FreeMayaqua(); + return 3; +}