clockchimes 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #!/bin/sh
  2. # Play audio script for ClockChimes
  3. # Copyright 2018 - Stu Miller - Colorado, USA
  4. # All rights reserved.
  5. #
  6. # Redistribution and use of this script, with or without modification, is
  7. # permitted provided that the following conditions are met:
  8. #
  9. # 1. Redistributions of this script must retain the above copyright
  10. # notice, this list of conditions and the following disclaimer.
  11. #
  12. # THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
  13. # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  14. # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
  15. # EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  16. # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  17. # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
  18. # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  19. # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  20. # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  21. # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  22. # Function - input: UC - output: LC
  23. lowercase () {
  24. LC=$(echo $UC | tr [:upper:] [:lower:])
  25. } # END lowercase
  26. # function - input: ARRAY, KEY - output: VALUE
  27. read_array(){
  28. # indirect reference method
  29. TMP=${ARRAY}[KEY]
  30. VALUE=${!TMP}
  31. } # END read_array
  32. # Function - input: CHIME, STRIKE - output: sox audio
  33. play_chimestrike(){
  34. #echo "play_chimestrike - #1:"$chime$strike":"
  35. # check chimestrike null
  36. if [ "$CHIME$STRIKE" != "" ]; then
  37. # determine user based on 1st local display
  38. # last - reads /var/log/wtmp file
  39. # grep - looks for ":0" followed by "still logged in"
  40. # awk - uses 1st line and 1st field, ignores remaining lines
  41. USER=$(last | grep -E :0.*"still logged in" | awk 'NR==1{print $1}')
  42. # play as default root user or user currently logged in
  43. # for play commands, see: man sox
  44. # functionaly equivalent to: sox -q $CHIME$STRIKE -d
  45. if [[ "$USER" == "" || "$USER" == "root" ]]; then
  46. # play as root
  47. /usr/bin/play -q $CHIME$STRIKE
  48. else
  49. # play as user currently logged in
  50. su -l $USER -c "/usr/bin/play -q $CHIME$STRIKE"
  51. fi # END play as root or user
  52. fi # END chimestrike null
  53. #echo "play_chimestrike - :end:"
  54. } # END play_chimestrike
  55. # Function - requires: read_array - input: CONTROL[], MINUTE, LOOP - output: STRIKE
  56. set_strike(){
  57. #echo "START set_strike - #1:play_strike:"${CONTROL[2]}":minute:"$MINUTE":loop:"$LOOP":"
  58. # check play strike
  59. if [ ${CONTROL[2]} == "yes" ]; then
  60. # check min 00
  61. if [[ "$MINUTE" == "00" || "$MINUTE" == "0" ]]; then
  62. # set strike to play, minus last
  63. while [ "$LOOP" -gt "1" ]; do
  64. # concatenate pre & strike
  65. ARRAY=${CONTROL[0]}; KEY="4"; read_array
  66. STRIKE=$STRIKE" "$PRE$VALUE
  67. # decrement loop counter
  68. LOOP=$(($LOOP-1))
  69. done # END strike loop
  70. # concatenate last pre & strike
  71. ARRAY=${CONTROL[0]}; KEY="5"; read_array
  72. STRIKE=$STRIKE" "$PRE$VALUE
  73. fi # END min 00
  74. fi # END play strike
  75. #echo "END set_strike - strike:"$STRIKE":"
  76. } # END set_strikes
  77. # Function - requires: read_array - input: CONTROL[], MINUTE - output: CHIME
  78. set_chime(){
  79. #echo "START set_chime - #1:play_chime:"${CONTROL[1]}":minute:"$MINUTE":"
  80. # check play chimes
  81. if [ "${CONTROL[1]}" == "yes" ]; then
  82. # check minute on the quarter hour
  83. if [ "$MINUTE" == "00" ]; then
  84. ARRAY=${CONTROL[0]}; KEY="0"; read_array
  85. CHIME=$PRE$VALUE
  86. elif [ "$MINUTE" == "15" ]; then
  87. ARRAY=${CONTROL[0]}; KEY="1"; read_array
  88. CHIME=$PRE$VALUE
  89. elif [ "$MINUTE" == "30" ]; then
  90. ARRAY=${CONTROL[0]}; KEY="2"; read_array
  91. CHIME=$PRE$VALUE
  92. elif [ "$MINUTE" == "45" ]; then
  93. ARRAY=${CONTROL[0]}; KEY="3"; read_array
  94. CHIME=$PRE$VALUE
  95. fi # END minute on the quarter hour
  96. fi # END play chimes
  97. #echo "END set_chime - chime:"$CHIME":"
  98. } # END set_chime
  99. # Function - input: $1, $2, $3 - output: LOOP, MINUTE
  100. test(){
  101. #echo "START test_script - #1:"$1":"$2":"$3":"
  102. USAGE="TEST FAILED: requires 2nd & 3rd integer arguments"
  103. # check for arguments
  104. if [[ "$2" != "" && "$3" != "" ]]; then
  105. USAGE="TEST FAILED: 2nd argument represents hours. It must be an integer <= 24"
  106. # check hour argument is integer
  107. if [ "$2" -eq "$2" ] 2>/dev/null; then
  108. # check hour argument is -le 24
  109. if [ $2 -le 12 ]; then
  110. LOOP=$2
  111. elif [ $2 -le 24 ]; then
  112. LOOP=$(($2-12))
  113. else
  114. echo $USAGE; exit
  115. fi # END hour argument is -le 24
  116. else
  117. echo $USAGE; exit
  118. fi # END hour argument is integer
  119. USAGE="TEST FAILED: 3rd argument represents minutes. It must be an integer <= 45"
  120. # check minute argument is integer
  121. if [ "$3" -eq "$3" ] 2>/dev/null; then
  122. # check minute argument -le 45
  123. if [ $3 -le 45 ]; then
  124. MINUTE=$3
  125. else
  126. echo $USAGE; exit
  127. fi # END minute argument -le 45
  128. else
  129. echo $USAGE; exit
  130. fi # END minute argument is integer
  131. else
  132. echo $USAGE; exit
  133. fi # END check for arguments
  134. #echo "END test_script - loop:"$LOOP":minute:"$MINUTE":"
  135. echo "NOTE: requires logged in user password if NOT running as root"
  136. } # END test
  137. # source config file
  138. . /etc/clockchimes.conf
  139. # sound directory
  140. SND_DIR="/usr/share/sounds/clockchimes/"
  141. # prefix volume factor, sound directory & chime name
  142. UC=${CONTROL[0]}; lowercase
  143. PRE="-v "${CONTROL[3]}" "$SND_DIR$LC"/"
  144. # system minute
  145. MINUTE=$(date +"%M")
  146. # system hour, 12 hour clock
  147. HOUR=$(date +"%I")
  148. # loop counter, strip leading "0" from system hour
  149. LOOP=$((10#$HOUR))
  150. # version language
  151. VERSION="clockchimes v0.2
  152. Copyright 2018 - Stu Miller - Colorado, USA
  153. All rights reserved."
  154. # usage language
  155. USAGE="Usage: $0 [OPTION]
  156. Play clock chimes and hour strikes.
  157. --help display this help and exit
  158. --test test sample time, add hour & minute
  159. --version display version information and exit
  160. Report bugs to <slackbuilds@go4it2day.com>."
  161. # Main routine
  162. # check for options
  163. case $1 in
  164. '--help')
  165. printf '%s\n' "$USAGE" || exit
  166. ;;
  167. '--test')
  168. # must pass script arguments to funtions
  169. test $1 $2 $3
  170. ;;
  171. '--version')
  172. printf '%s\n' "$VERSION" || exit
  173. ;;
  174. esac
  175. set_chime
  176. set_strike
  177. play_chimestrike