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