From 93427b8cb602abaabc4e3768b4b4dd9105e940eb Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Wed, 6 Nov 2013 14:43:47 -0500 Subject: [PATCH] Installer work, add .pid file writing on *nix systems to main.cpp. --- .gitignore | 5 +- Makefile.linux | 1 + installer.cpp | 88 ++++++++++++++++ installer/linux/redhat/init.d/zerotier-one | 115 +++++++++++++++++++++ main.cpp | 43 +++++--- 5 files changed, 238 insertions(+), 14 deletions(-) create mode 100644 installer.cpp create mode 100755 installer/linux/redhat/init.d/zerotier-one diff --git a/.gitignore b/.gitignore index 3aa462cef..533a83c30 100755 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -zerotier-* +/zerotier-* /Makefile *.o .DS_Store @@ -20,6 +20,7 @@ mac-tap/tuntap/tap.kext /vsprojects/TapDriver/x64 /vsprojects/InstallerUpdater/obj /vsprojects/Service/obj +/vsprojects/SelfTest/SelfTest.aps /Build/* *.log *.opensdf @@ -27,4 +28,4 @@ mac-tap/tuntap/tap.kext *.cache *.obj *.tlog -/vsprojects/SelfTest/SelfTest.aps +/installer-build diff --git a/Makefile.linux b/Makefile.linux index f13d3bfcb..b602f7acc 100644 --- a/Makefile.linux +++ b/Makefile.linux @@ -44,5 +44,6 @@ file2lz4c: ext/lz4/lz4hc.o FORCE clean: rm -f $(OBJS) file2lz4c zerotier-* + rm -rf installer-build FORCE: diff --git a/installer.cpp b/installer.cpp new file mode 100644 index 000000000..40694048f --- /dev/null +++ b/installer.cpp @@ -0,0 +1,88 @@ +/* + * ZeroTier One - Global Peer to Peer Ethernet + * Copyright (C) 2012-2013 ZeroTier Networks LLC + * + * This program 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 3 of the License, or + * (at your option) any later version. + * + * This program 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 this program. If not, see . + * + * -- + * + * ZeroTier may be used and distributed under the terms of the GPLv3, which + * are available at: http://www.gnu.org/licenses/gpl-3.0.html + * + * If you would like to embed ZeroTier into a commercial application or + * redistribute it in a modified binary form, please contact ZeroTier Networks + * LLC. Start here: http://www.zerotier.com/ + */ + +#include +#include +#include +#include + +#include "node/Constants.hpp" + +#include "version.h" + +#ifdef __WINDOWS__ +#include +#include +#include +#include +#else +#include +#include +#include +#include +#include +#endif + +#include "ext/lz4/lz4.h" +#include "ext/lz4/lz4hc.h" + +// Include generated binaries ------------------------------------------------- + +// zerotier-one binary (or zerotier-one.exe for Windows) +#include "installer-build/zerotier-one.build.c" + +// Linux init.d script +#ifdef __LINUX__ +#include "installer-build/redhat__init.d__zerotier-one.build.c" +#include "installer-build/debian__init.d__zerotier-one.build.c" +#endif + +// Apple Tap device driver +#ifdef __APPLE__ +#include "installer-build/tap-mac__tap.build.c" +#include "installer-build/tap-mac__Info.plist.build.c" +#endif + +// Windows Tap device drivers +#ifdef __WINDOWS__ +#include "installer-build/tap-windows__x64__ztTap100.sys.build.c" +#include "installer-build/tap-windows__x64__ztTap100.inf.build.c" +#include "installer-build/tap-windows__x86__ztTap100.sys.build.c" +#include "installer-build/tap-windows__x86__ztTap100.inf.build.c" +#include "installer-build/tap-windows__devcon32.exe.build.c" +#include "installer-build/tap-windows__devcon64.exe.build.c" +#endif + +// ---------------------------------------------------------------------------- + +#ifdef __WINDOWS__ +int _tmain(int argc, _TCHAR* argv[]) +#else +int main(int argc,char **argv) +#endif +{ +} diff --git a/installer/linux/redhat/init.d/zerotier-one b/installer/linux/redhat/init.d/zerotier-one new file mode 100755 index 000000000..099627041 --- /dev/null +++ b/installer/linux/redhat/init.d/zerotier-one @@ -0,0 +1,115 @@ +#!/bin/sh +# +# zerotier-one Virtual distributed Ethernet service +# +# chkconfig: 2345 90 60 +# description: ZeroTier One provides public and private distributed ethernet \ +# networks. See https://www.zerotier.com/ for more information. + +### BEGIN INIT INFO +# Provides: zerotier-one +# Required-Start: $local_fs $network +# Required-Stop: $local_fs +# Default-Start: 2345 +# Default-Stop: 90 +# Short-Description: start ZeroTier One +# Description: ZeroTier One provides public and private distributed ethernet \ +# networks. See https://www.zerotier.com/ for more information. +### END INIT INFO + +RETVAL=0 +prog="zerotier-one" +exec="/var/lib/zerotier-one/zerotier-one" +lockfile="/var/lock/subsys/zerotier-one" +pidfile="/var/lib/zerotier-one/zerotier-one.pid" + +# Source function library. +. /etc/rc.d/init.d/functions + +start() { + if [ $UID -ne 0 ] ; then + echo "User has insufficient privilege." + exit 4 + fi + [ -x $exec ] || exit 5 + echo -n $"Starting $prog: " + daemon $exec + retval=$? + echo + [ $retval -eq 0 ] && touch $lockfile +} + +stop() { + if [ $UID -ne 0 ] ; then + echo "User has insufficient privilege." + exit 4 + fi + echo -n $"Stopping $prog: " + pid=0 + if [ -f "$pidfile" ]; then + pid=`cat $pidfile` + fi + if [ "$pid" -gt 0 ]; then + kill -TERM $pid + RETVAL=3 + else + failure $"Stopping $prog" + fi + retval=$? + echo + [ $retval -eq 0 ] && rm -f $lockfile +} + +restart() { + stop + start +} + +reload() { + stop + start +} + +force_reload() { + restart +} + +rh_status() { + status -p $pidfile $prog +} + +rh_status_q() { + rh_status >/dev/null 2>&1 +} + +case "$1" in + start) + rh_status_q && exit 0 + $1 + ;; + stop) + rh_status_q || exit 0 + $1 + ;; + restart) + $1 + ;; + reload) + rh_status_q || exit 7 + $1 + ;; + force-reload) + force_reload + ;; + status) + rh_status + ;; + condrestart|try-restart) + rh_status_q || exit 0 + restart + ;; + *) + echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}" + exit 2 +esac +exit $? diff --git a/main.cpp b/main.cpp index 8bf1bd009..93911c984 100644 --- a/main.cpp +++ b/main.cpp @@ -160,23 +160,42 @@ int main(int argc,char **argv) #ifdef __UNIX_LIKE__ mkdir(homeDir,0755); // will fail if it already exists + { + char pidpath[4096]; + Utils::snrpintf(pidpath,sizeof(pidpath),"%s/zerotier-one.pid",homeDir); + FILE *pf = fopen(pidpath,"w"); + if (pf) { + fprintf(pf,"%ld",(long)getpid()); + fclose(pf); + } + } #endif int exitCode = 0; - node = new Node(homeDir,port,controlPort); - const char *termReason = (char *)0; - switch(node->run()) { - case Node::NODE_UNRECOVERABLE_ERROR: - exitCode = -1; - termReason = node->reasonForTermination(); - fprintf(stderr,"%s: abnormal termination: %s\n",argv[0],(termReason) ? termReason : "(unknown reason)"); - break; - default: - break; + try { + node = new Node(homeDir,port,controlPort); + const char *termReason = (char *)0; + switch(node->run()) { + case Node::NODE_UNRECOVERABLE_ERROR: + exitCode = -1; + termReason = node->reasonForTermination(); + fprintf(stderr,"%s: abnormal termination: %s\n",argv[0],(termReason) ? termReason : "(unknown reason)"); + break; + default: + break; + } + delete node; + node = (Node *)0; + } catch ( ... ) {} + +#ifdef __UNIX_LIKE__ + { + char pidpath[4096]; + Utils::snrpintf(pidpath,sizeof(pidpath),"%s/zerotier-one.pid",homeDir); + Utils::rm(pidpath); } - delete node; - node = (Node *)0; +#endif return exitCode; }