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