83 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#!/bin/bash
 | 
						|
 | 
						|
# CHECK UPTIME
 | 
						|
 | 
						|
RESUMED_TIMESTAMP_MICRO=$(journalctl -t systemd-sleep -b 0 -o json MESSAGE="System resumed." -n1 | jq -r .__REALTIME_TIMESTAMP)
 | 
						|
if [[ -z "$RESUMED_TIMESTAMP_MICRO" ]]
 | 
						|
then
 | 
						|
  UPTIME=$(cat /proc/uptime | cut -d' ' -f1 | cut -d'.' -f1)
 | 
						|
else
 | 
						|
  RESUMED_TIMESTAMP=$(expr $RESUMED_TIMESTAMP_MICRO / 1000000)
 | 
						|
  NOW_TIMESTAMP=$(date +%s)
 | 
						|
  UPTIME=$(expr $NOW_TIMESTAMP - $RESUMED_TIMESTAMP)
 | 
						|
fi
 | 
						|
 | 
						|
 | 
						|
MIN_UPTIME=$(expr 60 \* 15)
 | 
						|
if [[ "$UPTIME" -lt "$MIN_UPTIME" ]]
 | 
						|
then
 | 
						|
  echo "ABORT: uptime of ${UPTIME}s is lower than minimum of ${MIN_UPTIME}s"
 | 
						|
  exit 75
 | 
						|
fi
 | 
						|
 | 
						|
# CHECK FOR RUNNING TIMERS
 | 
						|
 | 
						|
for SERVICE in $(systemctl list-timers --no-pager --no-legend --state active -o json | jq -r '.[] | .activates')
 | 
						|
do
 | 
						|
  if [[ "$SERVICE" = "$THIS_SERVICE" ]]
 | 
						|
  then
 | 
						|
    continue
 | 
						|
  elif systemctl is-active "$SERVICE" --quiet
 | 
						|
  then
 | 
						|
    echo "ABORT: service $SERVICE is running by timer"
 | 
						|
    exit 75
 | 
						|
  fi
 | 
						|
done
 | 
						|
 | 
						|
# CHECK FOR INCOMING SSH CONNECTIONS
 | 
						|
 | 
						|
LOGINS=$(netstat -np | grep 'ESTABLISHED.*sshd' | tr -s ' ' | cut -d' ' -f5,7,8)
 | 
						|
if ! [[ -z "$LOGINS" ]]
 | 
						|
then
 | 
						|
  echo "ABORT: incoming ssh connections: $LOGINS"
 | 
						|
  exit 75
 | 
						|
fi
 | 
						|
 | 
						|
# CHECK FOR OUTGOING SSH CONNECTIONS
 | 
						|
 | 
						|
LOGINS=$(netstat -np | grep 'ESTABLISHED.*ssh[^d]' | tr -s ' ' | cut -d' ' -f5,7,8)
 | 
						|
if ! [[ -z "$LOGINS" ]]
 | 
						|
then
 | 
						|
  echo "ABORT: outgoing ssh connections: $LOGINS"
 | 
						|
  exit 75
 | 
						|
fi
 | 
						|
 | 
						|
# SUSPEND!
 | 
						|
 | 
						|
if [[ "$1" = check ]]
 | 
						|
then
 | 
						|
  echo "WOULD SESPEND"
 | 
						|
  exit 0
 | 
						|
else
 | 
						|
  echo "SESPENDING AFTER TIMEOUT"
 | 
						|
 | 
						|
  for i in 1 2 3 4 5 6
 | 
						|
  do
 | 
						|
    echo "TIMEOUT ${i} success"
 | 
						|
    sleep 10
 | 
						|
 | 
						|
    # check if condition is still met
 | 
						|
    if "$0" check
 | 
						|
    then
 | 
						|
      continue
 | 
						|
    else
 | 
						|
      echo "SESPENSION ABORTED"
 | 
						|
      exit 75
 | 
						|
    fi
 | 
						|
  done
 | 
						|
 | 
						|
  echo "SESPENDING"
 | 
						|
  downtime
 | 
						|
  systemctl suspend
 | 
						|
  exit 0
 | 
						|
fi
 |