Skip to content

Instantly share code, notes, and snippets.

@MrQubo
Last active April 22, 2020 11:38
Show Gist options
  • Select an option

  • Save MrQubo/5f4a9ef780e6e2a88431aa980e1124a9 to your computer and use it in GitHub Desktop.

Select an option

Save MrQubo/5f4a9ef780e6e2a88431aa980e1124a9 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
set -o errexit -o nounset -o pipefail
declare -r NAME="toggle-redshift"
# If user doesn't have write permission to /var/lock then the $NAME directory
# with write permissions should be created beforehand.
declare -r LOCK_FILE="/var/lock/$NAME/$NAME.lock"
declare -r PERSISTENT_FILE="/tmp/$NAME.tmp"
declare -ar LEVEL_TO_CLI=(
"-t 5000:5000 -b 1"
"-t 4000:4000 -b 1"
"-t 3500:3500 -b 1"
"-t 3000:3000 -b 1"
"-t 2750:2750 -b 1"
"-t 2500:2500 -b 1"
"-t 2250:2250 -b 1"
"-t 2000:2000 -b 1"
"-t 1800:1800 -b 1"
)
if (( $# != 1 )); then
printf "Usage: $NAME LEVEL\n"
exit 2
fi
declare -ir LEVEL="${1-1}-1"
if [ -z $LEVEL ]; then
exit 2
fi
if (($LEVEL >= "${#LEVEL_TO_CLI[@]}")); then
exit 2
fi
lock_level() {
head -n1 -- "$PERSISTENT_FILE"
}
lock_pid() {
tail -n1 -- "$PERSISTENT_FILE"
}
kill_redshift() {
kill -- "$(lock_pid)" 2>/dev/null | true
}
off() {
kill_redshift
rm -- "$PERSISTENT_FILE"
}
maybe_off() {
if [ -r "$PERSISTENT_FILE" ]; then
off
fi
}
on() {
redshift $REDSHIFT_FLAGS ${LEVEL_TO_CLI[$LEVEL]} >/dev/null 2>/dev/null &
PID="$!"
printf -- "%s\n%s\n" "$LEVEL" "$PID" >"$PERSISTENT_FILE"
sleep 0.1
}
off_and_on() {
kill_redshift
on
}
main() {
flock -x $LOCK_FD
if (( $LEVEL < 0 )); then
maybe_off
elif [ -r "$PERSISTENT_FILE" ]; then
if (( "$(lock_level)" == $LEVEL )); then
off
else
off_and_on
fi
else
on
fi
flock -u $LOCK_FD
}
mkdir -v -p -- "$(dirname -- "$LOCK_FILE")"
declare -r LOCK_FD="9"
main 9>"$LOCK_FILE"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment