Magellan Linux

Contents of /trunk/mage/usr/lib/mage/mage3.functions.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 60 - (show annotations) (download) (as text)
Tue Feb 15 22:59:14 2005 UTC (19 years, 2 months ago) by niro
File MIME type: application/x-sh
File size: 29699 byte(s)
rev bump to 0.3.6-r13

1 #!/bin/bash
2 # Magellan Linux Installer Functions (mage.functions.sh)
3 # version: 0.3.6-r13
4
5 mage_setup() {
6 install -d $INSTALLDB
7 }
8
9 fatal_error() {
10 #$1 is the missing file
11 echo -e "\nFatal Error: Package seemed to be corrupt."
12 echo -e "$1 was not found in ${PKGNAME}"
13 exit 1
14 }
15
16 build_unpackpkg() {
17 tar xjmf ${PKGDIR}/${PKGNAME}.${PKGSUFFIX} -C ${BUILDDIR}
18 }
19
20 update_mtime() {
21 local M_MTIME
22 DB_ENTRY=${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}
23
24 #forcing mtime to same value
25 echo
26 echo -n ">>>> Forcing mtime to the same value ..."
27 #find ${BUILDDIR}/${PKGNAME}/binfiles \
28 # -exec touch -m -r ${BUILDDIR}/${PKGNAME}/.mtime '{}' ';' \
29 # && echo done || echo false
30
31
32 #get new M_MTIME from .mtime
33 M_MTIME=$(stat -c %Y ${DB_ENTRY}/.mtime)
34
35 #updating .files db entries; only if not empty, or they get killed
36 if [ -e "${DB_ENTRY}/.files" ]
37 then
38 if [ -n "$(cat ${DB_ENTRY}/.files)" ]
39 then
40 #make backup
41 mv ${DB_ENTRY}/.files \
42 ${DB_ENTRY}/.files-old
43
44 #sets fieldseperator to "§" instead of " "
45 IFS=§
46
47 #update
48 while read pathto posix user group mtime md5sum
49 do
50 echo "${pathto}§${posix}§${user}§${group}§${M_MTIME}§${md5sum}" \
51 >> ${DB_ENTRY}/.files
52 touch -m -r ${DB_ENTRY}/.mtime ${pathto}
53 done < ${DB_ENTRY}/.files-old
54
55 #remove old list
56 rm -f ${DB_ENTRY}/.files-old
57
58 #very important: unsetting the '§' fieldseperator
59 unset IFS
60 fi
61 else
62 fatal_error .files
63 fi
64
65
66 #updating .symlink db entries; only if not empty, or they get killed
67 if [ -e "${DB_ENTRY}/.symlinks" ]
68 then
69 if [ -n "$(cat ${DB_ENTRY}/.symlinks)" ]
70 then
71 #make backup
72 mv ${DB_ENTRY}/.symlinks \
73 ${DB_ENTRY}/.symlinks-old
74
75 #sets fieldseperator to "§" instead of " "
76 IFS=§
77
78 #update
79 while read pathto posix link mtime
80 do
81 echo "${pathto}§${posix}§${link}§${M_MTIME}" \
82 >> ${DB_ENTRY}/.symlinks
83 touch -m -r ${DB_ENTRY}/.mtime ${pathto}
84 done < ${DB_ENTRY}/.symlinks-old
85
86 #remove old list
87 rm -f ${DB_ENTRY}/.symlinks-old
88
89 #very important: unsetting the '§' fieldseperator
90 unset IFS
91 fi
92 else
93 fatal_error .symlinks
94 fi
95 }
96
97 ###################################################
98 # function install_direcories #
99 # install_direcories $PKGNAME #
100 ###################################################
101 install_directories() {
102 local PKGNAME
103 PKGNAME=$1
104
105 if [ -e ${BUILDDIR}/${PKGNAME}/.dirs ]
106 then
107
108 #sets fieldseperator to "§" instead of " "
109 IFS=§
110
111 while read pathto posix user group
112 do
113 if [ ! -z "$pathto" ]
114 then
115 if [ "$VERBOSE" == "on" ]
116 then
117 echo -e "\t>>> DIR: $pathto"
118 fi
119 install -m $posix -o $user -g $group -d "$pathto"
120 fi
121 done < ${BUILDDIR}/${PKGNAME}/.dirs
122
123 #very important: unsetting the '§' fieldseperator
124 unset IFS
125 else
126 fatal_error .dir
127 fi
128 }
129
130
131 ###################################################
132 # function install_files #
133 # install_files $PKGNAME #
134 ###################################################
135 install_files(){
136 local PKGNAME
137 local RETVAL
138 local COUNTER
139 local FILENAME
140 local DESTINATION
141
142 PKGNAME=$1
143
144 if [ -e ${BUILDDIR}/${PKGNAME}/.files ]
145 then
146 #sets fieldseperator to "§" instead of " "
147 IFS=§
148
149 while read pathto posix user group mtime md5sum
150 do
151 if [ ! -z "${pathto}" ]
152 then
153 if [ "${VERBOSE}" == "on" ]
154 then
155 echo -e "\t>>> FILE: ${pathto}"
156 fi
157 ### kleiner notfall fix ###
158 if [ ! -d "$(dirname "${pathto}")" ]
159 then
160 install -d "$(dirname "${pathto}")"
161 fi
162
163 #when file exists, check if protected
164 if [ -e "${pathto}" ]
165 then
166 is_config_protected "${pathto}"
167 RETVAL=$?
168
169 # 0 - not protected #
170 # 1 - error #
171 # 2 - protected #
172 # 3 - protected but masked #
173
174 case ${RETVAL} in
175 #file is not protected - overwrite it
176 0|3)
177 FILE="$pathto"
178 install -m ${posix} -o ${user} -g ${group} \
179 ${BUILDDIR}/${PKGNAME}/binfiles/"$FILE" \
180 "$pathto"
181 ;;
182
183 #file is protected - write backup file
184 # "._cfg${COUNTER}_{FILENAME}
185 2)
186 #moves the cursor up
187 echo -en \\033[A
188 echo -e "${COLRED}! prot ${COLDEFAULT} === FILE: $pathto"
189 FILENAME="$(basename "${pathto}")"
190 FILE="$pathto"
191 COUNTER=$(count_protected_files "${FILE}")
192 DESTINATION="$(dirname "$pathto")/._cfg${COUNTER}_${FILENAME}"
193 install -m ${posix} -o ${user} -g ${group} \
194 ${BUILDDIR}/${PKGNAME}/binfiles/"$FILE" \
195 "${DESTINATION}"
196
197 #set run_etc_update=true
198 PROTECT_COUNT=${PROTECT_COUNT}+1
199 ;;
200 esac
201 else
202 #install file because it does not exists
203 FILE="$pathto"
204 install -m ${posix} -o ${user} -g ${group} \
205 ${BUILDDIR}/${PKGNAME}/binfiles/$FILE \
206 "$pathto"
207 fi
208
209 #not needed anymore ?
210 #if [ ! -z $user ]
211 #then
212 # chown $user:$group $FILE ### <---- test
213 #fi
214 fi
215 done < ${BUILDDIR}/${PKGNAME}/.files
216
217 #very important: unsetting the '§' fieldseperator
218 unset IFS
219 else
220 fatal_error .files
221 fi
222 }
223
224
225 ###################################################
226 # function install_symlinks #
227 # install_symlinks $PKGNAME #
228 ###################################################
229 install_symlinks() {
230 local PKGNAME
231 PKGNAME=$1
232
233 if [ -e ${BUILDDIR}/${PKGNAME}/.symlinks ]
234 then
235 #sets fieldseperator to "§" instead of " "
236 IFS=§
237
238 while read pathto posix link mtime
239 do
240 if [ ! -z "$pathto" ]
241 then
242 if [ "$VERBOSE" == "on" ]
243 then
244 echo -e "\t>>> LINK: $pathto"
245 fi
246 ln -snf $link "$pathto"
247 fi
248 done < ${BUILDDIR}/${PKGNAME}/.symlinks
249
250 #very important: unsetting the '§' fieldseperator
251 unset IFS
252 else
253 fatal_error .symlinks
254 fi
255 }
256
257
258 ###################################################
259 # function install_blockdevices #
260 # install_blockdevices $PKGNAME #
261 ###################################################
262 install_blockdevices() {
263 local PKGNAME
264 PKGNAME=$1
265
266 if [ -e ${BUILDDIR}/${PKGNAME}/.pipes ]
267 then
268 #sets fieldseperator to "§" instead of " "
269 IFS=§
270
271 while read pathto posix
272 do
273 if [ ! -z "$pathto" ]
274 then
275 if [ "$VERBOSE" == "on" ]
276 then
277 echo -e "\t>>> PIPE: $pathto"
278 fi
279 mkfifo -m $posix "$pathto"
280 fi
281 done < ${BUILDDIR}/${PKGNAME}/.pipes
282
283 #very important: unsetting the '§' fieldseperator
284 unset IFS
285 else
286 fatal_error .pipes
287 fi
288 }
289
290
291 ###################################################
292 # function install_characterdevices #
293 # install_characterdevices $PKGNAME #
294 ###################################################
295 install_characterdevices() {
296 local PKGNAME
297 PKGNAME=$1
298
299 if [ -e ${BUILDDIR}/${PKGNAME}/.char ]
300 then
301 #sets fieldseperator to "§" instead of " "
302 IFS=§
303
304 while read pathto posix
305 do
306 if [ ! -z "$pathto" ]
307 then
308 if [ "$VERBOSE" == "on" ]
309 then
310 echo -e "\t>>> CHAR: $pathto"
311 fi
312 mknode -m $posix -c "$pathto"
313 fi
314 done < ${BUILDDIR}/${PKGNAME}/.char
315
316 #very important: unsetting the '§' fieldseperator
317 unset IFS
318 else
319 fatal_error .char
320 fi
321
322 #very important: unsetting the '§' fieldseperator
323 unset IFS
324 }
325
326
327 ###################################################
328 # function build_doinstall #
329 # build_doinstall $PKGNAME #
330 # NOTE: this is an wrapper do install packages #
331 ###################################################
332 build_doinstall() {
333 #this is only a wrapper
334
335 # NOTE:
336 # !! we use § as field seperator !!
337 # doing so prevent us to get errors by filenames with spaces
338
339 local PKGNAME
340 PKGNAME=$1
341
342 install_directories ${PKGNAME}
343 install_files ${PKGNAME}
344 install_symlinks ${PKGNAME}
345 install_blockdevices ${PKGNAME}
346 install_characterdevices ${PKGNAME}
347 }
348
349
350 ###################################################
351 # function install_database_entry #
352 # install_database_entry $PKGNAME $PKGTYPE #
353 # PKGTYPE can be "virtual", "sources" or nothing #
354 ###################################################
355 install_database_entry(){
356 local PKGNAME
357 local PKGTYPE
358
359 PKGNAME=$1
360 PKGTYPE=$2
361
362 #add package to database
363 install -d ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}
364
365 #install mage-file to database
366 install -m 0644 -o root -g root \
367 ${MAGEFILE} \
368 ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}
369
370 # create fake file descriptors
371 # used by virtual and source packages
372 touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.dirs
373 touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.symlinks
374 touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.files
375 touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.pipes
376 touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.char
377 touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.mtime
378
379 #put category to database
380 echo ${CATEGORIE} > ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.categorie
381
382 #install PKGTYPE specific files
383 case ${PKGTYPE} in
384 virtual)
385 touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.virtual
386 ;;
387
388 sources)
389 touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.sources
390 ;;
391
392 *)
393 # normal packages needs these files
394 cp -f ${BUILDDIR}/${PKGNAME}/.{char,dirs,files,pipes,symlinks,mtime} \
395 ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}
396 ;;
397 esac
398 }
399
400
401 ###################################################
402 # function remove_database_entry #
403 # remove_database_entry $PKGNAME $PKGTYPE #
404 # PKGTYPE can be "virtual", "sources" or nothing #
405 ###################################################
406 remove_database_entry(){
407 local PKGNAME
408 local PKGTYPE
409
410 PKGNAME=$1
411 PKGTYPE=$2
412
413 #removes database entry
414 if [ -d ${INSTALLDB}/${PKGNAME} ]
415 then
416 rm -rf ${INSTALLDB}/${PKGNAME}
417 fi
418 }
419
420
421 ###################################################
422 # function compare_mtime #
423 # compare_mtime $PKGNAME /path/to/file #
424 # #
425 # returns: #
426 # 0=delete me #
427 # 1=keep me #
428 # #
429 # compares mtime of given files in packages #
430 ###################################################
431 compare_mtime(){
432 local DBDIR
433 local pathto
434 local x
435
436 DBDIR=$1
437 pathto=$2
438
439 M_MTIME=$(stat -c %Y ${INSTALLDB}/${DBDIR}/.mtime)
440
441 #if $pathto is a symlink than compare linked binary
442 if [ -L ${pathto} ]
443 then
444 #readlink -f resolves full path of linked file
445 x=$(stat -c %Y "$(readlink -f "${pathto}")")
446 else
447 x=$(stat -c %Y "${pathto}")
448 fi
449
450 if [ "${M_MTIME}" -eq "${x}" ]
451 then
452 #echo "delete me: ${pathto}"
453 return 0
454 else
455 #echo "keep me : ${pathto}"
456 return 1
457 fi
458 }
459
460
461 ###################################################
462 # function remove_symlinks #
463 # remove_symlinks $PKGNAME #
464 ###################################################
465 remove_symlinks() {
466 local PKGNAME
467 local RETVAL
468
469 PKGNAME=$1
470
471 if [ -e ${INSTALLDB}/${PKGNAME}/.symlinks ]
472 then
473 #sets fieldseperator to "§" instead of " "
474 IFS=§
475
476 while read pathto posix link mtime
477 do
478 if [ ! -z "$pathto" ]
479 then
480 if [ -L "$pathto" ]
481 then
482 compare_mtime ${PKGNAME} "${pathto}"
483 RETVAL=$?
484 # 0=delete me #
485 # 1=keep me #
486 case ${RETVAL} in
487 0)
488 echo -e "\t<<< LINK: $pathto"
489 rm "$pathto"
490 ;;
491 1)
492 echo -e "${COLRED}! mtime${COLDEFAULT} === LINK: $pathto"
493 ;;
494 esac
495 else
496 echo -e "${COLRED}! exist${COLDEFAULT} === LINK: $pathto"
497 fi
498 fi
499 done < ${INSTALLDB}/${PKGNAME}/.symlinks
500
501 #very important: unsetting the '§' fieldseperator
502 unset IFS
503 else
504 fatal_error .symlinks
505 fi
506 }
507
508
509 ###################################################
510 # function remove_files #
511 # remove_files $PKGNAME #
512 ###################################################
513 remove_files() {
514 local PKGNAME
515 local RETVAL
516
517 PKGNAME=$1
518
519 #uninstall of files
520 if [ -e ${INSTALLDB}/${PKGNAME}/.files ]
521 then
522 #sets fieldseperator to "§" instead of " "
523 IFS=§
524
525 while read pathto posix user group mtime md5sum
526 do
527 if [ ! -z "$pathto" ]
528 then
529 if [ -e "$pathto" ]
530 then
531 compare_mtime ${PKGNAME} "${pathto}"
532 RETVAL=$?
533 # 0=delete me #
534 # 1=keep me #
535 case ${RETVAL} in
536 0)
537 echo -e "\t<<< FILE: $pathto"
538 rm "$pathto"
539 ;;
540 1)
541 echo -e "${COLRED}! mtime${COLDEFAULT} === FILE: $pathto"
542 ;;
543 esac
544 else
545 echo -e "${COLRED}! exist${COLDEFAULT} === FILE: $pathto"
546 fi
547 fi
548 done < ${INSTALLDB}/${PKGNAME}/.files
549
550 #very important: unsetting the '§' fieldseperator
551 unset IFS
552 else
553 fatal_error .files
554 fi
555 }
556
557
558 ###################################################
559 # function remove_blockdevices #
560 # remove_blockdevices $PKGNAME #
561 ###################################################
562 remove_blockdevices() {
563 local PKGNAME
564 PKGNAME=$1
565
566 if [ -e ${INSTALLDB}/${PKGNAME}/.pipes ]
567 then
568 #sets fieldseperator to "§" instead of " "
569 IFS=§
570
571 while read pathto posix
572 do
573 if [ ! -z "$pathto" ]
574 then
575 echo -e "\t<<< PIPE: $pathto"
576 rm "$pathto"
577 fi
578 done < ${INSTALLDB}/${PKGNAME}/.pipes
579
580 #very important: unsetting the '§' fieldseperator
581 unset IFS
582 else
583 fatal_error .pipes
584 fi
585 }
586
587
588 ###################################################
589 # function remove_characterdevices #
590 # remove_characterdevices $PKGNAME #
591 ###################################################
592 remove_characterdevices() {
593 local PKGNAME
594 PKGNAME=$1
595
596 if [ -e ${INSTALLDB}/${PKGNAME}/.char ]
597 then
598 #sets fieldseperator to "§" instead of " "
599 IFS=§
600
601 while read pathto posix
602 do
603 if [ ! -z "$pathto" ]
604 then
605 echo -e "\t<<< CHAR: $pathto"
606 rm "$pathto"
607 fi
608 done < ${INSTALLDB}/${PKGNAME}/.char
609
610 #very important: unsetting the '§' fieldseperator
611 unset IFS
612 else
613 fatal_error .char
614 fi
615 }
616
617
618 ###################################################
619 # function remove_direcories #
620 # remove_direcories $PKGNAME #
621 ###################################################
622 remove_directories() {
623 local PKGNAME
624 PKGNAME=$1
625
626 #uninstall of dirs ## added small hack to fix dirs
627 # must be reverse -> smage2 doesn't sort them
628 if [ -e ${INSTALLDB}/${PKGNAME}/.dirs ]
629 then
630
631 #sort directory order
632 mv ${INSTALLDB}/${PKGNAME}/.dirs ${INSTALLDB}/${PKGNAME}/.dirs_old
633 cat ${INSTALLDB}/${PKGNAME}/.dirs_old | sort > ${INSTALLDB}/${PKGNAME}/.dirs
634
635 #sets fieldseperator to "§" instead of " "
636 IFS=§
637
638 while read pathto posix
639 do
640 if [ ! -z "$pathto" ]
641 then
642 if [ -e "$pathto" ]
643 then
644 echo -e "\t<<< DIR: $pathto"
645 rmdir "$pathto" &> /dev/null
646 if [ "$?" -ne "0" ]
647 then
648 #moves the cursor up
649 echo -en \\033[A
650 echo -e "${COLRED}! empty${COLDEFAULT} === DIR: $pathto"
651 fi
652 else
653 echo -e "${COLRED}! exist${COLDEFAULT} === DIR: $pathto"
654 fi
655 fi
656 done < ${INSTALLDB}/${PKGNAME}/.dirs
657
658 #very important: unsetting the '§' fieldseperator
659 unset IFS
660 else
661 fatal_error .dirs
662 fi
663 }
664
665
666 ###################################################
667 # function build_douninstall #
668 # build_douninstall $PKGNAME #
669 # NOTE: this is an wrapper do remove packages #
670 ###################################################
671 build_douninstall() {
672 #this is only a wrapper
673
674 # NOTE:
675 # !! we use § as field seperator !!
676 # doing so prevent us to get errors by filenames with spaces
677
678 local PKGNAME
679 PKGNAME=$1
680
681 remove_symlinks ${PKGNAME}
682 remove_files ${PKGNAME}
683 remove_blockdevices ${PKGNAME}
684 remove_characterdevices ${PKGNAME}
685 remove_directories ${PKGNAME}
686 }
687
688 getpackages() {
689 if [ -z "$MIRRORS" ]
690 then
691 echo "You have no mirrors defined. Please edit your /etc/mage.rc."
692 exit 1
693 fi
694
695 local i
696 for i in $MIRRORS
697 do
698 wget \
699 --passive-ftp \
700 --tries 3 \
701 --continue \
702 --progress bar \
703 --directory-prefix=${PKGDIR} \
704 ${i}/packages/${PKGNAME}.${PKGSUFFIX}
705 if [ "$?" == "0" ]
706 then
707 break
708 else
709 continue
710 fi
711 done
712 }
713
714 syncmage() {
715 if [ -z "$RSYNC" ]
716 then
717 echo "You have no rsync-mirrors defined. Please edit your /etc/mage.rc."
718 exit 1
719 fi
720
721 local i
722 for i in $RSYNC
723 do
724 rsync \
725 --recursive \
726 --links \
727 --perms \
728 --times \
729 --devices \
730 --timeout=600 \
731 --verbose \
732 --compress \
733 --progress \
734 --stats \
735 --delete \
736 --delete-after \
737 $i $MAGEDIR
738 if [ "$?" == "0" ]
739 then
740 break
741 else
742 continue
743 fi
744 done
745
746 #clean up backup files (foo~)
747 find ${MAGEDIR} -name *~ -exec rm '{}' ';'
748 }
749
750 cleanpkg(){
751 if [ -d "$PKGDIR" ]
752 then
753 echo -n "Removing downloaded packages... "
754 rm -rf ${PKGDIR}/*
755 echo "done."
756 fi
757 }
758
759 ###################################################
760 # function keepfiles #
761 # keepfiles "$CATEGORIE/$PNAME" "$filename" #
762 # note wildchars allowed #
763 ###################################################
764 keepfiles() {
765 local name
766 local keep
767 name="`echo $1| cut -d '/' -f2`"
768 keep="$2"
769
770 DELPKG="`find ${INSTALLDB} -name ${name}*.mage`"
771 DELDIR="${INSTALLDB}/$(basename ${DELPKG} .mage)"
772 cp ${DELDIR}/.files ${DELDIR}/.files-orig
773 sed "s:${keep}::" \
774 ${DELDIR}/.files-orig > ${DELDIR}/.files
775 rm ${DELDIR}/.files-orig
776 }
777
778
779 ###################################################
780 # function injectpkg #
781 # injectpkg "$CATEGORIE/$PNAME" #
782 # note wildchars allowed #
783 ###################################################
784 injectpkg() {
785 local name
786 local categorie
787 local magename
788 name="`echo $1| cut -d '/' -f2`"
789 categorie="`echo $1| cut -d '/' -f1`"
790
791 INJPKG="`find ${MAGEDIR} -name ${name}-*.mage`"
792 for i in ${INJPKG}
793 do
794 magename="$(basename ${INJPKG} .mage)"
795 echo -e "Injecting fake package for ${COLBLUE}${categorie}${COLDEFAULT}/${COLGREEN}${magename}${COLDEFAULT}"
796 install -d ${INSTALLDB}/${magename}
797 touch ${INSTALLDB}/${magename}/{.injected,.files,.dirs,.symlinks,.pipes,.char}
798
799 #installs magefile
800 install -m 0644 -o root -g root \
801 ${MAGEDIR}/${categorie}/${magename}.mage \
802 ${INSTALLDB}/${magename}
803 done
804 }
805
806 ###################################################
807 # function reminjected #
808 # reminjected #
809 # note: removes all injected packages #
810 ###################################################
811 reminjected() {
812 DELINJ="`find ${INSTALLDB} -name .injected`"
813 for i in ${DELINJ}
814 do
815 magename=$(dirname ${i})
816 if [ -d "${magename}" ]
817 then
818 # small fix to protect the mage-db deleting itself, that is not so funny :)
819 if [ "${magename}" != "${INSTALLDB}" ]
820 then
821 echo -e "removing fake package ${COLRED}${magename#${INSTALLDB}/*}${COLDEFAULT}"
822 rm -rf ${magename}
823 fi
824 fi
825 done
826 }
827
828
829 xtitle() {
830 if [ ${TERM} == "xterm" ]
831 then
832 echo -ne "\033]0;Mage: $1\007"
833 fi
834 return 0
835 }
836
837
838 xtitleclean() {
839 if [ ${TERM} == "xterm" ]
840 then
841 echo -ne "\033]0;\007"
842 fi
843 return 0
844 }
845
846
847 spin_processbar() {
848
849 # does not works as it should -- disabled
850 # you musst add and remove a tempfile outside this funktion
851 # to leave this funktion ...
852
853 # before you call this function do this:
854 #
855 # touch /var/tmp/proz
856 # build_doinstall|spin_processbar
857
858 echo -en "Processing: "
859 while [ -f /var/tmp/proz ]
860 do
861 echo -en "-\b"
862 sleep 0.01
863 echo -en "\\ \b\b"
864 sleep 0.01
865 echo -en "|\b"
866 sleep 0.01
867 echo -en "/\b"
868 sleep 0.01
869 done
870 echo "done"
871 return 0
872
873 # when you want to leave the funktion do
874 # something like this:
875 #
876 # #remove spinner tempfile
877 # if [ "$VERBOSE" == "off" ]
878 # then
879 # if [ -f /var/tmp/proz ]
880 # then
881 # rm /var/tmp/proz
882 # fi
883 # fi
884
885 }
886
887
888 #cuts full pathnames or versioniezed names down to basename
889 choppkgname(){
890 #we want this only if full name was used
891 if [ -n "$(echo ${MAGENAME}|fgrep .mage)" ]
892 then
893 #cuts ARCH and PBUILD
894 #ARCH comes from /etc/mage.rc
895 MAGENAME=$(echo ${MAGENAME} |sed -e "s:-${ARCH}-r*.::g")
896
897 #cuts version number
898 MAGENAME=$(basename ${MAGENAME%-*} .mage)
899 fi
900 }
901
902
903 # get_categorie $PKGNAME, returns CATEGORIE
904 # ret 0=ok, 1=not_found
905 getcategorie(){
906 for CAT in ${MAGEDIR}/*
907 do
908 if [ -d ${CAT}/${MAGENAME} ]
909 then
910 #debug only
911 if [ "$MAGEDEBUG" == "on" ]
912 then
913 echo "$MAGENAME found -> $CAT/$MAGENAME"
914 echo "categorie = $(basename ${CAT})"
915 fi
916 CATEGORIE=$(basename ${CAT})
917 fi
918 done
919
920 #package does not exists
921 if [ -z "$CATEGORIE" ]
922 then
923 echo -e "Package "${COLRED}"\"${MAGENAME}\""${COLDEFAULT}" does not exists."
924 exit 1
925 fi
926 }
927
928
929 #check_stable_package /path/to/foo.mage
930 # returns 0=stable 1=unstable
931 check_stable_package(){
932 #be sure no previous $STATES exists
933 unset STATE
934
935 source $1
936
937 #if USE_UNSTABLE=true this must be prevented
938 if [ "${USE_UNSTABLE}" != "true" ]
939 then
940 if [ "${STATE}" != "stable" ]
941 then
942 return 1
943 else
944 if [ "${STATE}" == "old" ]
945 then
946 return 1
947 fi
948 fi
949 fi
950
951 #unset the sourced varibales;
952 #we'll got bad problems later on if we don't do this
953 unset PKGNAME
954 unset STATE
955 unset DESCRIPTION
956 unset HOMEPAGE
957 unset DEPEND
958 unset SDEPEND
959 unset PROVIDE
960 unset PKGTYPE
961 unset preinstall
962 unset postinstall
963
964 return 0
965 }
966
967
968 #get_highest_magefile ${CATEGORIE} ${PKGNAME}
969 #fake at moment returns only stable pkgs (must set to be one)
970 # return $HIGHEST_MAGEFILE
971 get_highest_magefile(){
972 unset HIGHEST_MAGEFILE
973 #CATEGORIE=$1
974 #PKGNAME=$2
975
976 for i in ${MAGEDIR}/${CATEGORIE}/${MAGENAME}/*
977 do
978 #we exclude subdirs (for stuff like a md5sum dir)
979 if [ ! -d ${i} ]
980 then
981 check_stable_package ${i}
982 if [ "$?" == "0" ]
983 then
984 HIGHEST_MAGEFILE=${i}
985 #for debug only
986 if [ "$MAGEDEBUG" == "on" ]
987 then
988 echo "HIGHEST_MAGEFILE=${HIGHEST_MAGEFILE}"
989 fi
990 fi
991 fi
992 done
993
994 # stop here if HIGHEST_MAGEFILE is zero
995 # this package must be unstable or old
996 if [ -z "${HIGHEST_MAGEFILE}" ]
997 then
998 echo
999 echo -n "All packages named "
1000 echo -en ${COLRED}\""${PKGNAME%-*-*-*}\""${COLDEFAULT}
1001 echo -n " are marked "
1002 echo -en ${COLRED}"*UNSTABLE*"${COLDEFAULT}
1003 echo "."
1004 echo "You need to declare USE_UNSTABLE=true to install this."
1005 echo
1006 echo "Example:"
1007 echo " USE_UNSTABLE=true mage install ${PKGNAME%-*-*-*}"
1008 echo
1009 echo "Be warned that these packages are not stable and may cause serious problems."
1010 echo "You should know what you are doing, so don't complain about any damage."
1011 echo
1012 return 1
1013 fi
1014
1015 MAGEFILE=${HIGHEST_MAGEFILE}
1016 return 0
1017 }
1018
1019
1020 ###################################################
1021 # function is_config_protected #
1022 # is_config_protected /path/to/file #
1023 # #
1024 # returns: #
1025 # 0 - not protected #
1026 # 1 - error #
1027 # 2 - protected #
1028 # 3 - protected but masked #
1029 # #
1030 ###################################################
1031 is_config_protected() {
1032 local EXPFILE
1033 local TEST
1034 local PROTECTED
1035 local IFS
1036
1037 EXPFILE=$1
1038
1039 #to be safe; it may be '§'
1040 IFS=' '
1041
1042 #check ob in config protect
1043 for i in ${CONFIG_PROTECT}
1044 do
1045 #ersetzen von $i nur wenn am anfang der variable
1046 TEST="${EXPFILE/#${i}/Protected}"
1047 if [ "${TEST}" != "${EXPFILE}" ]
1048 then
1049 #setzen das es protected ist
1050 PROTECTED=TRUE
1051
1052 #check ob nicht doch maskiert
1053 for x in ${CONFIG_PROTECT_MASK}
1054 do
1055 TEST="${EXPFILE/#${x}/Protect_Masked}"
1056 if [ "${TEST}" != "${EXPFILE}" ]
1057 then
1058 PROTECTED=MASKED
1059 fi
1060 done
1061 fi
1062 done
1063
1064 unset IFS
1065
1066 case ${PROTECTED} in
1067 TRUE)
1068 #echo "I'm protected"
1069 return 2
1070 ;;
1071 MASKED)
1072 #echo "I'm protected, but masked - delete me"
1073 return 3
1074 ;;
1075 *)
1076 #echo "delete me"
1077 return 0
1078 ;;
1079 esac
1080 }
1081
1082
1083 ###################################################
1084 # function count_protected_files #
1085 # count_protected_files /path/to/file #
1086 # #
1087 # note: prints number of protected files #
1088 # exp: 0012 #
1089 ###################################################
1090 count_protected_files() {
1091 ${MLIBDIR}/writeprotected "$1"
1092 }
1093
1094
1095 #call with 'get_magefile_to_uninstall SEARCHSTRING'
1096 #returns /path/to/magefile
1097 get_magefile_to_uninstall() {
1098 local RESULT
1099 local SSTRING
1100 local i
1101 local x
1102 local z
1103
1104 SSTRING=$1
1105
1106 for i in ${INSTALLDB}/*/*
1107 do
1108 #echo ${i}
1109 #to be sure
1110 if [ -d ${i} ]
1111 then
1112 #echo "DEBUG: stripped i: $(basename ${i%-*-*})"
1113 if [ $(basename ${i%-*-*}) == ${SSTRING} ]
1114 then
1115 #RESULT="${RESULT} ${i}"
1116 CATEGORIE=$(< ${i}/.categorie)
1117 #echo ${CATEGORIE}/$(basename ${RESULT})
1118 RESULT="${RESULT} ${CATEGORIE}/$(basename ${i})"
1119 fi
1120 fi
1121 done
1122
1123 if [ -n "${RESULT}" ]
1124 then
1125 #check if ONE package was found and not more
1126 declare -i x=0
1127 for i in ${RESULT}
1128 do
1129 x=${x}+1
1130 done
1131 if [ ${x} -eq 1 ]
1132 then
1133 #echo "jo ich uninstall $(basename ${RESULT}) ..."
1134 #the mage file
1135 #echo "${RESULT}/$(basename ${RESULT}).mage"
1136
1137 #gets categorie of the package
1138 #CATEGORIE=$(< ${i}/.categorie)
1139 #echo ${CATEGORIE}/$(basename ${RESULT})
1140 echo "${RESULT}"
1141 return 0
1142 else
1143 #echo "More than one package found ..."
1144 echo "${RESULT}"
1145 return 2
1146 fi
1147 else
1148 #echo "No package found named '${SSTRING}'."
1149 echo "${SSTRING}"
1150 return 1
1151 fi
1152 }
1153
1154
1155 # reads virtualdb file
1156 #$1 = virtualname; $2 commands: showpkgs, showline
1157 #return 0 == installed -> shows installed pkg as well
1158 #return 1 == not installed
1159 virtuals_read() {
1160 local VIRTUAL_NAME COMMAND VIRT_LINE line x i
1161
1162 VIRTUAL_NAME=$1
1163 COMMAND=$2
1164
1165 # parse file to get virtual_name line
1166 IFS=$'\n'
1167 for line in $(< ${VIRTUALDB_FILE})
1168 do
1169 IFS=$' '
1170 for x in ${line}
1171 do
1172 if [ "${x}" == "${VIRTUAL_NAME}" ]
1173 then
1174 VIRT_LINE="${line}"
1175
1176 if [ "${COMMAND}" == "showline" ]
1177 then
1178 #give out the non stripped line
1179 echo "${line}"
1180 fi
1181 fi
1182 done
1183
1184 IFS=$'\n'
1185 done
1186
1187 unset IFS
1188
1189 #now read the packages linked to VIRTUAL_NAME and output them
1190 if [ -n "${VIRT_LINE}" ]
1191 then
1192 if [ "${COMMAND}" == "showpkgs" ]
1193 then
1194 declare -i x=0
1195 for i in ${VIRT_LINE}
1196 do
1197 if [ ${x} -ge 1 ]
1198 then
1199 echo "${i}"
1200 fi
1201 ((x++))
1202 done
1203 fi
1204 return 0
1205 fi
1206 return 1
1207 }
1208
1209
1210 #add pkg to virtualdb
1211 # $1 == virtualname $2= pkgname
1212 # retvals: 0=ok,added; 1=error; 3=pkg already in virtual
1213 virtuals_add(){
1214 local VIRTUAL_NAME PKG_NAME OLD_LINE line i
1215
1216 VIRTUAL_NAME=$1
1217 PKG_NAME=$2
1218
1219
1220 if virtuals_read ${VIRTUAL_NAME}
1221 then
1222 #make shure ${PKG_NAME} is *not* in ${VIRTUAL_NAME} already
1223 for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs)
1224 do
1225 if [ "${i}" == ${PKG_NAME} ]
1226 then
1227 echo "==== ${PKG_NAME} already linked with ${VIRTUAL_NAME} ..."
1228 return 3
1229 fi
1230 done
1231
1232 echo ">>>> Updating ${VIRTUAL_NAME} with ${PKG_NAME} in virtual database ..."
1233 OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)"
1234
1235 #make a backup
1236 mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
1237
1238 IFS=$'\n'
1239 for line in $(< ${VIRTUALDB_FILE}.old)
1240 do
1241 #if the right line, append ${PKG_NAME}, else do nothing
1242 if [ "${line}" == "${OLD_LINE}" ]
1243 then
1244 echo "${line} ${PKG_NAME}" >> ${VIRTUALDB_FILE}
1245 else
1246 echo "${line}" >> ${VIRTUALDB_FILE}
1247 fi
1248 done
1249
1250 unset IFS
1251 else
1252 echo ">>>> Adding ${PKG_NAME} as ${VIRTUAL_NAME} to virtual database ..."
1253 echo "${VIRTUAL_NAME} ${PKG_NAME}" >> ${VIRTUALDB_FILE} \
1254 && echo "ok" || echo "false"
1255 fi
1256
1257 return 0
1258 }
1259
1260 #deletes pakages from virtual database
1261 #$1 virtualname; $2 pkgname
1262 virtuals_del() {
1263
1264 local VIRTUAL_NAME PKG_NAME OLD_LINE METHOD line i x PKG_INSTALLED
1265
1266 VIRTUAL_NAME=$1
1267 PKG_NAME=$2
1268
1269 #first check if exists
1270 if virtuals_read ${VIRTUAL_NAME}
1271 then
1272 #get method -> delall or update and check if ${PKG_NAME} exists in ${VIRTUAL_NAME}
1273 declare -i x=0
1274 for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs)
1275 do
1276 if [ "${i}" == "${PKG_NAME}" ]
1277 then
1278 PKG_INSTALLED=true
1279 fi
1280 ((x++))
1281 done
1282
1283 #abort if not installed
1284 if [ "${PKG_INSTALLED}" != "true" ]
1285 then
1286 echo "!!!! ${PKG_NAME} does not exists in ${VIRTUAL_NAME}."
1287 return 0
1288 fi
1289
1290 if [ ${x} -ge 2 ]
1291 then
1292 METHOD=update
1293 else
1294 METHOD=delall
1295 fi
1296
1297 #get the complete line
1298 OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)"
1299
1300 #make a backup
1301 mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
1302
1303 #parse virtualdb
1304 IFS=$'\n'
1305 for line in $(< ${VIRTUALDB_FILE}.old)
1306 do
1307 if [ "${line}" == "${OLD_LINE}" ]
1308 then
1309 #delall or update?
1310 case ${METHOD} in
1311 update)
1312 echo "<<<< Unlinking ${PKG_NAME} from ${VIRTUAL_NAME} in virtual database ..."
1313 #del PKG_NAME from line
1314 echo "${line/ ${PKG_NAME}/}" >> ${VIRTUALDB_FILE}
1315 ;;
1316 delall)
1317 echo "<<<< Deleting ${VIRTUAL_NAME} in virtual database ..."
1318 #continue; do not write anything
1319 continue
1320 ;;
1321 esac
1322 else
1323 echo "${line}" >> ${VIRTUALDB_FILE}
1324 fi
1325 done
1326 unset IFS
1327 else
1328 echo "!!!! ${VIRTUAL_NAME} does not exists in virtual database."
1329 fi
1330 }
1331
1332 # gets real pkgname from virtuals.default
1333 #$1=VIRTUAL_NAME; returns PKG_NAME
1334 default_virtualname_to_pkgname(){
1335 local VIRTUAL_NAME PKG_NAME db_virtualname db_pkgname
1336
1337 VIRTUAL_NAME=$1
1338
1339 while read db_virtualname db_pkgname
1340 do
1341 if [ "${db_virtualname}" == "${VIRTUAL_NAME}" ]
1342 then
1343 PKG_NAME="${db_pkgname}"
1344 fi
1345 done << EOF
1346 $(< ${VIRTUALDB_DEFAULTS})
1347 EOF
1348
1349 if [ -n "${PKG_NAME}" ]
1350 then
1351 echo "${PKG_NAME}"
1352 fi
1353 }

Properties

Name Value
svn:executable *