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_by_sid() 23*4882a593Smuzhiyun{ 24*4882a593Smuzhiyun sed "s/(.*)//" /proc/*/stat | cut -d' ' -f1,6 | grep -w "$1$" | 25*4882a593Smuzhiyun cut -d' ' -f1 || true 26*4882a593Smuzhiyun} 27*4882a593Smuzhiyun 28*4882a593Smuzhiyunsid_by_pid() 29*4882a593Smuzhiyun{ 30*4882a593Smuzhiyun sed "s/(.*)//" /proc/$1/stat | cut -d' ' -f6 31*4882a593Smuzhiyun} 32*4882a593Smuzhiyun 33*4882a593Smuzhiyunbootanim_init() 34*4882a593Smuzhiyun{ 35*4882a593Smuzhiyun # Save bootanim's pid 36*4882a593Smuzhiyun echo $$ > $PID_FILE 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun # Freeze display service 39*4882a593Smuzhiyun touch /dev/null $XSERVER_FREEZE_DISPLAY $WESTON_FREEZE_DISPLAY 40*4882a593Smuzhiyun} 41*4882a593Smuzhiyun 42*4882a593Smuzhiyunbootanim_deinit() 43*4882a593Smuzhiyun{ 44*4882a593Smuzhiyun # Unfreeze display service 45*4882a593Smuzhiyun rm -rf $XSERVER_FREEZE_DISPLAY $WESTON_FREEZE_DISPLAY 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun rm -rf "$PID_FILE" 48*4882a593Smuzhiyun} 49*4882a593Smuzhiyun 50*4882a593Smuzhiyunbootanim_start() 51*4882a593Smuzhiyun{ 52*4882a593Smuzhiyun [ -d $HOOK_DIR ] || return 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun echo "Starting bootanim..." 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun bootanim_init 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun # Start bootanim hooks 59*4882a593Smuzhiyun for hook in $(find $HOOK_DIR -maxdepth 1 -name "*.sh"); do 60*4882a593Smuzhiyun echo "Starting hook: $hook..." 61*4882a593Smuzhiyun $hook 62*4882a593Smuzhiyun echo "Started hook: $hook..." 63*4882a593Smuzhiyun done 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun if [ ! -e "$TAG_FILE" ]; then 66*4882a593Smuzhiyun echo "No animation started..." 67*4882a593Smuzhiyun bootanim_deinit 68*4882a593Smuzhiyun return 69*4882a593Smuzhiyun fi 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun # Timeout killer 72*4882a593Smuzhiyun sleep $TIMEOUT 73*4882a593Smuzhiyun bootanim_stop 74*4882a593Smuzhiyun} 75*4882a593Smuzhiyun 76*4882a593Smuzhiyunchildren_pid() 77*4882a593Smuzhiyun{ 78*4882a593Smuzhiyun [ -f $PID_FILE ] || return 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun SID=$(cat $PID_FILE) 81*4882a593Smuzhiyun [ "$SID" ] || return 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun pid_by_sid $SID | grep -wv $SID || true 84*4882a593Smuzhiyun} 85*4882a593Smuzhiyun 86*4882a593Smuzhiyunbootanim_stop() 87*4882a593Smuzhiyun{ 88*4882a593Smuzhiyun echo "Stopping bootanim..." 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun # Parse children pid 91*4882a593Smuzhiyun CPID=$(children_pid) 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun if [ -z "$CPID" ]; then 94*4882a593Smuzhiyun bootanim_deinit 95*4882a593Smuzhiyun return 96*4882a593Smuzhiyun fi 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun { 99*4882a593Smuzhiyun # Pause animation -> unfreeze display -> kill animation 100*4882a593Smuzhiyun kill -STOP $CPID &>/dev/null || true 101*4882a593Smuzhiyun bootanim_deinit 102*4882a593Smuzhiyun sleep .1 103*4882a593Smuzhiyun kill -9 $CPID &>/dev/null || true 104*4882a593Smuzhiyun }& 105*4882a593Smuzhiyun wait 106*4882a593Smuzhiyun} 107*4882a593Smuzhiyun 108*4882a593Smuzhiyuncase "$1" in 109*4882a593Smuzhiyun start|"") 110*4882a593Smuzhiyun # Make sure that we own this session (pid equals sid) 111*4882a593Smuzhiyun if [ $(sid_by_pid $$) != $$ ] || 112*4882a593Smuzhiyun [ $(realpath "$0") != $SCRIPT ] ; then 113*4882a593Smuzhiyun setsid $SCRIPT $@ 114*4882a593Smuzhiyun else 115*4882a593Smuzhiyun { 116*4882a593Smuzhiyun bootanim_stop || true 117*4882a593Smuzhiyun bootanim_start 118*4882a593Smuzhiyun } 2>&1 | tee -a $LOG_FILE& 119*4882a593Smuzhiyun fi 120*4882a593Smuzhiyun ;; 121*4882a593Smuzhiyun stop) 122*4882a593Smuzhiyun bootanim_stop 2>&1 | tee -a $LOG_FILE 123*4882a593Smuzhiyun ;; 124*4882a593Smuzhiyun *) 125*4882a593Smuzhiyun echo "Usage: $0 [start|stop]" 126*4882a593Smuzhiyun ;; 127*4882a593Smuzhiyunesac 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun: 130