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