v0.4.2 - migrate and postupd2 commands added for post webOS update
[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.2
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 $MEDIA ]
1194   then
1195    echo ".apps folder does not exist."
1196    echo "try mvapp postupd2"
1197    echo "or mvapp restorebk"
1198    cleanexit 1
1199   fi
1200   if [ "$app" = "*preware" ]
1201   then
1202    echo "Skipping Preware."
1203    continue
1204   fi
1205   if [ -h $VAR/$app ] 
1206   then
1207    rm $VAR/$app
1208   fi
1209   if [ -d $VAR/$app ]
1210   then 
1211     rm -r $VAR/$app
1212   fi
1213   if [ ! -d $VAR/$app ]
1214   then
1215    grep cryptofs /media/cryptofs/apps/usr/lib/ipkg/info/${app}*manifest >/dev/null 2>&1
1216    if [ $? != 0 ]
1217    then
1218     echo "Prepping migration: $app"
1219     mkdir $VAR/$app
1220     chmod 777 $VAR/$app
1221     cp $MEDIA/$app/appinfo.json $VAR/$app
1222     touch $VAR/$app
1223    fi
1224   fi
1225   if [ ! -d $CRYPT/$app ]
1226   then
1227    cp -rp $MEDIA/$app $CRYPT
1228   fi
1229   
1230  done
1231  
1232  cd /tmp
1233  echo "Complete.  Will now restart Luna."
1234  echo "If apps do not appear afterwards,"
1235  echo "run:  mvapp postupd"
1236  echo "Press Enter to Continue: "
1237  read junk
1238  (nohup sleep 5; initctl stop LunaSysMgr; sleep 5; initctl start LunaSysMgr) &
1239  
1240 }
1241
1242 #-------------------------------------------------------------------------#
1243 # function: postupd2 - alternate method based on ipkg lists
1244 #-------------------------------------------------------------------------#
1245 postupd2() {
1246
1247  cd $CRYPT
1248  if [ $? != 0 ]
1249  then 
1250   echo "Cannot cd into $CRYPT"
1251   cleanexit 1
1252  fi
1253  
1254  ls | while read app
1255  do
1256    grep cryptofs /media/cryptofs/apps/usr/lib/ipkg/info/${app}*manifest >/dev/null 2>&1
1257    if [ $? != 0 ]
1258    then
1259     echo "Prepping migration: $app"
1260     if [ ! -d $VAR/$app ]
1261     then
1262      mkdir $VAR/$app
1263     fi
1264     if [ -f $CRYPT/$app/appinfo.json ]
1265     then
1266      cp $CRYPT/$app/appinfo.json $VAR/$app
1267     fi
1268     touch $VAR/$app
1269    fi
1270  done
1271  
1272  cd /tmp
1273  echo "Complete.  Will now restart Luna."
1274  echo "If apps do not appear afterwards,"
1275  echo "run: mvapp migrate"
1276  echo "Press Enter to Continue: "
1277  read junk
1278  (nohup sleep 5; initctl stop LunaSysMgr; sleep 5; initctl start LunaSysMgr) &
1279  
1280 }
1281
1282
1283 #-------------------------------------------------------------------------#
1284 # function: checkfd - check if fair dinkum is installed
1285 #-------------------------------------------------------------------------#
1286 checkfd() {
1287  if [ -f /usr/local/bin/ipkg ]
1288  then 
1289   echo "Fair Dinkum is installed and enabled."
1290  else
1291   echo "Fair Dinkum is NOT installed or enabled."
1292  fi
1293  
1294  ipkg -o /var list_installed |grep ipkgservice
1295  ipkg -o /var list_installed |grep preware
1296  
1297 } #endof checkfd
1298
1299 #-------------------------------------------------------------------------#
1300 # function: install latest development version
1301 #-------------------------------------------------------------------------#
1302 installdev() {
1303  echo "Installing latest development version."
1304  echo "Use \"ma\" instead of \"mvapp\"."
1305  cd /tmp
1306  wget http://gitorious.org/webos-internals/mvapp/blobs/raw/master/mvapp
1307  chmod 755 mvapp
1308  mv mvapp /usr/local/bin/ma  
1309  echo "Done. Type... ma"
1310 } #end of installdev function
1311
1312
1313 #-------------------------------------------------------------------------#
1314 # function: updatepreware - update to latest version of preware
1315 #-------------------------------------------------------------------------#
1316 updatepreware() {
1317 cd /tmp
1318 rm prew*
1319 rm org.webos*
1320 wget http://gitorious.org/webos-internals/bootstrap/blobs/raw/master/preware-bootstrap.sh
1321 #Alternatively, you can use this tiny URL: http://bit.ly/dDEMO
1322 sh preware-bootstrap.sh
1323 echo 
1324 echo "PreWare update complete..."
1325
1326 }
1327
1328 updatepreware2() {
1329 /usr/bin/ipkg -o /var update
1330 /usr/bin/ipkg -o /var install org.webosinternals.ipkgservice
1331 /usr/bin/ipkg -o /var install org.webosinternals.preware
1332 sh /var/usr/lib/ipkg/info/org.webosinternals.ipkgservice.postinst
1333
1334 }
1335
1336 #-------------------------------------------------------------------------#
1337 # function: updateterminal - update to latest version of terminal
1338 #-------------------------------------------------------------------------#
1339 updateterminal() {
1340 cd /tmp
1341 ipkg -o /var update
1342 ipkg -o /var install org.webosinternals.termplugin
1343 ipkg -o /var install org.webosinternals.terminal
1344
1345 }
1346
1347
1348 #-------------------------------------------------------------------------#
1349 # function: startup - startup items 
1350 #-------------------------------------------------------------------------#
1351 startup() {
1352
1353 clear
1354 echo
1355 echo "mvapp version: $VERSION"
1356
1357 mount -o remount,rw /
1358
1359 #create shortcut 'm'
1360 if [ ! -h /usr/local/bin/m ]
1361 then
1362  echo
1363  echo "Created shortcut to mvapp."
1364  echo "Can now use just 'm' to run 'mvapp'."
1365  echo
1366  ln -s /usr/local/bin/mvapp /usr/local/bin/m
1367 fi
1368
1369 if [ ! -f /usr/local/bin/mvappd ]
1370 then 
1371  cd /tmp
1372  wget http://gitorious.org/webos-internals/mvapp/blobs/raw/master/mvapp >/dev/null 2>&1
1373  chmod 755 mvapp
1374  mv mvapp /usr/local/bin/mvappd
1375 fi
1376
1377 df |grep /media/internal 2>&1 >/dev/null
1378 if [ $? != 0 ]
1379 then
1380  echo "USB drive is mounted to computer.  You must unmount from USB to use mvapp."
1381  code=100
1382  cleanexit $code
1383 fi  
1384
1385 }
1386 # end of startup function
1387
1388
1389
1390 #-------------------------------------------------------------------------#
1391 # main - begins here
1392 #-------------------------------------------------------------------------#
1393
1394 startup
1395
1396 case $COMMAND in
1397 c|"clean")
1398    cleanapp
1399    ;;
1400 ls|"list")
1401    listapps
1402    ;;
1403 lm|"listmoved")
1404    listmoved
1405    ;;
1406 ln|"link")
1407    linkapp
1408    ;;
1409 ul|"unlink")
1410    unlinkapp
1411    ;;
1412 bm|"bulkmv")
1413    bulkmv
1414    ;;
1415 ra|"restoreall")
1416    restoreall
1417    ;;
1418 "ftr")  # force tar restore
1419    BACKUP=1   
1420    unlinkapp
1421    ;;
1422 "rtb")  # remove all tar backups
1423    removetarbackups 
1424    ;;
1425 i|"info")
1426    info 
1427    ;;   
1428 d|"doctor"|"diag")
1429    diag |tee /media/internal/diagreport.rtf
1430    ;;
1431 "le"|"linkemail")
1432   linkemail
1433   ;;
1434 "ue"|"unlinkemail")
1435   unlinkemail
1436   ;;
1437 "s"|"search")
1438   search
1439   ;;
1440 "cl"|"checklinks")
1441   checklinks
1442   ;;
1443 "dev")
1444   installdev
1445   ;;
1446 "cfd"|"checkfd")
1447   checkfd
1448   ;;
1449 "upw"|"updatepreware")
1450   updatepreware
1451   ;;
1452 "upw2"|"updatepreware2")
1453   updatepreware2
1454   ;;
1455 "upt"|"updateterminal")
1456   updateterminal
1457   ;;
1458 "b"|"backup")
1459   backup
1460   ;;
1461 "rb"|"restorebk")
1462   restorebk
1463   ;;
1464 "postupd")
1465   postupd
1466   ;;
1467 "postupd2")
1468   postupd2
1469   ;;
1470 "rl")
1471   removelinks
1472   ;;
1473 "cleanup")
1474   cleanup
1475   ;;
1476 "migrate")
1477   migrate
1478   ;;
1479 *)
1480    usage 1
1481    ;;
1482 esac
1483
1484 cleanexit $code
1485