123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- #!/bin/sh
- # Play audio script for ClockChimes
- # Copyright 2018 - Stu Miller - Colorado, USA
- # All rights reserved.
- #
- # Redistribution and use of this script, with or without modification, is
- # permitted provided that the following conditions are met:
- #
- # 1. Redistributions of this script must retain the above copyright
- # notice, this list of conditions and the following disclaimer.
- #
- # THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
- # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- # EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- # Function - input: UC - output: LC
- lowercase () {
- LC=$(echo $UC | tr [:upper:] [:lower:])
- } # END lowercase
- # function - input: ARRAY, KEY - output: VALUE
- read_array(){
- # indirect reference method
- TMP=${ARRAY}[KEY]
- VALUE=${!TMP}
- } # END read_array
- # Function - input: CHIME, STRIKE - output: sox audio
- play_chimestrike(){
- #echo "play_chimestrike - #1:"$chime$strike":"
- # check chimestrike null
- if [ "$CHIME$STRIKE" != "" ]; then
- # determine user based on 1st local display
- # last - reads /var/log/wtmp file
- # grep - looks for ":0" followed by "still logged in"
- # awk - uses 1st line and 1st field, ignores remaining lines
- USER=$(last | grep -E :0.*"still logged in" | awk 'NR==1{print $1}')
- # play as default root user or user currently logged in
- # for play commands, see: man sox
- # functionaly equivalent to: sox -q $CHIME$STRIKE -d
- if [[ "$USER" == "" || "$USER" == "root" ]]; then
- # play as root
- /usr/bin/play -q $CHIME$STRIKE
- else
- # play as user currently logged in
- su -l $USER -c "/usr/bin/play -q $CHIME$STRIKE"
- fi # END play as root or user
- fi # END chimestrike null
- #echo "play_chimestrike - :end:"
- } # END play_chimestrike
- # Function - requires: read_array - input: CONTROL[], MINUTE, LOOP - output: STRIKE
- set_strike(){
- #echo "START set_strike - #1:play_strike:"${CONTROL[2]}":minute:"$MINUTE":loop:"$LOOP":"
- # check play strike
- if [ ${CONTROL[2]} == "yes" ]; then
- # check min 00
- if [[ "$MINUTE" == "00" || "$MINUTE" == "0" ]]; then
- # set strike to play, minus last
- while [ "$LOOP" -gt "1" ]; do
- # concatenate pre & strike
- ARRAY=${CONTROL[0]}; KEY="4"; read_array
- STRIKE=$STRIKE" "$PRE$VALUE
- # decrement loop counter
- LOOP=$(($LOOP-1))
- done # END strike loop
- # concatenate last pre & strike
- ARRAY=${CONTROL[0]}; KEY="5"; read_array
- STRIKE=$STRIKE" "$PRE$VALUE
- fi # END min 00
- fi # END play strike
- #echo "END set_strike - strike:"$STRIKE":"
- } # END set_strikes
- # Function - requires: read_array - input: CONTROL[], MINUTE - output: CHIME
- set_chime(){
- #echo "START set_chime - #1:play_chime:"${CONTROL[1]}":minute:"$MINUTE":"
- # check play chimes
- if [ "${CONTROL[1]}" == "yes" ]; then
- # check minute on the quarter hour
- if [ "$MINUTE" == "00" ]; then
- ARRAY=${CONTROL[0]}; KEY="0"; read_array
- CHIME=$PRE$VALUE
- elif [ "$MINUTE" == "15" ]; then
- ARRAY=${CONTROL[0]}; KEY="1"; read_array
- CHIME=$PRE$VALUE
- elif [ "$MINUTE" == "30" ]; then
- ARRAY=${CONTROL[0]}; KEY="2"; read_array
- CHIME=$PRE$VALUE
- elif [ "$MINUTE" == "45" ]; then
- ARRAY=${CONTROL[0]}; KEY="3"; read_array
- CHIME=$PRE$VALUE
- fi # END minute on the quarter hour
- fi # END play chimes
- #echo "END set_chime - chime:"$CHIME":"
- } # END set_chime
- # Function - input: $1, $2, $3 - output: LOOP, MINUTE
- test(){
- #echo "START test_script - #1:"$1":"$2":"$3":"
- USAGE="TEST FAILED: requires 2nd & 3rd integer arguments"
- # check for arguments
- if [[ "$2" != "" && "$3" != "" ]]; then
- USAGE="TEST FAILED: 2nd argument represents hours. It must be an integer <= 24"
- # check hour argument is integer
- if [ "$2" -eq "$2" ] 2>/dev/null; then
- # check hour argument is -le 24
- if [ $2 -le 12 ]; then
- LOOP=$2
- elif [ $2 -le 24 ]; then
- LOOP=$(($2-12))
- else
- echo $USAGE; exit
- fi # END hour argument is -le 24
- else
- echo $USAGE; exit
- fi # END hour argument is integer
- USAGE="TEST FAILED: 3rd argument represents minutes. It must be an integer <= 45"
- # check minute argument is integer
- if [ "$3" -eq "$3" ] 2>/dev/null; then
- # check minute argument -le 45
- if [ $3 -le 45 ]; then
- MINUTE=$3
- else
- echo $USAGE; exit
- fi # END minute argument -le 45
- else
- echo $USAGE; exit
- fi # END minute argument is integer
- else
- echo $USAGE; exit
- fi # END check for arguments
- #echo "END test_script - loop:"$LOOP":minute:"$MINUTE":"
- echo "NOTE: requires logged in user password if NOT running as root"
- } # END test
- # source config file
- . /etc/clockchimes.conf
- # sound directory
- SND_DIR="/usr/share/sounds/clockchimes/"
- # prefix volume factor, sound directory & chime name
- UC=${CONTROL[0]}; lowercase
- PRE="-v "${CONTROL[3]}" "$SND_DIR$LC"/"
- # system minute
- MINUTE=$(date +"%M")
- # system hour, 12 hour clock
- HOUR=$(date +"%I")
- # loop counter, strip leading "0" from system hour
- LOOP=$((10#$HOUR))
- # version language
- VERSION="clockchimes v0.2
- Copyright 2018 - Stu Miller - Colorado, USA
- All rights reserved."
- # usage language
- USAGE="Usage: $0 [OPTION]
- Play clock chimes and hour strikes.
- --help display this help and exit
- --test test sample time, add hour & minute
- --version display version information and exit
- Report bugs to <slackbuilds@go4it2day.com>."
- # Main routine
- # check for options
- case $1 in
- '--help')
- printf '%s\n' "$USAGE" || exit
- ;;
- '--test')
- # must pass script arguments to funtions
- test $1 $2 $3
- ;;
- '--version')
- printf '%s\n' "$VERSION" || exit
- ;;
- esac
- set_chime
- set_strike
- play_chimestrike
|