v0.2.5 - improved screen formatting for Terminal app, added shortcuts
[webos-internals:mvapp.git] / mvapp
1 #!/bin/sh
2
3 # This code is open for re-use with no restrictions.  xorg
4 # Intent is for someone to port to or use this for a webOS app.
5 # Homepage: http://www.webos-internals.org/wiki/Solution_to_App_Catalog_Installation_Limit
6
7 #-------------------------------------------------------------------------#
8 # versions:
9 # 0.1.0 - original (xorg)
10 # 0.1.1 - added unlink and clean functions (daventx)
11 # 0.1.2 - added bulkmv function, allows moving many apps (xorg)
12 # 0.1.3 - added option for tar backups (xorg)
13 # 0.1.4 - added listmoved function to show apps already moved (xorg)
14 # 0.1.5 - added restoreall function, couple cleanup items (xorg)
15 # 0.1.6 - fixed to show usage if no appname supplied to link/unlink (xorg)
16 # 0.1.7 - added cleanexit (w/mount ro /) 
17 #       - added exit code documentation for javascripts calling this (xorg)
18 # 0.2.0 - will not move apps that would have attribute issues (xorg)
19 #       - will not move apps that have no json file
20 #       - improved error handling, improved listing shows actual app names
21 # 0.2.1 - minor update, proper cleanup if link command doesn't move app
22 #       - don't create tar backup until testing if app is movable (xorg)
23 # 0.2.2 - broke with Fair Dinkum - resolved by explicit path for du (nt4cats)
24 #       - will not move an app if it is running, thx to greg roll
25 #       - faster listmoved apps (but no size), error reporting cleanup (xorg)
26 # 0.2.3 - new trap method for link cp errors ; version reporting in usage 
27 #       - doesn't allow to use mvapp if USB drive is mounted to computer (xorg)
28 # 0.2.4 - turned off TAR backups by default, added 'mvapp info'
29 #       - added two hidden functions (see mvapp homepage for details)
30 #       - 'mvapp ftr' - force tar restore, 'mvapp rtb' - remove tar backups
31 # 0.2.5 - better screen formatting for Terminal app, added shortcuts
32 #       - added /var usage before/after move (xorg)
33 #-------------------------------------------------------------------------#
34
35 #-------------------------------------------------------------------------#
36 # variables: these are globally available to all functions
37 #-------------------------------------------------------------------------#
38 COMMAND=$1
39 APP=$2
40 VERSION=0.2.5
41 MEDIA=/media/internal/.apps
42 VAR=/var/usr/palm/applications  # Do not change this
43
44 # TAR backups are no longer needed, recommend setting to 0
45 BACKUP=0  # set to 1 for tar backups, 0 to disable
46 BACKUPDIR=/media/internal/.appbackups
47
48 # This should be turned on.  Only turn off if javascript is calling this script.
49 PROMPTS=1
50
51 #-------------------------------------------------------------------------#
52 # exit codes for javascripts:
53 # function usage:
54 # 1 - normal usage error
55 # 100 - USB drive is mounted, cannot use mvapp
56 #
57 # function cleanapp:
58 # 0 - normal exit
59 # 30 - link for app does not exist
60 #
61 # function linkapp:
62 # 0  - normal exit
63 # 10 - app name not supplied
64 # 11 - link already exists
65 # 12 - app does not exist in VAR
66 # 13 - copy failed from VAR to MEDIA
67 # 14 - removing app from VAR failed
68 # 15 - APP has attributes not supported on FAT, did not move to MEDIA
69 # 16 - APP has no json file, did not move to MEDIA
70 # 17 - APP is running, need to close the app before moving
71 #
72 # function unlinkapp:
73 # 0  - normal exit
74 # 20 - app name not supplied
75 # 21 - app doesn't exist on MEDIA
76 # 22 - tar restore failed
77 # 23 - copy from MEDIA to VAR failed (only used if tar backup doesn't exist)
78 # 24 - remove from MEDIA failed
79 #
80 #-------------------------------------------------------------------------#
81
82 #-------------------------------------------------------------------------#
83 # function: cleanexit - exit with cleanup items
84 #-------------------------------------------------------------------------#
85
86 cleanexit () {
87  code=$1
88
89 # put / back to read only
90   mount -o remount,ro /
91
92 # Uncomment if you want verbose exit codes
93 # echo "exit code: $code"
94
95  exit $code
96 }
97 # end of cleanexit function
98
99
100 #-------------------------------------------------------------------------#
101 # function: usage - show command usage options
102 #-------------------------------------------------------------------------#
103 usage () {
104    exitcode=$1
105    if [ ! $exitcode ]
106    then
107      exitcode=1  # default exit code for usage, otherwise exit with incode
108    fi
109
110    echo "Usage:" 
111    echo "mvapp info <or> i                         - view mvapp homepage in phone browser" 
112    echo "mvapp link <or> ln domain.appname         - move app to media, create link"
113    echo "mvapp unlink <or> ul domain.appname       - restore app to var, remove link"
114    echo "mvapp clean <or> c domain.appname         - remove app dir and links"
115    echo "mvapp list <or> ls                        - list all apps sorted by size"
116    echo "mvapp bulkmv  <or> bm                     - move/link many apps"
117    echo "mvapp listmoved <or> lm                   - list apps that have been moved"
118    echo "mvapp restoreall <or> ra                  - restore all apps to original"
119    echo
120
121   cleanexit $exitcode
122 }
123 # end of usage function
124
125 #-------------------------------------------------------------------------#
126 # function: info - launch the mvapp page on webosinternals
127 #-------------------------------------------------------------------------#
128
129 info () {
130 HOMEPAGE=http://www.webos-internals.org/wiki/Solution_to_App_Catalog_Installation_Limit
131
132 luna-send -n 1 palm://com.palm.applicationManager/launch {\"id\":\"com.palm.app.browser\",\"params\":{\"scene\":\"page\",\"target\":\"$HOMEPAGE\"}}  2>&1 >/dev/null
133
134 echo "View on the phone web browser..."
135
136 }
137 # end of info function
138
139
140 #-------------------------------------------------------------------------#
141 # function: cleanapp - removes symbolic links and folder in media and var
142 #-------------------------------------------------------------------------#
143
144 cleanapp () {
145
146  mount -o remount,rw /
147
148  # exit to usage if no app name supplied
149  if [ ! $APP ]
150  then
151    echo "No app name supplied."
152    usage 1
153  fi
154
155  if [ -h $VAR/$APP ]
156  then
157   echo "Continue to remove all traces of $APP."
158  else
159   echo "$APP link does not exist..."
160   echo "First attempt to remove the app from Launcher or Homebrew installer."
161   cleanexit 30
162  fi
163  
164  ls -ld $VAR/$APP
165             
166 # Continue on if PROMPTS turned off (call from outside app) 
167  if [ $PROMPTS -eq 1 ]  
168  then
169   echo "This will remove $APP from both...."
170   echo "$VAR and "
171   echo "$MEDIA"
172   echo
173   echo "FIRST ATTEMPT TO... remove the app from Launcher or Homebrew installer."
174   echo
175   echo "Are you sure you want to remove $APP? [y/N]: "
176   read answer
177   case $answer in
178    [Yy]*) continue;;
179        *) cleanexit 0;;
180   esac
181  fi
182
183
184  
185
186  echo "Size of $VAR before cleanup... "
187  /usr/bin/du -sh $VAR
188  df -m /var |grep /var |awk '{print "/var - used: "$2,"MB - avail: " $3,"MB  " $4}'
189
190  if [ -d $MEDIA/$APP ]
191  then
192      rm -r $MEDIA/$APP
193       echo "Removed directory" $MEDIA/$APP
194  fi
195  if [ -d $VAR/$APP ]
196  then
197       rm -r $VAR/$APP
198       echo "Removed directory" $VAR/$APP
199  fi
200  if [ -h $VAR/$APP ]
201  then
202       rm -r $VAR/$APP
203       echo "Removed link" $VAR/$APP
204  fi
205  if [ -f $BACKUPDIR/$APP.tgz ]
206  then
207       rm -r $BACKUPDIR/$APP.tgz
208       echo "Removed tar backup" $BACKUPDIR/$APP.tgz
209  fi
210
211
212  # rescan luna in case it's needed
213  luna-send -n 1 palm://com.palm.applicationManager/rescan {} >/dev/null 2>&1
214  echo "$APP directories and links removed."
215  echo "Size of $VAR after cleanup... "
216  /usr/bin/du -sh $VAR
217  df -m /var |grep /var |awk '{print "/var - used: "$2,"MB - avail: " $3,"MB  " $4}'
218  cleanexit 0
219 }
220 # end of cleanup function
221
222
223 #-------------------------------------------------------------------------#
224 # function: listapps - list the size of each app, sort showing largest last
225 #-------------------------------------------------------------------------#
226 listapps () {
227  echo "First number is size in KB.  Size of 0 is an app already linked."
228  cd $VAR
229  for i in `/usr/bin/du -s * | sort -n |cut -f 2`
230  do
231     APP=$i
232     SIZE=`/usr/bin/du -s $VAR/$APP |cut -f1`
233     TITLE=""
234     if [ -f $VAR/$APP/appinfo.json ]
235     then
236       TITLE=`grep title $VAR/$APP/appinfo.json |cut -d: -f2 |cut -d\" -f2`
237     fi
238     echo "$SIZE - $APP - $TITLE"
239  done
240  
241  cleanexit 0
242 }
243 # end of listapps function
244
245 #-------------------------------------------------------------------------#
246 # function: listmoved - list apps moved/linked, sort showing largest last
247 #-------------------------------------------------------------------------#
248 listmoved () {
249  #/usr/bin/du -sk $MEDIA/* | sort -n  #doesn't show proper size on FAT fs, removing
250  cd $MEDIA
251  #for i in `/usr/bin/du -s * | sort -n |cut -f 2`
252  for i in `ls $MEDIA`
253  do
254     APP=$i
255     # Not sure why du reports incorrectly on FAT fs
256     #SIZE=`/usr/bin/du -s $MEDIA/$APP |cut -f1`
257     SIZE=""
258     TITLE=""
259     if [ -f $MEDIA/$APP/appinfo.json ]
260     then
261       TITLE=`grep title $MEDIA/$APP/appinfo.json |cut -d: -f2 |cut -d\" -f2`
262     fi
263     echo "$SIZE - $APP - $TITLE"
264  done
265  cleanexit 0
266 }
267 # end of listmoved function
268
269
270 #-------------------------------------------------------------------------#
271 # function: linkapp - move the app to media and create symbolic link
272 #-------------------------------------------------------------------------#
273 linkapp () {
274
275  clear
276  
277  if [ ! $APP ]
278  then
279       echo -e "\nNo application supplied..."
280       usage 10
281  fi
282  
283 # Check if the app is running 
284  luna-send -n 1 palm://com.palm.applicationManager/running {} 2>&1 | grep $APP >/dev/null 2>&1
285  if [ $? == 0 ]
286  then
287    echo -e "\n$APP is running.  \nClose the app before moving."
288    
289    code=17
290    return $code
291    
292  fi  
293  
294  
295  if [ ! -f $VAR/$APP/appinfo.json ]
296  then
297     echo -e "\n$APP has no json file.  \nWill not be moved."
298     code=16
299     return 16
300  fi   
301
302  if [ ! -d $MEDIA ]
303  then
304       mkdir $MEDIA
305  fi
306
307  if [ -h $VAR/$APP ]
308  then
309       echo -e "Link already exists for... \n${APP}"
310       cleanexit 11
311  fi
312
313  TITLE=`grep title $VAR/$APP/appinfo.json |cut -d: -f2 |cut -d\" -f2`
314  
315  mount -o remount,rw /
316
317  if [ -d $VAR/$APP ]
318  then
319    echo -e "\nMoving... \n$APP \n$TITLE \nto $MEDIA..."
320  else
321    echo "$APP does not exist..."
322    usage 12
323  fi
324
325  
326  mount -o remount,rw /
327
328  echo -e "\nSize before move... "
329  /usr/bin/du -sh $VAR
330  df -m /var |grep /var |awk '{print "/var - used: "$2,"MB - avail: " $3,"MB  " $4}'
331  echo
332   
333
334  # move over to USB drive
335  cp -rp  $VAR/$APP $MEDIA >/tmp/cpresult.out 2>&1
336  if [ -s /tmp/cpresult.out ]
337  then
338   grep "cannot preserve" /tmp/cpresult.out >/dev/null 2>&1
339   if [ $? = 0 ]
340   then
341    echo
342    echo -e "\n$APP \nCANNOT BE MOVED as it \ncontains special attributes."
343    echo "Leaving app in original location."
344    code=15
345    rm -r $MEDIA/$APP
346    rm /tmp/cpresult.out
347    return $code
348   else
349    echo -e "Copy failed. Leaving app in original location."
350    code=13
351   fi
352   rm -r $MEDIA/$APP
353   rm /tmp/cpresult.out
354   return $code
355  fi
356                   
357
358 # Backup using tar if enabled
359  if [ $BACKUP -eq 1 ]
360  then
361    if [ ! -d $BACKUPDIR ]
362    then
363     mkdir $BACKUPDIR
364    fi
365    echo -e "Backing up $APP $TITLE \nto $BACKUPDIR using tar..."
366    tar czf $BACKUPDIR/${APP}.tgz $VAR/$APP 2>&1 >/dev/null
367  fi
368
369  rm -r $VAR/$APP
370  if [ $? != 0 ]
371  then
372   echo -e "Remove failed. \nLeaving app in original location."
373   rm -r $MEDIA/$APP
374   cleanexit 14
375  fi
376
377  # create the symbolic link
378  ln -s $MEDIA/$APP $VAR/$APP
379
380  # rescan luna in case it's needed
381  luna-send -n 1 palm://com.palm.applicationManager/rescan {} >/dev/null 2>&1
382
383  echo -e "$APP \nSUCCESSFULLY moved and linked."
384  echo -e "\nSize after move... "
385  /usr/bin/du -sh $VAR
386  df -m /var |grep /var |awk '{print "/var - used: "$2,"MB - avail: " $3,"MB  " $4}'
387 }
388 # end of linkapp function
389
390
391 #-------------------------------------------------------------------------#
392 # function: unlinkapp -  restore the app to var and remove symbolic link
393 #-------------------------------------------------------------------------#
394 unlinkapp () {
395
396  if [ ! $APP ]
397  then
398    echo "No application supplied..."
399    usage 20
400  fi
401
402  mount -o remount,rw /
403
404  if [ -d $MEDIA/$APP ]
405  then
406    echo "Restoring $APP..."
407  else
408    echo -e "\n$APP does not exist \nor was not moved.\n\n"
409    usage 21
410  fi
411
412  echo "Size of $VAR before move... "
413  /usr/bin/du -sh $VAR
414  df -m /var |grep /var |awk '{print "/var - used: "$2,"MB - avail: " $3,"MB  " $4}'
415
416  # remove the old symbolic link
417  rm -r $VAR/$APP
418
419  # move to original location or restore from tar if it exists
420  if [ -f $BACKUPDIR/$APP.tgz ] && [ $BACKUP -eq 1 ]
421  then
422   echo "Restoring from tar backup...."
423   cd /
424   tar xzf $BACKUPDIR/$APP.tgz
425   if [ $? -ne 0 ]
426   then
427    echo "Tar restore failed. Remove and restore app using official webOS/Pre methods."
428    cleanexit 22
429   else
430    rm -r $BACKUPDIR/$APP.tgz
431   fi
432  else
433   echo "Restoring from $MEDIA..."
434   cp -r  $MEDIA/$APP $VAR
435   if [ $? != 0 ]
436   then
437    echo "Copy failed. Leaving app in $MEDIA."
438    cleanexit 23
439   fi
440  fi
441
442  rm -r $MEDIA/$APP
443  if [ $? != 0 ]
444  then
445   echo "Remove failed. Leaving app in $MEDIA."
446   rm -r $VAR/$APP
447   cleanexit 24
448  fi
449
450  # rescan luna in case it's needed
451  luna-send -n 1 palm://com.palm.applicationManager/rescan {} >/dev/null 2>&1
452
453  echo -e "$APP \nmoved and unlinked SUCCESSFULLY."
454  echo "Size after move... "
455  /usr/bin/du -sh $VAR
456  df -m /var |grep /var |awk '{print "/var - used: "$2,"MB - avail: " $3,"MB  " $4}'
457 }
458 # end of unlinkapp function
459
460 #-------------------------------------------------------------------------#
461 # function: bulkmv -  move/link many apps
462 #-------------------------------------------------------------------------#
463 bulkmv() {
464  echo
465  echo
466  echo -e "This allows moving many apps, \nasking which you'd like to move."
467  echo "Starting with the largest apps."
468  echo
469
470
471  mount -o remount,rw /
472  cd $VAR
473
474  for i in `/usr/bin/du -s * | sort -nr |cut -f 2`
475  do
476     export APP=$i
477     SIZE=`/usr/bin/du -sh $APP |cut -f 1`
478     TITLE=`grep title $VAR/$APP/appinfo.json 2>/dev/null |cut -d: -f2 |cut -d\" -f2`
479     echo
480     echo "------------------"
481     echo
482     echo -e "Size of $APP \n$TITLE \nis $SIZE."
483     
484     echo -e "\nWould you like to move and link... \n$TITLE? [y/N/q]: \c"
485     read answer
486     case $answer in
487     [Yy]*) linkapp;;
488     [Qq]*) cleanexit 0;;
489         *) echo "$APP not moved."
490            continue;;
491     esac
492
493     echo
494  done
495 }
496 # end of bulkmv function
497
498 #-------------------------------------------------------------------------#
499 # function: restoreall - restore all apps, back to /var
500 #-------------------------------------------------------------------------#
501 restoreall() {
502
503 #Only confirm if PROMPT turned on. (allows outside app to call) 
504   if [ $PROMPTS -eq 1 ]
505   then
506    echo "This will restore all applications back to original location"
507    echo "and remove the links.  Are you sure you want to continue? [y/N]:"
508    read answer
509    case $answer in
510     [Yy]*) continue;;
511         *) cleanexit 0;;
512    esac
513   fi
514
515   ls $MEDIA | while read APP
516   do
517     echo "Restoring $APP and unlinking..."
518     unlinkapp
519   done
520 }
521 # end of restoreall function
522
523 #-------------------------------------------------------------------------#
524 # function: removetarbackups -  remove entire tar backup directory
525 #-------------------------------------------------------------------------#
526 removetarbackups() {
527   echo "Tar backups are no longer needed and waste space on /media."
528   echo "Backups are located in $BACKUPDIR"
529   echo "Type \"remove\" to remove entire backup directory: "
530   read answer
531   case $answer in
532    [Rr]emove) echo "Removing $BACKUPDIR..."
533               if [ -d $BACKUPDIR ] 
534                then
535                rm -r $BACKUPDIR
536               fi  
537               ;;
538   esac        
539 }
540 # end of removetarbackups function
541
542 #-------------------------------------------------------------------------#
543 # function: startup - startup items 
544 #-------------------------------------------------------------------------#
545 startup() {
546 clear
547 echo
548 echo "mvapp version: $VERSION"
549
550 mount -o remount,rw /
551
552 df |grep /media/internal 2>&1 >/dev/null
553 if [ $? != 0 ]
554 then
555  echo "USB drive is mounted to computer.  You must unmount from USB to use mvapp."
556  code=100
557  cleanexit $code
558 fi  
559
560 }
561 # end of startup function
562
563
564
565 #-------------------------------------------------------------------------#
566 # main - begins here
567 #-------------------------------------------------------------------------#
568
569 startup
570
571 case $COMMAND in
572 c|"clean")
573    cleanapp
574    ;;
575 ls|"list")
576    listapps
577    ;;
578 lm|"listmoved")
579    listmoved
580    ;;
581 ln|"link")
582    linkapp
583    ;;
584 ul|"unlink")
585    unlinkapp
586    ;;
587 bm|"bulkmv")
588    bulkmv
589    ;;
590 ra|"restoreall")
591    restoreall
592    ;;
593 "ftr")  # force tar restore
594    BACKUP=1   
595    unlinkapp
596    ;;
597 "rtb")  # remove all tar backups
598    removetarbackups 
599    ;;
600 i|"info")
601    info 
602    ;;   
603 *)
604    usage 1
605    ;;
606 esac
607
608 cleanexit $code
609