Browse Source

Fix for GitHub issue #133, and move restart out of installer to address restart problem. Installer probably should NOT mess with the running service, since Linux servers are likely to be production.

Adam Ierymenko 10 years ago
parent
commit
502cd6921f
1 changed files with 39 additions and 32 deletions
  1. 39 32
      ext/installfiles/linux/install.tmpl.sh

+ 39 - 32
ext/installfiles/linux/install.tmpl.sh

@@ -12,22 +12,6 @@ if [ "$UID" -ne 0 ]; then
 	dryRun=1
 	dryRun=1
 fi
 fi
 
 
-# Detect systemd vs. regular init
-SYSTEMDUNITDIR=
-if [ -e /bin/systemctl -o -e /usr/bin/systemctl -o -e /usr/local/bin/systemctl -o -e /sbin/systemctl -o -e /usr/sbin/systemctl ]; then
-	if [ -e /usr/bin/pkg-config ]; then
-		SYSTEMDUNITDIR=`/usr/bin/pkg-config systemd --variable=systemdsystemunitdir`
-	fi
-	if [ -z "$SYSTEMDUNITDIR" -o ! -d "$SYSTEMDUNITDIR" ]; then
-		if [ -d /usr/lib/systemd/system ]; then
-			SYSTEMDUNITDIR=/usr/lib/systemd/system
-		fi
-		if [ -d /etc/systemd/system ]; then
-			SYSTEMDUNITDIR=/etc/systemd/system
-		fi
-	fi
-fi
-
 if [ $dryRun -gt 0 ]; then
 if [ $dryRun -gt 0 ]; then
 	alias ln="echo '>> ln'"
 	alias ln="echo '>> ln'"
 	alias rm="echo '>> rm'"
 	alias rm="echo '>> rm'"
@@ -51,6 +35,27 @@ if [ ! -r "$scriptPath" ]; then
 	fi
 	fi
 fi
 fi
 
 
+# Check for systemd vs. old school SysV init
+SYSTEMDUNITDIR=
+if [ -e /bin/systemctl -o -e /usr/bin/systemctl -o -e /usr/local/bin/systemctl -o -e /sbin/systemctl -o -e /usr/sbin/systemctl ]; then
+	# Second check: test if systemd appears to actually be running. Apparently Ubuntu
+	# thought it was a good idea to ship with systemd installed but not used. Issue #133
+	if [ -d /var/run/systemd/system -o -d /run/systemd/system ]; then
+		if [ -e /usr/bin/pkg-config ]; then
+			SYSTEMDUNITDIR=`/usr/bin/pkg-config systemd --variable=systemdsystemunitdir`
+		fi
+		if [ -z "$SYSTEMDUNITDIR" -o ! -d "$SYSTEMDUNITDIR" ]; then
+			if [ -d /usr/lib/systemd/system ]; then
+				SYSTEMDUNITDIR=/usr/lib/systemd/system
+			fi
+			if [ -d /etc/systemd/system ]; then
+				SYSTEMDUNITDIR=/etc/systemd/system
+			fi
+		fi
+	fi
+fi
+
+# Find the end of this script, which is where we have appended binary data.
 endMarkerIndex=`grep -a -b -E '^################' "$scriptPath" | head -c 16 | cut -d : -f 1`
 endMarkerIndex=`grep -a -b -E '^################' "$scriptPath" | head -c 16 | cut -d : -f 1`
 if [ "$endMarkerIndex" -le 100 ]; then
 if [ "$endMarkerIndex" -le 100 ]; then
 	echo 'Internal error: unable to find end of script / start of binary data marker.'
 	echo 'Internal error: unable to find end of script / start of binary data marker.'
@@ -86,7 +91,7 @@ echo -n 'Getting version of new install... '
 newVersion=`/var/lib/zerotier-one/zerotier-one -v`
 newVersion=`/var/lib/zerotier-one/zerotier-one -v`
 echo $newVersion
 echo $newVersion
 
 
-echo 'Installing zerotier-cli command line utility...'
+echo 'Creating symlinks...'
 
 
 rm -f /usr/bin/zerotier-cli /usr/bin/zerotier-idtool
 rm -f /usr/bin/zerotier-cli /usr/bin/zerotier-idtool
 ln -sf /var/lib/zerotier-one/zerotier-one /usr/bin/zerotier-cli
 ln -sf /var/lib/zerotier-one/zerotier-one /usr/bin/zerotier-cli
@@ -94,10 +99,9 @@ ln -sf /var/lib/zerotier-one/zerotier-one /usr/bin/zerotier-idtool
 
 
 echo 'Installing zerotier-one service...'
 echo 'Installing zerotier-one service...'
 
 
-# Note: ensure that service restarts are the last thing this script actually
-# does, since these may kill the script itself. Also note the & to allow
-# them to finish independently.
 if [ -n "$SYSTEMDUNITDIR" -a -d "$SYSTEMDUNITDIR" ]; then
 if [ -n "$SYSTEMDUNITDIR" -a -d "$SYSTEMDUNITDIR" ]; then
+	# SYSTEMD
+
 	# If this was updated or upgraded from an init.d based system, clean up the old
 	# If this was updated or upgraded from an init.d based system, clean up the old
 	# init.d stuff before installing directly via systemd.
 	# init.d stuff before installing directly via systemd.
 	if [ -f /etc/init.d/zerotier-one ]; then
 	if [ -f /etc/init.d/zerotier-one ]; then
@@ -114,11 +118,13 @@ if [ -n "$SYSTEMDUNITDIR" -a -d "$SYSTEMDUNITDIR" ]; then
 	rm -f /tmp/systemd_zerotier-one.service /tmp/init.d_zerotier-one
 	rm -f /tmp/systemd_zerotier-one.service /tmp/init.d_zerotier-one
 
 
 	systemctl enable zerotier-one.service
 	systemctl enable zerotier-one.service
-	if [ "$origVersion" != "$newVersion" ]; then
-		echo 'Version has changed, starting...'
-		systemctl restart zerotier-one.service
-	fi
+	#if [ "$origVersion" != "$newVersion" ]; then
+	#	echo 'Version has changed, starting...'
+	#	systemctl restart zerotier-one.service
+	#fi
 else
 else
+	# SYSV INIT -- also covers upstart which supports SysVinit backward compatibility
+
 	cp -f /tmp/init.d_zerotier-one /etc/init.d/zerotier-one
 	cp -f /tmp/init.d_zerotier-one /etc/init.d/zerotier-one
 	chmod 0755 /etc/init.d/zerotier-one
 	chmod 0755 /etc/init.d/zerotier-one
 	rm -f /tmp/systemd_zerotier-one.service /tmp/init.d_zerotier-one
 	rm -f /tmp/systemd_zerotier-one.service /tmp/init.d_zerotier-one
@@ -126,6 +132,7 @@ else
 	if [ -f /sbin/chkconfig -o -f /usr/sbin/chkconfig -o -f /usr/bin/chkconfig -o -f /bin/chkconfig ]; then
 	if [ -f /sbin/chkconfig -o -f /usr/sbin/chkconfig -o -f /usr/bin/chkconfig -o -f /bin/chkconfig ]; then
 		chkconfig zerotier-one on
 		chkconfig zerotier-one on
 	else
 	else
+		# Yes Virginia, some systems lack chkconfig.
 		if [ -d /etc/rc0.d ]; then
 		if [ -d /etc/rc0.d ]; then
 			rm -f /etc/rc0.d/???zerotier-one
 			rm -f /etc/rc0.d/???zerotier-one
 			ln -sf /etc/init.d/zerotier-one /etc/rc0.d/K89zerotier-one
 			ln -sf /etc/init.d/zerotier-one /etc/rc0.d/K89zerotier-one
@@ -156,14 +163,14 @@ else
 		fi
 		fi
 	fi
 	fi
 
 
-	if [ "$origVersion" != "$newVersion" ]; then
-		echo 'Version has changed, starting...'
-		if [ -f /sbin/service -o -f /usr/sbin/service ]; then
-			service zerotier-one restart
-		else
-			/etc/init.d/zerotier-one restart
-		fi
-	fi
+	#if [ "$origVersion" != "$newVersion" ]; then
+	#	echo 'Version has changed, starting...'
+	#	if [ -f /sbin/service -o -f /usr/sbin/service ]; then
+	#		service zerotier-one restart
+	#	else
+	#		/etc/init.d/zerotier-one restart
+	#	fi
+	#fi
 fi
 fi
 
 
 exit 0
 exit 0