1#!/bin/sh
2# ASUS app install script
3# $1: package name, $2: device name.
4
5
6apps_ipkg_old=`nvram get apps_ipkg_old`
7APPS_PATH=/opt
8CONF_FILE=$APPS_PATH/etc/ipkg.conf
9ASUS_SERVER=`nvram get apps_ipkg_server`
10wget_timeout=`nvram get apps_wget_timeout`
11#wget_options="-nv -t 2 -T $wget_timeout --dns-timeout=120"
12wget_options="-q -t 2 -T $wget_timeout"
13download_file=
14apps_from_internet=`nvram get rc_support |grep appnet`
15apps_local_space=`nvram get apps_local_space`
16f=`nvram get apps_install_folder`
17case $f in
18	"asusware.arm")
19		pkg_type=`echo $f|sed -e "s,asusware\.,,"`
20		third_lib="mbwe-bluering"
21		;;
22	"asusware.big")
23		pkg_type="mipsbig"
24		third_lib=
25		;;
26	"asusware.mipsbig")
27		pkg_type=`echo $f|sed -e "s,asusware\.,,"`
28		third_lib=
29		;;
30	"asusware")
31		pkg_type="mipsel"
32		third_lib="oleg"
33		;;
34	*)
35		echo "Unknown apps_install_folder: $f"
36		exit 1
37		;;
38esac
39
40
41# $1: package name.
42# return value. 1: have package. 0: no package.
43_check_package(){
44	package_ready=`ipkg list_installed | grep "$1 "`
45	package_ready2=`app_get_field.sh $1 Enabled 1`
46
47	if [ -z "$package_ready" ] && [ -z "$package_ready2" ]; then
48		return 0
49	else
50		return 1
51	fi
52}
53
54# $1: package name, $2: ipkg server name, $3: force(1/0).
55_get_pkg_file_name_old(){
56	pkg_file_full=`app_get_field.sh $1 Filename 2`
57	old_pkg_file=`echo "$pkg_file_full" |awk '{FS=".ipk";print $1}'`
58	pkg_file=`echo "$old_pkg_file" |sed 's/\./-/g'`
59
60	if [ "$3" == "1" ] || [ "$2" != "$ASUS_SERVER" ]; then
61		echo "$pkg_file_full"
62	else
63		echo "$pkg_file.tgz"
64	fi
65}
66
67# $1: package name.
68_get_pkg_file_name(){
69	pkg_file_full=`app_get_field.sh $1 Filename 2`
70
71	echo "$pkg_file_full"
72}
73
74# $1: ipkg log file, $2: the depends of package.
75_check_log_message(){
76	got_log=`cat $1 |sed -n '$p'`
77	action=`echo $got_log |awk '{print $1}'`
78
79	if [ "$action" == "Installing" ] || [ "$action" == "Configuring" ]; then
80		target=`echo $got_log |awk '{print $2}'`
81	elif [ "$action" == "Downloading" ]; then
82		target=`echo $got_log |awk '{print $2}' |awk '{FS="/"; print $NF}' |awk '{FS="_"; print $1}'`
83	elif [ "$action" == "Successfully" ]; then
84		target="terminated"
85	elif [ "$action" == "update-alternatives:" ]; then
86		target=""
87	elif [ -z "$action" ]; then
88		target="Space"
89	else
90		target="error"
91	fi
92
93	got_target=0
94	if [ "$action" == "Installing" ] || [ "$action" == "Configuring" ] || [ "$action" == "Downloading" ]; then
95		check_array=`echo $2 |sed 's/,/ /g'`
96		for check in $check_array; do
97			if [ "$target" == "$check" ]; then
98				got_target=1
99				break
100			fi
101		done
102	fi
103
104	if [ "$got_target" -eq "1" ]; then
105		nvram set apps_depend_action="$action"
106		nvram set apps_depend_action_target="$target"
107	fi
108
109	echo "$target"
110
111	return 0
112}
113
114# $1: delay number.
115_loop_delay(){
116	i=0
117	while [ $i -lt $1 ]; do
118		i=$((i+1))
119		echo "."
120	done
121}
122
123# $1: package name, $2: ipkg log file.
124_log_ipkg_install(){
125	package_deps=`app_get_field.sh $1 Depends 2`
126	package_deps=`echo $package_deps |sed 's/,/ /g'`
127	package_deps_do=
128
129	for dep in $package_deps; do
130		_check_package $dep
131		if [ "$?" == "1" ]; then
132			continue
133		fi
134
135		if [ -z "$package_deps_do" ]; then
136			package_deps_do=$dep
137			nvram set apps_depend_action="$dep"
138			nvram set apps_depend_action_target="Installing"
139		else
140			package_deps_do=$package_deps_do,$dep
141		fi
142	done
143	nvram set apps_depend_do="$package_deps_do"
144
145	ret=`_check_log_message "$2" "$package_deps_do"`
146	while [ "$ret" != "terminated" ] && [ "$ret" != "error" ]; do
147		_loop_delay 10
148		ret=`_check_log_message "$2" "$package_deps_do"`
149	done
150
151	echo "$ret"
152
153	return 0
154}
155
156# $1: package name, $2: mounted path.
157_download_package(){
158	if [ "$1" == "uclibc-opt" ] || [ "$1" == "ipkg-opt" ]; then
159		return 0
160	fi
161
162	pkg_server=
163	pkg_file=
164	installed_ipk_path=
165	need_download=1
166
167	if [ "$1" == "downloadmaster" ] && [ -z "$apps_from_internet" ]; then
168		installed_ipk_path=`ls $apps_local_space/downloadmaster*`
169	elif [ "$1" == "asuslighttpd" ] && [ -z "$apps_from_internet" ]; then
170		installed_ipk_path=`ls $apps_local_space/asuslighttpd*`
171	fi
172
173	if [ -n "$installed_ipk_path" ]; then
174		list_ver4=`app_get_field.sh $1 Version 2 |awk '{FS=".";print $4}'`
175		file_name=`echo $installed_ipk_path |awk '{FS="/"; print $NF}'`
176		file_ver=`echo $file_name |awk '{FS="_"; print $2}'`
177		file_ver4=`echo $file_ver |awk '{FS="."; print $4}'`
178echo "file_ver4=$file_ver4, list_ver4=$list_ver4."
179
180		if [ -z "$list_ver4" ] || [ "$list_ver4" -le "$file_ver4" ]; then
181			need_download=0
182		fi
183	fi
184
185	if [ "$need_download" == "1" ]; then
186		# Geting the app's file name...
187		server_names=`grep -n '^src.*' $CONF_FILE |sort -r |awk '{print $3}'`
188
189		if [ "$pkg_type" != "arm" ] && [ -n "$apps_ipkg_old" ] && [ "$apps_ipkg_old" == "1" ]; then
190			IS_SUPPORT_SSL=`nvram get rc_support|grep -i HTTPS`
191			if [ -n "$IS_SUPPORT_SSL" ]; then
192				wget_options="$wget_options --no-check-certificate"
193			fi
194		fi
195
196		for s in $server_names; do
197			if [ "$pkg_type" != "arm" ] && [ -n "$apps_ipkg_old" ] && [ "$apps_ipkg_old" == "1" ]; then
198				pkg_file=`_get_pkg_file_name_old $1 $s 0`
199			else
200				pkg_file=`_get_pkg_file_name $1`
201			fi
202			wget --spider $wget_options $s/$pkg_file
203			if [ "$?" == "0" ]; then
204				pkg_server=$s
205				break
206			fi
207		done
208		if [ -z "$pkg_server" ]; then
209			nvram set apps_state_error=6
210			return 1
211		fi
212
213		# Downloading the app's file name...
214		if [ "$pkg_type" != "arm" ] && [ -n "$apps_ipkg_old" ] && [ "$apps_ipkg_old" == "1" ] && [ "$pkg_server" == "$ASUS_SERVER" ]; then
215			ipk_file_name=`_get_pkg_file_name_old $1 $pkg_server 1`
216		else
217			ipk_file_name=$pkg_file
218		fi
219
220		target=$2/$ipk_file_name
221		nvram set apps_download_file=$ipk_file_name
222		nvram set apps_download_percent=0
223		echo "wget -c $wget_options $pkg_server/$pkg_file -O $target"
224		wget -c $wget_options $pkg_server/$pkg_file -O $target &
225		wget_pid=`pidof wget`
226		if [ -z "$wget_pid" ] || [ $wget_pid -lt 1 ]; then
227			rm -rf $target
228			sync
229
230			nvram set apps_state_error=6
231			return 1
232		fi
233		i=0
234		while [ $i -lt $wget_timeout ] && [ ! -f "$target" ]; do
235			i=$((i+1))
236			sleep 1
237		done
238
239		wget_pid=`pidof wget`
240		size=`app_get_field.sh $1 Size 2`
241		target_size=`ls -l $target |awk '{printf $5}'`
242		percent=$((target_size*100/size))
243		nvram set apps_download_percent=$percent
244		while [ -n "$wget_pid" ] && [ -n "$target_size" ] && [ $target_size -lt $size ]; do
245			sleep 1
246
247			wget_pid=`pidof wget`
248			target_size=`ls -l $target |awk '{printf $5}'`
249			percent=$((target_size*100/size))
250			nvram set apps_download_percent=$percent
251		done
252
253		target_size=`ls -l $target |awk '{printf $5}'`
254		percent=$((target_size*100/size))
255		nvram set apps_download_percent=$percent
256		if [ -z "$percent" ] || [ $percent -ne 100 ]; then
257			rm -rf $target
258			sync
259
260			nvram set apps_state_error=6
261			return 1
262		fi
263
264		installed_ipk_path=$2"/"$ipk_file_name
265	fi
266
267	download_file=$installed_ipk_path
268
269	return 0
270}
271
272
273nvram set apps_state_install=0 # INITIALIZING
274nvram set apps_state_error=0
275
276autorun_file=.asusrouter
277nonautorun_file=$autorun_file.disabled
278APPS_INSTALL_FOLDER=`nvram get apps_install_folder`
279SWAP_ENABLE=`nvram get apps_swap_enable`
280SWAP_THRESHOLD=`nvram get apps_swap_threshold`
281SWAP_FILE=`nvram get apps_swap_file`
282SWAP_SIZE=`nvram get apps_swap_size`
283PATH=$APPS_PATH/usr/bin:$APPS_PATH/bin:$APPS_PATH/usr/sbin:$APPS_PATH/sbin:/usr/bin:/bin:/usr/sbin:/sbin
284unset LD_LIBRARY_PATH
285unset LD_PRELOAD
286
287if [ -z "$1" ]; then
288	echo "Usage: app_install.sh <Package name> [device name]"
289	nvram set apps_state_error=1
290	exit 1
291fi
292
293APPS_DEV=`nvram get apps_dev`
294APPS_MOUNTED_PATH=`nvram get apps_mounted_path`
295if [ -z "$APPS_DEV" ]; then
296	APPS_DEV=$2
297
298	if [ -z "$APPS_DEV" ] || [ ! -b "/dev/$APPS_DEV" ];then
299		echo "Usage: app_install.sh <Package name> [device name]"
300		nvram set apps_state_error=1
301		exit 1
302	fi
303
304	echo "Initializing the APP environment..."
305
306	APPS_MOUNTED_PATH=`mount |grep "/dev/$2 on " |awk '{print $3}'`
307	if [ -z "$APPS_MOUNTED_PATH" ]; then
308		echo "$2 had not mounted yet!"
309		nvram set apps_state_error=1
310		exit 1
311	fi
312
313	nvram set apps_dev=$APPS_DEV
314	nvram set apps_mounted_path=$APPS_MOUNTED_PATH
315fi
316APPS_INSTALL_PATH=$APPS_MOUNTED_PATH/$APPS_INSTALL_FOLDER
317
318
319nvram set apps_state_install=1 # CHECKING_PARTITION
320app_base_packages.sh $APPS_DEV
321if [ "$?" != "0" ]; then
322	# apps_state_error was already set by app_base_packages.sh.
323	exit 1
324fi
325
326_check_package $1
327if [ "$?" != "0" ]; then
328	echo "The \"$1\" is installed already!"
329	nvram set apps_state_install=5 # FINISHED
330	exit 0
331fi
332
333
334nvram set apps_state_install=2 # CHECKING_SWAP
335if [ "$SWAP_ENABLE" != "1" ]; then
336	echo "Disable to swap!"
337else
338	mem_size=`free |sed '1,3d' |awk '{print $4}'`
339	if [ "$SWAP_THRESHOLD" == "" ] || [ $mem_size -lt $SWAP_THRESHOLD ]; then
340		pool_size=`df /dev/$APPS_DEV |sed '1d' |awk '{print $4}'`
341		if [ $pool_size -gt $SWAP_SIZE ]; then
342			if [ -e "$APPS_INSTALL_PATH/$SWAP_FILE" ]; then
343				swapoff $APPS_INSTALL_PATH/$SWAP_FILE
344				rm -rf $APPS_INSTALL_PATH/$SWAP_FILE
345			fi
346
347			swap_count=`expr $SWAP_SIZE / 1000 - 1`
348			echo "dd if=/dev/zero of=$APPS_INSTALL_PATH/$SWAP_FILE bs=1M count=$swap_count"
349			dd if=/dev/zero of=$APPS_INSTALL_PATH/$SWAP_FILE bs=1M count=$swap_count
350			echo "mkswap $APPS_INSTALL_PATH/$SWAP_FILE"
351			mkswap $APPS_INSTALL_PATH/$SWAP_FILE
352			echo "swapon $APPS_INSTALL_PATH/$SWAP_FILE"
353			swapon $APPS_INSTALL_PATH/$SWAP_FILE
354		else
355			echo "No enough partition size!"
356			nvram set apps_state_error=3
357			exit 1
358		fi
359	fi
360fi
361
362
363nvram set apps_state_install=3 # DOWNLOADING
364link_internet=`nvram get link_internet`
365if [ "$link_internet" != "2" ]; then
366	cp -f $apps_local_space/optware.asus $APPS_INSTALL_PATH/lib/ipkg/lists/
367	if [ -n "$third_lib" ]; then
368		cp -f $apps_local_space/optware.$third_lib $APPS_INSTALL_PATH/lib/ipkg/lists/
369	fi
370elif [ "$1" == "downloadmaster" ] && [ -z "$apps_from_internet" ]; then
371	app_update.sh optware.asus
372	if [ -n "$third_lib" ]; then
373		cp -f $apps_local_space/optware.$third_lib $APPS_INSTALL_PATH/lib/ipkg/lists/
374	fi
375else
376	app_update.sh
377fi
378
379need_asuslighttpd=0
380need_asusffmpeg=0
381need_smartsync=0
382if [ "$1" == "downloadmaster" ]; then
383	DM_version1=`app_get_field.sh downloadmaster Version 2 |awk '{FS=".";print $1}'`
384	DM_version4=`app_get_field.sh downloadmaster Version 2 |awk '{FS=".";print $4}'`
385
386	if [ "$DM_version1" -gt "3" ]; then
387		need_asuslighttpd=1
388	elif [ "$DM_version1" -eq "3" ] && [ "$DM_version4" -gt "59" ]; then
389		need_asuslighttpd=1
390	fi
391elif [ "$1" == "mediaserver" ]; then
392	MS_version1=`app_get_field.sh mediaserver Version 2 |awk '{FS=".";print $1}'`
393	MS_version4=`app_get_field.sh mediaserver Version 2 |awk '{FS=".";print $4}'`
394
395	if [ "$MS_version1" -gt "1" ]; then
396		need_asuslighttpd=1
397	elif [ "$MS_version1" -eq "1" ] && [ "$MS_version4" -gt "15" ]; then
398		need_asuslighttpd=1
399	fi
400
401	if [ "$MS_version1" -gt "1" ]; then
402		need_asusffmpeg=1
403	elif [ "$MS_version1" -eq "1" ] && [ "$MS_version4" -ge "30" ]; then
404		need_asusffmpeg=1
405	fi
406elif [ "$1" == "aicloud" ]; then
407	AC_version1=`app_get_field.sh aicloud Version 2 |awk '{FS=".";print $1}'`
408	AC_version4=`app_get_field.sh aicloud Version 2 |awk '{FS=".";print $4}'`
409
410	if [ "$AC_version1" -gt "1" ]; then
411		need_smartsync=1
412	elif [ "$AC_version1" -eq "1" ] && [ "$AC_version4" -gt "4" ]; then
413		need_smartsync=1
414	fi
415fi
416
417target_file=
418if [ "$need_asuslighttpd" == "1" ]; then
419	echo "Downloading the dependent package: asuslighttpd..."
420	_download_package asuslighttpd $APPS_INSTALL_PATH/tmp
421	if [ "$?" != "0" ]; then
422		echo "Fail to download the package: asuslighttpd!"
423		# apps_state_error was already set by _download_package().
424		exit 1
425	fi
426	if [ -z "$target_file" ]; then
427		target_file=$download_file
428	else
429		target_file=$target_file" $download_file"
430	fi
431fi
432if [ "$need_asusffmpeg" == "1" ]; then
433	echo "Downloading the dependent package: asusffmpeg..."
434	_download_package asusffmpeg $APPS_INSTALL_PATH/tmp
435	if [ "$?" != "0" ]; then
436		echo "Fail to download the package: asusffmpeg!"
437		# apps_state_error was already set by _download_package().
438		exit 1
439	fi
440	if [ -z "$target_file" ]; then
441		target_file=$download_file
442	else
443		target_file=$target_file" $download_file"
444	fi
445fi
446if [ "$need_smartsync" == "1" ]; then
447	if [ -n "$apps_ipkg_old" ] && [ "$apps_ipkg_old" == "1" ]; then
448		deps=`app_get_field.sh smartsync Depends 2 |sed 's/,/ /g'`
449
450		for dep in $deps; do
451			echo "Downloading the dependent package of smartsync: $dep..."
452			_download_package $dep $APPS_INSTALL_PATH/tmp
453			if [ "$?" != "0" ]; then
454				echo "Fail to download the package: $dep!"
455				# apps_state_error was already set by _download_package().
456				exit 1
457			fi
458			if [ -z "$target_file" ]; then
459				target_file=$download_file
460			else
461				target_file=$target_file" $download_file"
462			fi
463		done
464	fi
465
466	echo "Downloading the dependent package: smartsync..."
467	_download_package smartsync $APPS_INSTALL_PATH/tmp
468	if [ "$?" != "0" ]; then
469		echo "Fail to download the package: smartsync!"
470		# apps_state_error was already set by _download_package().
471		exit 1
472	fi
473	if [ -z "$target_file" ]; then
474		target_file=$download_file
475	else
476		target_file=$target_file" $download_file"
477	fi
478fi
479
480echo "Downloading the package: $1..."
481_download_package $1 $APPS_INSTALL_PATH/tmp
482if [ "$?" != "0" ]; then
483	echo "Fail to download the package: $1!"
484	# apps_state_error was already set by _download_package().
485	exit 1
486fi
487if [ -z "$target_file" ]; then
488	target_file=$download_file
489else
490	target_file=$target_file" $download_file"
491fi
492echo "target_file=$target_file..."
493
494
495nvram set apps_state_install=4 # INSTALLING
496if [ "$1" == "downloadmaster" ] && [ -z "$apps_from_internet" ]; then
497	echo "downloadmaster_file=$download_file..."
498	app_base_library.sh $APPS_DEV $download_file
499	if [ "$?" != "0" ]; then
500		# apps_state_error was already set by app_base_library.sh.
501		return 1
502	fi
503elif [ "$1" == "asuslighttpd" ] && [ -z "$apps_from_internet" ]; then
504	app_base_library.sh $APPS_DEV
505	if [ "$?" != "0" ]; then
506		# apps_state_error was already set by app_base_library.sh.
507		return 1
508	fi
509fi
510
511for file in $target_file; do
512	echo "Installing the package: $file..."
513	install_log=$APPS_INSTALL_PATH/ipkg_log.txt
514	ipkg install $file 1>$install_log &
515	result=`_log_ipkg_install $1 $install_log`
516	if [ "$result" == "error" ]; then
517		echo "Fail to install the package: $file!"
518		nvram set apps_state_error=7
519		exit 1
520	else
521		rm -rf $file
522		rm -f $install_log
523	fi
524done
525
526APPS_MOUNTED_TYPE=`mount |grep "/dev/$APPS_DEV on " |awk '{print $5}'`
527if [ "$APPS_MOUNTED_TYPE" == "vfat" ] || [ "$APPS_MOUNTED_TYPE" == "tfat" ]; then
528	app_move_to_pool.sh $APPS_DEV
529	if [ "$?" != "0" ]; then
530		# apps_state_error was already set by app_move_to_pool.sh.
531		exit 1
532	fi
533fi
534
535app_base_link.sh
536if [ "$?" != "0" ]; then
537	# apps_state_error was already set by app_base_link.sh.
538	exit 1
539fi
540
541if [ "$need_asuslighttpd" == "1" ]; then
542	echo "Enabling the dependent package: asuslighttpd..."
543	app_set_enabled.sh asuslighttpd "yes"
544fi
545if [ "$need_asusffmpeg" == "1" ]; then
546	echo "Enabling the dependent package: asusffmpeg..."
547	app_set_enabled.sh asusffmpeg "yes"
548fi
549if [ "$need_smartsync" == "1" ]; then
550	if [ -n "$apps_ipkg_old" ] && [ "$apps_ipkg_old" == "1" ]; then
551		deps=`app_get_field.sh smartsync Depends 2 |sed 's/,/ /g'`
552
553		for dep in $deps; do
554			echo "Enabling the dependent package of smartsync: $dep..."
555			app_set_enabled.sh $dep "yes"
556		done
557	fi
558
559	echo "Enabling the dependent package: smartsync..."
560	app_set_enabled.sh smartsync "yes"
561fi
562
563echo "Enabling the package: $1..."
564app_set_enabled.sh $1 "yes"
565
566if [ "$link_internet" == "2" ]; then
567	app_update.sh&
568fi
569
570test_of_var_files "$APPS_MOUNTED_PATH"
571rc rc_service restart_nasapps
572
573nvram set apps_download_file=
574nvram set apps_download_percent=
575
576nvram set apps_depend_do=
577nvram set apps_depend_action=
578nvram set apps_depend_action_target=
579
580
581nvram set apps_state_install=5 # FINISHED
582