EditBear
Cadet
- Joined
 - Sep 17, 2018
 
- Messages
 - 1
 
Hi,
Please forgive my lack of knowledge, I'm a very old "nooby" from the days of "vacuum tubes", trying my best to understand programming and failing miserably!
I have a FreeNas 7 server with all my DVD movies on it, and a Windows Home Server (2011) with all my Blu-rays and music.
The WHS2011 starts up when any client HTPC starts up and shuts down when all clients sleep.
I can get my WHS2011 server to start-up my FreeNas server (by a WOL script during the WHS startup), but for years, I cannot work out how to get the FreeNas to shutdown when my WHS shuts down?
I then came upon this script (posted originally by sac0dan) which seems to monitor a range of IP addresses and shuts the FreeNas 7 server down if they all are quiet.
https://forums.freenas.org/index.php?threads/green-power-scheduled-power-off.232/
I only need to check just one IP address - that of my WHS2011 which is 192.168.0.220
My FreeNas7 is at 192.168.0.250
I can see the program is looping round but my ability is too little to strip out the unnecessary steps
I would be very grateful if some kind person would simplify this to check only the one IP address please?
	
		
			
		
		
	
			
			Please forgive my lack of knowledge, I'm a very old "nooby" from the days of "vacuum tubes", trying my best to understand programming and failing miserably!
I have a FreeNas 7 server with all my DVD movies on it, and a Windows Home Server (2011) with all my Blu-rays and music.
The WHS2011 starts up when any client HTPC starts up and shuts down when all clients sleep.
I can get my WHS2011 server to start-up my FreeNas server (by a WOL script during the WHS startup), but for years, I cannot work out how to get the FreeNas to shutdown when my WHS shuts down?
I then came upon this script (posted originally by sac0dan) which seems to monitor a range of IP addresses and shuts the FreeNas 7 server down if they all are quiet.
https://forums.freenas.org/index.php?threads/green-power-scheduled-power-off.232/
I only need to check just one IP address - that of my WHS2011 which is 192.168.0.220
My FreeNas7 is at 192.168.0.250
I can see the program is looping round but my ability is too little to strip out the unnecessary steps
I would be very grateful if some kind person would simplify this to check only the one IP address please?
Code:
#!/bin/bash
{
lockfile=/tmp/autosuspend.lock
if [ ! -e $lockfile ]; then
   trap "rm -f $lockfile; exit" INT TERM EXIT
   touch $lockfile
	echo "autosuspend script started"
	#sleep 180	 # Sleep for 3 mins to make sure the server don't shut down right away
	class=192.168.0
	myIP=192.168.0.250   #$(/sbin/ifconfig | egrep -o "192.168.0.[0-9]{1,3}")
	failcount=0
	maxfail=3	   # Set the number of failure count before we do a shutdown
	SLEEP=600	   # Numbers of seconds between each check/loop
	LOGFILE=/tmp/autosuspend.log
	# Don't suspend if one of the following processes is active (separate by space):
	STOPPROCS='storeBackup wget'
	echo Logfile=$LOGFILE
	unset known_host
	_ping_last_host() {
	  # try to ping the last known active host
	  # return 0 on success, otherwise 1
	  echo "pinging last host $known_host" >> $LOGFILE
	  if [ $known_host ]; then
		echo -n "`date` - pinging last host $known_host - " >> $LOGFILE
		ping -c 1 $known_host >/dev/null;
		if [ $? -eq 0 ]; then 
		  echo "host is active" >> $LOGFILE
		  # Jepp! We're done
		  return 0
		else
		  echo "fail" >> $LOGFILE
		  unset known_host
		  return 1
		fi;
	  else
		return 1
	  fi
	 
	}
	_ping_range() {
	  # Ping an IP-range and look for a responding host.
	  # If there is one store it's IP in $known_host and return 0
	  # return 0 on success, otherwise 1
	  cnt=0
	  echo "`date` - pinging range...  " >> $LOGFILE
	  for i in {2..14}; # Set the range
	  do
		# Ignore my own IP
		if [ ${class}.${i} != $myIP ]; then
		  echo "pinging ${class}.${i}" >> $LOGFILE
		  ping -c 1 ${class}.${i} >/dev/null
		  if [ $? -eq 0 ]; then 
			echo -n "${class}.${i} - " >> $LOGFILE
			known_host=${class}.${i}
			return 0;
		  fi
		fi
	  done
	  return 1
	}
	_shutdown() { 
	  # Do a shutdown if we failed for $failcount rounds
	  # We need a script suspend.sh in the current directory
	  echo "deciding doing shutdown or not. failcount = $failcount" >> $LOGFILE
	  if [ $failcount -eq $maxfail ];then 
		echo "`date` - doing a shutdown" >> $LOGFILE
		more $LOGFILE | grep -F --line-buffered ''  # clear buffer
				rm $lockfile
				trap - INT TERM EXIT
		shutdown -p now >>$LOGFILE
		more $LOGFILE | grep -F --line-buffered ''  # clear buffer
		#we will never arrive here with a shutdown...
		echo "`date` - back from suspend" >> $LOGFILE
		failcount=0;
	  fi
	}
	while [ 1 ];
	do
	  proc_found=0
	  # look if uniterruptable jobs are running
	  for proc in $STOPPROCS
	  do
		if [ "`pgrep $proc`" != "" ];then 
		  echo "`date` - $proc is running." >> $LOGFILE
		  proc_found=1
		  break
		fi
	  done 
	  echo procfound=$proc_found 
	  if [ $proc_found -eq 0 ]; then
		# look for other hosts, that are alive in our subnet
		_ping_last_host
		if [ $? -ne 0 ];then
		  _ping_range
		  if [ $? -ne 0 ];then
			let failcount++;
			echo "failure No. $failcount" >> $LOGFILE
			_shutdown;
		  else
			echo "good." >> $LOGFILE
			failcount=0;
		  fi
		  else
			echo "good." >> $LOGFILE
			failcount=0;
		fi
	  fi
	  sleep $SLEEP;
	done
	
   rm $lockfile
   trap - INT TERM EXIT
else
   echo "autosuspend is already running. Exiting."
fi
} &