1*4882a593Smuzhiyun#!/bin/sh 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# Usage: 4*4882a593Smuzhiyun# bootanim start [timeout] 5*4882a593Smuzhiyun# bootanim stop 6*4882a593Smuzhiyun# 7*4882a593Smuzhiyun# Example hook: 8*4882a593Smuzhiyun# root@RK3588:/# more /etc/bootanim.d/gst-bootanim.sh 9*4882a593Smuzhiyun# #!/bin/sh 10*4882a593Smuzhiyun# touch ${TAG_FILE:-/dev/null} 11*4882a593Smuzhiyun# gst-play-1.0 /etc/bootanim.d/bootanim.mp4 -q --no-interactive& 12*4882a593Smuzhiyun 13*4882a593Smuzhiyunexport TAG_FILE=/tmp/.bootanim 14*4882a593Smuzhiyunrm -f $TAG_FILE 15*4882a593Smuzhiyun 16*4882a593SmuzhiyunSCRIPT=/usr/bin/bootanim 17*4882a593SmuzhiyunHOOK_DIR=/etc/bootanim.d/ 18*4882a593SmuzhiyunPID_FILE=/tmp/bootanim.pid 19*4882a593SmuzhiyunLOG_FILE=/tmp/bootanim.log 20*4882a593SmuzhiyunTIMEOUT=${2:-${BOOTANIM_DEFAULT_TIMEOUT:-5}} 21*4882a593Smuzhiyun 22*4882a593Smuzhiyunpid_sid() 23*4882a593Smuzhiyun{ 24*4882a593Smuzhiyun ps x -o pid,sid | grep -w $@ 25*4882a593Smuzhiyun} 26*4882a593Smuzhiyun 27*4882a593Smuzhiyunbootanim_start() 28*4882a593Smuzhiyun{ 29*4882a593Smuzhiyun [ -d $HOOK_DIR ] || return 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun echo "Starting bootanim: $$..." 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun # Freeze display server 34*4882a593Smuzhiyun touch /dev/null $XSERVER_FREEZE_DISPLAY $WESTON_FREEZE_DISPLAY 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun # Start bootanim hooks 37*4882a593Smuzhiyun for hook in $(find $HOOK_DIR -maxdepth 1 -name "*.sh"); do 38*4882a593Smuzhiyun echo "Starting hook: $hook..." 39*4882a593Smuzhiyun $hook 40*4882a593Smuzhiyun echo "Started hook: $hook..." 41*4882a593Smuzhiyun done 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun # Save bootanim's pid 44*4882a593Smuzhiyun echo $$ > $PID_FILE 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun # Exit when no animation started 47*4882a593Smuzhiyun if [ ! -e "$TAG_FILE" ]; then 48*4882a593Smuzhiyun bootanim_stop 2>&1 | tee -a $LOG_FILE 49*4882a593Smuzhiyun return 50*4882a593Smuzhiyun fi 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun # Timeout killer 53*4882a593Smuzhiyun start-stop-daemon -S -q -b -n bootanim-stop \ 54*4882a593Smuzhiyun -x /bin/sh -- -c "sleep $TIMEOUT; $SCRIPT stop" 55*4882a593Smuzhiyun} 56*4882a593Smuzhiyun 57*4882a593Smuzhiyunbootanim_stop() 58*4882a593Smuzhiyun{ 59*4882a593Smuzhiyun [ -f $PID_FILE ] || return 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun # Parse our sid (same as bootanim's pid) 62*4882a593Smuzhiyun SID=$(cat $PID_FILE; rm -rf $PID_FILE) 63*4882a593Smuzhiyun [ -n "$SID" ] || return 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun # Parse children pid 66*4882a593Smuzhiyun CPID=$(pid_sid $SID | xargs -n 2 | cut -d' ' -f1 | xargs) 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun echo "Stopping bootanim: ${CPID:-none} for $SID..." 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun # Pause children 71*4882a593Smuzhiyun [ -z "$CPID" ] || kill -STOP $CPID &>/dev/null 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun # Unfreeze display server 74*4882a593Smuzhiyun rm -f $XSERVER_FREEZE_DISPLAY $WESTON_FREEZE_DISPLAY 75*4882a593Smuzhiyun sleep .1 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun # Kill children 78*4882a593Smuzhiyun [ -z "$CPID" ] || kill -9 $CPID &>/dev/null 79*4882a593Smuzhiyun} 80*4882a593Smuzhiyun 81*4882a593Smuzhiyuncase "$1" in 82*4882a593Smuzhiyun start|"") 83*4882a593Smuzhiyun # Make sure that we own this session (pid equals sid) 84*4882a593Smuzhiyun if ! pid_sid -q "$$$" || [ $(realpath "$0") != $SCRIPT ] ; then 85*4882a593Smuzhiyun setsid $SCRIPT $@ 86*4882a593Smuzhiyun else 87*4882a593Smuzhiyun # Run it 88*4882a593Smuzhiyun $SCRIPT stop 89*4882a593Smuzhiyun bootanim_start 2>&1 | tee -a $LOG_FILE& 90*4882a593Smuzhiyun fi 91*4882a593Smuzhiyun ;; 92*4882a593Smuzhiyun stop) 93*4882a593Smuzhiyun bootanim_stop 2>&1 | tee -a $LOG_FILE 94*4882a593Smuzhiyun ;; 95*4882a593Smuzhiyun *) 96*4882a593Smuzhiyun echo "Usage: $0 [start|stop]" 97*4882a593Smuzhiyun ;; 98*4882a593Smuzhiyunesac 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun: 101