summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-x.gitignore5
-rw-r--r--Makefile.linux1
-rw-r--r--installer.cpp88
-rwxr-xr-xinstaller/linux/redhat/init.d/zerotier-one115
-rw-r--r--main.cpp43
5 files changed, 238 insertions, 14 deletions
diff --git a/.gitignore b/.gitignore
index 3aa462ce..533a83c3 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 f13d3bfc..b602f7ac 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 00000000..40694048
--- /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 <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
+{
+}
diff --git a/installer/linux/redhat/init.d/zerotier-one b/installer/linux/redhat/init.d/zerotier-one
new file mode 100755
index 00000000..09962704
--- /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 8bf1bd00..93911c98 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;
}