Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 178 - (show annotations) (download) (as text)
Sun Jul 31 15:28:53 2005 UTC (18 years, 9 months ago) by niro
File MIME type: application/x-sh
File size: 31013 byte(s)
minclude: only verbose when MAGEDBUG=on

1 #!/bin/bash
2 # Magellan Linux Installer Functions (mage.functions.sh)
3 # $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/mage3.functions.sh,v 1.14 2005-07-31 15:28:53 niro Exp $
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 -c -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 -c -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 # check if an newer mage version is available
750 is_newer_mage_version_available
751 }
752
753 cleanpkg(){
754 if [ -d "$PKGDIR" ]
755 then
756 echo -n "Removing downloaded packages... "
757 rm -rf ${PKGDIR}/*
758 echo "done."
759 fi
760 }
761
762 ###################################################
763 # function keepfiles #
764 # keepfiles "$CATEGORIE/$PNAME" "$filename" #
765 # note wildchars allowed #
766 ###################################################
767 keepfiles() {
768 local name
769 local keep
770 name="`echo $1| cut -d '/' -f2`"
771 keep="$2"
772
773 DELPKG="`find ${INSTALLDB} -name ${name}*.mage`"
774 DELDIR="${INSTALLDB}/$(basename ${DELPKG} .mage)"
775 cp ${DELDIR}/.files ${DELDIR}/.files-orig
776 sed "s:${keep}::" \
777 ${DELDIR}/.files-orig > ${DELDIR}/.files
778 rm ${DELDIR}/.files-orig
779 }
780
781
782 ###################################################
783 # function injectpkg #
784 # injectpkg "$CATEGORIE/$PNAME" #
785 # note wildchars allowed #
786 ###################################################
787 injectpkg() {
788 local name
789 local categorie
790 local magename
791 name="`echo $1| cut -d '/' -f2`"
792 categorie="`echo $1| cut -d '/' -f1`"
793
794 INJPKG="`find ${MAGEDIR} -name ${name}-*.mage`"
795 for i in ${INJPKG}
796 do
797 magename="$(basename ${INJPKG} .mage)"
798 echo -e "Injecting fake package for ${COLBLUE}${categorie}${COLDEFAULT}/${COLGREEN}${magename}${COLDEFAULT}"
799 install -d ${INSTALLDB}/${magename}
800 touch ${INSTALLDB}/${magename}/{.injected,.files,.dirs,.symlinks,.pipes,.char}
801
802 #installs magefile
803 install -m 0644 -o root -g root \
804 ${MAGEDIR}/${categorie}/${magename}.mage \
805 ${INSTALLDB}/${magename}
806 done
807 }
808
809 ###################################################
810 # function reminjected #
811 # reminjected #
812 # note: removes all injected packages #
813 ###################################################
814 reminjected() {
815 DELINJ="`find ${INSTALLDB} -name .injected`"
816 for i in ${DELINJ}
817 do
818 magename=$(dirname ${i})
819 if [ -d "${magename}" ]
820 then
821 # small fix to protect the mage-db deleting itself, that is not so funny :)
822 if [ "${magename}" != "${INSTALLDB}" ]
823 then
824 echo -e "removing fake package ${COLRED}${magename#${INSTALLDB}/*}${COLDEFAULT}"
825 rm -rf ${magename}
826 fi
827 fi
828 done
829 }
830
831
832 xtitle() {
833 if [ ${TERM} == "xterm" ]
834 then
835 echo -ne "\033]0;Mage: $1\007"
836 fi
837 return 0
838 }
839
840
841 xtitleclean() {
842 if [ ${TERM} == "xterm" ]
843 then
844 echo -ne "\033]0;\007"
845 fi
846 return 0
847 }
848
849
850 spin_processbar() {
851
852 # does not works as it should -- disabled
853 # you musst add and remove a tempfile outside this funktion
854 # to leave this funktion ...
855
856 # before you call this function do this:
857 #
858 # touch /var/tmp/proz
859 # build_doinstall|spin_processbar
860
861 echo -en "Processing: "
862 while [ -f /var/tmp/proz ]
863 do
864 echo -en "-\b"
865 sleep 0.01
866 echo -en "\\ \b\b"
867 sleep 0.01
868 echo -en "|\b"
869 sleep 0.01
870 echo -en "/\b"
871 sleep 0.01
872 done
873 echo "done"
874 return 0
875
876 # when you want to leave the funktion do
877 # something like this:
878 #
879 # #remove spinner tempfile
880 # if [ "$VERBOSE" == "off" ]
881 # then
882 # if [ -f /var/tmp/proz ]
883 # then
884 # rm /var/tmp/proz
885 # fi
886 # fi
887
888 }
889
890
891 #cuts full pathnames or versioniezed names down to basename
892 choppkgname(){
893 #we want this only if full name was used
894 if [ -n "$(echo ${MAGENAME}|fgrep .mage)" ]
895 then
896 #cuts ARCH and PBUILD
897 #ARCH comes from /etc/mage.rc
898 MAGENAME=$(echo ${MAGENAME} |sed -e "s:-${ARCH}-r*.::g")
899
900 #cuts version number
901 MAGENAME=$(basename ${MAGENAME%-*} .mage)
902 fi
903 }
904
905
906 # get_categorie $PKGNAME, returns CATEGORIE
907 # ret 0=ok, 1=not_found
908 getcategorie(){
909 for CAT in ${MAGEDIR}/*
910 do
911 if [ -d ${CAT}/${MAGENAME} ]
912 then
913 #debug only
914 if [ "$MAGEDEBUG" == "on" ]
915 then
916 echo "$MAGENAME found -> $CAT/$MAGENAME"
917 echo "categorie = $(basename ${CAT})"
918 fi
919 CATEGORIE=$(basename ${CAT})
920 fi
921 done
922
923 #package does not exists
924 if [ -z "$CATEGORIE" ]
925 then
926 echo -e "Package "${COLRED}"\"${MAGENAME}\""${COLDEFAULT}" does not exists."
927 exit 1
928 fi
929 }
930
931
932 #check_stable_package /path/to/foo.mage
933 # returns 0=stable 1=unstable
934 check_stable_package(){
935 #be sure no previous $STATES exists
936 unset STATE
937
938 source $1
939
940 #if USE_UNSTABLE=true this must be prevented
941 if [ "${USE_UNSTABLE}" != "true" ]
942 then
943 if [ "${STATE}" != "stable" ]
944 then
945 return 1
946 else
947 if [ "${STATE}" == "old" ]
948 then
949 return 1
950 fi
951 fi
952 fi
953
954 #unset the sourced varibales;
955 #we'll got bad problems later on if we don't do this
956 unset PKGNAME
957 unset STATE
958 unset DESCRIPTION
959 unset HOMEPAGE
960 unset DEPEND
961 unset SDEPEND
962 unset PROVIDE
963 unset PKGTYPE
964 unset preinstall
965 unset postinstall
966
967 return 0
968 }
969
970
971 #get_highest_magefile ${CATEGORIE} ${PKGNAME}
972 #fake at moment returns only stable pkgs (must set to be one)
973 # return $HIGHEST_MAGEFILE
974 get_highest_magefile(){
975 unset HIGHEST_MAGEFILE
976 #CATEGORIE=$1
977 #PKGNAME=$2
978
979 for i in ${MAGEDIR}/${CATEGORIE}/${MAGENAME}/*
980 do
981 #we exclude subdirs (for stuff like a md5sum dir)
982 if [ ! -d ${i} ]
983 then
984 check_stable_package ${i}
985 if [ "$?" == "0" ]
986 then
987 HIGHEST_MAGEFILE=${i}
988 #for debug only
989 if [ "$MAGEDEBUG" == "on" ]
990 then
991 echo "HIGHEST_MAGEFILE=${HIGHEST_MAGEFILE}"
992 fi
993 fi
994 fi
995 done
996
997 # stop here if HIGHEST_MAGEFILE is zero
998 # this package must be unstable or old
999 if [ -z "${HIGHEST_MAGEFILE}" ]
1000 then
1001 echo
1002 echo -n "All packages named "
1003 echo -en ${COLRED}\""${PKGNAME%-*-*-*}\""${COLDEFAULT}
1004 echo -n " are marked "
1005 echo -en ${COLRED}"*UNSTABLE*"${COLDEFAULT}
1006 echo "."
1007 echo "You need to declare USE_UNSTABLE=true to install this."
1008 echo
1009 echo "Example:"
1010 echo " USE_UNSTABLE=true mage install ${PKGNAME%-*-*-*}"
1011 echo
1012 echo "Be warned that these packages are not stable and may cause serious problems."
1013 echo "You should know what you are doing, so don't complain about any damage."
1014 echo
1015 return 1
1016 fi
1017
1018 MAGEFILE=${HIGHEST_MAGEFILE}
1019 return 0
1020 }
1021
1022
1023 ###################################################
1024 # function is_config_protected #
1025 # is_config_protected /path/to/file #
1026 # #
1027 # returns: #
1028 # 0 - not protected #
1029 # 1 - error #
1030 # 2 - protected #
1031 # 3 - protected but masked #
1032 # #
1033 ###################################################
1034 is_config_protected() {
1035 local EXPFILE
1036 local TEST
1037 local PROTECTED
1038 local IFS
1039
1040 EXPFILE=$1
1041
1042 #to be safe; it may be '§'
1043 IFS=' '
1044
1045 #check ob in config protect
1046 for i in ${CONFIG_PROTECT}
1047 do
1048 #ersetzen von $i nur wenn am anfang der variable
1049 TEST="${EXPFILE/#${i}/Protected}"
1050 if [ "${TEST}" != "${EXPFILE}" ]
1051 then
1052 #setzen das es protected ist
1053 PROTECTED=TRUE
1054
1055 #check ob nicht doch maskiert
1056 for x in ${CONFIG_PROTECT_MASK}
1057 do
1058 TEST="${EXPFILE/#${x}/Protect_Masked}"
1059 if [ "${TEST}" != "${EXPFILE}" ]
1060 then
1061 PROTECTED=MASKED
1062 fi
1063 done
1064 fi
1065 done
1066
1067 unset IFS
1068
1069 case ${PROTECTED} in
1070 TRUE)
1071 #echo "I'm protected"
1072 return 2
1073 ;;
1074 MASKED)
1075 #echo "I'm protected, but masked - delete me"
1076 return 3
1077 ;;
1078 *)
1079 #echo "delete me"
1080 return 0
1081 ;;
1082 esac
1083 }
1084
1085
1086 ###################################################
1087 # function count_protected_files #
1088 # count_protected_files /path/to/file #
1089 # #
1090 # note: prints number of protected files #
1091 # exp: 0012 #
1092 ###################################################
1093 count_protected_files() {
1094 ${MLIBDIR}/writeprotected "$1"
1095 }
1096
1097
1098 #call with 'get_magefile_to_uninstall SEARCHSTRING'
1099 #returns /path/to/magefile
1100 get_magefile_to_uninstall() {
1101 local RESULT
1102 local SSTRING
1103 local i
1104 local x
1105 local z
1106
1107 SSTRING=$1
1108
1109 for i in ${INSTALLDB}/*/*
1110 do
1111 #echo ${i}
1112 #to be sure
1113 if [ -d ${i} ]
1114 then
1115 #echo "DEBUG: stripped i: $(basename ${i%-*-*})"
1116 if [ $(basename ${i%-*-*}) == ${SSTRING} ]
1117 then
1118 #RESULT="${RESULT} ${i}"
1119 CATEGORIE=$(< ${i}/.categorie)
1120 #echo ${CATEGORIE}/$(basename ${RESULT})
1121 RESULT="${RESULT} ${CATEGORIE}/$(basename ${i})"
1122 fi
1123 fi
1124 done
1125
1126 if [ -n "${RESULT}" ]
1127 then
1128 #check if ONE package was found and not more
1129 declare -i x=0
1130 for i in ${RESULT}
1131 do
1132 x=${x}+1
1133 done
1134 if [ ${x} -eq 1 ]
1135 then
1136 #echo "jo ich uninstall $(basename ${RESULT}) ..."
1137 #the mage file
1138 #echo "${RESULT}/$(basename ${RESULT}).mage"
1139
1140 #gets categorie of the package
1141 #CATEGORIE=$(< ${i}/.categorie)
1142 #echo ${CATEGORIE}/$(basename ${RESULT})
1143 echo "${RESULT}"
1144 return 0
1145 else
1146 #echo "More than one package found ..."
1147 echo "${RESULT}"
1148 return 2
1149 fi
1150 else
1151 #echo "No package found named '${SSTRING}'."
1152 echo "${SSTRING}"
1153 return 1
1154 fi
1155 }
1156
1157
1158 # reads virtualdb file
1159 #$1 = virtualname; $2 commands: showpkgs, showline
1160 #return 0 == installed -> shows installed pkg as well
1161 #return 1 == not installed
1162 virtuals_read() {
1163 local VIRTUAL_NAME COMMAND VIRT_LINE line x i
1164
1165 VIRTUAL_NAME=$1
1166 COMMAND=$2
1167
1168 # parse file to get virtual_name line
1169 IFS=$'\n'
1170 for line in $(< ${VIRTUALDB_FILE})
1171 do
1172 IFS=$' '
1173 for x in ${line}
1174 do
1175 if [ "${x}" == "${VIRTUAL_NAME}" ]
1176 then
1177 VIRT_LINE="${line}"
1178
1179 if [ "${COMMAND}" == "showline" ]
1180 then
1181 #give out the non stripped line
1182 echo "${line}"
1183 fi
1184 fi
1185 done
1186
1187 IFS=$'\n'
1188 done
1189
1190 unset IFS
1191
1192 #now read the packages linked to VIRTUAL_NAME and output them
1193 if [ -n "${VIRT_LINE}" ]
1194 then
1195 if [ "${COMMAND}" == "showpkgs" ]
1196 then
1197 declare -i x=0
1198 for i in ${VIRT_LINE}
1199 do
1200 if [ ${x} -ge 1 ]
1201 then
1202 echo "${i}"
1203 fi
1204 ((x++))
1205 done
1206 fi
1207 return 0
1208 fi
1209 return 1
1210 }
1211
1212
1213 #add pkg to virtualdb
1214 # $1 == virtualname $2= pkgname
1215 # retvals: 0=ok,added; 1=error; 3=pkg already in virtual
1216 virtuals_add(){
1217 local VIRTUAL_NAME PKG_NAME OLD_LINE line i
1218
1219 VIRTUAL_NAME=$1
1220 PKG_NAME=$2
1221
1222
1223 if virtuals_read ${VIRTUAL_NAME}
1224 then
1225 #make shure ${PKG_NAME} is *not* in ${VIRTUAL_NAME} already
1226 for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs)
1227 do
1228 if [ "${i}" == ${PKG_NAME} ]
1229 then
1230 echo "==== ${PKG_NAME} already linked with ${VIRTUAL_NAME} ..."
1231 return 3
1232 fi
1233 done
1234
1235 echo ">>>> Updating ${VIRTUAL_NAME} with ${PKG_NAME} in virtual database ..."
1236 OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)"
1237
1238 #make a backup
1239 mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
1240
1241 IFS=$'\n'
1242 for line in $(< ${VIRTUALDB_FILE}.old)
1243 do
1244 #if the right line, append ${PKG_NAME}, else do nothing
1245 if [ "${line}" == "${OLD_LINE}" ]
1246 then
1247 echo "${line} ${PKG_NAME}" >> ${VIRTUALDB_FILE}
1248 else
1249 echo "${line}" >> ${VIRTUALDB_FILE}
1250 fi
1251 done
1252
1253 unset IFS
1254 else
1255 echo ">>>> Adding ${PKG_NAME} as ${VIRTUAL_NAME} to virtual database ..."
1256 echo "${VIRTUAL_NAME} ${PKG_NAME}" >> ${VIRTUALDB_FILE} \
1257 && echo "ok" || echo "false"
1258 fi
1259
1260 return 0
1261 }
1262
1263 #deletes pakages from virtual database
1264 #$1 virtualname; $2 pkgname
1265 virtuals_del() {
1266
1267 local VIRTUAL_NAME PKG_NAME OLD_LINE METHOD line i x PKG_INSTALLED
1268
1269 VIRTUAL_NAME=$1
1270 PKG_NAME=$2
1271
1272 #first check if exists
1273 if virtuals_read ${VIRTUAL_NAME}
1274 then
1275 #get method -> delall or update and check if ${PKG_NAME} exists in ${VIRTUAL_NAME}
1276 declare -i x=0
1277 for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs)
1278 do
1279 if [ "${i}" == "${PKG_NAME}" ]
1280 then
1281 PKG_INSTALLED=true
1282 fi
1283 ((x++))
1284 done
1285
1286 #abort if not installed
1287 if [ "${PKG_INSTALLED}" != "true" ]
1288 then
1289 echo "!!!! ${PKG_NAME} does not exists in ${VIRTUAL_NAME}."
1290 return 0
1291 fi
1292
1293 if [ ${x} -ge 2 ]
1294 then
1295 METHOD=update
1296 else
1297 METHOD=delall
1298 fi
1299
1300 #get the complete line
1301 OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)"
1302
1303 #make a backup
1304 mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
1305
1306 #parse virtualdb
1307 IFS=$'\n'
1308 for line in $(< ${VIRTUALDB_FILE}.old)
1309 do
1310 if [ "${line}" == "${OLD_LINE}" ]
1311 then
1312 #delall or update?
1313 case ${METHOD} in
1314 update)
1315 echo "<<<< Unlinking ${PKG_NAME} from ${VIRTUAL_NAME} in virtual database ..."
1316 #del PKG_NAME from line
1317 echo "${line/ ${PKG_NAME}/}" >> ${VIRTUALDB_FILE}
1318 ;;
1319 delall)
1320 echo "<<<< Deleting ${VIRTUAL_NAME} in virtual database ..."
1321 #continue; do not write anything
1322 continue
1323 ;;
1324 esac
1325 else
1326 echo "${line}" >> ${VIRTUALDB_FILE}
1327 fi
1328 done
1329 unset IFS
1330 else
1331 echo "!!!! ${VIRTUAL_NAME} does not exists in virtual database."
1332 fi
1333 }
1334
1335 # gets real pkgname from virtuals.default
1336 #$1=VIRTUAL_NAME; returns PKG_NAME
1337 default_virtualname_to_pkgname(){
1338 local VIRTUAL_NAME PKG_NAME db_virtualname db_pkgname
1339
1340 VIRTUAL_NAME=$1
1341
1342 while read db_virtualname db_pkgname
1343 do
1344 if [ "${db_virtualname}" == "${VIRTUAL_NAME}" ]
1345 then
1346 PKG_NAME="${db_pkgname}"
1347 fi
1348 done << EOF
1349 $(< ${VIRTUALDB_DEFAULTS})
1350 EOF
1351
1352 if [ -n "${PKG_NAME}" ]
1353 then
1354 echo "${PKG_NAME}"
1355 fi
1356 }
1357
1358 minclude() {
1359 local i
1360
1361 if [ -n "$@" ]
1362 then
1363 for i in $@
1364 do
1365 [[ ${MAGEDEBUG} = on ]] && \
1366 echo "--- Including ${MAGEDIR}/include/${i}.minc"
1367 source ${MAGEDIR}/include/${i}.minc
1368 done
1369 echo
1370 fi
1371 }
1372
1373 sminclude() {
1374 local i
1375
1376 if [ -n "$@" ]
1377 then
1378 for i in $@
1379 do
1380 echo "--- Including ${SMAGESCRIPTSDIR}/include/${i}.sminc"
1381 source ${SMAGESCRIPTSDIR}/include/${i}.sminc
1382 done
1383 echo
1384 fi
1385 }
1386
1387 # checks if an newer mage version is available
1388 is_newer_mage_version_available() {
1389 local newest_mage
1390 local installed_mage
1391
1392 newest_mage="$( CATEGORIE=app-mage MAGENAME=mage get_highest_magefile;echo $(basename ${MAGEFILE} .mage) )"
1393 installed_mage="$(magequery -n mage | cut -d' ' -f5)"
1394
1395 if [[ ${newest_mage} > ${installed_mage} ]]
1396 then
1397 echo
1398 echo -en ${COLRED}"An update for your packetmanager is available. "${COLDEFAULT}
1399 echo -e ${COLBLUE}"[ ${newest_mage} ]"${COLDEFAULT}
1400 echo "It is recommened to install this newer version"
1401 echo "or your current system installation may brake."
1402 echo
1403 echo -en "Please update mage by running "
1404 echo -e ${COLGREEN}"'mage install mage'"${COLDEFAULT}
1405 echo
1406 fi
1407 }
1408

Properties

Name Value
svn:executable *