Replace hardcoded sleep with wait with timeout
This commit is contained in:
		
							
								
								
									
										35
									
								
								tunsocks.sh
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								tunsocks.sh
									
									
									
									
									
								
							@@ -2,7 +2,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
set -xeuo pipefail
 | 
					set -xeuo pipefail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pidfile=${RUNTIME_DIRECTORY:-/tmp}/tunsocks.pid
 | 
					rtdir=${RUNTIME_DIRECTORY:-/tmp}
 | 
				
			||||||
 | 
					pidfile="$rtdir/tunsocks.pid"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
nsname="$1"
 | 
					nsname="$1"
 | 
				
			||||||
device="tun${nsname}"
 | 
					device="tun${nsname}"
 | 
				
			||||||
@@ -18,9 +19,28 @@ fi
 | 
				
			|||||||
setup() {
 | 
					setup() {
 | 
				
			||||||
	ip tuntap add mode tun dev "$device"
 | 
						ip tuntap add mode tun dev "$device"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/usr/bin/tun2socks -device "$device" -proxy "$proxy" &
 | 
						chan="$rtdir/chan"
 | 
				
			||||||
 | 
						mkfifo "$chan"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							sleep 10
 | 
				
			||||||
 | 
							echo TIMEOUT >"$chan"
 | 
				
			||||||
 | 
						} &
 | 
				
			||||||
 | 
						timeout_pid=$!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						done_cmd="sh -c 'echo DONE > \"$chan\"'"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/usr/bin/tun2socks -device "$device" -proxy "$proxy" -tun-post-up "$done_cmd" &
 | 
				
			||||||
	echo "$!" >"$pidfile"
 | 
						echo "$!" >"$pidfile"
 | 
				
			||||||
	sleep 5
 | 
					
 | 
				
			||||||
 | 
						read -r status <"$chan"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ "$status" = DONE ]; then
 | 
				
			||||||
 | 
							kill "$timeout_pid"
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							echo "Failed: $status"
 | 
				
			||||||
 | 
							return 1
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ip netns add "$ns"
 | 
						ip netns add "$ns"
 | 
				
			||||||
	ip link set "$device" netns "$ns"
 | 
						ip link set "$device" netns "$ns"
 | 
				
			||||||
@@ -29,12 +49,19 @@ setup() {
 | 
				
			|||||||
	ip -n "$ns" link set dev "$device" up
 | 
						ip -n "$ns" link set dev "$device" up
 | 
				
			||||||
	ip -n "$ns" route add default via 198.19.1.1 dev "$device" metric 100
 | 
						ip -n "$ns" route add default via 198.19.1.1 dev "$device" metric 100
 | 
				
			||||||
	ip -n "$ns" link set lo up
 | 
						ip -n "$ns" link set lo up
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	systemd-notify --ready
 | 
						systemd-notify --ready
 | 
				
			||||||
	wait
 | 
						wait
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cleanup() {
 | 
					cleanup() {
 | 
				
			||||||
	ip tuntap del mode tun dev "$device" || true
 | 
						# Cleanup as much as possible. Don't stop on first error
 | 
				
			||||||
 | 
						set +e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# If the script failed after creating the device before moving it to namespace
 | 
				
			||||||
 | 
						ip tuntap del mode tun dev "$device"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Regular cleanup when when shutdown normally
 | 
				
			||||||
	kill "$(cat "$pidfile")"
 | 
						kill "$(cat "$pidfile")"
 | 
				
			||||||
	ip -n "$ns" tuntap del mode tun dev "$device"
 | 
						ip -n "$ns" tuntap del mode tun dev "$device"
 | 
				
			||||||
	ip netns del "$ns"
 | 
						ip netns del "$ns"
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user