1#!/bin/sh
2# $1: Package name/allpkg, $2: action.
3
4
5APPS_PATH=/opt
6APPS_RUN_DIR=$APPS_PATH/etc/init.d
7APPS_MOUNTED_PATH=`nvram get apps_mounted_path`
8APP_FS_TYPE=`mount | grep $APPS_MOUNTED_PATH | sed -e "s,.*on.* type \([^ ]*\) (.*$,\1,"`
9memsize=`grep MemTotal /proc/meminfo | sed -e "s,MemTotal:[^0-9]*\([0-9][0-9]*\) .*,\1,"`
10
11
12if [ -z "$1" ] || [ -z "$2" ]; then
13	echo "Usage: app_init_run.sh <Package name|allpkg> <action>"
14	exit 1
15fi
16
17if [ ! -d "$APPS_RUN_DIR" ]; then
18	echo "The APP's init dir was not existed!"
19	exit 1
20fi
21
22if [ "$2" == "stop" ]; then
23	while true ; do
24		PIDS1=`ps|grep "sh.*/\(\.asusrouter\|app_base_link.sh\|app_update.sh\|app_init_run.sh.*start\)"|grep -v grep|awk '{print $1}'`
25		PIDS2=`ps|grep "sh.*/opt/etc/init\.d/S.*start"|grep -v grep|awk '{print $1}'`
26		PIDS3=`ps|grep "ch\(mod\|own\).*/tmp/mnt"|grep -v grep|awk '{print $1}'`
27		PIDS4=`ps|grep "wget.*asus"|grep -v grep|awk '{print $1}'`
28		PIDS5=`ps|grep "[^[]watch_app"|grep -v grep|awk '{print $1}'`
29		PIDS=`echo $PIDS1 $PIDS2 $PIDS3 $PIDS4 $PIDS5 | tr  '\n' ' '`
30
31		if [ -z "`echo $PIDS | tr -d ' \n\t\f\r'`" ] ; then
32			break
33		fi
34
35		kill -TERM $PIDS
36		sleep 1
37		kill -KILL $PIDS
38	done
39fi
40
41for f in $APPS_RUN_DIR/S*; do
42	s="/opt/"`basename $f`.1
43	[ -e "$s" ] && rm -f $s
44	if [ "$APP_FS_TYPE" == "fuseblk" ] ; then
45		sed -e "s,\(chmod.*\),echo skip \1," -e "s,\(chown.*\),echo skip \1," -e "s,/opt/etc/init\.d/\(S50[^. ]*\),/opt/\1.1," $f > $s
46	else
47		cp -f $f $s
48	fi
49done
50
51for f in $APPS_RUN_DIR/S*; do
52	s=$f
53	tmp_apps_name=`get_apps_name $f`
54	if [ "$1" != "allpkg" ] && [ "$1" != "$tmp_apps_name" ]; then
55		continue
56	fi
57
58	if [ "$2" == "start" ] || [ "$2" == "firewall-start" ]; then
59		app_enable=`app_get_field.sh $tmp_apps_name "Enabled" 1`
60		if [ "$app_enable" != "yes" ]; then
61			if [ "$1" != "allpkg" ] && [ "$1" == "$tmp_apps_name" ]; then
62				echo "No permission to start with the app: $1!"
63				exit 1
64			fi
65
66			continue
67		fi
68	fi
69
70	# If all process of a package are not exist, skip the stop procedure.
71	if [ "$2" == "stop" ]; then
72		proc_list=""
73		if [ "$tmp_apps_name" == "downloadmaster" ] ; then
74			proc_list="\(dm2_amuled\|dm2_snarfmaster\|dm2_transmission-daemon\|dm2_nzbget\|dm2_amuled\)"
75		elif [ "$tmp_apps_name" == "mediaserver" ] ; then
76			proc_list="\(watch_app\|minidlna\)"
77		elif [ "$tmp_apps_name" == "asuslighttpd" ] ; then
78			proc_list="\(asus_lighttpd\)"
79		fi
80
81		if [ "$proc_list" != "" ] ; then
82			if [ "`ps|grep -c $proc_list`" == "0" ] ; then
83				echo "Skip stop procedure of $tmp_apps_name package."
84				continue;
85			fi
86		fi
87	fi
88
89	s="/opt/"`basename $f`.1
90	[ ! -e "$s" ] && s=$f
91
92	nice_cmd=
93	if [ $memsize -lt 204800 -a "$tmp_apps_name" == "downloadmaster" ]; then
94		nice_cmd="nice -n 19"
95	fi
96
97	echo "$nice_cmd sh $s $2" | logger -c
98	$nice_cmd sh $s $2
99
100	if [ "$tmp_apps_name" == "mediaserver" ] && [ "$2" == "stop" ] ; then
101		sleep 1
102		ms_pid=`pidof minidlna`
103		i=0
104		while [ ! -z "$ms_pid" ] && [ $i -lt 10 ] ; do
105			i=$((i+1))
106			echo "$i: $nice_cmd sh $s $2" | logger -c
107			$nice_cmd sh $s $2
108			sleep 1
109			ms_pid=`pidof minidlna`
110		done
111		ms_pid=`pidof minidlna`
112		if [ ! -z "$ms_pid" ] ; then
113			killall -9 minidlna
114		fi
115	fi
116
117	if [ "$1" != "allpkg" ] && [ "$1" == "$tmp_apps_name" ]; then
118		break
119	fi
120done
121
122if [ $memsize -lt 204800 ]; then
123	dm2_trans_array=`ps|grep dm2_trans|grep -v grep|awk '{print $1}'`
124	for tran in $dm2_trans_array; do
125		ionice -c3 -p $tran
126	done
127fi
128
129