0.3.5c - check fair dinkum and preware versions
[webos-internals:djcin7s-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 doctor' 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 #-------------------------------------------------------------------------#
42
43
44 #-------------------------------------------------------------------------#
45 # variables: these are globally available to all functions
46 #-------------------------------------------------------------------------#
47 COMMAND=$1
48 APP=$2
49 VERSION=0.3.5c
50 MEDIA=/media/internal/.apps
51 VAR=/var/usr/palm/applications  # Do not change this
52
53 # TAR backups are no longer needed, recommend setting to 0
54 BACKUP=0  # set to 1 for tar backups, 0 to disable
55 BACKUPDIR=/media/internal/.appbackups
56
57 # This should be turned on.  Only turn off if javascript is calling this script.
58 PROMPTS=1
59
60 #-------------------------------------------------------------------------#
61 # exit codes for javascripts:
62 # function usage:
63 # 1 - normal usage error
64 # 100 - USB drive is mounted, cannot use mvapp
65 #
66 # function cleanapp:
67 # 0 - normal exit
68 # 30 - link for app does not exist
69 #
70 # function linkapp:
71 # 0  - normal exit
72 # 10 - app name not supplied
73 # 11 - link already exists
74 # 12 - app does not exist in VAR
75 # 13 - copy failed from VAR to MEDIA
76 # 14 - removing app from VAR failed
77 # 15 - APP has attributes not supported on FAT, did not move to MEDIA
78 # 16 - APP has no json file, did not move to MEDIA
79 # 17 - APP is running, need to close the app before moving
80 #
81 # function unlinkapp:
82 # 0  - normal exit
83 # 20 - app name not supplied
84 # 21 - app doesn't exist on MEDIA
85 # 22 - tar restore failed
86 # 23 - copy from MEDIA to VAR failed (only used if tar backup doesn't exist)
87 # 24 - remove from MEDIA failed
88 #
89 # function linkemail:
90 # 0  - normal exit
91 # 50 - 
92 # 51 - 
93 #
94 #-------------------------------------------------------------------------#
95
96 #-------------------------------------------------------------------------#
97 # function: cleanexit - exit with cleanup items
98 #-------------------------------------------------------------------------#
99
100 cleanexit () {
101  code=$1
102
103 # put / back to read only
104   mount -o remount,ro /
105
106 # Uncomment if you want verbose exit codes
107 # echo "exit code: $code"
108
109  exit $code
110 }
111 # end of cleanexit function
112
113
114 #-------------------------------------------------------------------------#
115 # function: usage - show command usage options
116 #-------------------------------------------------------------------------#
117 usage () {
118    exitcode=$1
119    if [ ! $exitcode ]
120    then
121      exitcode=1  # default exit code for usage, otherwise exit with incode
122    fi
123
124    echo "Usage:" 
125    echo "mvapp info <or> i                         - view mvapp homepage in phone browser" 
126    echo "mvapp link <or> ln domain.appname         - move app to media, create link"
127    echo "mvapp unlink <or> ul domain.appname       - restore app to var, remove link"
128    echo "mvapp clean <or> c domain.appname         - remove app dir and links"
129    echo "mvapp list <or> ls                        - list all apps sorted by size"
130    echo "mvapp bulkmv  <or> bm                     - move/link many apps"
131    echo "mvapp search <or> s appname               - search for apps to link/unlk/clean"
132    echo "mvapp listmoved <or> lm                   - list apps that have been moved"
133    echo "mvapp restoreall <or> ra                  - restore all apps to original"
134    echo 
135    echo "mvapp linkemail <or> le                   - move email/attach to media and link"
136    echo "mvapp unlinkemail <or> ue                 - restore email/attach to var, rm link"
137    echo
138    echo "mvapp doctor <or> d                       - report /var usage, diagnositics"
139    echo "mvapp doctor <or> d media                 - with size of apps on media (slow)"
140    echo
141
142   cleanexit $exitcode
143 }
144 # end of usage function
145
146 #-------------------------------------------------------------------------#
147 # function: info - launch the mvapp page on webosinternals
148 #-------------------------------------------------------------------------#
149
150 info () {
151 HOMEPAGE=http://www.webos-internals.org/wiki/Solution_to_App_Catalog_Installation_Limit
152
153 luna-send -n 1 palm://com.palm.applicationManager/launch {\"id\":\"com.palm.app.browser\",\"params\":{\"scene\":\"page\",\"target\":\"$HOMEPAGE\"}}  >/dev/null 2>&1
154
155 echo "View on the phone web browser..."
156
157 }
158 # end of info function
159
160
161 #-------------------------------------------------------------------------#
162 # function: cleanapp - removes symbolic links and folder in media and var
163 #-------------------------------------------------------------------------#
164
165 cleanapp () {
166
167  clear
168  mount -o remount,rw /
169
170  # exit to usage if no app name supplied
171  if [ ! $APP ]
172  then
173    echo "No app name supplied."
174    usage 1
175  fi
176
177  if [ -h $VAR/$APP ]
178  then
179   echo "Continue to remove all traces of $APP."
180  else
181   if [ -d $MEDIA/$APP ]
182   then
183    echo "Removing $MEDIA/$APP..."
184    rm -r $MEDIA/$APP
185   else 
186    echo "Nothing to remove."
187   fi
188   return 30
189  fi
190  
191             
192 # Continue on if PROMPTS turned off (call from outside app) 
193  if [ $PROMPTS -eq 1 ]  
194  then
195   echo "This will remove $APP from both...."
196   echo "$VAR and "
197   echo "$MEDIA"
198   echo
199   echo "FIRST ATTEMPT TO... remove the app "
200   echo "from Launcher or Homebrew installer."
201   echo
202   echo -e "Are you sure you want to remove.."
203   echo -e "$APP? [y/N]: \c"
204   read answer
205   case $answer in
206    [Yy]*) continue;;
207        *) cleanexit 0;;
208   esac
209  fi
210
211  echo "Size of $VAR before cleanup... "
212  /usr/bin/du -sh $VAR
213  df -m /var |grep /var |awk '{print "/var used: "$2,"MB " $4 " - avail: " $3,"MB"}'
214
215  if [ -d $MEDIA/$APP ]
216  then
217       rm -r $MEDIA/$APP
218       echo "Removed directory" $MEDIA/$APP
219  fi
220  if [ -d $VAR/$APP ]
221  then
222       rm -r $VAR/$APP
223       echo "Removed directory" $VAR/$APP
224       rm -r /var/usr/lib/ipkg/info/${APP}"*"
225  fi
226  if [ -h $VAR/$APP ]
227  then
228       rm -r $VAR/$APP
229       echo "Removed link" $VAR/$APP
230  fi
231  if [ -f $BACKUPDIR/$APP.tgz ]
232  then
233       rm -r $BACKUPDIR/$APP.tgz
234       echo "Removed tar backup" $BACKUPDIR/$APP.tgz
235  fi
236
237
238  # rescan luna in case it's needed
239  luna-send -n 1 palm://com.palm.applicationManager/rescan {} >/dev/null 2>&1
240  echo "$APP directories and links removed."
241  echo "Size of $VAR after cleanup... "
242  /usr/bin/du -sh $VAR
243  df -m /var |grep /var |awk '{print "/var used: "$2,"MB " $4 " - avail: " $3,"MB"}'
244  cleanexit 0
245 }
246 # end of cleanup function
247
248
249 #-------------------------------------------------------------------------#
250 # function: listapps - list the size of each app, sort showing largest last
251 #-------------------------------------------------------------------------#
252 listapps () {
253  echo "First number is size in KB. "
254  echo "Size of 0 is an app already linked."
255  cd $VAR
256  for i in `/usr/bin/du -s * | sort -n |cut -f 2`
257  do
258     APP=$i
259     SIZE=`/usr/bin/du -s $VAR/$APP |cut -f1`
260     TITLE=""
261     if [ -f $VAR/$APP/appinfo.json ]
262     then
263       TITLE=`grep title $VAR/$APP/appinfo.json |cut -d: -f2 |cut -d\" -f2`
264     fi
265     echo "$SIZE - $APP - $TITLE"
266  done
267  
268  cleanexit 0
269 }
270 # end of listapps function
271
272 #-------------------------------------------------------------------------#
273 # function: listmoved - list apps moved/linked, sort showing largest last
274 #-------------------------------------------------------------------------#
275 listmoved () {
276  
277  if [ ! -d $MEDIA ]
278  then
279   echo "No apps linked yet..."
280   cleanexit 1
281  fi
282  
283  echo "Generating list, hold please."
284  echo "This may take up to a minute..."
285  cd $MEDIA
286 # for i in `/usr/bin/du -s * | sort -n |cut -f 2`
287  for i in `ls -tr $MEDIA`
288  do
289     APP=$i
290     SIZE=`/usr/bin/du -s $MEDIA/$APP |cut -f1`
291     #SIZE=""
292     TITLE=""
293     if [ -f $MEDIA/$APP/appinfo.json ]
294     then
295       TITLE=`grep title $MEDIA/$APP/appinfo.json |cut -d: -f2 |cut -d\" -f2`
296     fi
297     echo "$SIZE - $APP - $TITLE"
298  done
299  cleanexit 0
300 }
301 # end of listmoved function
302
303
304 #-------------------------------------------------------------------------#
305 # function: linkapp - move the app to media and create symbolic link
306 #-------------------------------------------------------------------------#
307 linkapp () {
308
309  clear
310  
311  if [ ! $APP ]
312  then
313       echo -e "\nNo application supplied..."
314       usage 10
315  fi
316  
317   
318 # Check if the app is running 
319  luna-send -n 1 palm://com.palm.applicationManager/running {} 2>&1 | grep $APP >/dev/null 2>&1
320  if [ $? == 0 ]
321  then
322    echo -e "\n$APP is running.  \nClose the app before moving."
323    code=17
324    return $code
325  fi  
326  
327  if [ ! -f $VAR/$APP/appinfo.json ]
328  then
329     echo -e "\n$APP has no json file. \nRecommend not moving."
330     echo -e "\nMove anyway? [y/N]: \c"
331     read answer
332     case $answer in
333      [Yy]*) echo "Continuing with install...";;
334          *) code=16; return $code;;
335     esac
336  fi   
337
338  if [ ! -d $MEDIA ]
339  then
340       mkdir $MEDIA
341  fi
342
343  if [ -h $VAR/$APP ]
344  then
345       echo -e "Link already exists for... \n${APP}"
346       cleanexit 11
347  fi
348
349  TITLE=`grep title $VAR/$APP/appinfo.json |cut -d: -f2 |cut -d\" -f2`
350  
351  mount -o remount,rw /
352
353  if [ -d $VAR/$APP ]
354  then
355    echo -e "\nMoving... \n$APP \n$TITLE \nto $MEDIA..."
356  else
357    echo "$APP does not exist..."
358    usage 12
359  fi
360
361  
362  mount -o remount,rw /
363
364  echo -e "\nSize before move... "
365  /usr/bin/du -sh $VAR
366  df -m /var |grep /var |awk '{print "/var used: "$2,"MB " $4 " - avail: " $3,"MB"}'
367  echo
368   
369
370  # move over to USB drive
371  cp -rp  $VAR/$APP $MEDIA >/tmp/cpresult.out 2>&1
372  if [ -s /tmp/cpresult.out ]
373  then
374   grep "cannot preserve" /tmp/cpresult.out >/dev/null 2>&1
375   if [ $? = 0 ]
376   then
377    echo
378    echo -e "\n$APP \nCANNOT BE MOVED as it \ncontains special attributes."
379    echo "Leaving app in original location."
380    echo -e "This is not an error message.  \nmvapp properly handled this."
381    code=15
382    rm -r $MEDIA/$APP
383    rm /tmp/cpresult.out
384    return $code
385   else
386    echo -e "Copy failed. \nLeaving app in original location."
387    code=13
388   fi
389   rm -r $MEDIA/$APP
390   rm /tmp/cpresult.out
391   return $code
392  fi
393                   
394
395 # Backup using tar if enabled
396  if [ $BACKUP -eq 1 ]
397  then
398    if [ ! -d $BACKUPDIR ]
399    then
400     mkdir $BACKUPDIR
401    fi
402    echo -e "Backing up $APP $TITLE \nto $BACKUPDIR using tar..."
403    tar czf $BACKUPDIR/${APP}.tgz $VAR/$APP 2>&1 >/dev/null
404  fi
405
406  rm -r $VAR/$APP
407  if [ $? != 0 ]
408  then
409   echo -e "Remove failed. \nLeaving app in original location."
410   rm -r $MEDIA/$APP
411   cleanexit 14
412  fi
413
414  # create the symbolic link
415  ln -s $MEDIA/$APP $VAR/$APP
416
417  # rescan luna in case it's needed
418  luna-send -n 1 palm://com.palm.applicationManager/rescan {} >/dev/null 2>&1
419
420  echo -e "$APP \nSUCCESSFULLY moved and linked."
421  echo -e "\nSize after move... "
422  /usr/bin/du -sh $VAR
423  df -m /var |grep /var |awk '{print "/var used: "$2,"MB " $4 " - avail: " $3,"MB"}'
424 }
425 # end of linkapp function
426
427
428 #-------------------------------------------------------------------------#
429 # function: unlinkapp -  restore the app to var and remove symbolic link
430 #-------------------------------------------------------------------------#
431 unlinkapp () {
432
433  if [ ! $APP ]
434  then
435    echo "No application supplied..."
436    usage 20
437  fi
438
439  mount -o remount,rw /
440
441  if [ -d $MEDIA/$APP ]
442  then
443    echo "Restoring $APP..."
444  else
445    echo -e "\n$APP does not exist \nor was not moved.\n\n"
446    cleanexit 21
447  fi
448
449  echo "Size of $VAR before move... "
450  /usr/bin/du -sh $VAR
451  df -m /var |grep /var |awk '{print "/var used: "$2,"MB " $4 " - avail: " $3,"MB"}'
452
453  # remove the old symbolic link
454  rm -r $VAR/$APP
455
456  # move to original location or restore from tar if it exists
457  if [ -f $BACKUPDIR/$APP.tgz ] && [ $BACKUP -eq 1 ]
458  then
459   echo "Restoring from tar backup...."
460   cd /
461   tar xzf $BACKUPDIR/$APP.tgz
462   if [ $? -ne 0 ]
463   then
464    echo "Tar restore FAILED. Remove and restore app using official webOS/Pre methods."
465    cleanexit 22
466   else
467    rm -r $BACKUPDIR/$APP.tgz
468   fi
469  else
470   echo "Restoring from $MEDIA..."
471   cp -r  $MEDIA/$APP $VAR
472   if [ $? != 0 ]
473   then
474    echo -e "Copy FAILED. \nLeaving app in $MEDIA."
475    cleanexit 23
476   fi
477  fi
478
479  rm -r $MEDIA/$APP
480  if [ $? != 0 ]
481  then
482   echo -e "Remove FAILED. \nLeaving app in $MEDIA."
483   rm -r $VAR/$APP
484   cleanexit 24
485  fi
486
487  # rescan luna in case it's needed
488  luna-send -n 1 palm://com.palm.applicationManager/rescan {} >/dev/null 2>&1
489
490  echo -e "$APP \nmoved and unlinked SUCCESSFULLY."
491  echo "Size after move... "
492  /usr/bin/du -sh $VAR
493  df -m /var |grep /var |awk '{print "/var used: "$2,"MB " $4 " - avail: " $3,"MB"}'
494 }
495 # end of unlinkapp function
496
497 #-------------------------------------------------------------------------#
498 # function: bulkmv -  move/link many apps
499 #-------------------------------------------------------------------------#
500 bulkmv() {
501  echo
502  echo
503  echo "This allows moving many apps."
504  echo "Starting with the largest apps."
505  echo
506
507
508  mount -o remount,rw /
509  cd $VAR
510
511  for i in `/usr/bin/du -s * | sort -nr |cut -f 2`
512  do
513     export APP=$i
514     SIZE=`/usr/bin/du -sh $APP |cut -f 1`
515     TITLE=`grep title $VAR/$APP/appinfo.json 2>/dev/null |cut -d: -f2 |cut -d\" -f2`
516     echo
517     echo "------------------"
518     echo
519     echo -e "Size of $APP \n$TITLE \nis $SIZE."
520     
521     echo -e "\nWould you like to move and link...\n$TITLE? [y/N/q]: \c"
522     read answer
523     case $answer in
524     [Yy]*) linkapp;;
525     [Qq]*) cleanexit 0;;
526         *) echo "$APP not moved."
527            continue;;
528     esac
529
530     echo
531  done
532 }
533 # end of bulkmv function
534
535 #-------------------------------------------------------------------------#
536 # function: restoreall - restore all apps, back to /var
537 #-------------------------------------------------------------------------#
538 restoreall() {
539
540 #Only confirm if PROMPT turned on. (allows outside app to call) 
541   if [ $PROMPTS -eq 1 ]
542   then
543    echo "This will restore all applications back to original location"
544    echo "and remove the links.  Are you sure you want to continue? [y/N]:"
545    read answer
546    case $answer in
547     [Yy]*) continue;;
548         *) cleanexit 0;;
549    esac
550   fi
551
552   ls $MEDIA | while read APP
553   do
554     echo "Restoring $APP and unlinking..."
555     unlinkapp
556   done
557 }
558 # end of restoreall function
559
560 #-------------------------------------------------------------------------#
561 # function: removetarbackups -  remove entire tar backup directory
562 #-------------------------------------------------------------------------#
563 removetarbackups() {
564   echo "Tar backups are no longer needed and waste space on /media."
565   echo "Backups are located in $BACKUPDIR"
566   echo "Type \"remove\" to remove entire backup directory: "
567   read answer
568   case $answer in
569    [Rr]emove) echo "Removing $BACKUPDIR..."
570               if [ -d $BACKUPDIR ] 
571                then
572                rm -r $BACKUPDIR
573               fi  
574               ;;
575   esac        
576 }
577 # end of removetarbackups function
578
579 #-------------------------------------------------------------------------#
580 # function: checklinks - check to make sure links match .apps
581 #-------------------------------------------------------------------------#
582 checklinks() {
583
584 if [ ! -d $MEDIA ]
585 then
586  return 0
587 fi
588
589 echo "Checking abandoned links..."
590
591 #ls $MEDIA |while read app
592 for app in `ls $MEDIA`
593 do
594   if [ ! -h $VAR/$app ]
595   then
596     echo
597     echo "Missing link for..."
598     echo
599     echo "$app"
600     echo
601     echo "on media. \87Probably leftovers from"
602     echo "deleted app. Recommend removing."
603     echo
604     echo "Would you like"
605     echo -e "to remove the app? [y/N]: \c"
606     read answer
607     case $answer in
608       [Yy]*) rm -r $MEDIA/$app;;
609     esac
610   fi
611 done
612 } #end of checklinks function
613
614 #-------------------------------------------------------------------------#
615 # function: diag  - report var storage usage areas
616 #-------------------------------------------------------------------------#
617 doctor() {
618
619 echo
620 echo "Gathering diag report, hold please..."
621 if [ -d $MEDIA ] && [ $APP ]
622 then
623  mappsz=`/usr/bin/du -sm $MEDIA |cut -f1`
624 fi
625 #varused=df -m /var |grep /var |awk '{print ": "$2,"MB " $4 " - avail: " $3,"MB"}'
626 varused=`df -m /var |grep /var |awk '{print $2}'`
627 varpct=`df -m /var |grep /var |awk '{print $4}'`
628 varavail=`df -m /var |grep /var |awk '{print $3}'`
629 echo "var used:          ${varused}MB $varpct"
630 echo "var available:     ${varavail}MB"
631
632 appsz=`/usr/bin/du -sm $VAR |cut -f1`
633 echo "app used:          ${appsz}MB on /var"
634
635 numapps=`ls $VAR |wc -l`
636 echo "# total apps:      $numapps"
637
638 if [ -d $MEDIA ]
639 then
640  nummapps=`ls $MEDIA |wc -l`
641  numvapps=`expr $numapps - $nummapps`
642  echo "# var apps:        $numvapps"
643  echo "# media apps:      $nummapps"
644 fi
645
646 if [ -d $MEDIA ] && [ $APP ]
647 then
648  echo "app used:          ${mappsz}MB on /media"
649  nummapps=`ls $MEDIA |wc -l`
650  echo "# media apps:      $nummapps"
651 fi
652
653 if [ -h /var/luna/data/emails ]
654 then
655  emailsz=`/usr/bin/du -sm /media/internal/.data/emails |cut -f1`
656  attachsz=`/usr/bin/du -sm /media/internal/.data/attachments |cut -f1`
657  echo "email used:        ${emailsz}MB on /media"
658  echo "attachmnt used:    ${attachsz}MB on /media"
659 else
660  emailsz=`/usr/bin/du -sm /var/luna/data/emails |cut -f1`
661  attachsz=`/usr/bin/du -sm /var/luna/data/attachments |cut -f1`
662  echo "email used:        ${emailsz}MB on /var"
663  echo "attach used:       ${attachsz}MB on /var"
664 fi
665
666 softtemp=`/usr/bin/du -sm /var/lib/software/tmp |cut -f1`
667 echo "var tmp used:      ${softtemp}MB"
668
669 optsz=0
670 if [ -d /opt ]
671 then
672 optsz=`/usr/bin/du -sm /opt |cut -f1`
673 echo "opt used:          ${optsz}MB"
674 fi
675
676 ipkglist=`/usr/bin/du -sm /var/usr/lib/ipkg/lists |cut -f1`
677 echo "ipkg lists:        ${ipkglist}MB"
678
679 echo
680 echo "Recommendations..."
681 echo
682 echo "- Keep \"var used\" well below 100MB."
683
684
685 if [ $varused -gt "100" ]
686 then
687  echo
688  echo "- Consider reducing space on /var."
689  echo "/var use is greater than 100MB."
690 fi
691 if [ $softtemp -gt 1 ]
692 then
693  echo
694  echo "- Check Updates app."
695  echo "/var/lib/software/tmp is larger"
696  echo "than it should be.  May have an"
697  echo "update waiting to be applied."
698  echo
699 fi
700 if [ $appsz -gt "20" ]
701 then
702  echo
703  echo "- Consider moving apps: mvapp bulkmv"
704 fi
705
706 totalsz=`expr $emailsz + $attachsz`
707 if [ ! -h /var/luna/data/emails ] && [ $totalsz -gt "10" ]
708 then
709  echo
710  echo "- Consider moving email: mvapp linkemail"
711 fi
712 if [ $optsz -gt 10 ] && [ $varused -gt 100 ]
713 then
714  echo
715  echo "- Consider removing optware packages."
716  echo "You have optware software installed."
717  echo "See: ipkg-opt list_installed"
718  echo " Do: ipkg-opt remove ipkg"
719  echo "Ask on PreCentral."
720 fi
721 if [ $ipkglist -gt 10 ]
722 then
723  echo
724  echo "- ipkg list size is rather large."
725  echo "check /var/usr/lib/ipkg/lists"
726  ls -l |awk '{print  $5 "\t"  $9}'
727    
728 fi
729
730
731 echo
732 echo "This report is available on media"
733 echo "drive as... diagreport.rtf"
734 } # end of doctor function
735
736 #-------------------------------------------------------------------------#
737 # function: linkemail - move/link email and attachments to /media
738 #-------------------------------------------------------------------------#
739 linkemail() {
740 vdata=/var/luna/data
741 mdata=/media/internal/.data
742
743  echo "This will move email and attachments"
744  echo "to the media drive.  It is unknown"
745  echo "if there will be email issues when"
746  echo "Palm upgrades webOS.  See \"mvapp "
747  echo "info\" for details."
748  echo
749  echo "If you are writing a new email,"
750  echo "complete and send before continuing."
751  echo
752  echo -e "Do you want to continue? [y/N]: \c"
753  read answer
754  case $answer in
755    [Yy]*) continue;;
756        *) cleanexit 0;;
757  esac
758  
759  if [ -h $vdata/emails ]
760  then
761   echo "email link already exists."
762   cleanexit 0
763  fi
764  
765  echo "Closing email application and background service..."
766  luna-send -n 1 palm://com.palm.applicationManager/running {} 2>&1 \
767  | tr  '{' '\n' | grep com.palm.app.email |cut -d: -f3 |cut -d"\"" -f2 \
768  | while read it
769  do
770   echo $it
771   luna-send -n 1 "palm://com.palm.applicationManager/close" "{\"processId\":\"$it\"}"
772  done
773  
774  
775  if [ ! -d $mdata ]
776  then
777   mkdir $mdata
778  fi
779
780
781  #move email to media and create link
782  echo "Do not close Terminal during moves."
783  echo "Moves could take several minutes."
784  echo "Moving/linking email. "
785  cp -rp $vdata/emails $mdata 2>&1 >/tmp/cpemail.out
786   if [ -s /tmp/cpemail.out ]
787   then
788    echo "Copying email failed. Leaving email in place."
789    cleanexit 52
790   fi  
791 #mv $vdata/emails $vdata/emails.$$
792  rm -r $vdata/emails
793  ln -s $mdata/emails $vdata/emails
794
795  
796  #move attachments to media and create link
797  echo "Moving/linking attachments..."
798  cp -rp $vdata/attachments $mdata 2>&1 >/tmp/cpemail.out
799   if [ -s /tmp/cpemail.out ]
800   then
801    echo "Copying attachments failed. Leaving attachments in place."
802    cleanexit 53
803   fi  
804 #mv $vdata/attachments $vdata/attachments.$$
805  rm -r $vdata/attachments
806  ln -s $mdata/attachments $vdata/attachments
807  
808  #starup email process
809  echo "Starting up email..."
810  luna-send -n 1 palm://com.palm.applicationManager/launch {\"id\":\"com.palm.app.email\"}  >/dev/null 2>&1
811  
812  echo
813  echo "SUCCESSFUL: Confirm you can access your email."
814  echo
815  echo "NOTE: First time you run email,"
816  echo "it may ask if you want to add "
817  echo "accounts.  Press Done."
818
819 } #end of link email function
820
821 #-------------------------------------------------------------------------#
822 # function: unlinkemail - move email and attachments to /media
823 #-------------------------------------------------------------------------#
824 unlinkemail() {
825 vdata=/var/luna/data
826 mdata=/media/internal/.data
827
828
829  if [ ! -d $mdata/emails ]
830  then
831   echo "no email on media"
832   cleanexit 60
833  fi
834  
835  if [ ! -h $vdata/emails ]
836  then
837   echo "email link does not exist on /var"
838   cleanexit 61
839  fi
840  
841  echo "Closing email application and background service..."
842  luna-send -n 1 palm://com.palm.applicationManager/running {} 2>&1 \
843   | tr  '{' '\n' | grep com.palm.app.email |cut -d: -f3 |cut -d"\"" -f2 \
844   | while read it
845   do
846    echo $it
847    luna-send -n 1 "palm://com.palm.applicationManager/close" "{\"processId\":\"$it\"}"
848   done
849  
850  echo "Do not close Terminal during restore."
851  echo "Restore could take several minutes."
852  echo "Restoring email to /var..."
853  # rm the email link
854  rm $vdata/emails
855  # cp email from media to var
856  cp -rp $mdata/emails $vdata 2>&1 >/tmp/cpemail.out
857  if [ -s /tmp/cpemail.out ]
858  then
859    echo "copying email back to /var failed."
860    cleanexit 62
861  fi  
862  rm -r $mdata/emails
863  
864  echo "Restoring attachments to /var..."
865  # rm the attachment link
866  rm $vdata/attachments
867  # cp attachments from media to var
868  cp -rp $mdata/attachments $vdata 2>&1 >/tmp/cpemail.out
869  if [ -s /tmp/cpemail.out ]
870  then
871    echo "copying attachments back to /var failed."
872    cleanexit 63
873  fi  
874  
875  rm -r $mdata/attachments
876  
877  #starup email process
878  echo "Starting up email..."
879  luna-send -n 1 palm://com.palm.applicationManager/launch {\"id\":\"com.palm.app.email\"} >/dev/null 2>&1
880  
881  echo
882  echo "SUCCESSFUL: Confirm you can access your email."
883  
884 } #end of unlinkemail function
885
886 #-------------------------------------------------------------------------#
887 # function: search - search for partial app names
888 #-------------------------------------------------------------------------#
889 search() {
890
891  echo
892
893  for i in `ls -dt $VAR/*${APP}* $MEDIA/*${APP}* |sort ` 
894  do
895    export TITLE=""
896     if [ -f $i/appinfo.json ]
897     then
898       TITLE=`grep title $i/appinfo.json |cut -d: -f2 |cut -d\" -f2`
899     fi
900    echo "Found...."
901    echo $TITLE
902    APP=`basename $i`
903    echo $APP
904    echo
905    
906    if [ -h $VAR/$APP ]
907    then
908     echo "App is currently linked to media."
909    else
910     if [ -d $MEDIA/$APP ]
911     then 
912      echo "App is on media drive but has no link."
913     else
914      echo "App is in original location, not linked."
915     fi
916    fi
917    
918    echo -e "\nWould you like to link/unlink/clean/skip this app? [l/u/c/S/q]: \c"
919    read answer
920    case $answer in
921     l) mvapp link $APP;;
922     u) mvapp unlink $APP;;
923     c) mvapp clean $APP;;
924     q) cleanexit 0;;
925    esac
926    
927    echo -e "\n\n---------------------\n"
928    
929  done 
930  
931  echo 
932
933 } #end of search function
934
935
936 #-------------------------------------------------------------------------#
937 # function: checkfd - check if fair dinkum is installed
938 #-------------------------------------------------------------------------#
939 checkfd() {
940  if [ -f /usr/local/bin/ipkg ]
941  then 
942   echo "Fair Dinkum is installed."
943  else
944   echo "Fair Dinkum is NOT installed."
945  fi
946  
947  ipkg -o /var list_installed |grep ipkgservice
948  ipkg -o /var list_installed |grep preware
949  
950 }
951
952 #-------------------------------------------------------------------------#
953 # function: install latest development version
954 #-------------------------------------------------------------------------#
955 installdev() {
956  echo "Installing latest development version."
957  echo "Use \"ma\" instead of \"mvapp\"."
958  cd /tmp
959  wget http://gitorious.org/webos-internals/mvapp/blobs/raw/master/mvapp
960  chmod 755 mvapp
961  mv mvapp /usr/local/bin/ma  
962  echo "Done. Type... ma"
963 } #end of installdev function
964
965 #-------------------------------------------------------------------------#
966 # function: startup - startup items 
967 #-------------------------------------------------------------------------#
968 startup() {
969
970 clear
971 echo
972 echo "mvapp version: $VERSION"
973
974 mount -o remount,rw /
975
976 #create shortcut 'm'
977 if [ ! -h /usr/local/bin/m ]
978 then
979  echo
980  echo "Created shortcut to mvapp."
981  echo "Can now use just 'm' to run 'mvapp'."
982  echo
983  ln -s /usr/local/bin/mvapp /usr/local/bin/m
984 fi
985
986 df |grep /media/internal 2>&1 >/dev/null
987 if [ $? != 0 ]
988 then
989  echo "USB drive is mounted to computer.  You must unmount from USB to use mvapp."
990  code=100
991  cleanexit $code
992 fi  
993
994 }
995 # end of startup function
996
997
998
999 #-------------------------------------------------------------------------#
1000 # main - begins here
1001 #-------------------------------------------------------------------------#
1002
1003 startup
1004
1005 case $COMMAND in
1006 c|"clean")
1007    cleanapp
1008    ;;
1009 ls|"list")
1010    listapps
1011    ;;
1012 lm|"listmoved")
1013    listmoved
1014    ;;
1015 ln|"link")
1016    linkapp
1017    ;;
1018 ul|"unlink")
1019    unlinkapp
1020    ;;
1021 bm|"bulkmv")
1022    bulkmv
1023    ;;
1024 ra|"restoreall")
1025    restoreall
1026    ;;
1027 "ftr")  # force tar restore
1028    BACKUP=1   
1029    unlinkapp
1030    ;;
1031 "rtb")  # remove all tar backups
1032    removetarbackups 
1033    ;;
1034 i|"info")
1035    info 
1036    ;;   
1037 d|"doctor"|"diag")
1038    doctor |tee /media/internal/diagreport.rtf
1039    ;;
1040 "le"|"linkemail")
1041   linkemail
1042   ;;
1043 "ue"|"unlinkemail")
1044   unlinkemail
1045   ;;
1046 "s"|"search")
1047   search
1048   ;;
1049 "cl"|"checklinks")
1050   checklinks
1051   ;;
1052 "dev")
1053   installdev
1054   ;;
1055 "checkfd")
1056   checkfd
1057   ;;
1058 *)
1059    usage 1
1060    ;;
1061 esac
1062
1063 cleanexit $code
1064