Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/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
Add Comment
Please, Sign In to add comment