Browse Source

Installer work, add .pid file writing on *nix systems to main.cpp.

Adam Ierymenko 11 years ago
parent
commit
93427b8cb6
5 changed files with 238 additions and 14 deletions
  1. 3 2
      .gitignore
  2. 1 0
      Makefile.linux
  3. 88 0
      installer.cpp
  4. 115 0
      installer/linux/redhat/init.d/zerotier-one
  5. 31 12
      main.cpp

+ 3 - 2
.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

+ 1 - 0
Makefile.linux

@@ -44,5 +44,6 @@ file2lz4c: ext/lz4/lz4hc.o FORCE
 
 clean:
 	rm -f $(OBJS) file2lz4c zerotier-*
+	rm -rf installer-build
 
 FORCE:

+ 88 - 0
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 <http://www.gnu.org/licenses/>.
+ *
+ * --
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+#include "node/Constants.hpp"
+
+#include "version.h"
+
+#ifdef __WINDOWS__
+#include <WinSock2.h>
+#include <Windows.h>
+#include <tchar.h>
+#include <wchar.h>
+#else
+#include <unistd.h>
+#include <pwd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <signal.h>
+#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
+{
+}

+ 115 - 0
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 $?

+ 31 - 12
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;
 }