Magellan Linux

Contents of /trunk/mage/usr/lib/mage/mage4.functions2.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 226 - (show annotations) (download) (as text)
Fri Sep 9 16:35:46 2005 UTC (18 years, 7 months ago) by niro
File MIME type: application/x-sh
File size: 42976 byte(s)
complete rewrite

1 #!/bin/bash
2 # Magellan Linux Installer Functions (mage.functions.sh)
3 # $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/mage4.functions2.sh,v 1.1 2005-09-09 16:35:33 niro Exp $
4
5 mage_setup()
6 {
7 [ ! -d ${INSTALLDB} ] && install -d ${INSTALLDB}
8 [ ! -d ${PKGDIR} ] && install -d ${PKGDIR}
9 [ ! -d ${BUILDDIR} ] && install -d ${BUILDDIR}
10 [ ! -d ${MAGEDIR} ] && install -d ${MAGEDIR}
11 }
12
13 fatal_error()
14 {
15 # $1 is the missing file
16 echo -e "\nFatal Error: Package seemed to be corrupt."
17 echo -e "$1 was not found in ${PKGNAME}"
18 exit 1
19 }
20
21 # build_unpackpkg()
22 # {
23 # tar xjmf ${PKGDIR}/${PKGNAME}.${PKGSUFFIX} -C ${BUILDDIR} || die "Unpacking package"
24 # }
25
26 unpack_packages()
27 {
28 local list="$@"
29 local magefile
30 local pkg
31 local pkgtype
32
33 for magefile in ${list}
34 do
35 pkg="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}"
36 pkgtype="$(get_value_from_magefile PKGTYPE ${magefile}).${PKGSUFFIX}"
37
38 # abort on virtual pkg
39 [[ ${pkgtype} = virtual ]] && continue
40
41 echo -e " ${COLBLUE}***${COLDEFAULT} unpacking ${pkg} ... "
42 tar xjmf ${PKGDIR}/${pkg} -C ${BUILDDIR} || die "Unpacking package ${pkg}"
43 done
44 }
45
46 update_mtime()
47 {
48 local M_MTIME
49 DB_ENTRY=${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}
50
51 # forcing mtime to same value
52 echo
53 echo -n ">>>> Forcing mtime to the same value ..."
54 #find ${BUILDDIR}/${PKGNAME}/binfiles \
55 # -exec touch -m -r ${BUILDDIR}/${PKGNAME}/.mtime '{}' ';' \
56 # && echo done || echo false
57
58
59 # get new M_MTIME from .mtime
60 M_MTIME=$(stat -c %Y ${DB_ENTRY}/.mtime)
61
62 # updating .files db entries; only if not empty, or they get killed
63 if [ -e "${DB_ENTRY}/.files" ]
64 then
65 if [ -n "$(cat ${DB_ENTRY}/.files)" ]
66 then
67 # make backup
68 mv ${DB_ENTRY}/.files \
69 ${DB_ENTRY}/.files-old
70
71 # sets fieldseperator to "§" instead of " "
72 IFS=§
73
74 # update
75 while read pathto posix user group mtime md5sum
76 do
77 echo "${pathto}§${posix}§${user}§${group}§${M_MTIME}§${md5sum}" \
78 >> ${DB_ENTRY}/.files
79 touch -c -m -r ${DB_ENTRY}/.mtime ${pathto}
80 done < ${DB_ENTRY}/.files-old
81
82 # remove old list
83 rm -f ${DB_ENTRY}/.files-old
84
85 # very important: unsetting the '§' fieldseperator
86 unset IFS
87 fi
88 else
89 fatal_error .files
90 fi
91
92
93 # updating .symlink db entries; only if not empty, or they get killed
94 if [ -e "${DB_ENTRY}/.symlinks" ]
95 then
96 if [ -n "$(cat ${DB_ENTRY}/.symlinks)" ]
97 then
98 # make backup
99 mv ${DB_ENTRY}/.symlinks \
100 ${DB_ENTRY}/.symlinks-old
101
102 # sets fieldseperator to "§" instead of " "
103 IFS=§
104
105 # update
106 while read pathto posix link mtime
107 do
108 echo "${pathto}§${posix}§${link}§${M_MTIME}" \
109 >> ${DB_ENTRY}/.symlinks
110 touch -c -m -r ${DB_ENTRY}/.mtime ${pathto}
111 done < ${DB_ENTRY}/.symlinks-old
112
113 # remove old list
114 rm -f ${DB_ENTRY}/.symlinks-old
115
116 # very important: unsetting the '§' fieldseperator
117 unset IFS
118 fi
119 else
120 fatal_error .symlinks
121 fi
122 }
123
124 ###################################################
125 # function install_direcories #
126 # install_direcories $PKGNAME #
127 ###################################################
128 install_directories()
129 {
130 local pkgname="$1"
131 local pathto
132 local posix
133 local user
134 local group
135 local IFS
136
137 # sanity checks; abort if not given
138 [ -z "${pkgname}" ] && die "install_directories() \$pkgname not given."
139
140 # check needed global vars
141 [ -z "${BUILDDIR}" ] && die "install_directories() \$BUILDDIR not set."
142
143 [ ! -f ${BUILDDIR}/${pkgname} ] && die ".dir not found"
144
145 # sets fieldseperator to "§" instead of " "
146 IFS=§
147
148 while read pathto posix user group
149 do
150 [ -z "${pathto}" ] && continue
151 [[ ${VERBOSE} = on ]] && echo -e "\t>>> DIR: ${pathto}"
152 install -m "${posix}" -o "${user}" -g "${group}" -d "${MAGE_INSTALL_ROOT}${pathto}"
153 done < ${BUILDDIR}/${pkgname}/.dirs
154
155 # very important: unsetting the '§' fieldseperator
156 IFS=$'\n'
157 }
158
159
160 ###################################################
161 # function install_files #
162 # install_files $PKGNAME #
163 ###################################################
164 install_files()
165 {
166 local PKGNAME
167 local RETVAL
168 local COUNTER
169 local FILENAME
170 local DESTINATION
171
172 PKGNAME=$1
173
174 if [ -e ${BUILDDIR}/${PKGNAME}/.files ]
175 then
176 # sets fieldseperator to "§" instead of " "
177 IFS=§
178
179 while read pathto posix user group mtime md5sum
180 do
181 [ -z "${pathto}" ] && continue
182 [[ ${VERBOSE} = on ]] && echo -e "\t>>> FILE: ${pathto}"
183
184 ### small hotfix fix ###
185 [ ! -d "$(dirname "${pathto}")" ] && install -d "$(dirname "${pathto}")"
186
187 # when file exists, check if protected
188 if [ -e "${pathto}" ]
189 then
190 is_config_protected "${pathto}"
191 RETVAL=$?
192
193 # 0 - not protected #
194 # 1 - error #
195 # 2 - protected #
196 # 3 - protected but masked #
197
198 case ${RETVAL} in
199 # file is not protected - overwrite it
200 0|3)
201 FILE="$pathto"
202 install -m ${posix} -o ${user} -g ${group} \
203 ${BUILDDIR}/${PKGNAME}/binfiles/"$FILE" \
204 "$pathto"
205 ;;
206
207 #file is protected - write backup file
208 # "._cfg${COUNTER}_{FILENAME}
209 2)
210 if [ "${VERBOSE}" == "on" ]
211 then
212 # moves the cursor up
213 echo -en \\033[A
214 echo -e "${COLRED}! prot ${COLDEFAULT} === FILE: $pathto"
215 fi
216 FILENAME="$(basename "${pathto}")"
217 FILE="$pathto"
218 COUNTER=$(count_protected_files "${FILE}")
219 DESTINATION="$(dirname "$pathto")/._cfg${COUNTER}_${FILENAME}"
220 install -m ${posix} -o ${user} -g ${group} \
221 ${BUILDDIR}/${PKGNAME}/binfiles/"$FILE" \
222 "${DESTINATION}"
223
224 #set run_etc_update=true
225 PROTECT_COUNT=${PROTECT_COUNT}+1
226 ;;
227 esac
228 else
229 # install file because it does not exists
230 FILE="$pathto"
231 install -m ${posix} -o ${user} -g ${group} \
232 ${BUILDDIR}/${PKGNAME}/binfiles/$FILE \
233 "$pathto"
234 fi
235
236 #not needed anymore ?
237 #if [ ! -z $user ]
238 #then
239 # chown $user:$group $FILE ### <---- test
240 #fi
241 done < ${BUILDDIR}/${PKGNAME}/.files
242
243 # very important: unsetting the '§' fieldseperator
244 unset IFS
245 else
246 fatal_error .files
247 fi
248 }
249
250
251 ###################################################
252 # function install_symlinks #
253 # install_symlinks $PKGNAME #
254 ###################################################
255 install_symlinks()
256 {
257 local PKGNAME
258 PKGNAME=$1
259
260 if [ -e ${BUILDDIR}/${PKGNAME}/.symlinks ]
261 then
262 # sets fieldseperator to "§" instead of " "
263 IFS=§
264
265 while read pathto posix link mtime
266 do
267 if [ ! -z "$pathto" ]
268 then
269 if [ "$VERBOSE" == "on" ]
270 then
271 echo -e "\t>>> LINK: $pathto"
272 fi
273 ln -snf $link "$pathto"
274 fi
275 done < ${BUILDDIR}/${PKGNAME}/.symlinks
276
277 # very important: unsetting the '§' fieldseperator
278 unset IFS
279 else
280 fatal_error .symlinks
281 fi
282 }
283
284
285 ###################################################
286 # function install_blockdevices #
287 # install_blockdevices $PKGNAME #
288 ###################################################
289 install_blockdevices()
290 {
291 local PKGNAME
292 PKGNAME=$1
293
294 if [ -e ${BUILDDIR}/${PKGNAME}/.pipes ]
295 then
296 # sets fieldseperator to "§" instead of " "
297 IFS=§
298
299 while read pathto posix
300 do
301 if [ ! -z "$pathto" ]
302 then
303 if [ "$VERBOSE" == "on" ]
304 then
305 echo -e "\t>>> PIPE: $pathto"
306 fi
307 mkfifo -m $posix "$pathto"
308 fi
309 done < ${BUILDDIR}/${PKGNAME}/.pipes
310
311 # very important: unsetting the '§' fieldseperator
312 unset IFS
313 else
314 fatal_error .pipes
315 fi
316 }
317
318
319 ###################################################
320 # function install_characterdevices #
321 # install_characterdevices $PKGNAME #
322 ###################################################
323 install_characterdevices()
324 {
325 local PKGNAME
326 PKGNAME=$1
327
328 if [ -e ${BUILDDIR}/${PKGNAME}/.char ]
329 then
330 # sets fieldseperator to "§" instead of " "
331 IFS=§
332
333 while read pathto posix
334 do
335 if [ ! -z "$pathto" ]
336 then
337 if [ "$VERBOSE" == "on" ]
338 then
339 echo -e "\t>>> CHAR: $pathto"
340 fi
341 mknode -m $posix -c "$pathto"
342 fi
343 done < ${BUILDDIR}/${PKGNAME}/.char
344
345 # very important: unsetting the '§' fieldseperator
346 unset IFS
347 else
348 fatal_error .char
349 fi
350
351 #very important: unsetting the '§' fieldseperator
352 unset IFS
353 }
354
355
356 ###################################################
357 # function build_doinstall #
358 # build_doinstall $PKGNAME #
359 # NOTE: this is an wrapper do install packages #
360 ###################################################
361 build_doinstall()
362 {
363 local pkgname="$1"
364
365 echo "DEBUG: pkgname=${pkgname}"
366
367 # sanity checks; abort if not given
368 [ -z "${pkgname}" ] && die "build_doinstall() \$pkgname not given."
369
370 echo "DEBUG=jojo"
371
372 # this is only a wrapper
373
374 # NOTE:
375 # !! we use § as field seperator !!
376 # doing so prevent us to get errors by filenames with spaces
377
378 install_directories ${pkgname} || die "install directories ${pkgname}"
379 # install_files ${pkgname} || die "install files ${pkgname}"
380 # install_symlinks ${pkgname} || die "install symlinks ${pkgname}"
381 # install_blockdevices ${pkgname} || die "install blockdevices ${pkgname}"
382 # install_characterdevices ${pkgname} || die "install chardevices ${pkgname}"
383 }
384
385
386 ###################################################
387 # function install_database_entry #
388 # install_database_entry $PKGNAME $PKGTYPE #
389 # PKGTYPE can be "virtual", "sources" or nothing #
390 ###################################################
391 install_database_entry()
392 {
393 local PKGNAME
394 local PKGTYPE
395
396 PKGNAME=$1
397 PKGTYPE=$2
398
399 # add package to database
400 install -d ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}
401
402 # install mage-file to database
403 install -m 0644 -o root -g root \
404 ${MAGEFILE} \
405 ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}
406
407 # create fake file descriptors
408 # used by virtual and source packages
409 touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.dirs
410 touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.symlinks
411 touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.files
412 touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.pipes
413 touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.char
414 touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.mtime
415
416 # put category to database
417 echo ${CATEGORIE} > ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.categorie
418
419 # install PKGTYPE specific files
420 case ${PKGTYPE} in
421 virtual)
422 touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.virtual
423 ;;
424
425 sources)
426 touch ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}/.sources
427 ;;
428
429 *)
430 # normal packages needs these files
431 cp -f ${BUILDDIR}/${PKGNAME}/.{char,dirs,files,pipes,symlinks,mtime} \
432 ${INSTALLDB}/${CATEGORIE}/${PKGNAME/-${ARCH}/}
433 ;;
434 esac
435 }
436
437
438 ###################################################
439 # function remove_database_entry #
440 # remove_database_entry $PKGNAME $PKGTYPE #
441 # PKGTYPE can be "virtual", "sources" or nothing #
442 ###################################################
443 remove_database_entry()
444 {
445 local PKGNAME
446 local PKGTYPE
447
448 PKGNAME=$1
449 PKGTYPE=$2
450
451 #removes database entry
452 if [ -d ${INSTALLDB}/${PKGNAME} ]
453 then
454 rm -rf ${INSTALLDB}/${PKGNAME}
455 fi
456 }
457
458
459 ###################################################
460 # function compare_mtime #
461 # compare_mtime $PKGNAME /path/to/file #
462 # #
463 # returns: #
464 # 0=delete me #
465 # 1=keep me #
466 # #
467 # compares mtime of given files in packages #
468 ###################################################
469 compare_mtime()
470 {
471 local DBDIR
472 local pathto
473 local x
474
475 DBDIR=$1
476 pathto=$2
477
478 M_MTIME=$(stat -c %Y ${INSTALLDB}/${DBDIR}/.mtime)
479
480 # if $pathto is a symlink than compare linked binary
481 if [ -L ${pathto} ]
482 then
483 #readlink -f resolves full path of linked file
484 x=$(stat -c %Y "$(readlink -f "${pathto}")")
485 else
486 x=$(stat -c %Y "${pathto}")
487 fi
488
489 if [ "${M_MTIME}" -eq "${x}" ]
490 then
491 #echo "delete me: ${pathto}"
492 return 0
493 else
494 #echo "keep me : ${pathto}"
495 return 1
496 fi
497 }
498
499
500 ###################################################
501 # function remove_symlinks #
502 # remove_symlinks $PKGNAME #
503 ###################################################
504 remove_symlinks()
505 {
506 local PKGNAME
507 local RETVAL
508
509 PKGNAME=$1
510
511 if [ -e ${INSTALLDB}/${PKGNAME}/.symlinks ]
512 then
513 # sets fieldseperator to "§" instead of " "
514 IFS=§
515
516 while read pathto posix link mtime
517 do
518 if [ ! -z "$pathto" ]
519 then
520 if [ -L "$pathto" ]
521 then
522 compare_mtime ${PKGNAME} "${pathto}"
523 RETVAL=$?
524 # 0=delete me #
525 # 1=keep me #
526 case ${RETVAL} in
527 0)
528 if [ "${VERBOSE}" == "on" ]
529 then
530 echo -e "\t<<< LINK: $pathto"
531 fi
532 rm "$pathto"
533 ;;
534 1)
535 if [ "${VERBOSE}" == "on" ]
536 then
537 echo -e "${COLRED}! mtime${COLDEFAULT} === LINK: $pathto"
538 fi
539 ;;
540 esac
541 else
542 if [ "${VERBOSE}" == "on" ]
543 then
544 echo -e "${COLRED}! exist${COLDEFAULT} === LINK: $pathto"
545 fi
546 fi
547 fi
548 done < ${INSTALLDB}/${PKGNAME}/.symlinks
549
550 # very important: unsetting the '§' fieldseperator
551 unset IFS
552 else
553 fatal_error .symlinks
554 fi
555 }
556
557
558 ###################################################
559 # function remove_files #
560 # remove_files $PKGNAME #
561 ###################################################
562 remove_files()
563 {
564 local PKGNAME
565 local RETVAL
566
567 PKGNAME=$1
568
569 # uninstall of files
570 if [ -e ${INSTALLDB}/${PKGNAME}/.files ]
571 then
572 # sets fieldseperator to "§" instead of " "
573 IFS=§
574
575 while read pathto posix user group mtime md5sum
576 do
577 if [ ! -z "$pathto" ]
578 then
579 if [ -e "$pathto" ]
580 then
581 compare_mtime ${PKGNAME} "${pathto}"
582 RETVAL=$?
583 # 0=delete me #
584 # 1=keep me #
585 case ${RETVAL} in
586 0)
587 if [ "${VERBOSE}" == "on" ]
588 then
589 echo -e "\t<<< FILE: $pathto"
590 fi
591 rm "$pathto"
592 ;;
593 1)
594 if [ "${VERBOSE}" == "on" ]
595 then
596 echo -e "${COLRED}! mtime${COLDEFAULT} === FILE: $pathto"
597 fi
598 ;;
599 esac
600 else
601 if [ "${VERBOSE}" == "on" ]
602 then
603 echo -e "${COLRED}! exist${COLDEFAULT} === FILE: $pathto"
604 fi
605 fi
606 fi
607 done < ${INSTALLDB}/${PKGNAME}/.files
608
609 # very important: unsetting the '§' fieldseperator
610 unset IFS
611 else
612 fatal_error .files
613 fi
614 }
615
616
617 ###################################################
618 # function remove_blockdevices #
619 # remove_blockdevices $PKGNAME #
620 ###################################################
621 remove_blockdevices()
622 {
623 local PKGNAME
624 PKGNAME=$1
625
626 if [ -e ${INSTALLDB}/${PKGNAME}/.pipes ]
627 then
628 # sets fieldseperator to "§" instead of " "
629 IFS=§
630
631 while read pathto posix
632 do
633 if [ ! -z "$pathto" ]
634 then
635 if [ "${VERBOSE}" == "on" ]
636 then
637 echo -e "\t<<< PIPE: $pathto"
638 fi
639 rm "$pathto"
640 fi
641 done < ${INSTALLDB}/${PKGNAME}/.pipes
642
643 # very important: unsetting the '§' fieldseperator
644 unset IFS
645 else
646 fatal_error .pipes
647 fi
648 }
649
650
651 ###################################################
652 # function remove_characterdevices #
653 # remove_characterdevices $PKGNAME #
654 ###################################################
655 remove_characterdevices()
656 {
657 local PKGNAME
658 PKGNAME=$1
659
660 if [ -e ${INSTALLDB}/${PKGNAME}/.char ]
661 then
662 # sets fieldseperator to "§" instead of " "
663 IFS=§
664
665 while read pathto posix
666 do
667 if [ ! -z "$pathto" ]
668 then
669 if [ "${VERBOSE}" == "on" ]
670 then
671 echo -e "\t<<< CHAR: $pathto"
672 fi
673 rm "$pathto"
674 fi
675 done < ${INSTALLDB}/${PKGNAME}/.char
676
677 # very important: unsetting the '§' fieldseperator
678 unset IFS
679 else
680 fatal_error .char
681 fi
682 }
683
684
685 ###################################################
686 # function remove_direcories #
687 # remove_direcories $PKGNAME #
688 ###################################################
689 remove_directories()
690 {
691 local PKGNAME
692 PKGNAME=$1
693
694 # uninstall of dirs ## added small hack to fix dirs
695 # must be reverse -> smage2 doesn't sort them
696 if [ -e ${INSTALLDB}/${PKGNAME}/.dirs ]
697 then
698
699 # sort directory order
700 mv ${INSTALLDB}/${PKGNAME}/.dirs ${INSTALLDB}/${PKGNAME}/.dirs_old
701 cat ${INSTALLDB}/${PKGNAME}/.dirs_old | sort > ${INSTALLDB}/${PKGNAME}/.dirs
702
703 # sets fieldseperator to "§" instead of " "
704 IFS=§
705
706 while read pathto posix
707 do
708 if [ ! -z "$pathto" ]
709 then
710 if [ -e "$pathto" ]
711 then
712 if [ "${VERBOSE}" == "on" ]
713 then
714 echo -e "\t<<< DIR: $pathto"
715 fi
716 rmdir "$pathto" &> /dev/null
717 if [ "$?" -ne "0" ]
718 then
719 if [ "${VERBOSE}" == "on" ]
720 then
721 # moves the cursor up
722 echo -en \\033[A
723 echo -e "${COLRED}! empty${COLDEFAULT} === DIR: $pathto"
724 fi
725 fi
726 else
727 if [ "${VERBOSE}" == "on" ]
728 then
729 echo -e "${COLRED}! exist${COLDEFAULT} === DIR: $pathto"
730 fi
731 fi
732 fi
733 done < ${INSTALLDB}/${PKGNAME}/.dirs
734
735 # very important: unsetting the '§' fieldseperator
736 unset IFS
737 else
738 fatal_error .dirs
739 fi
740 }
741
742
743 ###################################################
744 # function build_douninstall #
745 # build_douninstall $PKGNAME #
746 # NOTE: this is an wrapper do remove packages #
747 ###################################################
748 build_douninstall()
749 {
750 # this is only a wrapper
751
752 # NOTE:
753 # !! we use § as field seperator !!
754 # doing so prevent us to get errors by filenames with spaces
755
756 local PKGNAME
757 PKGNAME=$1
758
759 remove_symlinks ${PKGNAME}
760 remove_files ${PKGNAME}
761 remove_blockdevices ${PKGNAME}
762 remove_characterdevices ${PKGNAME}
763 remove_directories ${PKGNAME}
764 }
765
766 # fetch_packages /path/to/mage/file1 /path/to/mage/file2
767 fetch_packages()
768 {
769 local pkg
770 local mirr
771 local magefile
772 local md5file
773 local opt
774
775 [ -z "${MIRRORS}" ] && die "You have no mirrors defined. Please edit your /etc/mage.rc."
776
777 for magefile in $@
778 do
779 pkg="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}"
780 pkgtype="$(get_value_from_magefile PKGTYPE ${magefile}).${PKGSUFFIX}"
781
782 # abort on virtual pkg
783 [[ ${pkgtype} = virtual ]] && continue
784
785 # abort if already exist
786 if [ -f ${PKGDIR}/${pkg} ]
787 then
788 echo -e " ${COLBLUE}***${COLDEFAULT} fetch complete ${pkg} ... "
789 continue
790 fi
791
792 for mirr in ${MIRRORS}
793 do
794 echo -e " ${COLBLUE}***${COLDEFAULT} fetching ${mirr}/${pkg} ... "
795 [[ ${VERBOSE} = off ]] && opt="--quiet"
796 wget \
797 --passive-ftp \
798 --tries 3 \
799 --continue \
800 --progress bar \
801 --directory-prefix=${PKGDIR} \
802 ${opt} ${mirr}/packages/${pkg}
803 if [[ $? = 0 ]]
804 then
805 break
806 else
807 continue
808 fi
809 done
810
811 if [ ! -f ${PKGDIR}/${pkg} ]
812 then
813 die "Could not download ${pkg}"
814 fi
815 done
816 }
817
818 syncmage()
819 {
820 if [ -z "${RSYNC}" ]
821 then
822 die "You have no rsync-mirrors defined. Please edit your /etc/mage.rc."
823 fi
824
825 local i
826 for i in ${RSYNC}
827 do
828 rsync \
829 --recursive \
830 --links \
831 --perms \
832 --times \
833 --devices \
834 --timeout=600 \
835 --verbose \
836 --compress \
837 --progress \
838 --stats \
839 --delete \
840 --delete-after \
841 ${i} ${MAGEDIR}
842 if [[ $? = 0 ]]
843 then
844 break
845 else
846 continue
847 fi
848 done
849
850 # clean up backup files (foo~)
851 find ${MAGEDIR} -name *~ -exec rm '{}' ';'
852
853 # check if an newer mage version is available
854 is_newer_mage_version_available
855 }
856
857 cleanpkg()
858 {
859 if [ -d "${PKGDIR}" ]
860 then
861 echo -n "Removing downloaded packages... "
862 rm -rf ${PKGDIR}/*
863 echo "done."
864 fi
865 }
866
867 ###################################################
868 # function keepfiles #
869 # keepfiles "$CATEGORIE/$PNAME" "$filename" #
870 # note wildchars allowed #
871 ###################################################
872 keepfiles()
873 {
874 local name
875 local keep
876 name="`echo $1| cut -d '/' -f2`"
877 keep="$2"
878
879 DELPKG="`find ${INSTALLDB} -name ${name}*.mage`"
880 DELDIR="${INSTALLDB}/$(basename ${DELPKG} .mage)"
881 cp ${DELDIR}/.files ${DELDIR}/.files-orig
882 sed "s:${keep}::" \
883 ${DELDIR}/.files-orig > ${DELDIR}/.files
884 rm ${DELDIR}/.files-orig
885 }
886
887
888 ###################################################
889 # function injectpkg #
890 # injectpkg "$CATEGORIE/$PNAME" #
891 # note wildchars allowed #
892 ###################################################
893 injectpkg()
894 {
895 local name
896 local categorie
897 local magename
898 name="`echo $1| cut -d '/' -f2`"
899 categorie="`echo $1| cut -d '/' -f1`"
900
901 INJPKG="`find ${MAGEDIR} -name ${name}-*.mage`"
902 for i in ${INJPKG}
903 do
904 magename="$(basename ${INJPKG} .mage)"
905 echo -e "Injecting fake package for ${COLBLUE}${categorie}${COLDEFAULT}/${COLGREEN}${magename}${COLDEFAULT}"
906 install -d ${INSTALLDB}/${magename}
907 touch ${INSTALLDB}/${magename}/{.injected,.files,.dirs,.symlinks,.pipes,.char}
908
909 #installs magefile
910 install -m 0644 -o root -g root \
911 ${MAGEDIR}/${categorie}/${magename}.mage \
912 ${INSTALLDB}/${magename}
913 done
914 }
915
916 ###################################################
917 # function reminjected #
918 # reminjected #
919 # note: removes all injected packages #
920 ###################################################
921 reminjected()
922 {
923 DELINJ="`find ${INSTALLDB} -name .injected`"
924 for i in ${DELINJ}
925 do
926 magename=$(dirname ${i})
927 if [ -d "${magename}" ]
928 then
929 # small fix to protect the mage-db deleting itself, that is not so funny :)
930 if [ "${magename}" != "${INSTALLDB}" ]
931 then
932 echo -e "removing fake package ${COLRED}${magename#${INSTALLDB}/*}${COLDEFAULT}"
933 rm -rf ${magename}
934 fi
935 fi
936 done
937 }
938
939
940 xtitle()
941 {
942 if [ ${TERM} == "xterm" ]
943 then
944 echo -ne "\033]0;Mage: $1\007"
945 fi
946 return 0
947 }
948
949
950 xtitleclean()
951 {
952 if [ ${TERM} == "xterm" ]
953 then
954 echo -ne "\033]0;\007"
955 fi
956 return 0
957 }
958
959
960 spin_processbar()
961 {
962
963 # does not works as it should -- disabled
964 # you musst add and remove a tempfile outside this funktion
965 # to leave this funktion ...
966
967 # before you call this function do this:
968 #
969 # touch /var/tmp/proz
970 # build_doinstall|spin_processbar
971
972 echo -en "Processing: "
973 while [ -f /var/tmp/proz ]
974 do
975 echo -en "-\b"
976 sleep 0.01
977 echo -en "\\ \b\b"
978 sleep 0.01
979 echo -en "|\b"
980 sleep 0.01
981 echo -en "/\b"
982 sleep 0.01
983 done
984 echo "done"
985 return 0
986
987 # when you want to leave the funktion do
988 # something like this:
989 #
990 # #remove spinner tempfile
991 # if [ "$VERBOSE" == "off" ]
992 # then
993 # if [ -f /var/tmp/proz ]
994 # then
995 # rm /var/tmp/proz
996 # fi
997 # fi
998
999 }
1000
1001
1002 # cuts full pathnames or versioniezed names down to basename
1003 choppkgname()
1004 {
1005 #we want this only if full name was used
1006 if [ -n "$(echo ${MAGENAME}|fgrep .mage)" ]
1007 then
1008 #cuts ARCH and PBUILD
1009 #ARCH comes from /etc/mage.rc
1010 MAGENAME=$(echo ${MAGENAME} |sed -e "s:-${ARCH}-r*.::g")
1011
1012 #cuts version number
1013 MAGENAME=$(basename ${MAGENAME%-*} .mage)
1014 fi
1015 }
1016
1017
1018 # # get_categorie $PNAME, returns CATEGORIE
1019 # # ret 0=ok, 1=not_found
1020 # getcategorie()
1021 # {
1022 # local pname="$1"
1023 # local pcat
1024 #
1025 # for CAT in ${MAGEDIR}/*
1026 # do
1027 # if [ -d ${CAT}/${MAGENAME} ]
1028 # then
1029 # # debug only
1030 # if [[ ${MAGEDEBUG} = on ]]
1031 # then
1032 # echo "${MAGENAME} found -> ${CAT}/${MAGENAME}"
1033 # echo "categorie = $(basename ${CAT})"
1034 # fi
1035 # CATEGORIE=$(basename ${CAT})
1036 # fi
1037 # done
1038 #
1039 # # package does not exists
1040 # [ -z "${CATEGORIE}" ] && die "Package '${MAGENAME}' does not exists."
1041 #
1042 # echo "${CATEGORIE}"
1043 # }
1044
1045
1046 # get_categorie $PNAME, returns CATEGORIE
1047 # ret 0=ok, 1=not_found
1048 pname2pcat()
1049 {
1050 local pname="$1"
1051 local pcat
1052 local categorie
1053
1054 for pcat in ${MAGEDIR}/*
1055 do
1056 if [ -d ${pcat}/${pname} ]
1057 then
1058 # for debug only
1059 if [[ ${MAGEDEBUG} = on ]]
1060 then
1061 echo "${MAGENAME} found -> ${pcat}/${pname}"
1062 echo "categorie = $(basename ${pcat})"
1063 fi
1064 categorie=$(basename ${pcat})
1065 fi
1066 done
1067
1068 # package does not exists
1069 [ -z "${categorie}" ] && die "Package '${pname}' does not exists."
1070
1071 echo "${categorie}"
1072 }
1073
1074 # check_stable_package /path/to/foo.mage
1075 # returns 0=stable 1=unstable
1076 check_stable_package()
1077 {
1078 local STATE
1079 STATE="$(get_value_from_magefile STATE "$1")"
1080
1081 # state testing
1082 if [[ ${USE_TESTING} = true ]]
1083 then
1084 case ${STATE} in
1085 testing|stable) return 0 ;;
1086 *) return 1 ;;
1087 esac
1088 fi
1089
1090 # state unstable
1091 if [[ ${USE_UNSTABLE} = true ]]
1092 then
1093 case ${STATE} in
1094 unstable|testing|stable) return 0 ;;
1095 *) return 1 ;;
1096 esac
1097 fi
1098
1099 # no use_state given = stable
1100 case ${STATE} in
1101 stable) return 0 ;;
1102 *) return 1 ;;
1103 esac
1104 }
1105
1106
1107 # get_highest_magefile ${PCAT} ${PNAME}
1108 # fake at moment returns only stable pkgs (must set to be one)
1109 # return $HIGHEST_MAGEFILE
1110 get_highest_magefile()
1111 {
1112 local HIGHEST_MAGEFILE
1113 local PCAT="$1"
1114 local PNAME="$2"
1115 local magefile
1116
1117 for magefile in $(ls --format=single-column -v ${MAGEDIR}/${PCAT}/${PNAME}/*)
1118 do
1119 # we exclude subdirs (for stuff like a md5sum dir)
1120 [ -d ${magefile} ] && continue
1121 if check_stable_package ${magefile}
1122 then
1123 HIGHEST_MAGEFILE=${magefile}
1124 #for debug only
1125 [[ ${MAGEDEBUG} = on ]] && echo "HIGHEST_MAGEFILE=${HIGHEST_MAGEFILE}"
1126 fi
1127 done
1128
1129 # stop here if HIGHEST_MAGEFILE is zero
1130 # this package must be unstable or old
1131 if [ -z "${HIGHEST_MAGEFILE}" ]
1132 then
1133 echo
1134 echo -n "All packages named "
1135 echo -en ${COLRED}\""${PKGNAME%-*-*-*}\""${COLDEFAULT}
1136 echo -n " are marked "
1137 echo -en ${COLRED}"*UNSTABLE*"${COLDEFAULT}
1138 echo "."
1139 echo "You need to declare USE_UNSTABLE=true to install this."
1140 echo
1141 echo "Example:"
1142 echo " USE_UNSTABLE=true mage install ${PKGNAME%-*-*-*}"
1143 echo
1144 echo "Be warned that these packages are not stable and may cause serious problems."
1145 echo "You should know what you are doing, so don't complain about any damage."
1146 echo
1147 return 1
1148 fi
1149
1150 echo "${HIGHEST_MAGEFILE}"
1151 return 0
1152 }
1153
1154
1155 ###################################################
1156 # function is_config_protected #
1157 # is_config_protected /path/to/file #
1158 # #
1159 # returns: #
1160 # 0 - not protected #
1161 # 1 - error #
1162 # 2 - protected #
1163 # 3 - protected but masked #
1164 # #
1165 ###################################################
1166 is_config_protected()
1167 {
1168 local EXPFILE
1169 local TEST
1170 local PROTECTED
1171 local IFS
1172
1173 EXPFILE=$1
1174
1175 # to be safe; it may be '§'
1176 IFS=' '
1177
1178 # check ob in config protect
1179 for i in ${CONFIG_PROTECT}
1180 do
1181 # ersetzen von $i nur wenn am anfang der variable
1182 TEST="${EXPFILE/#${i}/Protected}"
1183 if [ "${TEST}" != "${EXPFILE}" ]
1184 then
1185 # setzen das es protected ist
1186 PROTECTED=TRUE
1187
1188 # check ob nicht doch maskiert
1189 for x in ${CONFIG_PROTECT_MASK}
1190 do
1191 TEST="${EXPFILE/#${x}/Protect_Masked}"
1192 if [ "${TEST}" != "${EXPFILE}" ]
1193 then
1194 PROTECTED=MASKED
1195 fi
1196 done
1197 fi
1198 done
1199
1200 unset IFS
1201
1202 case ${PROTECTED} in
1203 TRUE)
1204 #echo "I'm protected"
1205 return 2
1206 ;;
1207 MASKED)
1208 #echo "I'm protected, but masked - delete me"
1209 return 3
1210 ;;
1211 *)
1212 #echo "delete me"
1213 return 0
1214 ;;
1215 esac
1216 }
1217
1218
1219 ###################################################
1220 # function count_protected_files #
1221 # count_protected_files /path/to/file #
1222 # #
1223 # note: prints number of protected files #
1224 # exp: 0012 #
1225 ###################################################
1226 count_protected_files()
1227 {
1228 ${MLIBDIR}/writeprotected "$1"
1229 }
1230
1231
1232 #call with 'get_magefile_to_uninstall SEARCHSTRING'
1233 #returns /path/to/magefile
1234 get_magefile_to_uninstall()
1235 {
1236 local RESULT
1237 local SSTRING
1238 local i
1239 local x
1240 local z
1241
1242 SSTRING=$1
1243
1244 for i in ${INSTALLDB}/*/*
1245 do
1246 #echo ${i}
1247 #to be sure
1248 if [ -d ${i} ]
1249 then
1250 #echo "DEBUG: stripped i: $(basename ${i%-*-*})"
1251 if [ $(basename ${i%-*-*}) == ${SSTRING} ]
1252 then
1253 #RESULT="${RESULT} ${i}"
1254 CATEGORIE=$(< ${i}/.categorie)
1255 #echo ${CATEGORIE}/$(basename ${RESULT})
1256 RESULT="${RESULT} ${CATEGORIE}/$(basename ${i})"
1257 fi
1258 fi
1259 done
1260
1261 if [ -n "${RESULT}" ]
1262 then
1263 #check if ONE package was found and not more
1264 declare -i x=0
1265 for i in ${RESULT}
1266 do
1267 x=${x}+1
1268 done
1269 if [ ${x} -eq 1 ]
1270 then
1271 #echo "jo ich uninstall $(basename ${RESULT}) ..."
1272 #the mage file
1273 #echo "${RESULT}/$(basename ${RESULT}).mage"
1274
1275 #gets categorie of the package
1276 #CATEGORIE=$(< ${i}/.categorie)
1277 #echo ${CATEGORIE}/$(basename ${RESULT})
1278 echo "${RESULT}"
1279 return 0
1280 else
1281 #echo "More than one package found ..."
1282 echo "${RESULT}"
1283 return 2
1284 fi
1285 else
1286 #echo "No package found named '${SSTRING}'."
1287 echo "${SSTRING}"
1288 return 1
1289 fi
1290 }
1291
1292
1293 # reads virtualdb file
1294 #$1 = virtualname; $2 commands: showpkgs, showline
1295 #return 0 == installed -> shows installed pkg as well
1296 #return 1 == not installed
1297 virtuals_read()
1298 {
1299 local VIRTUAL_NAME COMMAND VIRT_LINE line x i
1300
1301 VIRTUAL_NAME=$1
1302 COMMAND=$2
1303
1304 # parse file to get virtual_name line
1305 IFS=$'\n'
1306 for line in $(< ${VIRTUALDB_FILE})
1307 do
1308 IFS=$' '
1309 for x in ${line}
1310 do
1311 if [ "${x}" == "${VIRTUAL_NAME}" ]
1312 then
1313 VIRT_LINE="${line}"
1314
1315 if [ "${COMMAND}" == "showline" ]
1316 then
1317 #give out the non stripped line
1318 echo "${line}"
1319 fi
1320 fi
1321 done
1322
1323 IFS=$'\n'
1324 done
1325
1326 unset IFS
1327
1328 #now read the packages linked to VIRTUAL_NAME and output them
1329 if [ -n "${VIRT_LINE}" ]
1330 then
1331 if [ "${COMMAND}" == "showpkgs" ]
1332 then
1333 declare -i x=0
1334 for i in ${VIRT_LINE}
1335 do
1336 if [ ${x} -ge 1 ]
1337 then
1338 echo "${i}"
1339 fi
1340 ((x++))
1341 done
1342 fi
1343 return 0
1344 fi
1345 return 1
1346 }
1347
1348
1349 #add pkg to virtualdb
1350 # $1 == virtualname $2= pkgname
1351 # retvals: 0=ok,added; 1=error; 3=pkg already in virtual
1352 virtuals_add()
1353 {
1354 local VIRTUAL_NAME PKG_NAME OLD_LINE line i
1355
1356 VIRTUAL_NAME=$1
1357 PKG_NAME=$2
1358
1359
1360 if virtuals_read ${VIRTUAL_NAME}
1361 then
1362 #make shure ${PKG_NAME} is *not* in ${VIRTUAL_NAME} already
1363 for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs)
1364 do
1365 if [ "${i}" == ${PKG_NAME} ]
1366 then
1367 echo "==== ${PKG_NAME} already linked with ${VIRTUAL_NAME} ..."
1368 return 3
1369 fi
1370 done
1371
1372 echo ">>>> Updating ${VIRTUAL_NAME} with ${PKG_NAME} in virtual database ..."
1373 OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)"
1374
1375 #make a backup
1376 mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
1377
1378 IFS=$'\n'
1379 for line in $(< ${VIRTUALDB_FILE}.old)
1380 do
1381 #if the right line, append ${PKG_NAME}, else do nothing
1382 if [ "${line}" == "${OLD_LINE}" ]
1383 then
1384 echo "${line} ${PKG_NAME}" >> ${VIRTUALDB_FILE}
1385 else
1386 echo "${line}" >> ${VIRTUALDB_FILE}
1387 fi
1388 done
1389
1390 unset IFS
1391 else
1392 echo ">>>> Adding ${PKG_NAME} as ${VIRTUAL_NAME} to virtual database ..."
1393 echo "${VIRTUAL_NAME} ${PKG_NAME}" >> ${VIRTUALDB_FILE} \
1394 && echo "ok" || echo "false"
1395 fi
1396
1397 return 0
1398 }
1399
1400 #deletes pakages from virtual database
1401 #$1 virtualname; $2 pkgname
1402 virtuals_del() {
1403
1404 local VIRTUAL_NAME PKG_NAME OLD_LINE METHOD line i x PKG_INSTALLED
1405
1406 VIRTUAL_NAME=$1
1407 PKG_NAME=$2
1408
1409 #first check if exists
1410 if virtuals_read ${VIRTUAL_NAME}
1411 then
1412 #get method -> delall or update and check if ${PKG_NAME} exists in ${VIRTUAL_NAME}
1413 declare -i x=0
1414 for i in $(virtuals_read ${VIRTUAL_NAME} showpkgs)
1415 do
1416 if [ "${i}" == "${PKG_NAME}" ]
1417 then
1418 PKG_INSTALLED=true
1419 fi
1420 ((x++))
1421 done
1422
1423 #abort if not installed
1424 if [ "${PKG_INSTALLED}" != "true" ]
1425 then
1426 echo "!!!! ${PKG_NAME} does not exists in ${VIRTUAL_NAME}."
1427 return 0
1428 fi
1429
1430 if [ ${x} -ge 2 ]
1431 then
1432 METHOD=update
1433 else
1434 METHOD=delall
1435 fi
1436
1437 #get the complete line
1438 OLD_LINE="$(virtuals_read ${VIRTUAL_NAME} showline)"
1439
1440 #make a backup
1441 mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
1442
1443 #parse virtualdb
1444 IFS=$'\n'
1445 for line in $(< ${VIRTUALDB_FILE}.old)
1446 do
1447 if [ "${line}" == "${OLD_LINE}" ]
1448 then
1449 #delall or update?
1450 case ${METHOD} in
1451 update)
1452 echo "<<<< Unlinking ${PKG_NAME} from ${VIRTUAL_NAME} in virtual database ..."
1453 #del PKG_NAME from line
1454 echo "${line/ ${PKG_NAME}/}" >> ${VIRTUALDB_FILE}
1455 ;;
1456 delall)
1457 echo "<<<< Deleting ${VIRTUAL_NAME} in virtual database ..."
1458 #continue; do not write anything
1459 continue
1460 ;;
1461 esac
1462 else
1463 echo "${line}" >> ${VIRTUALDB_FILE}
1464 fi
1465 done
1466 unset IFS
1467 else
1468 echo "!!!! ${VIRTUAL_NAME} does not exists in virtual database."
1469 fi
1470 }
1471
1472 # gets real pkgname from virtuals.default
1473 #$1=VIRTUAL_NAME; returns PKG_NAME
1474 default_virtualname_to_pkgname()
1475 {
1476 local VIRTUAL_NAME PKG_NAME db_virtualname db_pkgname
1477
1478 VIRTUAL_NAME=$1
1479
1480 while read db_virtualname db_pkgname
1481 do
1482 if [ "${db_virtualname}" == "${VIRTUAL_NAME}" ]
1483 then
1484 PKG_NAME="${db_pkgname}"
1485 fi
1486 done << EOF
1487 $(< ${VIRTUALDB_DEFAULTS})
1488 EOF
1489
1490 if [ -n "${PKG_NAME}" ]
1491 then
1492 echo "${PKG_NAME}"
1493 fi
1494 }
1495
1496 minclude()
1497 {
1498 local i
1499
1500 if [ -n "$@" ]
1501 then
1502 for i in $@
1503 do
1504 [[ ${MAGEDEBUG} = on ]] && \
1505 echo "--- Including ${MAGEDIR}/include/${i}.minc"
1506 source ${MAGEDIR}/include/${i}.minc
1507 done
1508 [[ ${MAGEDEBUG} = on ]] && echo
1509 fi
1510 }
1511
1512 sminclude()
1513 {
1514 local i
1515
1516 if [ -n "$@" ]
1517 then
1518 for i in $@
1519 do
1520 echo "--- Including ${SMAGESCRIPTSDIR}/include/${i}.sminc"
1521 source ${SMAGESCRIPTSDIR}/include/${i}.sminc
1522 done
1523 echo
1524 fi
1525 }
1526
1527 # checks if an newer mage version is available
1528 is_newer_mage_version_available()
1529 {
1530 local newest_mage
1531 local installed_mage
1532
1533 newest_mage="$( CATEGORIE=app-mage MAGENAME=mage get_highest_magefile;echo $(basename ${MAGEFILE} .mage) )"
1534 installed_mage="$(magequery -n mage | cut -d' ' -f5)"
1535
1536 if [[ ${newest_mage} > ${installed_mage} ]]
1537 then
1538 echo
1539 echo -en ${COLRED}"An update for your packetmanager is available. "${COLDEFAULT}
1540 echo -e ${COLBLUE}"[ ${newest_mage} ]"${COLDEFAULT}
1541 echo "It is recommened to install this newer version"
1542 echo "or your current system installation may brake."
1543 echo
1544 echo -en "Please update mage by running "
1545 echo -e ${COLGREEN}"'mage install mage'"${COLDEFAULT}
1546 echo
1547 fi
1548 }
1549
1550
1551 # returns pname from pkgname
1552 # pkgname2pname $PKGNAME
1553 pkgname2pname()
1554 {
1555 local pname
1556
1557 pname="${1%-*-*-*}"
1558 echo "${pname}"
1559 }
1560
1561 # returns pver from pkgname
1562 # pkgname2pver $PKGNAME
1563 pkgname2pver()
1564 {
1565 local i pver
1566
1567 i="${1/$(pkgname2pname $1)-/}"
1568 pver="${i%-*-*}"
1569 echo "${pver}"
1570 }
1571
1572 # returns pbuild from pkgname
1573 # pkgname2pbuild $PKGNAME
1574 pkgname2pbuild()
1575 {
1576 local pbuild
1577
1578 pbuild="${1##*-}"
1579 echo "${pbuild}"
1580 }
1581
1582 # returns parch from pkgname
1583 # pkgname2parch $PKGNAME
1584 pkgname2parch()
1585 {
1586 local i x parch
1587
1588 i="${1%-*-*}-"
1589 x="${1%-*}"
1590 parch="${x/${i}/}"
1591 echo "${parch}"
1592 }
1593
1594 # returns pname from magename
1595 # magename2pname /PATH/TO/MAGE/FILE
1596 magename2pname()
1597 {
1598 local i pname
1599
1600 i="$(basename $1 .mage)"
1601 pname="${i%-*-*}"
1602 echo "${pname}"
1603 }
1604
1605 # returns pver from magename
1606 # magename2pver /PATH/TO/MAGE/FILE
1607 magename2pver()
1608 {
1609 local i pver
1610
1611 i="$(basename $1 .mage)"
1612 i="${i/$(magename2pname $1)-/}"
1613 pver="${i%-*}"
1614 echo "${pver}"
1615 }
1616
1617 # returns pbuild from magename
1618 # magename2pbuild /PATH/TO/MAGE/FILE
1619 magename2pbuild()
1620 {
1621 local i pbuild
1622
1623 i="$(basename $1 .mage)"
1624 pbuild="${i##*-}"
1625 echo "${pbuild}"
1626 }
1627
1628 # returns pcat from magename
1629 # magename2pcat /PATH/TO/MAGE/FILE
1630 magename2pcat()
1631 {
1632 local i pcat
1633
1634 # go 2 dirs back
1635 i="${1%/*/*}"
1636 # get basename
1637 pcat="${i##*/}"
1638 echo "${pcat}"
1639 }
1640
1641 # returns pcat from DEPEND (without operand ! PCAT/PNAME-VERSION)
1642 # dep2pcat DEPEND
1643 dep2pcat()
1644 {
1645 local pcat
1646
1647 pcat="${1%/*}"
1648 echo "${pcat}"
1649 }
1650
1651 # returns pname from DEPEND (without operand ! PCAT/PNAME-VERSION)
1652 # $2=virtual is used to resolv VDEPEND from virtual packages
1653 # dep2pcat DEPEND (virtual)
1654 dep2pname()
1655 {
1656 local pname
1657
1658 pname="${1##*/}"
1659
1660 # cut version only if not virtual or it will cut the name
1661 if [[ $(dep2pcat $1) != virtual ]] && \
1662 [[ $2 != virtual ]]
1663 then
1664 pname="${pname%-*}"
1665 fi
1666
1667 echo "${pname}"
1668 }
1669
1670 dep2highest_magefile()
1671 {
1672 local pcat
1673 local pname
1674 local magefile
1675 local installed_virtuals
1676
1677 pcat="$(dep2pcat $1)"
1678 pname="$(dep2pname $1)"
1679
1680 if [[ ${pcat} = virtual ]]
1681 then
1682 # first check if virtual is already installed
1683 installed_virtuals="$(virtuals_read ${pcat}/${pname} showpkgs)"
1684 if [ -n "${installed_virtuals}" ]
1685 then
1686 for vpkg in ${installed_virtuals}
1687 do
1688 realpkgname="${vpkg}"
1689 virtualpkgname="${pcat}/${pname}"
1690 pcat="$(dep2pcat ${realpkgname})"
1691 pname="$(dep2pname ${realpkgname} virtual)"
1692 done
1693 else
1694 # choose one from virtualdb defaults (virtuals.defaults)
1695 realpkgname="$(default_virtualname_to_pkgname ${pcat}/${pname})"
1696 virtualpkgname="${pcat}/${pname}"
1697 pcat="$(dep2pcat ${realpkgname})"
1698 pname="$(dep2pname ${realpkgname} virtual)"
1699 fi
1700 fi
1701
1702 magefile="$(get_highest_magefile ${pcat} ${pname})"
1703 echo "${magefile}"
1704 }
1705
1706 # is_installed ${PCAT}/${PNAME}-${PVER}-${PBUILD}
1707 is_installed()
1708 {
1709 local fullpkgname="$1"
1710
1711 # return 0 if installed
1712 [ -d ${INSTALLDB}/${fullpkgname} ] && return 0
1713
1714 return 1
1715 }
1716
1717 install_packages()
1718 {
1719 local list="$@"
1720 local pkg
1721 local pcat
1722 local pname
1723 local pver
1724 local pbuild
1725 local total_pkgs
1726 local current_pkg
1727
1728 # get count of total packages
1729 declare -i total_pkgs=0
1730 declare -i current_pkg=0
1731 for i in ${list}; do (( total_pkgs++ )); done
1732
1733 for pkg in ${list}
1734 do
1735 (( current_pkg++ ))
1736 pcat=$(magename2pcat ${pkg})
1737 pname=$(magename2pname ${pkg})
1738 pver=$(magename2pver ${pkg})
1739 pbuild=$(magename2pbuild ${pkg})
1740
1741 mage_install \
1742 --pcat ${pcat} \
1743 --pname ${pname} \
1744 --pver ${pver} \
1745 --pbuild ${pbuild} \
1746 --count-total ${total_pkgs} \
1747 --count-current ${current_pkg}
1748 done
1749 }
1750
1751 # get_value_from_magefile VARIABLE
1752 # returns the content of this VAR
1753 get_value_from_magefile()
1754 {
1755 local var="$1"
1756 local magefile="$2"
1757 local value
1758
1759 # local all possible vars of a mage file
1760 # to prevent bad issues
1761 local PKGNAME
1762 local STATE
1763 local DESCRIPTION
1764 local HOMEPAGE
1765 local DEPEND
1766 local SDEPEND
1767 local PROVIDE
1768 local PKGTYPE
1769 local preinstall
1770 local postinstall
1771
1772 # sanity checks
1773 [ -f ${magefile} ] && source ${magefile} || \
1774 die "get_value_from_magefile: ${magefile} not found."
1775 [ -z "${var}" ] && die "get_value_from_magefile: \$var not given."
1776
1777 source ${magefile}
1778 eval value=\$$(echo ${var})
1779 echo "${value}"
1780 }
1781
1782 mage_install()
1783 {
1784 # local all possible vars of a mage file
1785 # to prevent bad issues
1786 local PKGNAME
1787 local STATE
1788 local DESCRIPTION
1789 local HOMEPAGE
1790 local DEPEND
1791 local SDEPEND
1792 local PROVIDE
1793 local PKGTYPE
1794 local preinstall
1795 local postinstall
1796
1797 local pcat
1798 local pname
1799 local pver
1800 local pbuild
1801 local count_total
1802 local count_current
1803 local magefile
1804
1805 # very basic getops
1806 for i in $*
1807 do
1808 case $1 in
1809 --pcat|-c) shift; pcat="$1" ;;
1810 --pname|-n) shift; pname="$1" ;;
1811 --pver|-v) shift; pver="$1" ;;
1812 --pbuild|-b) shift; pbuild="$1" ;;
1813 --count-total) shift; count_total="$1" ;;
1814 --count-current) shift; count_current="$1" ;;
1815 --src-install|-s) shift ;;
1816 --help|-h) usage ;;
1817 esac
1818 shift
1819 done
1820
1821 # sanity checks; abort if not given
1822 [ -z "${pcat}" ] && die "mage_install() \$pcat not given."
1823 [ -z "${pname}" ] && die "mage_install() \$pname not given."
1824 [ -z "${pver}" ] && die "mage_install() \$pver not given."
1825 [ -z "${pbuild}" ] && die "mage_install() \$pbuild not given."
1826
1827 # check needed global vars
1828 [ -z "${MAGEDIR}" ] && die "\$MAGEDIR not set."
1829 [ -z "${INSTALLDB}" ] && die "\$INSTALLDB not set."
1830 [ -z "${BUILDDIR}" ] && die "\$BUILDDIR not set."
1831
1832 xtitle "[ (${count_current}/${count_total}) Installing ${pcat}/${pname}-${pver}-${pbuild} ]"
1833 echo -ne "${COLBLUE} >>> ${COLDEFAULT}"
1834 echo -n "installing (${count_current}/${count_total}): "
1835 echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
1836 echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}"
1837
1838 magefile="${MAGEDIR}/${pcat}/${pname}/${pname}-${pver}-${pbuild}.mage"
1839 source ${magefile}
1840
1841 # if [ "${PKGTYPE}" == "virtual" ]
1842 # then
1843 # mage_install_virtual
1844 # return 0
1845 # fi
1846 #
1847 # if [ "${PKGTYPE}" == "sources" ]
1848 # then
1849 # mage_install_sources
1850 # return 0
1851 # fi
1852
1853 # if [ ! -e ${PKGDIR}/${PKGNAME}.${PKGSUFFIX} ]
1854 # then
1855 # echo -en "\nPrefetching needed Packages for "
1856 # echo -e "${COLGREEN}${PKGNAME/-${ARCH}/}${COLDEFAULT}...\n"
1857 # getpackages
1858 # fi
1859 #
1860 # echo -e "\nInstallation of Package: ${COLGREEN}${PKGNAME/-${ARCH}/}${COLDEFAULT}\n"
1861 # #( build_unpackpkg ) | echo -e "Unpacking Package ...\n"
1862 #
1863 # echo -en "Unpacking Package ..."
1864 # build_unpackpkg
1865 # echo "done"
1866
1867 # ## preinstall scripte
1868 # export -f preinstall 2> /dev/null
1869 # if [ "$?" == "0" ]
1870 # then
1871 # echo -e "\nRunning Preinstall ... \n"
1872 # preinstall
1873 # unset preinstall
1874 # fi
1875
1876
1877 ## preinstall scripte
1878 if [ -n "$(typeset -f preinstall)" ]
1879 then
1880 echo -e " ${COLBLUE}---${COLDEFAULT} running preinstall ... "
1881 # preinstall
1882 unset preinstall
1883 fi
1884
1885 #
1886 # # install of package
1887 # if [ "$VERBOSE" == "off" ]
1888 # then
1889 # echo -en "Processing ... "
1890 build_doinstall ${PKGNAME}
1891 # echo "done"
1892 # fi
1893 #
1894 # if [ "$VERBOSE" == "on" ]
1895 # then
1896 # # build_doinstall
1897 # build_doinstall ${PKGNAME}
1898 # fi
1899 #
1900 # # postinstall scripte
1901 # export -f postinstall 2> /dev/null
1902 # if [ "$?" == "0" ]
1903 # then
1904 # echo -e "\nRunning Postinstall ... \n"
1905 # postinstall
1906 # unset postinstall
1907 # fi
1908
1909 ## postinstall scripte
1910 if [ -n "$(typeset -f postinstall)" ]
1911 then
1912 echo -e " ${COLBLUE}---${COLDEFAULT} running postinstall ... "
1913 # postinstall
1914 unset postinstall
1915 fi
1916
1917
1918 # # install database entry
1919 # install_database_entry ${PKGNAME}
1920 #
1921 # # cleanup
1922 # if [ -d ${BUILDDIR}/${PKGNAME} ]
1923 # then
1924 # rm -rf ${BUILDDIR}/${PKGNAME}
1925 # fi
1926 #
1927 # # check for virtuals and PROVIDE
1928 # # if so install it to virtualdb
1929 # register_virtual_pkg
1930 #
1931 # # update mtimes of packages and db_entries
1932 # update_mtime
1933 #
1934 # # rebuilds toplevel info node
1935 # echo -en "\n>>>> Rebuilding top-level info node ... "
1936 # ${MLIBDIR}/mkinfodir /usr/share/info > /usr/share/info/dir \
1937 # && echo "done" || echo "false"
1938 #
1939 # # rebuilds the enviroment with the content of /etc/env.d
1940 # ${MLIBDIR}/env-rebuild.sh
1941 #
1942 xtitleclean
1943 # echo -e "\nPackage '${PKGNAME/-${ARCH}/}' sucessfully installed.\n"
1944
1945 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1946 echo -n "Package "
1947 echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
1948 echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} "
1949 echo "successfully installed."
1950 }
1951
1952 md5sum_packages()
1953 {
1954 local list="$@"
1955 local magefile
1956 local pcat
1957 local pname
1958 local pver
1959 local pbuild
1960 local pkgname
1961
1962 for magefile in ${list}
1963 do
1964 pcat=$(magename2pcat ${magefile})
1965 pname=$(magename2pname ${magefile})
1966 pver=$(magename2pver ${magefile})
1967 pbuild=$(magename2pbuild ${magefile})
1968 md5file="${MAGEDIR}/${pcat}/${pname}/md5/${pname}-${pver}-${pbuild}.md5"
1969 pkgfile="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}"
1970
1971 if [ -f "${md5file}" ]
1972 then
1973 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1974 echo -ne "checking md5 sum:"
1975 echo -n "${pkgfile} "
1976 ( cd ${PKGDIR}; md5sum --check ${md5file} ) || die "md5 for ${pkgfile} failed"
1977 echo "ok"
1978 else
1979 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1980 echo -e "!! no md5 sum file found for ${pkgfile} :("
1981 fi
1982 done
1983 }