Guest User

Untitled

a guest
Mar 23rd, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.71 KB | None | 0 0
  1. #!/usr/bin/env bash
  2.  
  3. export ql_quicklock_version="0.0.104"
  4. export ql_source_file="$HOME/.quicklock/ql.sh";
  5.  
  6. export ql_gray='\033[1;30m'
  7. export ql_magenta='\033[1;35m'
  8. export ql_cyan='\033[1;36m'
  9. export ql_orange='\033[1;33m'
  10. export ql_green='\033[1;32m'
  11. export ql_no_color='\033[0m'
  12.  
  13.  
  14. on_ql_trap (){
  15. # echo something here
  16. ql_release_lock
  17. }
  18.  
  19. ql_unlock_process(){
  20. kill -SIGUSR1 "$1" # kill <pid> given by $1, with SIGUSR1 signal...
  21. }
  22.  
  23. on_ql_conditional_exit (){
  24.  
  25. if [[ $- == *i* ]]; then
  26. # if we are in a terminal just return, do not exit.
  27. # debugging: echo -e "${ql_orange}quicklock: since we are in a terminal, not exiting.${ql_no_color}";
  28. return 1;
  29. fi
  30.  
  31. # debugging: echo -e "${ql_orange}quicklock: since we are not in a terminal, we are exiting...${ql_no_color}";
  32.  
  33. if [[ "$ql_prevent_exit" == "yes" || "$ql_prevent_exit" == "yes" ]]; then
  34. return 1;
  35. fi
  36.  
  37. exit 1;
  38.  
  39. }
  40.  
  41. ql_noop(){
  42. echo "";
  43. }
  44.  
  45.  
  46. ql_remove_all_locks (){
  47. rm -rf "$HOME/.quicklock/locks/"*
  48. }
  49.  
  50.  
  51. ql_acquire_lock () {
  52.  
  53. local name="${1}" # the lock name is the first argument, if that is empty, then set the lockname to $PWD
  54.  
  55. if [[ -z "$name" ]]; then
  56. echo -e "${ql_orange}quicklock: warning - no quicklock_name available so defaulted to \$PWD.${ql_no_color}"
  57. name="$PWD";
  58. fi
  59.  
  60. mkdir -p "$HOME/.quicklock/locks"
  61. fle=$(echo "${name}" | tr "/" _)
  62.  
  63. local qln="$HOME/.quicklock/locks/${fle}.lock"
  64.  
  65. mkdir "${qln}" &> /dev/null || {
  66. echo -e "${ql_magenta}quicklock: could not acquire lock with name '${qln}'${ql_no_color}";
  67. echo -e "${ql_magenta}quicklock: someone else is using that lockname.${ql_no_color}";
  68. on_ql_conditional_exit;
  69. return 1;
  70. }
  71.  
  72. my_named_pipe="${qln}/$$"
  73. mkfifo "${my_named_pipe}" &> /dev/null; # add the PID inside the lock dir
  74.  
  75. export ql_current_lockname="${qln}";
  76. trap on_ql_trap EXIT;
  77. trap on_ql_trap 0;
  78. trap on_ql_trap SIGHUP;
  79.  
  80.  
  81. echo -e "${ql_gray}quicklock: process id requesting lock: $$, parent process id: $(ps -o ppid= -p $$)${ql_no_color}."
  82. echo -e "${ql_green}quicklock: acquired lock with name '${qln}'${ql_no_color}"
  83.  
  84. if [[ "$ql_allow_ipc" == "yes" ]]; then
  85.  
  86. echo -e "quicklock: process is reading from named pipe to listen for incoming messages regarding releasing lock.";
  87. while read line; do ql_on_named_pipe_msg "$line" "$$"; done < ${my_named_pipe} &
  88.  
  89. fi
  90.  
  91. }
  92.  
  93.  
  94. ql_release_lock () {
  95.  
  96. local quicklock_name="$ql_current_lockname";
  97. local is_force="nope";
  98.  
  99. local last="$(echo ${@: -1})"
  100. if [[ "${last}" == "--force" ]]; then
  101. echo -e "${ql_magenta}quicklock: warning using --force.${ql_no_color}";
  102. is_force="yes"
  103. fi
  104.  
  105. if [[ ! -z "$1" && "$1" != "--force" ]]; then
  106. quicklock_name="${1}";
  107.  
  108. elif [[ -z "${quicklock_name}" ]]; then
  109. echo -e "${ql_orange}quicklock: warning - no quicklock_name available so defaulted to \$PWD.${ql_no_color}";
  110. quicklock_name="$PWD";
  111. fi
  112.  
  113. if [[ "$quicklock_name" != "$HOME/.quicklock/locks/"* ]]; then
  114.  
  115. quicklock_name=$(echo "${quicklock_name}" | tr "/" _)
  116.  
  117. if [[ "$quicklock_name" =~ [^a-zA-Z0-9\-\_] ]]; then
  118. echo -e "${ql_magenta}quicklock: lockname has invalid chars - must be alpha-numeric chars only.${ql_no_color}"
  119. echo -e "${ql_magenta}quicklock: could not release lock with desired name -> '$fle'.${ql_no_color}"
  120. on_ql_conditional_exit
  121. return 1;
  122. fi
  123.  
  124. quicklock_name="$HOME/.quicklock/locks/${quicklock_name}.lock";
  125. fi
  126.  
  127. if [[ -z "${quicklock_name}" ]]; then
  128. echo -e "${ql_orange}quicklock: no lockname was defined. (\$quicklock_name was not set).${ql_no_color}";
  129. ql_maybe_fail;
  130. return 1;
  131. fi
  132.  
  133. if [[ "$HOME" == "${quicklock_name}" ]]; then
  134. echo -e "${ql_orange}quicklock: dangerous value set for \$quicklock_name variable..was equal to user home directory, not good.${ql_no_color}";
  135. ql_maybe_fail;
  136. return 1;
  137. fi
  138.  
  139. local current_pid="$$"
  140. local pid_inside="$(ls "${quicklock_name}" 2> /dev/null)";
  141.  
  142.  
  143. rm -r "${quicklock_name}" &> /dev/null &&
  144. { echo -e "${ql_cyan}quicklock: lock with name '${quicklock_name}' was released.${ql_no_color}"; } ||
  145. { >&2 echo -e "${ql_magenta}quicklock: no lock existed for lockname '${quicklock_name}'.${ql_no_color}"; ql_maybe_fail; }
  146.  
  147. trap - EXIT; # clear/unset trap
  148. trap ql_noop EXIT;
  149.  
  150. }
  151.  
  152.  
  153.  
  154. # export all of the functions
  155. export -f ql_remove_all_locks
  156. export -f ql_maybe_fail;
  157. export -f on_ql_conditional_exit;
  158. export -f on_ql_trap;
  159. export -f ql_acquire_lock;
  160. export -f ql_release_lock;
  161. export -f ql_get_lockowner_pid;
  162. export -f ql_ls;
  163. export -f ql_print_version;
  164. export -f ql_unlock_process;
  165. export -f ql_on_named_pipe_msg;
  166. export -f ql_echo_current_lockname;
  167. export -f ql_get_lockname;
  168. export -f ql_write_message;
  169. export -f ql_noop;
  170.  
  171. # that's it lulz
Add Comment
Please, Sign In to add comment