xref: /OK3568_Linux_fs/debian/overlay/usr/bin/bootanim (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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