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