1#!/bin/sh
2# $1: package name.
3
4
5apps_ipkg_old=`nvram get apps_ipkg_old`
6f=`nvram get apps_install_folder`
7case $f in
8	"asusware.arm")
9		pkg_type=`echo $f|sed -e "s,asusware\.,,"`
10		;;
11	"asusware.big")
12		pkg_type="mipsbig"
13		;;
14	"asusware.mipsbig")
15		pkg_type=`echo $f|sed -e "s,asusware\.,,"`
16		;;
17	"asusware")
18		pkg_type="mipsel"
19		;;
20	*)
21		echo "Unknown apps_install_folder: $f"
22		exit 1
23		;;
24esac
25APPS_PATH=/opt
26CONF_FILE=$APPS_PATH/etc/ipkg.conf
27ASUS_SERVER=`nvram get apps_ipkg_server`
28wget_timeout=`nvram get apps_wget_timeout`
29#wget_options="-nv -t 2 -T $wget_timeout --dns-timeout=120"
30wget_options="-q -t 2 -T $wget_timeout"
31download_file=
32
33
34# $1: package name.
35# return value. 1: have package. 0: no package.
36_check_package(){
37	package_ready=`ipkg list_installed | grep "$1 "`
38
39	if [ -z "$package_ready" ]; then
40		return 0
41	else
42		return 1
43	fi
44}
45
46# $1: package name, $2: ipkg server name, $3: force(1/0).
47_get_pkg_file_name_old(){
48	pkg_file_full=`app_get_field.sh $1 Filename 2`
49	old_pkg_file=`echo "$pkg_file_full" |awk '{FS=".ipk";print $1}'`
50	pkg_file=`echo "$old_pkg_file" |sed 's/\./-/g'`
51
52	if [ "$3" == "1" ] || [ "$2" != "$ASUS_SERVER" ]; then
53		echo "$pkg_file_full"
54	else
55		echo "$pkg_file.tgz"
56	fi
57}
58
59# $1: package name.
60_get_pkg_file_name(){
61	pkg_file_full=`app_get_field.sh $1 Filename 2`
62
63	echo "$pkg_file_full"
64}
65
66# $1: ipkg log file, $2: the depends of package.
67_check_log_message(){
68	got_log=`cat $1 |sed -n '$p'`
69	action=`echo $got_log |awk '{print $1}'`
70
71	if [ "$action" == "Installing" ] || [ "$action" == "Configuring" ]; then
72		target=`echo $got_log |awk '{print $2}'`
73	elif [ "$action" == "Downloading" ]; then
74		target=`echo $got_log |awk '{print $2}' |awk '{FS="/"; print $NF}' |awk '{FS="_"; print $1}'`
75	elif [ "$action" == "Successfully" ]; then
76		target="terminated"
77	elif [ "$action" == "update-alternatives:" ]; then
78		target=""
79	elif [ -z "$action" ]; then
80		target="Space"
81	else
82		target="error"
83	fi
84
85	got_target=0
86	if [ "$action" == "Installing" ] || [ "$action" == "Configuring" ] || [ "$action" == "Downloading" ]; then
87		check_array=`echo $2 |sed 's/,/ /g'`
88		for check in $check_array; do
89			if [ "$target" == "$check" ]; then
90				got_target=1
91				break
92			fi
93		done
94	fi
95
96	if [ "$got_target" -eq "1" ]; then
97		nvram set apps_depend_action="$action"
98		nvram set apps_depend_action_target="$target"
99	fi
100
101	echo "$target"
102
103	return 0
104}
105
106# $1: delay number.
107_loop_delay(){
108	i=0
109	while [ $i -lt $1 ]; do
110		i=$((i+1))
111		echo "."
112	done
113}
114
115# $1: package name, $2: ipkg log file.
116_log_ipkg_install(){
117	package_deps=`app_get_field.sh $1 Depends 2`
118	package_deps=`echo $package_deps |sed 's/,/ /g'`
119	package_deps_do=
120
121	for dep in $package_deps; do
122		_check_package $dep
123		if [ "$?" == "1" ]; then
124			continue
125		fi
126
127		if [ -z "$package_deps_do" ]; then
128			package_deps_do=$dep
129			nvram set apps_depend_action="$dep"
130			nvram set apps_depend_action_target="Installing"
131		else
132			package_deps_do=$package_deps_do,$dep
133		fi
134	done
135	nvram set apps_depend_do="$package_deps_do"
136
137	ret=`_check_log_message "$2" "$package_deps_do"`
138	while [ "$ret" != "terminated" ] && [ "$ret" != "error" ]; do
139		_loop_delay 10
140		ret=`_check_log_message "$2" "$package_deps_do"`
141	done
142
143	echo "$ret"
144
145	return 0
146}
147
148# $1: package name, $2: installed path.
149_download_package(){
150	pkg_server=
151	pkg_file=
152
153	# Geting the app's file name...
154	server_names=`grep -n '^src.*' $CONF_FILE |sort -r |awk '{print $3}'`
155
156	if [ "$pkg_type" != "arm" ] && [ -n "$apps_ipkg_old" ] && [ "$apps_ipkg_old" == "1" ]; then
157			IS_SUPPORT_SSL=`nvram get rc_support|grep -i HTTPS`
158			if [ -n "$IS_SUPPORT_SSL" ]; then
159				wget_options="$wget_options --no-check-certificate"
160			fi
161	fi
162
163	for s in $server_names; do
164		if [ "$pkg_type" != "arm" ] && [ -n "$apps_ipkg_old" ] && [ "$apps_ipkg_old" == "1" ]; then
165			pkg_file=`_get_pkg_file_name_old $1 $s 0`
166		else
167			pkg_file=`_get_pkg_file_name $1`
168		fi
169		wget --spider $wget_options $s/$pkg_file
170		if [ "$?" == "0" ]; then
171			pkg_server=$s
172			break
173		fi
174	done
175	if [ -z "$pkg_server" ]; then
176		nvram set apps_state_error=6
177		return 1
178	fi
179
180	# Downloading the app's file name...
181	if [ "$pkg_type" != "arm" ] && [ -n "$apps_ipkg_old" ] && [ "$apps_ipkg_old" == "1" ] && [ "$pkg_server" == "$ASUS_SERVER" ]; then
182		download_file=`_get_pkg_file_name_old $1 $pkg_server 1`
183	else
184		download_file=$pkg_file
185	fi
186
187	target=$2/$download_file
188	nvram set apps_download_file=$download_file
189	nvram set apps_download_percent=0
190	wget -c $wget_options $pkg_server/$pkg_file -O $target &
191	wget_pid=`pidof wget`
192	if [ -z "$wget_pid" ] || [ $wget_pid -lt 1 ]; then
193		rm -rf $target
194		sync
195
196		nvram set apps_state_error=6
197		return 1
198	fi
199	i=0
200	while [ $i -lt $wget_timeout ] && [ ! -f "$target" ]; do
201		i=$((i+1))
202		sleep 1
203	done
204
205	wget_pid=`pidof wget`
206	size=`app_get_field.sh $1 Size 2`
207	target_size=`ls -l $target |awk '{printf $5}'`
208	percent=$((target_size*100/size))
209	nvram set apps_download_percent=$percent
210	while [ -n "$wget_pid" ] && [ -n "$target_size" ] && [ $target_size -lt $size ]; do
211		sleep 1
212
213		wget_pid=`pidof wget`
214		target_size=`ls -l $target |awk '{printf $5}'`
215		percent=$((target_size*100/size))
216		nvram set apps_download_percent=$percent
217	done
218
219	target_size=`ls -l $target |awk '{printf $5}'`
220	percent=$((target_size*100/size))
221	nvram set apps_download_percent=$percent
222	if [ -z "$percent" ] || [ $percent -ne 100 ]; then
223		rm -rf $target
224		sync
225
226		nvram set apps_state_error=6
227		return 1
228	fi
229
230	return 0
231}
232
233
234nvram set apps_state_upgrade=0 # INITIALIZING
235nvram set apps_state_error=0
236
237if [ -z "$1" ]; then
238	echo "Usage: app_upgrade.sh <Package name>"
239	nvram set apps_state_error=1
240	exit 1
241fi
242
243version=`app_get_field.sh $1 Version 1`
244new_version=`app_get_field.sh $1 Version 2`
245
246if [ "$version" == "$new_version" ]; then
247	echo "The package: $1 is the newest one."
248#	nvram set apps_state_upgrade=3 # FINISHED
249#	exit 0
250fi
251
252APPS_DEV=`nvram get apps_dev`
253APPS_MOUNTED_PATH=`nvram get apps_mounted_path`
254APPS_INSTALL_FOLDER=`nvram get apps_install_folder`
255if [ -z "$APPS_DEV" ] || [ -z "$APPS_MOUNTED_PATH" ]; then
256	nvram set apps_state_error=2
257	exit 1
258fi
259APPS_INSTALL_PATH=$APPS_MOUNTED_PATH/$APPS_INSTALL_FOLDER
260
261need_asuslighttpd=0
262need_asusffmpeg=0
263need_smartsync=0
264if [ "$1" == "downloadmaster" ]; then
265	DM_version1=`app_get_field.sh downloadmaster Version 2 |awk '{FS=".";print $1}'`
266	DM_version4=`app_get_field.sh downloadmaster Version 2 |awk '{FS=".";print $4}'`
267
268	if [ "$DM_version1" -gt "3" ]; then
269		need_asuslighttpd=1
270	elif [ "$DM_version1" -eq "3" ] && [ "$DM_version4" -gt "59" ]; then
271		need_asuslighttpd=1
272	fi
273elif [ "$1" == "mediaserver" ]; then
274	MS_version1=`app_get_field.sh mediaserver Version 2 |awk '{FS=".";print $1}'`
275	MS_version4=`app_get_field.sh mediaserver Version 2 |awk '{FS=".";print $4}'`
276
277	if [ "$MS_version1" -gt "1" ]; then
278		need_asuslighttpd=1
279	elif [ "$MS_version1" -eq "1" ] && [ "$MS_version4" -gt "15" ]; then
280		need_asuslighttpd=1
281	fi
282
283	if [ "$MS_version1" -gt "1" ]; then
284		need_asusffmpeg=1
285	elif [ "$MS_version1" -eq "1" ] && [ "$MS_version4" -ge "30" ]; then
286		need_asusffmpeg=1
287	fi
288elif [ "$1" == "aicloud" ]; then
289	AC_version1=`app_get_field.sh aicloud Version 2 |awk '{FS=".";print $1}'`
290	AC_version4=`app_get_field.sh aicloud Version 2 |awk '{FS=".";print $4}'`
291
292	if [ "$AC_version1" -gt "1" ]; then
293		need_smartsync=1
294	elif [ "$AC_version1" -eq "1" ] && [ "$AC_version4" -gt "4" ]; then
295		need_smartsync=1
296	fi
297fi
298
299
300nvram set apps_state_upgrade=1 # DOWNLOADING
301target_file=
302if [ "$need_asuslighttpd" == "1" ]; then
303	echo "Downloading the dependent package: asuslighttpd..."
304	_download_package asuslighttpd $APPS_INSTALL_PATH/tmp
305	if [ "$?" != "0" ]; then
306		# apps_state_error was already set by _download_package().
307		exit 1
308	fi
309	if [ -z "$target_file" ]; then
310		target_file=$APPS_INSTALL_PATH/tmp/$download_file
311	else
312		target_file=$target_file" $APPS_INSTALL_PATH/tmp/$download_file"
313	fi
314fi
315if [ "$need_asusffmpeg" == "1" ]; then
316	echo "Downloading the dependent package: asusffmpeg..."
317	_download_package asusffmpeg $APPS_INSTALL_PATH/tmp
318	if [ "$?" != "0" ]; then
319		# apps_state_error was already set by _download_package().
320		exit 1
321	fi
322	if [ -z "$target_file" ]; then
323		target_file=$APPS_INSTALL_PATH/tmp/$download_file
324	else
325		target_file=$target_file" $APPS_INSTALL_PATH/tmp/$download_file"
326	fi
327fi
328if [ "$need_smartsync" == "1" ]; then
329	if [ -n "$apps_ipkg_old" ] && [ "$apps_ipkg_old" == "1" ]; then
330		deps=`app_get_field.sh smartsync Depends 2 |sed 's/,/ /g'`
331
332		for dep in $deps; do
333			echo "Downloading the dependent package of smartsync: $dep..."
334			_download_package $dep $APPS_INSTALL_PATH/tmp
335			if [ "$?" != "0" ]; then
336				# apps_state_error was already set by _download_package().
337				exit 1
338			fi
339			if [ -z "$target_file" ]; then
340				target_file=$APPS_INSTALL_PATH/tmp/$download_file
341			else
342				target_file=$target_file" $APPS_INSTALL_PATH/tmp/$download_file"
343			fi
344		done
345	fi
346
347	echo "Downloading the dependent package: smartsync..."
348	_download_package smartsync $APPS_INSTALL_PATH/tmp
349	if [ "$?" != "0" ]; then
350		# apps_state_error was already set by _download_package().
351		exit 1
352	fi
353	if [ -z "$target_file" ]; then
354		target_file=$APPS_INSTALL_PATH/tmp/$download_file
355	else
356		target_file=$target_file" $APPS_INSTALL_PATH/tmp/$download_file"
357	fi
358fi
359
360_download_package $1 $APPS_INSTALL_PATH/tmp
361if [ "$?" != "0" ]; then
362	# apps_state_error was already set by _download_package().
363	exit 1
364fi
365if [ -z "$target_file" ]; then
366	target_file=$APPS_INSTALL_PATH/tmp/$download_file
367else
368	target_file=$target_file" $APPS_INSTALL_PATH/tmp/$download_file"
369fi
370
371
372nvram set apps_state_upgrade=2 # REMOVING
373_check_package $1
374if [ "$?" != "0" ]; then
375	app_remove.sh $1
376	if [ "$?" != "0" ]; then
377		# apps_state_error was already set by app_remove.sh.
378		exit 1
379	fi
380fi
381
382
383nvram set apps_state_upgrade=3 # INSTALLING
384for file in $target_file; do
385	echo "Installing the package: $file..."
386	install_log=$APPS_INSTALL_PATH/ipkg_log.txt
387	ipkg install $file 1>$install_log &
388	result=`_log_ipkg_install $1 $install_log`
389	if [ "$result" == "error" ]; then
390		echo "Fail to install the package: $file!"
391		nvram set apps_state_error=7
392		exit 1
393	else
394		rm -rf $file
395		rm -f $install_log
396	fi
397done
398
399APPS_MOUNTED_TYPE=`mount |grep "/dev/$APPS_DEV on " |awk '{print $5}'`
400if [ "$APPS_MOUNTED_TYPE" == "vfat" ] || [ "$APPS_MOUNTED_TYPE" == "tfat" ]; then
401	app_move_to_pool.sh $APPS_DEV
402	if [ "$?" != "0" ]; then
403		# apps_state_error was already set by app_move_to_pool.sh.
404		exit 1
405	fi
406fi
407
408app_base_link.sh
409if [ "$?" != "0" ]; then
410	# apps_state_error was already set by app_base_link.sh.
411	exit 1
412fi
413
414if [ "$need_asuslighttpd" == "1" ]; then
415	echo "Enabling the dependent package: asuslighttpd..."
416	app_set_enabled.sh asuslighttpd "yes"
417fi
418if [ "$need_asusffmpeg" == "1" ]; then
419	echo "Enabling the dependent package: asusffmpeg..."
420	app_set_enabled.sh asusffmpeg "yes"
421fi
422if [ "$need_smartsync" == "1" ]; then
423	if [ -n "$apps_ipkg_old" ] && [ "$apps_ipkg_old" == "1" ]; then
424		deps=`app_get_field.sh smartsync Depends 2 |sed 's/,/ /g'`
425
426		for dep in $deps; do
427			echo "Enabling the dependent package of smartsync: $dep..."
428			app_set_enabled.sh $dep "yes"
429		done
430	fi
431
432	echo "Enabling the dependent package: smartsync..."
433	app_set_enabled.sh smartsync "yes"
434fi
435
436echo "Enabling the package: $1..."
437app_set_enabled.sh $1 "yes"
438
439nvram set apps_download_file=
440nvram set apps_download_percent=
441
442nvram set apps_depend_do=
443nvram set apps_depend_action=
444nvram set apps_depend_action_target=
445
446
447nvram set apps_state_upgrade=4 # FINISHED
448