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