vo.4.3 - added migrate and postupd2 commands
[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 # 0.3.0 - added 'var diag' to check storage usage, 
35 #       - added linking for email/attachments  (xorg)
36 # 0.3.2 - a few reporting improvements, cleaner launching of email
37 #       - creates shortcut link m->mvapp
38 # 0.3.4 - now reports number of apps, new 'search' command will 
39 #       - best guess apps, report outputs now to rtf extension
40 # 0.3.5 - checks for abandoned links, check if fd installed
41 # 0.3.6 - doctor renamed to diag, update preware, terminal apps
42 # 0.3.8 - prep for next webosupdate
43 # 0.3.9 - fix for backup
44 # 0.4.0 - more webosupdate preps, restore direct to new location
45 # 0.4.2 - added migration for linked apps
46 #-------------------------------------------------------------------------#
47
48
49 #-------------------------------------------------------------------------#
50 # variables: these are globally available to all functions
51 #-------------------------------------------------------------------------#
52 COMMAND=$1
53 APP=$2
54 VERSION=0.4.3
55 MEDIA=/media/internal/.apps
56 VAR=/var/usr/palm/applications  # Do not change this
57
58
59 IPKG_OFFLINE_ROOT=/media/internal/.apps
60 CRYPT=/media/cryptofs/apps/usr/palm/applications
61
62 # TAR backups are no longer needed, recommend setting to 0
63 BACKUP=0  # set to 1 for tar backups, 0 to disable
64 BACKUPDIR=/media/internal/.appbackups
65
66 # This should be turned on.  Only turn off if javascript is calling this script.
67 PROMPTS=1
68
69 #-------------------------------------------------------------------------#
70 # exit codes for javascripts:
71 # function usage:
72 # 1 - normal usage error
73 # 100 - USB drive is mounted, cannot use mvapp
74 #
75 # function cleanapp:
76 # 0 - normal exit
77 # 30 - link for app does not exist
78 #
79 # function linkapp:
80 # 0  - normal exit
81 # 10 - app name not supplied
82 # 11 - link already exists
83 # 12 - app does not exist in VAR
84 # 13 - copy failed from VAR to MEDIA
85 # 14 - removing app from VAR failed
86 # 15 - APP has attributes not supported on FAT, did not move to MEDIA
87 # 16 - APP has no json file, did not move to MEDIA
88 # 17 - APP is running, need to close the app before moving
89 #
90 # function unlinkapp:
91 # 0  - normal exit
92 # 20 - app name not supplied
93 # 21 - app doesn't exist on MEDIA
94 # 22 - tar restore failed
95 # 23 - copy from MEDIA to VAR failed (only used if tar backup doesn't exist)
96 # 24 - remove from MEDIA failed
97 #
98 # function linkemail:
99 # 0  - normal exit
100 # 50 - 
101 # 51 - 
102 #
103 #-------------------------------------------------------------------------#
104
105 #-------------------------------------------------------------------------#
106 # function: cleanexit - exit with cleanup items
107 #-------------------------------------------------------------------------#
108
109 cleanexit () {
110  code=$1
111  
112   luna-send -n 1 palm://com.palm.applicationManager/rescan {} >/dev/null 2>&1 &
113
114 # put / back to read only
115   mount -o remount,ro / &
116
117 # Uncomment if you want verbose exit codes
118 # echo "exit code: $code"
119
120  exit $code
121 }
122 # end of cleanexit function
123
124
125 #-------------------------------------------------------------------------#
126 # function: usage - show command usage options
127 #-------------------------------------------------------------------------#
128 usage () {
129    exitcode=$1
130    if [ ! $exitcode ]
131    then
132      exitcode=1  # default exit code for usage, otherwise exit with incode
133    fi
134
135    echo "Usage:" 
136    echo "mvapp link <or> ln domain.appname         - move app to media, create link"
137    echo "mvapp bulkmv  <or> bm                     - move/link many apps"
138    echo "mvapp search <or> s appname               - search for apps to link/unlk/clean"
139    echo "mvapp unlink <or> ul domain.appname       - restore app to var, remove link"
140    echo "mvapp clean <or> c domain.appname         - remove app dir and links"
141    echo "mvapp list <or> ls                        - list all apps sorted by size"
142    echo "mvapp listmoved <or> lm                   - list apps that have been moved"
143    echo "mvapp restoreall <or> ra                  - restore all apps to original"
144    echo 
145    echo "mvapp linkemail <or> le                   - move email/attach to media and link"
146    echo "mvapp unlinkemail <or> ue                 - restore email/attach to var, rm link"
147    echo
148    echo "mvapp diag <or> d                         - report /var usage, diagnositics"
149    echo "mvapp diag <or> d media                   - with size of apps on media (slow)"
150    echo "mvapp info <or> i                         - view mvapp homepage in phone browser" 
151    echo
152    echo "mvapp backup <or> b                       - backup apps/email b4 webos update"
153    echo "mvapp restorebk <or> rb                   - restore from backup after os update"
154    echo "mvapp postupd                             - use if no backup before os update"
155
156   cleanexit $exitcode
157 }
158 # end of usage function
159
160 #-------------------------------------------------------------------------#
161 # function: info - launch the mvapp page on webosinternals
162 #-------------------------------------------------------------------------#
163
164 info () {
165 HOMEPAGE=http://www.webos-internals.org/wiki/Solution_to_App_Catalog_Installation_Limit
166 luna-send -n 1 palm://com.palm.applicationManager/launch {\"id\":\"com.palm.app.browser\",\"params\":{\"scene\":\"page\",\"target\":\"$HOMEPAGE\"}}  >/dev/null 2>&1
167
168 echo "View on the phone web browser..."
169
170 }
171 # end of info function
172
173
174 #-------------------------------------------------------------------------#
175 # function: cleanapp - removes symbolic links and folder in media and var
176 #-------------------------------------------------------------------------#
177
178 cleanapp () {
179
180  clear
181  mount -o remount,rw /
182
183  # exit to usage if no app name supplied
184  if [ ! $APP ]
185  then
186    echo "No app name supplied."
187    usage 1
188  fi
189
190  if [ -h $VAR/$APP ]
191  then
192   echo "Continue to remove all traces of $APP."
193  else
194   if [ -d $MEDIA/$APP ]
195   then
196    echo "Removing $MEDIA/$APP..."
197    rm -r $MEDIA/$APP
198   else 
199    echo "Nothing to remove."
200   fi
201   return 30
202  fi
203  
204             
205 # Continue on if PROMPTS turned off (call from outside app) 
206  if [ $PROMPTS -eq 1 ]  
207  then
208   echo "This will remove $APP from both...."
209   echo "$VAR and "
210   echo "$MEDIA"
211   echo
212   echo "FIRST ATTEMPT TO... remove the app "
213   echo "from Launcher or Homebrew installer."
214   echo
215   echo -e "Are you sure you want to remove.."
216   echo -e "$APP? [y/N]: \c"
217   read answer
218   case $answer in
219    [Yy]*) continue;;
220        *) cleanexit 0;;
221   esac
222  fi
223
224  echo "Size of $VAR before cleanup... "
225  /usr/bin/du -sh $VAR
226  df -m /var |grep /var |awk '{print "/var used: "$2,"MB " $4 " - avail: " $3,"MB"}'
227
228  if [ -d $MEDIA/$APP ]
229  then
230       rm -r $MEDIA/$APP
231       echo "Removed directory" $MEDIA/$APP
232  fi
233  if [ -d $VAR/$APP ]
234  then
235       rm -r $VAR/$APP
236       echo "Removed directory" $VAR/$APP
237       rm -r /var/usr/lib/ipkg/info/${APP}"*"
238  fi
239  if [ -h $VAR/$APP ]
240  then
241       rm -r $VAR/$APP
242       echo "Removed link" $VAR/$APP
243  fi
244  if [ -f $BACKUPDIR/$APP.tgz ]
245  then
246       rm -r $BACKUPDIR/$APP.tgz
247       echo "Removed tar backup" $BACKUPDIR/$APP.tgz
248  fi
249
250
251  # rescan luna in case it's needed
252  luna-send -n 1 palm://com.palm.applicationManager/rescan {} >/dev/null 2>&1
253  echo "$APP directories and links removed."
254  echo "Size of $VAR after cleanup... "
255  /usr/bin/du -sh $VAR
256  df -m /var |grep /var |awk '{print "/var used: "$2,"MB " $4 " - avail: " $3,"MB"}'
257  cleanexit 0
258 }
259 # end of cleanup function
260
261
262 #-------------------------------------------------------------------------#
263 # function: listapps - list the size of each app, sort showing largest last
264 #-------------------------------------------------------------------------#
265 listapps () {
266  echo "First number is size in KB. "
267  echo "Size of 0 is an app already linked."
268  cd $VAR
269  for i in `/usr/bin/du -s * | sort -n |cut -f 2`
270  do
271     APP=$i
272     SIZE=`/usr/bin/du -s $VAR/$APP |cut -f1`
273     TITLE=""
274     if [ -f $VAR/$APP/appinfo.json ]
275     then
276       TITLE=`grep title $VAR/$APP/appinfo.json |cut -d: -f2 |cut -d\" -f2`
277     fi
278     echo "$SIZE - $APP - $TITLE"
279  done
280  
281  cleanexit 0
282 }
283 # end of listapps function
284
285 #-------------------------------------------------------------------------#
286 # function: listmoved - list apps moved/linked, sort showing largest last
287 #-------------------------------------------------------------------------#
288 listmoved () {
289  
290  if [ ! -d $MEDIA ]
291  then
292   echo "No apps linked yet..."
293   cleanexit 1
294  fi
295  
296  echo "Generating list, hold please."
297  echo "This may take up to a minute..."
298  cd $MEDIA
299 # for i in `/usr/bin/du -s * | sort -n |cut -f 2`
300  for i in `ls -tr $MEDIA`
301  do
302     APP=$i
303     SIZE=`/usr/bin/du -s $MEDIA/$APP |cut -f1`
304     #SIZE=""
305     TITLE=""
306     if [ -f $MEDIA/$APP/appinfo.json ]
307     then
308       TITLE=`grep title $MEDIA/$APP/appinfo.json |cut -d: -f2 |cut -d\" -f2`
309     fi
310     echo "$SIZE - $APP - $TITLE"
311  done
312 }
313 # end of listmoved function
314
315
316 #-------------------------------------------------------------------------#
317 # function: linkapp - move the app to media and create symbolic link
318 #-------------------------------------------------------------------------#
319 linkapp () {
320
321  clear
322  
323  if [ ! $APP ]
324  then
325       echo -e "\nNo application supplied..."
326       usage 10
327  fi
328  
329   
330 # Check if the app is running 
331  luna-send -n 1 palm://com.palm.applicationManager/running {} 2>&1 | grep $APP >/dev/null 2>&1
332  if [ $? == 0 ]
333  then
334    echo -e "\n$APP is running.  \nClose the app before moving."
335    code=17
336    return $code
337  fi  
338  
339  if [ ! -f $VAR/$APP/appinfo.json ]
340  then
341     echo -e "\n$APP has no json file. \nRecommend not moving."
342     echo -e "\nMove anyway? [y/N]: \c"
343     read answer
344     case $answer in
345      [Yy]*) echo "Continuing with install...";;
346          *) code=16; return $code;;
347     esac
348  fi   
349
350  if [ ! -d $MEDIA ]
351  then
352       mkdir $MEDIA
353  fi
354
355  if [ -h $VAR/$APP ]
356  then
357       echo -e "Link already exists for... \n${APP}"
358       cleanexit 11
359  fi
360
361  TITLE=`grep title $VAR/$APP/appinfo.json |cut -d: -f2 |cut -d\" -f2`
362  
363  mount -o remount,rw /
364
365  if [ -d $VAR/$APP ]
366  then
367    echo -e "\nMoving... \n$APP \n$TITLE \nto $MEDIA..."
368  else
369    echo "$APP does not exist..."
370    usage 12
371  fi
372
373  
374  mount -o remount,rw /
375
376  echo -e "\nSize before move... "
377  /usr/bin/du -sh $VAR
378  df -m /var |grep /var |awk '{print "/var used: "$2,"MB " $4 " - avail: " $3,"MB"}'
379  echo
380   
381
382  # move over to USB drive
383  cp -rp  $VAR/$APP $MEDIA >/tmp/cpresult.out 2>&1
384  if [ -s /tmp/cpresult.out ]
385  then
386   grep "cannot preserve" /tmp/cpresult.out >/dev/null 2>&1
387   if [ $? = 0 ]
388   then
389    echo
390    echo -e "\n$APP \nCANNOT BE MOVED as it \ncontains special attributes."
391    echo "Leaving app in original location."
392    echo -e "This is not an error message.  \nmvapp properly handled this."
393    code=15
394    rm -r $MEDIA/$APP
395    rm /tmp/cpresult.out
396    return $code
397   else
398    echo -e "Copy failed. \nLeaving app in original location."
399    code=13
400   fi
401   rm -r $MEDIA/$APP
402   rm /tmp/cpresult.out
403   return $code
404  fi
405                   
406
407 # Backup using tar if enabled
408  if [ $BACKUP -eq 1 ]
409  then
410    if [ ! -d $BACKUPDIR ]
411    then
412     mkdir $BACKUPDIR
413    fi
414    echo -e "Backing up $APP $TITLE \nto $BACKUPDIR using tar..."
415    tar czf $BACKUPDIR/${APP}.tgz $VAR/$APP 2>&1 >/dev/null
416  fi
417
418  rm -r $VAR/$APP
419  if [ $? != 0 ]
420  then
421   echo -e "Remove failed. \nLeaving app in original location."
422   rm -r $MEDIA/$APP
423   cleanexit 14
424  fi
425
426  # create the symbolic link
427  ln -s $MEDIA/$APP $VAR/$APP
428
429  # rescan luna in case it's needed
430  luna-send -n 1 palm://com.palm.applicationManager/rescan {} >/dev/null 2>&1
431
432  echo -e "$APP \nSUCCESSFULLY moved and linked."
433  echo -e "\nSize after move... "
434  /usr/bin/du -sh $VAR
435  df -m /var |grep /var |awk '{print "/var used: "$2,"MB " $4 " - avail: " $3,"MB"}'
436 }
437 # end of linkapp function
438
439
440 #-------------------------------------------------------------------------#
441 # function: unlinkapp -  restore the app to var and remove symbolic link
442 #-------------------------------------------------------------------------#
443 unlinkapp () {
444
445  if [ ! $APP ]
446  then
447    echo "No application supplied..."
448    usage 20
449  fi
450
451  mount -o remount,rw /
452
453  if [ -d $MEDIA/$APP ]
454  then
455    echo
456    echo "RESTORING $APP..."
457  else
458    echo -e "\n$APP does not exist \nor was not moved.\n\n"
459    cleanexit 21
460  fi
461
462  echo "Size of $VAR before move... "
463  /usr/bin/du -sh $VAR
464  df -m /var |grep /var |awk '{print "/var used: "$2,"MB " $4 " - avail: " $3,"MB"}'
465
466  # remove the old symbolic link
467  rm -r $VAR/$APP
468
469  # move to original location or restore from tar if it exists
470  if [ -f $BACKUPDIR/$APP.tgz ] && [ $BACKUP -eq 1 ]
471  then
472   echo "Restoring from tar backup...."
473   cd /
474   tar xzf $BACKUPDIR/$APP.tgz
475   if [ $? -ne 0 ]
476   then
477    echo "Tar restore FAILED. Remove and restore app using official webOS/Pre methods."
478    cleanexit 22
479   else
480    rm -r $BACKUPDIR/$APP.tgz
481   fi
482  else
483   echo "Restoring from $MEDIA..."
484   cp -r  $MEDIA/$APP $VAR
485   if [ $? != 0 ]
486   then
487    echo -e "Copy FAILED. \nLeaving app in $MEDIA."
488    cleanexit 23
489   fi
490  fi
491
492  rm -r $MEDIA/$APP
493  if [ $? != 0 ]
494  then
495   echo -e "Remove FAILED. \nLeaving app in $MEDIA."
496   rm -r $VAR/$APP
497   cleanexit 24
498  fi
499
500  # rescan luna in case it's needed
501  luna-send -n 1 palm://com.palm.applicationManager/rescan {} >/dev/null 2>&1
502
503  echo -e "$APP \nmoved and unlinked SUCCESSFULLY."
504  echo "Size after move... "
505  /usr/bin/du -sh $VAR
506  df -m /var |grep /var |awk '{print "/var used: "$2,"MB " $4 " - avail: " $3,"MB"}'
507 }
508 # end of unlinkapp function
509
510 #-------------------------------------------------------------------------#
511 # function: bulkmv -  move/link many apps
512 #-------------------------------------------------------------------------#
513 bulkmv() {
514  echo
515  echo
516  echo "This allows moving many apps."
517  echo "Starting with the largest apps."
518  echo
519
520
521  mount -o remount,rw /
522  cd $VAR
523
524  for i in `/usr/bin/du -s * | sort -nr |cut -f 2`
525  do
526     export APP=$i
527     SIZE=`/usr/bin/du -sh $APP |cut -f 1`
528     TITLE=`grep title $VAR/$APP/appinfo.json 2>/dev/null |cut -d: -f2 |cut -d\" -f2`
529     echo
530     echo "------------------"
531     echo
532     echo -e "Size of $APP \n$TITLE \nis $SIZE."
533     
534     echo -e "\nWould you like to move and link...\n$TITLE? [y/N/q]: \c"
535     read answer
536     case $answer in
537     [Yy]*) linkapp;;
538     [Qq]*) cleanexit 0;;
539         *) echo "$APP not moved."
540            continue;;
541     esac
542
543     echo
544  done
545 }
546 # end of bulkmv function
547
548 #-------------------------------------------------------------------------#
549 # function: restoreall - restore all apps, back to /var
550 #-------------------------------------------------------------------------#
551 restoreall() {
552
553 #Only confirm if PROMPT turned on. (allows outside app to call) 
554   if [ $PROMPTS -eq 1 ]
555   then
556    echo
557    echo "This will restore all applications back to original location"
558    echo "and remove the links.  Recommend charging phone during "
559    echo "restore if battery low or if many apps to restore."
560    echo -e "Are you sure you want to continue? [y/N]: \c"
561    read answer
562    case $answer in
563     [Yy]*) continue;;
564         *) cleanexit 0;;
565    esac
566   fi
567
568   ls $MEDIA | while read APP
569   do
570     echo "Restoring $APP and unlinking..."
571     unlinkapp
572   done
573 }
574 # end of restoreall function
575
576 #-------------------------------------------------------------------------#
577 # function: removetarbackups -  remove entire tar backup directory
578 #-------------------------------------------------------------------------#
579 removetarbackups() {
580   echo "Tar backups are no longer needed and waste space on /media."
581   echo "Backups are located in $BACKUPDIR"
582   echo "Type \"remove\" to remove entire backup directory: "
583   read answer
584   case $answer in
585    [Rr]emove) echo "Removing $BACKUPDIR..."
586               if [ -d $BACKUPDIR ] 
587                then
588                rm -r $BACKUPDIR
589               fi  
590               ;;
591   esac        
592 }
593 # end of removetarbackups function
594
595 #-------------------------------------------------------------------------#
596 # function: checklinks - check to make sure links match .apps
597 #-------------------------------------------------------------------------#
598 checklinks() {
599
600 if [ ! -d $MEDIA ]
601 then
602  return 0
603 fi
604
605 echo "Checking abandoned links..."
606
607 #ls $MEDIA |while read app
608 for app in `ls $MEDIA`
609 do
610   if [ ! -h $VAR/$app ]
611   then
612     echo
613     echo "Missing link for..."
614     echo
615     echo "$app"
616     echo
617     echo "on media. \87Probably leftovers from"
618     echo "deleted app. Recommend removing."
619     echo
620     echo "Would you like"
621     echo -e "to remove the app? [y/N]: \c"
622     read answer
623     case $answer in
624       [Yy]*) rm -r $MEDIA/$app;;
625     esac
626   fi
627 done
628 echo "Checklinks complete."
629
630 } #end of checklinks function
631
632 #-------------------------------------------------------------------------#
633 # function: diag  - report var storage usage areas
634 #-------------------------------------------------------------------------#
635 diag() {
636
637 ownerid=`ls -ld /media/internal |cut -d" " -f5`
638 if [ $ownerid != "root" ]
639 then
640   echo
641   echo "/media/internal is not owned by root."
642   echo "Was SFTP installed?  May have impact."
643   echo
644 fi
645
646 echo
647 echo "Gathering diag report, hold please..."
648 if [ -d $MEDIA ] && [ $APP ]
649 then
650  mappsz=`/usr/bin/du -sm $MEDIA |cut -f1`
651 fi
652 #varused=df -m /var |grep /var |awk '{print ": "$2,"MB " $4 " - avail: " $3,"MB"}'
653 varused=`df -m /var |grep /var |awk '{print $2}'`
654 varpct=`df -m /var |grep /var |awk '{print $4}'`
655 varavail=`df -m /var |grep /var |awk '{print $3}'`
656 echo "var used:          ${varused}MB $varpct"
657 echo "var available:     ${varavail}MB"
658
659 appsz=`/usr/bin/du -sm $VAR |cut -f1`
660 echo "app used:          ${appsz}MB on /var"
661
662 numapps=`ls $VAR |wc -l`
663 echo "# total apps:      $numapps"
664
665 if [ -d $MEDIA ]
666 then
667  nummapps=`ls $MEDIA |wc -l`
668  numvapps=`expr $numapps - $nummapps`
669  echo "# var apps:        $numvapps"
670  echo "# media apps:      $nummapps"
671 fi
672
673 if [ -d $MEDIA ] && [ $APP ]
674 then
675  echo "app used:          ${mappsz}MB on /media"
676  nummapps=`ls $MEDIA |wc -l`
677  echo "# media apps:      $nummapps"
678 fi
679
680 if [ -h /var/luna/data/emails ]
681 then
682  emailsz=`/usr/bin/du -sm /media/internal/.data/emails |cut -f1`
683  attachsz=`/usr/bin/du -sm /media/internal/.data/attachments |cut -f1`
684  echo "email used:        ${emailsz}MB on /media"
685  echo "attachmnt used:    ${attachsz}MB on /media"
686 else
687  emailsz=`/usr/bin/du -sm /var/luna/data/emails |cut -f1`
688  attachsz=`/usr/bin/du -sm /var/luna/data/attachments |cut -f1`
689  echo "email used:        ${emailsz}MB on /var"
690  echo "attach used:       ${attachsz}MB on /var"
691 fi
692
693 softtemp=`/usr/bin/du -sm /var/lib/software/tmp |cut -f1`
694 echo "var tmp used:      ${softtemp}MB"
695
696 optsz=0
697 if [ -d /opt ]
698 then
699 optsz=`/usr/bin/du -sm /opt |cut -f1`
700 echo "opt used:          ${optsz}MB"
701 fi
702
703 ipkglist=`/usr/bin/du -sm /var/usr/lib/ipkg/lists |cut -f1`
704 echo "ipkg lists:        ${ipkglist}MB"
705
706 echo
707 echo "Recommendations..."
708 echo
709 echo "- Keep \"var used\" well below 125MB."
710
711
712 if [ $varused -gt "125" ]
713 then
714  echo
715  echo "- Consider reducing space on /var."
716  echo "/var use is greater than 125MB."
717 fi
718 if [ $softtemp -gt 1 ]
719 then
720  echo
721  echo "- Check Updates app."
722  echo "/var/lib/software/tmp is larger"
723  echo "than it should be.  May have an"
724  echo "update waiting to be applied."
725  echo
726 fi
727 if [ $appsz -gt "20" ] && [ $varused -gt 125 ]
728 then
729  echo
730  echo "- Consider moving apps: mvapp bulkmv"
731 fi
732
733 totalsz=`expr $emailsz + $attachsz`
734 if [ ! -h /var/luna/data/emails ] && [ $totalsz -gt "10" ]
735 then
736  echo
737  echo "- Consider moving email: mvapp linkemail"
738 fi
739 if [ $optsz -gt 10 ] && [ $varused -gt 125 ]
740 then
741  echo
742  echo "- Consider removing optware packages."
743  echo "You have optware software installed."
744  echo "See: ipkg-opt list_installed"
745  echo " Do: ipkg-opt remove ipkg"
746  echo "Ask on PreCentral."
747 fi
748 if [ $ipkglist -gt 10 ]
749 then
750  echo
751  echo "- ipkg list size is rather large."
752  echo "check /var/usr/lib/ipkg/lists"
753  ls -l |awk '{print  $5 "\t"  $9}'
754    
755 fi
756
757
758 echo
759 echo "This report is available on media"
760 echo "drive as... diagreport.rtf"
761 } # end of diag function
762
763 #-------------------------------------------------------------------------#
764 # function: linkemail - move/link email and attachments to /media
765 #-------------------------------------------------------------------------#
766 linkemail() {
767 vdata=/var/luna/data
768 mdata=/media/internal/.data
769
770  echo "This will move email and attachments"
771  echo "to the media drive.  It is unknown"
772  echo "if there will be email issues when"
773  echo "Palm upgrades webOS.  See \"mvapp "
774  echo "info\" for details."
775  echo
776  echo "If you are writing a new email,"
777  echo "complete and send before continuing."
778  echo
779  echo -e "Do you want to continue? [y/N]: \c"
780  read answer
781  case $answer in
782    [Yy]*) continue;;
783        *) cleanexit 0;;
784  esac
785  
786  if [ -h $vdata/emails ]
787  then
788   echo "email link already exists."
789   cleanexit 0
790  fi
791  
792  echo "Closing email application and background service..."
793  luna-send -n 1 palm://com.palm.applicationManager/running {} 2>&1 \
794  | tr  '{' '\n' | grep com.palm.app.email |cut -d: -f3 |cut -d"\"" -f2 \
795  | while read it
796  do
797   echo $it
798   luna-send -n 1 "palm://com.palm.applicationManager/close" "{\"processId\":\"$it\"}"
799  done
800  
801  
802  if [ ! -d $mdata ]
803  then
804   mkdir $mdata
805  fi
806
807
808  #move email to media and create link
809  echo "Do not close Terminal during moves."
810  echo "Moves could take several minutes."
811  echo "Moving/linking email. "
812  cp -rp $vdata/emails $mdata 2>&1 >/tmp/cpemail.out
813   if [ -s /tmp/cpemail.out ]
814   then
815    echo "Copying email failed. Leaving email in place."
816    cleanexit 52
817   fi  
818 #mv $vdata/emails $vdata/emails.$$
819  rm -r $vdata/emails
820  ln -s $mdata/emails $vdata/emails
821
822  
823  #move attachments to media and create link
824  echo "Moving/linking attachments..."
825  cp -rp $vdata/attachments $mdata 2>&1 >/tmp/cpemail.out
826   if [ -s /tmp/cpemail.out ]
827   then
828    echo "Copying attachments failed. Leaving attachments in place."
829    cleanexit 53
830   fi  
831 #mv $vdata/attachments $vdata/attachments.$$
832  rm -r $vdata/attachments
833  ln -s $mdata/attachments $vdata/attachments
834  
835  #starup email process
836  echo "Starting up email..."
837  luna-send -n 1 palm://com.palm.applicationManager/launch {\"id\":\"com.palm.app.email\"}  >/dev/null 2>&1
838  
839  echo
840  echo "SUCCESSFUL: Confirm you can access your email."
841  echo
842  echo "NOTE: First time you run email,"
843  echo "it may ask if you want to add "
844  echo "accounts.  Press Done."
845
846 } #end of link email function
847
848 #-------------------------------------------------------------------------#
849 # function: unlinkemail - move email and attachments to /media
850 #-------------------------------------------------------------------------#
851 unlinkemail() {
852 vdata=/var/luna/data
853 mdata=/media/internal/.data
854
855
856  if [ ! -d $mdata/emails ]
857  then
858   echo "no email on media"
859   cleanexit 60
860  fi
861  
862  if [ ! -h $vdata/emails ]
863  then
864   echo "email link does not exist on /var"
865   cleanexit 61
866  fi
867  
868  echo "Closing email application and background service..."
869  luna-send -n 1 palm://com.palm.applicationManager/running {} 2>&1 \
870   | tr  '{' '\n' | grep com.palm.app.email |cut -d: -f3 |cut -d"\"" -f2 \
871   | while read it
872   do
873    echo $it
874    luna-send -n 1 "palm://com.palm.applicationManager/close" "{\"processId\":\"$it\"}"
875   done
876  
877  echo "Do not close Terminal during restore."
878  echo "Restore could take several minutes."
879  echo "Restoring email to /var..."
880  # rm the email link
881  rm $vdata/emails
882  # cp email from media to var
883  cp -rp $mdata/emails $vdata 2>&1 >/tmp/cpemail.out
884  if [ -s /tmp/cpemail.out ]
885  then
886    echo "copying email back to /var failed."
887    cleanexit 62
888  fi  
889  rm -r $mdata/emails
890  
891  echo "Restoring attachments to /var..."
892  # rm the attachment link
893  rm $vdata/attachments
894  # cp attachments from media to var
895  cp -rp $mdata/attachments $vdata 2>&1 >/tmp/cpemail.out
896  if [ -s /tmp/cpemail.out ]
897  then
898    echo "copying attachments back to /var failed."
899    cleanexit 63
900  fi  
901  
902  rm -r $mdata/attachments
903  
904  #starup email process
905  echo "Starting up email..."
906  luna-send -n 1 palm://com.palm.applicationManager/launch {\"id\":\"com.palm.app.email\"} >/dev/null 2>&1
907  
908  echo
909  echo "SUCCESSFUL: Confirm you can access your email."
910  
911 } #end of unlinkemail function
912
913 #-------------------------------------------------------------------------#
914 # function: search - search for partial app names
915 #-------------------------------------------------------------------------#
916 search() {
917
918  echo
919
920  for i in `ls -dt $VAR/*${APP}* $MEDIA/*${APP}* |sort ` 
921  do
922    export TITLE=""
923     if [ -f $i/appinfo.json ]
924     then
925       TITLE=`grep title $i/appinfo.json |cut -d: -f2 |cut -d\" -f2`
926     fi
927    echo "Found...."
928    echo $TITLE
929    APP=`basename $i`
930    echo $APP
931    echo
932    
933    if [ -h $VAR/$APP ]
934    then
935     echo "App is currently linked to media."
936    else
937     if [ -d $MEDIA/$APP ]
938     then 
939      echo "App is on media drive but has no link."
940     else
941      echo "App is in original location, not linked."
942     fi
943    fi
944    
945    echo -e "\nWould you like to link/unlink/clean/skip this app? [l/u/c/S/q]: \c"
946    read answer
947    case $answer in
948     l) mvapp link $APP;;
949     u) mvapp unlink $APP;;
950     c) mvapp clean $APP;;
951     q) cleanexit 0;;
952    esac
953    
954    echo -e "\n\n---------------------\n"
955    
956  done 
957  
958  echo 
959
960 } #end of search function
961
962
963 #-------------------------------------------------------------------------#
964 # function: removelinks - remove links from var app dir
965 #-------------------------------------------------------------------------#
966 removelinks() 
967 {
968 echo
969 echo "This will remove mvapp links on /var."
970 echo "Only run if instructed to do so."
971 echo -e "Certain you want to continue? [y/N]:\c"
972 read answer
973 case $answer in
974   [yY]*) continue;;
975       *) cleanexit 0;;
976 esac
977
978 if [ ! -d /tmp/applinks ]
979 then
980  mkdir /tmp/applinks
981 fi
982  
983 cd $VAR
984 count=1
985 ls |while read app
986 do
987  if [ -h $app ]
988  then
989   echo "$count - $app has a link"
990   count=`expr $count + 1`
991   cp -rp $VAR/$app /tmp/applinks
992   rm -r  $VAR/$app
993  fi
994 done
995
996 cd /tmp/applinks
997 tar czf /media/internal/applinkbackup.tgz .
998
999  
1000 }
1001
1002 #-------------------------------------------------------------------------#
1003 # function: postupd - move apps to /media/cryptofs
1004 #-------------------------------------------------------------------------#
1005 postupd() 
1006 {
1007 HOMEPAGE=http://m.forums.precentral.net/webos-internals/212349-solution-app-catalog-limit-symbolic-link-method.html
1008
1009 luna-send -n 1 palm://com.palm.applicationManager/launch {\"id\":\"com.palm.app.browser\",\"params\":{\"scene\":\"page\",\"target\":\"$HOMEPAGE\"}}  >/dev/null 2>&1
1010
1011 cat << EOF
1012 You should not run this until 
1013 confirmed this is needed. 
1014
1015 Check PreCentral mvapp thread
1016 before continuing.  mvapp thread has
1017 been launched for you on phone.
1018 Read the first post before continuing.
1019 EOF
1020
1021 echo -e "\nReady to continue? [n/Y]: \c"
1022 read answer
1023 case $answer in
1024   [Yy]*) continue;;
1025       *) return 0;;
1026 esac
1027
1028
1029 cat << EOF
1030
1031 Large applications may take up
1032 to a minute each to copy.
1033
1034 Do not close the Terminal app
1035 during this process.
1036 EOF
1037
1038
1039 if [ ! -d /media/cryptofs/apps/usr/palm/applications ]
1040 then
1041  echo "New app home location does not exist."
1042  echo "Need to run webOS update first."
1043  cleanexit 70
1044 fi
1045
1046 if [ ! -d /media/internal/.apps ]
1047 then
1048  echo "media/internal/.apps does not exist"
1049  cleanexit 71
1050 fi
1051
1052 cd /media/internal/.apps
1053 numapps=`ls |wc -l`
1054 echo "Copying $numapps linked"
1055 echo "applications to new app home..."
1056
1057 error=0
1058 count=$numapps
1059 ls |while read app
1060 do
1061  echo "$count - $app"
1062  cp -rp $app /media/cryptofs/apps/usr/palm/applications
1063  if [ $? -ne 0 ]
1064  then
1065    echo "Copy failed.  Check PreCentral thread."
1066    export error=`expr $error +1`
1067  fi
1068  count=`expr $count - 1`
1069 done
1070 echo
1071 if [ $error != 0 ]
1072 then
1073  echo "There were $error copy error(s)."
1074  echo "Ask on PreCentral mvapp thread."
1075  cleanexit 1
1076 fi
1077  
1078 echo "Copy complete."
1079 echo "Check applications."
1080 echo "If issues, see PreCentral mvapp thread."
1081
1082 removelinks
1083
1084 }
1085 #-------------------------------------------------------------------------#
1086 # function: backup - perform tar backups
1087 #-------------------------------------------------------------------------#
1088 backup() 
1089 {
1090  echo "This will create backups for"
1091  echo "email, var apps and media apps."
1092  echo "This may take up2 10-20 minutes."
1093  echo "Will show progress of each file."
1094  
1095  echo -e "\nReady to continue? [n/Y]: \c"
1096    read answer
1097    case $answer in
1098     [Yy]*) continue;;
1099         *) return 0;;
1100   esac
1101
1102  
1103  echo "Performing backups of all apps..."
1104  cd /var/usr/palm/applications
1105  tar cvzf /media/internal/varappbackups.tgz .
1106  
1107  if [ -d /media/internal/.apps ]
1108  then
1109   cd /media/internal/.apps
1110   tar cvzf /media/internal/mediaappbackups.tgz .
1111  fi
1112  
1113  if [ -d /media/internal/.data ]
1114  then
1115   echo "Backing up email and attachments."
1116   cd /media/internal/.data
1117   tar cvzf /media/internal/mediaemail.tgz .
1118  fi
1119  
1120 echo
1121 echo "You may now perform the webOS update"
1122 echo "or run another backup just before update."
1123 echo "After webos update, run mvapp restorebk."
1124 echo
1125 }
1126
1127 #-------------------------------------------------------------------------#
1128 # function: restorebk - restore backups direct to new location
1129 #-------------------------------------------------------------------------#
1130 restorebk()  {
1131
1132 if [ ! -f /media/internal/mediaappbackups.tgz ]
1133 then
1134  echo "Backups dont exist."
1135  echo "Try mvapp postupd command. "
1136 fi 
1137
1138 echo "This will restore all of your media apps"
1139 echo -e "to the new location. Continue? [y/N]: \c"
1140   read answer
1141   case $answer in
1142    [Yy]*) continue;;
1143        *) cleanexit 0;;
1144   esac
1145   
1146 if [ ! -d $MEDIA ]
1147 then  
1148  mkdir $MEDIA
1149 fi
1150 cd /media/internal/.apps
1151 tar xvzf /media/internal/mediaappbackups.tgz 
1152
1153 echo
1154 echo "Restore complete.  Check your apps."
1155
1156 } #end of restorebk function
1157
1158 #-------------------------------------------------------------------------#
1159 # function: cleanup - post cleanup after webos update
1160 #-------------------------------------------------------------------------#
1161 cleanup()  {
1162
1163 echo "This will clean out .apps/data/backups"
1164 echo "created by mvapp. Do not continue"
1165 echo "until you have run mvapp postupd."
1166 echo
1167 echo -e "Continue? [y/N]: \c"
1168   read answer
1169   case $answer in
1170    [Yy]*) continue;;
1171        *) cleanexit 0;;
1172   esac
1173
1174 echo "Removing .apps folder..."
1175 rm -r /media/internal/.apps
1176
1177 cd /media/internal
1178 echo "Removing backups..."
1179 rm applinkbackup.tgz mediaemail.tgz  varappbackups.tgz mediaappbackups.tgz  >/dev/null 2>&1
1180
1181
1182 }
1183
1184 #-------------------------------------------------------------------------#
1185 # function: migrate - migrate linked apps after webos update
1186 #-------------------------------------------------------------------------#
1187 migrate() {
1188  cd $MEDIA
1189  ls | while read app
1190  do
1191   echo $app
1192   
1193   if [ ! -d $CRYPT ]
1194   then 
1195    echo "Migrate only works after OS update"
1196    echo "has been applied.  Firt do OS update"
1197    echo "and then run this command."
1198    cleanexit 1
1199   fi
1200   if [ ! -d $MEDIA ]
1201   then
1202    echo ".apps folder does not exist."
1203    echo "try mvapp postupd2"
1204    echo "or mvapp restorebk"
1205    cleanexit 1
1206   fi
1207   if [ "$app" = "*preware" ]
1208   then
1209    echo "Skipping Preware."
1210    continue
1211   fi
1212   if [ -h $VAR/$app ] 
1213   then
1214    rm $VAR/$app
1215   fi
1216   if [ -d $VAR/$app ]
1217   then 
1218     rm -r $VAR/$app
1219   fi
1220   if [ ! -d $VAR/$app ]
1221   then
1222    grep cryptofs /media/cryptofs/apps/usr/lib/ipkg/info/${app}*manifest >/dev/null 2>&1
1223    if [ $? != 0 ]
1224    then
1225     echo "Prepping migration: $app"
1226     mkdir $VAR/$app
1227     chmod 777 $VAR/$app
1228     cp $MEDIA/$app/appinfo.json $VAR/$app
1229     touch $VAR/$app
1230    fi
1231   fi
1232   if [ ! -d $CRYPT/$app ]
1233   then
1234    cp -rp $MEDIA/$app $CRYPT
1235   fi
1236   
1237  done
1238  
1239  cd /tmp
1240  echo "Complete.  Will now restart Luna."
1241  echo "If apps do not appear afterwards,"
1242  echo "run:  mvapp postupd"
1243  echo "Press Enter to Continue: "
1244  read junk
1245  (nohup sleep 5; initctl stop LunaSysMgr; sleep 5; initctl start LunaSysMgr) &
1246  
1247 }
1248
1249 #-------------------------------------------------------------------------#
1250 # function: postupd2 - alternate method based on ipkg lists
1251 #-------------------------------------------------------------------------#
1252 postupd2() {
1253
1254  cd $CRYPT
1255  if [ $? != 0 ]
1256  then 
1257   echo
1258   echo "Cannot cd into $CRYPT"
1259   echo "Must update webOS first"
1260   cleanexit 1
1261  fi
1262  
1263  ls | while read app
1264  do
1265    grep cryptofs /media/cryptofs/apps/usr/lib/ipkg/info/${app}*manifest >/dev/null 2>&1
1266    if [ $? != 0 ]
1267    then
1268     echo "Prepping migration: $app"
1269     if [ ! -d $VAR/$app ]
1270     then
1271      mkdir $VAR/$app
1272     fi
1273     if [ -f $CRYPT/$app/appinfo.json ]
1274     then
1275      cp $CRYPT/$app/appinfo.json $VAR/$app
1276     fi
1277     touch $VAR/$app
1278    fi
1279  done
1280  
1281  cd /tmp
1282  echo "Complete.  Will now restart Luna."
1283  echo "If apps do not appear afterwards,"
1284  echo "run: mvapp migrate"
1285  echo "Press Enter to Continue: "
1286  read junk
1287  (nohup sleep 5; initctl stop LunaSysMgr; sleep 5; initctl start LunaSysMgr) &
1288  
1289 }
1290
1291
1292 #-------------------------------------------------------------------------#
1293 # function: checkfd - check if fair dinkum is installed
1294 #-------------------------------------------------------------------------#
1295 checkfd() {
1296  if [ -f /usr/local/bin/ipkg ]
1297  then 
1298   echo "Fair Dinkum is installed and enabled."
1299  else
1300   echo "Fair Dinkum is NOT installed or enabled."
1301  fi
1302  
1303  ipkg -o /var list_installed |grep ipkgservice
1304  ipkg -o /var list_installed |grep preware
1305  
1306 } #endof checkfd
1307
1308 #-------------------------------------------------------------------------#
1309 # function: install latest development version
1310 #-------------------------------------------------------------------------#
1311 installdev() {
1312  echo "Installing latest development version."
1313  echo "Use \"ma\" instead of \"mvapp\"."
1314  cd /tmp
1315  wget http://gitorious.org/webos-internals/mvapp/blobs/raw/master/mvapp
1316  chmod 755 mvapp
1317  mv mvapp /usr/local/bin/ma  
1318  echo "Done. Type... ma"
1319 } #end of installdev function
1320
1321
1322 #-------------------------------------------------------------------------#
1323 # function: updatepreware - update to latest version of preware
1324 #-------------------------------------------------------------------------#
1325 updatepreware() {
1326 cd /tmp
1327 rm prew*
1328 rm org.webos*
1329 wget http://gitorious.org/webos-internals/bootstrap/blobs/raw/master/preware-bootstrap.sh
1330 #Alternatively, you can use this tiny URL: http://bit.ly/dDEMO
1331 sh preware-bootstrap.sh
1332 echo 
1333 echo "PreWare update complete..."
1334
1335 }
1336
1337 updatepreware2() {
1338 /usr/bin/ipkg -o /var update
1339 /usr/bin/ipkg -o /var install org.webosinternals.ipkgservice
1340 /usr/bin/ipkg -o /var install org.webosinternals.preware
1341 sh /var/usr/lib/ipkg/info/org.webosinternals.ipkgservice.postinst
1342
1343 }
1344
1345 #-------------------------------------------------------------------------#
1346 # function: updateterminal - update to latest version of terminal
1347 #-------------------------------------------------------------------------#
1348 updateterminal() {
1349 cd /tmp
1350 ipkg -o /var update
1351 ipkg -o /var install org.webosinternals.termplugin
1352 ipkg -o /var install org.webosinternals.terminal
1353
1354 }
1355
1356
1357 #-------------------------------------------------------------------------#
1358 # function: startup - startup items 
1359 #-------------------------------------------------------------------------#
1360 startup() {
1361
1362 clear
1363 echo
1364 echo "mvapp version: $VERSION"
1365
1366 mount -o remount,rw /
1367
1368 #create shortcut 'm'
1369 if [ ! -h /usr/local/bin/m ]
1370 then
1371  echo
1372  echo "Created shortcut to mvapp."
1373  echo "Can now use just 'm' to run 'mvapp'."
1374  echo
1375  ln -s /usr/local/bin/mvapp /usr/local/bin/m
1376 fi
1377
1378 if [ ! -f /usr/local/bin/mvappd ]
1379 then 
1380  cd /tmp
1381  wget http://gitorious.org/webos-internals/mvapp/blobs/raw/master/mvapp >/dev/null 2>&1
1382  chmod 755 mvapp
1383  mv mvapp /usr/local/bin/mvappd
1384 fi
1385
1386 df |grep /media/internal 2>&1 >/dev/null
1387 if [ $? != 0 ]
1388 then
1389  echo "USB drive is mounted to computer.  You must unmount from USB to use mvapp."
1390  code=100
1391  cleanexit $code
1392 fi  
1393
1394 }
1395 # end of startup function
1396
1397
1398
1399 #-------------------------------------------------------------------------#
1400 # main - begins here
1401 #-------------------------------------------------------------------------#
1402
1403 startup
1404
1405 case $COMMAND in
1406 c|"clean")
1407    cleanapp
1408    ;;
1409 ls|"list")
1410    listapps
1411    ;;
1412 lm|"listmoved")
1413    listmoved
1414    ;;
1415 ln|"link")
1416    linkapp
1417    ;;
1418 ul|"unlink")
1419    unlinkapp
1420    ;;
1421 bm|"bulkmv")
1422    bulkmv
1423    ;;
1424 ra|"restoreall")
1425    restoreall
1426    ;;
1427 "ftr")  # force tar restore
1428    BACKUP=1   
1429    unlinkapp
1430    ;;
1431 "rtb")  # remove all tar backups
1432    removetarbackups 
1433    ;;
1434 i|"info")
1435    info 
1436    ;;   
1437 d|"doctor"|"diag")
1438    diag |tee /media/internal/diagreport.rtf
1439    ;;
1440 "le"|"linkemail")
1441   linkemail
1442   ;;
1443 "ue"|"unlinkemail")
1444   unlinkemail
1445   ;;
1446 "s"|"search")
1447   search
1448   ;;
1449 "cl"|"checklinks")
1450   checklinks
1451   ;;
1452 "dev")
1453   installdev
1454   ;;
1455 "cfd"|"checkfd")
1456   checkfd
1457   ;;
1458 "upw"|"updatepreware")
1459   updatepreware
1460   ;;
1461 "upw2"|"updatepreware2")
1462   updatepreware2
1463   ;;
1464 "upt"|"updateterminal")
1465   updateterminal
1466   ;;
1467 "b"|"backup")
1468   backup
1469   ;;
1470 "rb"|"restorebk")
1471   restorebk
1472   ;;
1473 "postupd")
1474   postupd
1475   ;;
1476 "postupd2")
1477   postupd2
1478   ;;
1479 "rl")
1480   removelinks
1481   ;;
1482 "cleanup")
1483   cleanup
1484   ;;
1485 "migrate")
1486   migrate
1487   ;;
1488 *)
1489    usage 1
1490    ;;
1491 esac
1492
1493 cleanexit $code
1494