Created
March 15, 2018 00:57
-
-
Save ORESoftware/06dbb26a48d2ddf48a5a2166834e0836 to your computer and use it in GitHub Desktop.
using trap for SIGHUP (when user closes terminal window)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
export ql_quicklock_version="0.0.104" | |
export ql_source_file="$HOME/.quicklock/ql.sh"; | |
export ql_gray='\033[1;30m' | |
export ql_magenta='\033[1;35m' | |
export ql_cyan='\033[1;36m' | |
export ql_orange='\033[1;33m' | |
export ql_green='\033[1;32m' | |
export ql_no_color='\033[0m' | |
on_ql_trap (){ | |
# echo something here | |
ql_release_lock | |
} | |
ql_unlock_process(){ | |
kill -SIGUSR1 "$1" # kill <pid> given by $1, with SIGUSR1 signal... | |
} | |
on_ql_conditional_exit (){ | |
if [[ $- == *i* ]]; then | |
# if we are in a terminal just return, do not exit. | |
# debugging: echo -e "${ql_orange}quicklock: since we are in a terminal, not exiting.${ql_no_color}"; | |
return 1; | |
fi | |
# debugging: echo -e "${ql_orange}quicklock: since we are not in a terminal, we are exiting...${ql_no_color}"; | |
if [[ "$ql_prevent_exit" == "yes" || "$ql_prevent_exit" == "yes" ]]; then | |
return 1; | |
fi | |
exit 1; | |
} | |
ql_noop(){ | |
echo ""; | |
} | |
ql_remove_all_locks (){ | |
rm -rf "$HOME/.quicklock/locks/"* | |
} | |
ql_acquire_lock () { | |
local name="${1}" # the lock name is the first argument, if that is empty, then set the lockname to $PWD | |
if [[ -z "$name" ]]; then | |
echo -e "${ql_orange}quicklock: warning - no quicklock_name available so defaulted to \$PWD.${ql_no_color}" | |
name="$PWD"; | |
fi | |
mkdir -p "$HOME/.quicklock/locks" | |
fle=$(echo "${name}" | tr "/" _) | |
local qln="$HOME/.quicklock/locks/${fle}.lock" | |
mkdir "${qln}" &> /dev/null || { | |
echo -e "${ql_magenta}quicklock: could not acquire lock with name '${qln}'${ql_no_color}"; | |
echo -e "${ql_magenta}quicklock: someone else is using that lockname.${ql_no_color}"; | |
on_ql_conditional_exit; | |
return 1; | |
} | |
my_named_pipe="${qln}/$$" | |
mkfifo "${my_named_pipe}" &> /dev/null; # add the PID inside the lock dir | |
export ql_current_lockname="${qln}"; | |
trap on_ql_trap EXIT; | |
trap on_ql_trap 0; | |
trap on_ql_trap SIGHUP; | |
echo -e "${ql_gray}quicklock: process id requesting lock: $$, parent process id: $(ps -o ppid= -p $$)${ql_no_color}." | |
echo -e "${ql_green}quicklock: acquired lock with name '${qln}'${ql_no_color}" | |
if [[ "$ql_allow_ipc" == "yes" ]]; then | |
echo -e "quicklock: process is reading from named pipe to listen for incoming messages regarding releasing lock."; | |
while read line; do ql_on_named_pipe_msg "$line" "$$"; done < ${my_named_pipe} & | |
fi | |
} | |
ql_release_lock () { | |
local quicklock_name="$ql_current_lockname"; | |
local is_force="nope"; | |
local last="$(echo ${@: -1})" | |
if [[ "${last}" == "--force" ]]; then | |
echo -e "${ql_magenta}quicklock: warning using --force.${ql_no_color}"; | |
is_force="yes" | |
fi | |
if [[ ! -z "$1" && "$1" != "--force" ]]; then | |
quicklock_name="${1}"; | |
elif [[ -z "${quicklock_name}" ]]; then | |
echo -e "${ql_orange}quicklock: warning - no quicklock_name available so defaulted to \$PWD.${ql_no_color}"; | |
quicklock_name="$PWD"; | |
fi | |
if [[ "$quicklock_name" != "$HOME/.quicklock/locks/"* ]]; then | |
quicklock_name=$(echo "${quicklock_name}" | tr "/" _) | |
if [[ "$quicklock_name" =~ [^a-zA-Z0-9\-\_] ]]; then | |
echo -e "${ql_magenta}quicklock: lockname has invalid chars - must be alpha-numeric chars only.${ql_no_color}" | |
echo -e "${ql_magenta}quicklock: could not release lock with desired name -> '$fle'.${ql_no_color}" | |
on_ql_conditional_exit | |
return 1; | |
fi | |
quicklock_name="$HOME/.quicklock/locks/${quicklock_name}.lock"; | |
fi | |
if [[ -z "${quicklock_name}" ]]; then | |
echo -e "${ql_orange}quicklock: no lockname was defined. (\$quicklock_name was not set).${ql_no_color}"; | |
ql_maybe_fail; | |
return 1; | |
fi | |
if [[ "$HOME" == "${quicklock_name}" ]]; then | |
echo -e "${ql_orange}quicklock: dangerous value set for \$quicklock_name variable..was equal to user home directory, not good.${ql_no_color}"; | |
ql_maybe_fail; | |
return 1; | |
fi | |
local current_pid="$$" | |
local pid_inside="$(ls "${quicklock_name}" 2> /dev/null)"; | |
rm -r "${quicklock_name}" &> /dev/null && | |
{ echo -e "${ql_cyan}quicklock: lock with name '${quicklock_name}' was released.${ql_no_color}"; } || | |
{ >&2 echo -e "${ql_magenta}quicklock: no lock existed for lockname '${quicklock_name}'.${ql_no_color}"; ql_maybe_fail; } | |
trap - EXIT; # clear/unset trap | |
trap ql_noop EXIT; | |
} | |
# export all of the functions | |
export -f ql_remove_all_locks | |
export -f ql_maybe_fail; | |
export -f on_ql_conditional_exit; | |
export -f on_ql_trap; | |
export -f ql_acquire_lock; | |
export -f ql_release_lock; | |
export -f ql_get_lockowner_pid; | |
export -f ql_ls; | |
export -f ql_print_version; | |
export -f ql_unlock_process; | |
export -f ql_on_named_pipe_msg; | |
export -f ql_echo_current_lockname; | |
export -f ql_get_lockname; | |
export -f ql_write_message; | |
export -f ql_noop; | |
# that's it lulz | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment