Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 314 - (show annotations) (download) (as text)
Sun Jan 1 23:45:27 2006 UTC (18 years, 4 months ago) by niro
File MIME type: application/x-sh
File size: 60963 byte(s)
fixed again a typo

1 #!/bin/bash
2 # Magellan Linux Installer Functions (mage.functions.sh)
3 # $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/mage4.functions.sh,v 1.14 2006-01-01 23:45:27 niro Exp $
4
5 mage_setup()
6 {
7 [ ! -d ${MROOT}${INSTALLDB} ] && \
8 install -d ${MROOT}${INSTALLDB}
9 [ ! -f ${MROOT}${VIRTUALDB_FILE} ] && \
10 touch ${MROOT}${VIRTUALDB_FILE}
11 [ ! -d ${PKGDIR} ] && install -d ${PKGDIR}
12 [ ! -d ${BUILDDIR} ] && install -d ${BUILDDIR}
13 [ ! -d ${MAGEDIR} ] && install -d ${MAGEDIR}
14
15 return 0
16 }
17
18 unpack_packages()
19 {
20 local list="$@"
21 local magefile
22 local pkg
23 local pkgtype
24 local count_current
25 local count_total
26
27 # get count of total packages
28 declare -i count_current=0
29 declare -i count_total=0
30
31 for i in ${list}; do (( count_total++ )); done
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})"
37
38 (( count_current++ ))
39 xtitle "[ (${count_current}/${count_total}) Unpacking ${pkg} ]"
40
41 # abort on virtual pkg
42 if [[ ${pkgtype} = virtual ]]
43 then
44 echo -ne " ${COLBLUE}---${COLDEFAULT}"
45 echo " !unpack virtual (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... "
46 continue
47 fi
48
49 # abort on sources pkg
50 if [[ ${pkgtype} = sources ]]
51 then
52 echo -ne " ${COLBLUE}---${COLDEFAULT}"
53 echo " !unpack sources (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... "
54 continue
55 fi
56
57 echo -e " ${COLBLUE}***${COLDEFAULT} unpacking (${count_current}/${count_total}): ${pkg} ... "
58 tar xjmf ${PKGDIR}/${pkg} -C ${BUILDDIR} || die "Unpacking package ${pkg}"
59 done
60
61 # add a crlf for a better view
62 if [ ${count_total} -gt 1 ]; then echo; fi
63 }
64
65
66 # fix_mtime path/to/$mtime/reffile $pathto/file
67 # creates a given reference file and fixes given file
68 # returns new mtime
69 fix_mtime()
70 {
71 local reference="$1"
72 local pathto="$2"
73 local mtime
74
75 mtime=$(stat -c %Y "${reference}")
76 touch \
77 --no-create \
78 --time=mtime \
79 --reference "${reference}" \
80 "${pathto}"
81
82 echo "${mtime}"
83 }
84
85 # fix_descriptor pkgname/.dir "foo1" "foo2"
86 fix_descriptor()
87 {
88 local descriptor="$1"
89 local output
90 local i
91 shift
92
93 for i in $@
94 do
95 if [[ -z ${output} ]]
96 then
97 output="${i}"
98 else
99 output="${output}§${i}"
100 fi
101 done
102
103 echo "${output}" >> ${BUILDDIR}/${descriptor}_fixed
104 }
105
106 ###################################################
107 # function install_direcories #
108 # install_direcories $PKGNAME #
109 ###################################################
110 install_directories()
111 {
112 local pkgname="$1"
113 local pathto
114 local posix
115 local user
116 local group
117 local IFS
118
119 # sanity checks; abort if not given
120 [ -z "${pkgname}" ] && die "install_directories() \$pkgname not given."
121
122 # check needed global vars
123 [ -z "${BUILDDIR}" ] && die "install_directories() \$BUILDDIR not set."
124
125 [ ! -f ${BUILDDIR}/${pkgname}/.dirs ] && die "install_directories() .dirs not found"
126
127 # sets fieldseperator to "§" instead of " "
128 IFS=§
129
130 while read pathto posix user group
131 do
132 [ -z "${pathto}" ] && continue
133 [[ ${VERBOSE} = on ]] && echo -e "\t>>> DIR: ${MROOT}${pathto}"
134
135
136 # monitors /etc/env.d -> env-rebuild
137 [[ ${pathto} = /etc/env.d ]] && export MAGE_ENV_REBUILD=true
138
139 # monitors /usr/share/info -> info-rebuild
140 [[ ${pathto} = /usr/share/info ]] && export MAGE_INFO_REBUILD=true
141
142 install -m "${posix}" -o "${user}" -g "${group}" -d "${MROOT}${pathto}"
143 done < ${BUILDDIR}/${pkgname}/.dirs
144
145 # very important: unsetting the '§' fieldseperator
146 IFS=$'\n'
147 }
148
149
150 ###################################################
151 # function install_files #
152 # install_files $PKGNAME #
153 ###################################################
154 install_files()
155 {
156
157 local pkgname="$1"
158 local pathto
159 local posix
160 local user
161 local group
162 local mtime
163 local md5sum
164
165 local retval
166 local counter
167 local filename
168 local dest_dirname
169 local dest_protected
170 local IFS
171
172 # sanity checks; abort if not given
173 [ -z "${pkgname}" ] && die "install_files() \$pkgname not given."
174
175 # check needed global vars
176 [ -z "${BUILDDIR}" ] && die "install_files() \$BUILDDIR not set."
177
178 [ ! -f ${BUILDDIR}/${pkgname}/.files ] && die "install_files() .files not found"
179
180 # delete old files
181 [ -f ${BUILDDIR}/${pkgname}/.files_fixed ] && rm ${BUILDDIR}/${pkgname}/.files_fixed
182
183 # sets fieldseperator to "§" instead of " "
184 IFS=§
185
186 while read pathto posix user group mtime md5sum
187 do
188 [ -z "${pathto}" ] && continue
189
190 # final destination dir of file ${pathto}
191 dest_dirname="$(dirname "${MROOT}${pathto}")"
192
193 ### small hotfix fix ###
194 [ ! -d "${dest_dirname}" ] && install -d "${dest_dirname}"
195
196 # check if the file is config_protected
197 # ${MROOT} will automatically added if set !!
198 is_config_protected "${pathto}"
199 retval="$?"
200
201 # 0 - not protected #
202 # 1 - error #
203 # 2 - protected #
204 # 3 - protected but masked #
205
206 case ${retval} in
207 # file is not protected - (over)write it
208 0|3)
209 [[ ${VERBOSE} = on ]] && echo -e "\t>>> FILE: ${MROOT}${pathto}"
210 install -m "${posix}" -o "${user}" -g "${group}" \
211 ${BUILDDIR}/${pkgname}/binfiles/"${pathto}" \
212 "${MROOT}${pathto}"
213
214 # fix mtime and db
215 fix_descriptor ${pkgname}/.files \
216 "${pathto}" \
217 "${posix}" \
218 "${user}" \
219 "${group}" \
220 "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
221 "${MROOT}${pathto}")" \
222 "${md5sum}"
223 ;;
224
225 # file is protected, write backup file
226 2)
227 if [[ ${VERBOSE} = on ]]
228 then
229 echo -en "${COLRED}"
230 echo -n "! prot "
231 echo -en "${COLDEFAULT}"
232 echo " === FILE: ${MROOT}${pathto}"
233 fi
234 filename="$(basename "${pathto}")"
235 counter=$(count_protected_files "${pathto}")
236 dest_protected="${dest_dirname}/._cfg${counter}_${filename}"
237 install -m "${posix}" -o "${user}" -g "${group}" \
238 ${BUILDDIR}/${pkgname}/binfiles/"${pathto}" \
239 "${dest_protected}"
240
241 # fix mtime and db
242 fix_descriptor ${pkgname}/.files \
243 "${pathto}" \
244 "${posix}" \
245 "${user}" \
246 "${group}" \
247 "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
248 "${dest_protected}")" \
249 "${md5sum}"
250
251 # update global MAGE_PROTECT_COUNTER
252 (( MAGE_PROTECT_COUNTER++ ))
253 export MAGE_PROTECT_COUNTER
254 ;;
255 esac
256 done < ${BUILDDIR}/${pkgname}/.files
257
258 # now copy the fixed file over the old one
259 [ -f ${BUILDDIR}/${pkgname}/.files_fixed ] && \
260 cp ${BUILDDIR}/${pkgname}/.files{_fixed,}
261
262 # very important: unsetting the '§' fieldseperator
263 IFS=$'\n'
264 }
265
266
267 ###################################################
268 # function install_symlinks #
269 # install_symlinks $PKGNAME #
270 ###################################################
271 install_symlinks()
272 {
273 local pkgname="$1"
274 local pathto
275 local posix
276 local link
277 local mtime
278 local IFS
279
280 # sanity checks; abort if not given
281 [ -z "${pkgname}" ] && die "install_symlinks() \$pkgname not given."
282
283 # check needed global vars
284 [ -z "${BUILDDIR}" ] && die "install_symlinks() \$BUILDDIR not set."
285
286 [ ! -f ${BUILDDIR}/${pkgname}/.symlinks ] && die "install_symlinks() .symlinks not found"
287
288 # delete old files
289 [ -f ${BUILDDIR}/${pkgname}/.symlinks_fixed ] && rm ${BUILDDIR}/${pkgname}/.symlinks_fixed
290
291 # sets fieldseperator to "§" instead of " "
292 IFS=§
293
294 while read pathto posix link mtime
295 do
296 [ -z "${pathto}" ] && continue
297 [[ ${VERBOSE} = on ]] && echo -e "\t>>> LINK: ${MROOT}${pathto}"
298
299 ln -snf "${link}" "${MROOT}${pathto}"
300
301 # fix mtime and db
302 fix_descriptor ${pkgname}/.symlinks \
303 "${pathto}" \
304 "${posix}" \
305 "${link}" \
306 "$(fix_mtime "${BUILDDIR}/${pkgname}"/.mtime \
307 "${MROOT}${pathto}")"
308
309 done < ${BUILDDIR}/${pkgname}/.symlinks
310
311 # now copy the fixed file over the old one
312 [ -f ${BUILDDIR}/${pkgname}/.symlinks_fixed ] && \
313 cp -f ${BUILDDIR}/${pkgname}/.symlinks{_fixed,}
314
315 # very important: unsetting the '§' fieldseperator
316 IFS=$'\n'
317 }
318
319
320 ###################################################
321 # function install_blockdevices #
322 # install_blockdevices $PKGNAME #
323 ###################################################
324 install_blockdevices()
325 {
326 local pkgname="$1"
327 local pathto
328 local posix
329 local IFS
330
331 # sanity checks; abort if not given
332 [ -z "${pkgname}" ] && die "install_blockdevices() \$pkgname not given."
333
334 # check needed global vars
335 [ -z "${BUILDDIR}" ] && die "install_blockdevices() \$BUILDDIR not set."
336
337 [ ! -f ${BUILDDIR}/${pkgname}/.pipes ] && die "install_blockdevices() .pipes not found"
338
339 # sets fieldseperator to "§" instead of " "
340 IFS=§
341
342 while read pathto posix
343 do
344 [ -z "${pathto}" ] && continue
345 [[ ${VERBOSE} = on ]] && echo -e "\t>>> PIPE: ${MROOT}${pathto}"
346
347 mkfifo -m "${posix}" "${MROOT}$pathto"
348 done < ${BUILDDIR}/${pkgname}/.pipes
349
350 # very important: unsetting the '§' fieldseperator
351 IFS=$'\n'
352 }
353
354
355 ###################################################
356 # function install_characterdevices #
357 # install_characterdevices $PKGNAME #
358 ###################################################
359 install_characterdevices()
360 {
361 local pkgname="$1"
362 local pathto
363 local posix
364 local major
365 local minor
366 local IFS
367
368 # sanity checks; abort if not given
369 [ -z "${pkgname}" ] && die "install_characterdevices() \$pkgname not given."
370
371 # check needed global vars
372 [ -z "${BUILDDIR}" ] && die "install_characterdevices() \$BUILDDIR not set."
373
374 [ ! -f ${BUILDDIR}/${pkgname}/.char ] && die "install_characterdevices() .char not found"
375
376 # sets fieldseperator to "§" instead of " "
377 IFS=§
378
379 while read pathto posix major minor
380 do
381 [ -z "${pathto}" ] && continue
382 [[ ${VERBOSE} = on ]] && echo -e "\t>>> CHAR: ${MROOT}${pathto}"
383
384 mknod -m ${posix} "${MROOT}${pathto}" c ${major} ${minor}
385 done < ${BUILDDIR}/${pkgname}/.char
386
387 # very important: unsetting the '§' fieldseperator
388 IFS=$'\n'
389 }
390
391
392 ###################################################
393 # function build_doinstall #
394 # build_doinstall $PKGNAME #
395 # NOTE: this is an wrapper do install packages #
396 ###################################################
397 build_doinstall()
398 {
399 local pkgname="$1"
400
401 # sanity checks; abort if not given
402 [ -z "${pkgname}" ] && die "build_doinstall() \$pkgname not given."
403
404 # this is only a wrapper
405
406 # NOTE:
407 # !! we use § as field seperator !!
408 # doing so prevent us to get errors by filenames with spaces
409
410 # create a new mtime reference file
411 touch ${BUILDDIR}/${pkgname}/.mtime
412
413 install_directories ${pkgname} || die "install directories ${pkgname}"
414 install_files ${pkgname} || die "install files ${pkgname}"
415 install_symlinks ${pkgname} || die "install symlinks ${pkgname}"
416 install_blockdevices ${pkgname} || die "install blockdevices ${pkgname}"
417 install_characterdevices ${pkgname} || die "install chardevices ${pkgname}"
418 }
419
420
421 ###################################################
422 # function install_database_entry #
423 # install_database_entry $PKGNAME $PKGTYPE #
424 # PKGTYPE can be "virtual", "sources" or nothing #
425 ###################################################
426 install_database_entry()
427 {
428 local pcat
429 local pname
430 local pver
431 local pbuild
432 local pkgtype
433 local pkgname
434 local magefile
435 local dbrecorddir
436 local provide
437 local i
438
439 # very basic getops
440 for i in $*
441 do
442 case $1 in
443 --pcat|-c) shift; pcat="$1" ;;
444 --pname|-n) shift; pname="$1" ;;
445 --pver|-v) shift; pver="$1" ;;
446 --pbuild|-b) shift; pbuild="$1" ;;
447 --pkgname|-a) shift; pkgname="$1" ;;
448 --pkgtype|-t) shift; pkgtype="$1" ;;
449 esac
450 shift
451 done
452
453 # sanity checks; abort if not given
454 [ -z "${pcat}" ] && die "install_database_entry() \$pcat not given."
455 [ -z "${pname}" ] && die "install_database_entry() \$pname not given."
456 [ -z "${pver}" ] && die "install_database_entry() \$pver not given."
457 [ -z "${pbuild}" ] && die "install_database_entry() \$pbuild not given."
458 [ -z "${pkgname}" ] && die "install_database_entry() \$pkgname not given."
459
460 # check needed global vars
461 [ -z "${MAGEDIR}" ] && die "install_database_entry() \$MAGEDIR not set."
462 [ -z "${INSTALLDB}" ] && die "install_database_entry() \$INSTALLDB not set."
463
464 # set needed vars
465 magefile="${MAGEDIR}/${pcat}/${pname}/${pname}-${pver}-${pbuild}.mage"
466 dbrecorddir="${MROOT}${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}"
467
468 # abort if mage file not exists
469 [ ! -f ${magefile} ] && die "install_database_entry() ${magefile} not exist."
470
471 # add package to database
472 install -d ${dbrecorddir}
473
474 # install mage-file to database
475 install -m 0644 -o root -g root ${magefile} ${dbrecorddir}
476
477 # create fake file descriptors
478 # used by virtual and source packages
479 for i in .dirs .symlinks .files .pipes .char
480 do
481 touch ${dbrecorddir}/${i}
482 done
483
484 # put the category to database
485 echo ${pcat} > ${dbrecorddir}/.categorie
486
487 # now install PKGTYPE specific files
488 case ${pkgtype} in
489 virtual) touch ${dbrecorddir}/.virtual ;;
490 sources) touch ${dbrecorddir}/.sources ;;
491 *)
492 # !move! .mtime to database (only mv modifies not the mtime!!)
493 mv ${BUILDDIR}/${pkgname}/.mtime ${dbrecorddir}/.mtime
494
495 # normal packages needs these files
496 local i
497 for i in .char .dirs .files .pipes .symlinks
498 do
499 install -m 0644 ${BUILDDIR}/${pkgname}/${i} \
500 ${dbrecorddir}/${i}
501 done
502 ;;
503 esac
504
505 # last but not least register virtuals
506 provide="$(get_value_from_magefile PROVIDE ${magefile})"
507 if [ -n "${provide}" ]
508 then
509 for i in ${provide}
510 do
511 virtuals_add "${i}" "${pcat}/${pname}"
512 done
513 fi
514 }
515
516
517 ###################################################
518 # function remove_database_entry #
519 # remove_database_entry $PKGNAME $PKGTYPE #
520 # PKGTYPE can be "virtual", "sources" or nothing #
521 ###################################################
522 remove_database_entry()
523 {
524 local pcat
525 local pname
526 local pver
527 local pbuild
528 local magefile
529 local dbrecorddir
530 local provide
531 local i
532
533 # very basic getops
534 for i in $*
535 do
536 case $1 in
537 --pcat|-c) shift; pcat="$1" ;;
538 --pname|-n) shift; pname="$1" ;;
539 --pver|-v) shift; pver="$1" ;;
540 --pbuild|-b) shift; pbuild="$1" ;;
541 esac
542 shift
543 done
544
545 # sanity checks; abort if not given
546 [ -z "${pcat}" ] && die "remove_database_entry() \$pcat not given."
547 [ -z "${pname}" ] && die "remove_database_entry() \$pname not given."
548 [ -z "${pver}" ] && die "remove_database_entry() \$pver not given."
549 [ -z "${pbuild}" ] && die "remove_database_entry() \$pbuild not given."
550
551 # check needed global vars
552 [ -z "${INSTALLDB}" ] && die "remove_database_entry() \$INSTALLDB not set."
553
554 # set needed vars
555 magefile="${MROOT}${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}/${pname}-${pver}-${pbuild}.mage"
556 dbrecorddir="${MROOT}${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}"
557
558 # abort if mage file not exists
559 [ ! -f ${magefile} ] && die "remove_database_entry() ${magefile} not exist."
560
561 # remove virtuals only if no other exist
562 if [[ $(count_installed_pkgs --pcat ${pcat} --pname ${pname}) -le 1 ]]
563 then
564 # first unregister virtuals
565 provide="$(get_value_from_magefile PROVIDE ${magefile})"
566 if [ -n "${provide}" ]
567 then
568 for i in ${provide}
569 do
570 virtuals_del "${i}" "${pcat}/${pname}"
571 done
572 fi
573 fi
574
575 # removes database entry
576 if [ -d ${dbrecorddir} ]
577 then
578 rm -rf ${dbrecorddir}
579 fi
580 }
581
582 # get the number of installed packages
583 count_installed_pkgs()
584 {
585 local pcat
586 local pname
587 local pkg
588 local i
589
590 # very basic getops
591 for i in $*
592 do
593 case $1 in
594 --pcat|-c) shift; pcat="$1" ;;
595 --pname|-n) shift; pname="$1" ;;
596 esac
597 shift
598 done
599
600 # sanity checks; abort if not given
601 [ -z "${pcat}" ] && die "pkg_count() \$pcat not given."
602 [ -z "${pname}" ] && die "pkg_count() \$pname not given."
603
604 declare -i i=0
605 for pkg in $(get_uninstall_candidates --pcat ${pcat} --pname ${pname})
606 do
607 (( i++ ))
608 #echo "$i ${pkg}"
609 done
610
611 # return the value
612 echo "${i}"
613 }
614
615
616 ###################################################
617 # function compare_mtime #
618 # compare_mtime $pcat/$PKGNAME /path/to/file #
619 # #
620 # returns: #
621 # 0=delete me #
622 # 1=keep me #
623 # #
624 # compares mtime of given files in packages #
625 ###################################################
626 compare_mtime()
627 {
628 local pfull="$1"
629 local pathto="$2"
630 local mtime
631 local pcat
632 local x
633
634 mtime="$(stat -c %Y ${MROOT}${INSTALLDB}/${pfull}/.mtime)"
635
636 # if $pathto is a symlink than compare linked binary
637 if [ -L "${MROOT}${pathto}" ]
638 then
639 # readlink -f resolves full path of linked file
640 x="$(readlink -f "${MROOT}${pathto}")"
641
642 # abort if target does not exists
643 # we keep safe here, theoretically the link can removed
644 [ ! -e "${x}" ] && return 1
645
646 x=$(stat -c %Y "${x}")
647 else
648 x=$(stat -c %Y "${MROOT}${pathto}")
649 fi
650
651 [[ ${mtime} = ${x} ]] && return 0
652
653 # echo "keep me : ${pathto}"
654 return 1
655 }
656
657
658 ###################################################
659 # function remove_symlinks #
660 # remove_symlinks $PKGNAME #
661 ###################################################
662 remove_symlinks()
663 {
664 local pathto
665 local posix
666 local link
667 local mtime
668 local IFS
669 local retval
670 local pcat
671 local pname
672 local pver
673 local pbuild
674 local i
675 local pfull
676
677 IFS=$'\n'
678
679 # very basic getops
680 for i in $*
681 do
682 case $1 in
683 --pcat|-c) shift; pcat="$1" ;;
684 --pname|-n) shift; pname="$1" ;;
685 --pver|-v) shift; pver="$1" ;;
686 --pbuild|-b) shift; pbuild="$1" ;;
687 esac
688 shift
689 done
690
691 # sanity checks; abort if not given
692 [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."
693 [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."
694 [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."
695 [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."
696 pfull="${pcat}/${pname}-${pver}-${pbuild}"
697
698 # check needed global vars
699 [ -z "${BUILDDIR}" ] && die "remove_symlinks() \$BUILDDIR not set."
700
701 [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.symlinks ] && die "remove_symlinks() .symlinks not found"
702
703 # sets fieldseperator to "§" instead of " "
704 IFS=§
705
706 while read pathto posix link mtime
707 do
708 [ -z "${pathto}" ] && continue
709 if [ ! -L "${MROOT}${pathto}" ]
710 then
711 [[ ${VERBOSE} = on ]] && \
712 echo -e "${COLRED}! exist${COLDEFAULT} === LINK: ${MROOT}${pathto}"
713 continue
714 fi
715
716 # *no* ${MROOT}, will be set internal
717 compare_mtime "${pfull}" "${pathto}"
718 retval=$?
719 # 0=delete me #
720 # 1=keep me #
721 case ${retval} in
722 0)
723 [[ ${VERBOSE} = on ]] && echo -e "\t<<< LINK: ${MROOT}${pathto}"
724 rm "${MROOT}${pathto}"
725 ;;
726
727 1)
728 [[ ${VERBOSE} = on ]] && \
729 echo -e "${COLRED}! mtime${COLDEFAULT} === LINK: ${MROOT}${pathto}"
730 ;;
731 esac
732 done < ${MROOT}${INSTALLDB}/${pfull}/.symlinks
733
734 # very important: unsetting the '§' fieldseperator
735 IFS=$'\n'
736 }
737
738
739 ###################################################
740 # function remove_files #
741 # remove_files $PKGNAME #
742 ###################################################
743 remove_files()
744 {
745 local pathto
746 local posix
747 local user
748 local group
749 local mtime
750 local md5sum
751 local IFS
752 local retval
753 local pcat
754 local pname
755 local pver
756 local pbuild
757 local i
758 local pfull
759
760 IFS=$'\n'
761
762 # very basic getops
763 for i in $*
764 do
765 case $1 in
766 --pcat|-c) shift; pcat="$1" ;;
767 --pname|-n) shift; pname="$1" ;;
768 --pver|-v) shift; pver="$1" ;;
769 --pbuild|-b) shift; pbuild="$1" ;;
770 esac
771 shift
772 done
773
774 # sanity checks; abort if not given
775 [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."
776 [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."
777 [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."
778 [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."
779 pfull="${pcat}/${pname}-${pver}-${pbuild}"
780
781 # check needed global vars
782 [ -z "${BUILDDIR}" ] && die "remove_files() \$BUILDDIR not set."
783
784 [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.files ] && die "remove_files() .files not found"
785
786 # sets fieldseperator to "§" instead of " "
787 IFS=§
788
789 while read pathto posix user group mtime md5sum
790 do
791 [ -z "${pathto}" ] && continue
792
793 if [ ! -e "${MROOT}${pathto}" ]
794 then
795 [[ ${VERBOSE} = on ]] && \
796 echo -e "${COLRED}! exist${COLDEFAULT} === FILE: ${MROOT}${pathto}"
797 continue
798 fi
799
800 # *no* ${MROOT}, will be set internal
801 compare_mtime "${pfull}" "${pathto}"
802 retval=$?
803 # 0=delete me #
804 # 1=keep me #
805 case ${retval} in
806 0)
807 # check if the file is config_protected
808 # ${MROOT} will automatically added if set !!
809 is_config_protected "${pathto}"
810 retval="$?"
811
812 # 0 - not protected #
813 # 1 - error #
814 # 2 - protected #
815 # 3 - protected but masked #
816
817 case ${retval} in
818 # file is not protected - delete it
819 0|3)
820 [[ ${VERBOSE} = on ]] && echo -e "\t<<< FILE: ${MROOT}${pathto}"
821 rm "${MROOT}${pathto}"
822 ;;
823
824 # file is protected, do not delete
825 2)
826 if [[ ${VERBOSE} = on ]]
827 then
828 echo -en "${COLRED}"
829 echo -n "! prot "
830 echo -en "${COLDEFAULT}"
831 echo " === FILE: ${MROOT}${pathto}"
832 fi
833 ;;
834 esac
835 ;;
836 1)
837 [[ ${VERBOSE} = on ]] && \
838 echo -e "${COLRED}! mtime${COLDEFAULT} === FILE: ${MROOT}${pathto}"
839 ;;
840 esac
841 done < ${MROOT}${INSTALLDB}/${pfull}/.files
842
843 # very important: unsetting the '§' fieldseperator
844 IFS=$'\n'
845 }
846
847
848 ###################################################
849 # function remove_blockdevices #
850 # remove_blockdevices $PKGNAME #
851 ###################################################
852 remove_blockdevices()
853 {
854 local pathto
855 local posix
856 local IFS
857 local pcat
858 local pname
859 local pver
860 local pbuild
861 local i
862 local pfull
863
864 IFS=$'\n'
865
866 # very basic getops
867 for i in $*
868 do
869 case $1 in
870 --pcat|-c) shift; pcat="$1" ;;
871 --pname|-n) shift; pname="$1" ;;
872 --pver|-v) shift; pver="$1" ;;
873 --pbuild|-b) shift; pbuild="$1" ;;
874 esac
875 shift
876 done
877
878 # sanity checks; abort if not given
879 [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."
880 [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."
881 [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."
882 [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."
883 pfull="${pcat}/${pname}-${pver}-${pbuild}"
884
885 # check needed global vars
886 [ -z "${BUILDDIR}" ] && die "remove_blockdevices() \$BUILDDIR not set."
887
888 [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.pipes ] && die "remove_blockdevices() .pipes not found"
889
890 # sets fieldseperator to "§" instead of " "
891 IFS=§
892
893 while read pathto posix
894 do
895 [ -z "${pathto}" ] && continue
896
897 [[ ${VERBOSE} = on ]] && echo -e "\t<<< PIPE: ${MROOT}${pathto}"
898 rm "${MROOT}${pathto}"
899 done < ${MROOT}${INSTALLDB}/${pfull}/.pipes
900
901 # very important: unsetting the '§' fieldseperator
902 IFS=$'\n'
903 }
904
905
906 ###################################################
907 # function remove_characterdevices #
908 # remove_characterdevices $PKGNAME #
909 ###################################################
910 remove_characterdevices()
911 {
912 local pathto
913 local posix
914 local IFS
915 local pcat
916 local pname
917 local pver
918 local pbuild
919 local i
920 local pfull
921
922 IFS=$'\n'
923
924 # very basic getops
925 for i in $*
926 do
927 case $1 in
928 --pcat|-c) shift; pcat="$1" ;;
929 --pname|-n) shift; pname="$1" ;;
930 --pver|-v) shift; pver="$1" ;;
931 --pbuild|-b) shift; pbuild="$1" ;;
932 esac
933 shift
934 done
935
936 # sanity checks; abort if not given
937 [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."
938 [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."
939 [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."
940 [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."
941 pfull="${pcat}/${pname}-${pver}-${pbuild}"
942
943 # check needed global vars
944 [ -z "${BUILDDIR}" ] && die "remove_characterdevices() \$BUILDDIR not set."
945
946 [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.char ] && die "remove_characterdevices() .char not found"
947
948 # sets fieldseperator to "§" instead of " "
949 IFS=§
950
951 while read pathto posix
952 do
953 [ -z "${pathto}" ] && continue
954
955 [[ ${VERBOSE} = on ]] && echo -e "\t<<< CHAR: ${MROOT}${pathto}"
956 rm "${MROOT}${pathto}"
957 done < ${MROOT}${INSTALLDB}/${pfull}/.char
958
959 # very important: unsetting the '§' fieldseperator
960 IFS=$'\n'
961 }
962
963
964 ###################################################
965 # function remove_direcories #
966 # remove_direcories $PKGNAME #
967 ###################################################
968 remove_directories()
969 {
970 local pathto
971 local posix
972 local IFS
973 local pcat
974 local pname
975 local pver
976 local pbuild
977 local i
978 local pfull
979
980 IFS=$'\n'
981
982 # very basic getops
983 for i in $*
984 do
985 case $1 in
986 --pcat|-c) shift; pcat="$1" ;;
987 --pname|-n) shift; pname="$1" ;;
988 --pver|-v) shift; pver="$1" ;;
989 --pbuild|-b) shift; pbuild="$1" ;;
990 esac
991 shift
992 done
993
994 # sanity checks; abort if not given
995 [ -z "${pcat}" ] && die "remove_symlinks() \$pcat not given."
996 [ -z "${pname}" ] && die "remove_symlinks() \$pname not given."
997 [ -z "${pver}" ] && die "remove_symlinks() \$pver not given."
998 [ -z "${pbuild}" ] && die "remove_symlinks() \$pbuild not given."
999 pfull="${pcat}/${pname}-${pver}-${pbuild}"
1000
1001 # check needed global vars
1002 [ -z "${BUILDDIR}" ] && die "remove_directories() \$BUILDDIR not set."
1003
1004 [ ! -f ${MROOT}${INSTALLDB}/${pfull}/.char ] && die "remove_directories() .dirs not found"
1005
1006 # sets fieldseperator to "§" instead of " "
1007 IFS=§
1008
1009 # reversed order is mandatory !
1010 tac ${MROOT}${INSTALLDB}/${pfull}/.dirs | while read pathto posix
1011 do
1012 [ -z "${pathto}" ] && continue
1013
1014 if [ ! -d "${MROOT}${pathto}" ]
1015 then
1016 [[ ${VERBOSE} = on ]] && \
1017 echo -e "${COLRED}! exist${COLDEFAULT} === DIR: ${MROOT}${pathto}"
1018 continue
1019 fi
1020
1021 # exclude .keep directories
1022 if [ -f "${MROOT}${pathto}/.keep" ]
1023 then
1024 [[ ${VERBOSE} = on ]] && \
1025 echo -e "${COLRED}! .keep${COLDEFAULT} === DIR: ${MROOT}${pathto}"
1026 continue
1027 fi
1028
1029 # monitors /etc/env.d -> env-rebuild
1030 [[ ${pathto} = /etc/env.d ]] && export MAGE_ENV_REBUILD=true
1031
1032 # monitors /usr/share/info -> info-rebuild
1033 [[ ${pathto} = /usr/share/info ]] && export MAGE_INFO_REBUILD=true
1034
1035 if rmdir "${MROOT}${pathto}" &> /dev/null
1036 then
1037 [[ ${VERBOSE} = on ]] && echo -e "\t<<< DIR: ${MROOT}${pathto}"
1038 else
1039 [[ ${VERBOSE} = on ]] && \
1040 echo -e "${COLRED}! empty${COLDEFAULT} === DIR: ${MROOT}${pathto}"
1041 fi
1042 done
1043
1044 # very important: unsetting the '§' fieldseperator
1045 IFS=$'\n'
1046 }
1047
1048
1049 ###################################################
1050 # function build_douninstall #
1051 # build_douninstall $PKGNAME #
1052 # NOTE: this is an wrapper do remove packages #
1053 ###################################################
1054 build_douninstall()
1055 {
1056 local pcat
1057 local pname
1058 local pver
1059 local pbuild
1060 local i
1061
1062 # very basic getops
1063 for i in $*
1064 do
1065 case $1 in
1066 --pcat|-c) shift; pcat="$1" ;;
1067 --pname|-n) shift; pname="$1" ;;
1068 --pver|-v) shift; pver="$1" ;;
1069 --pbuild|-b) shift; pbuild="$1" ;;
1070 esac
1071 shift
1072 done
1073
1074 # sanity checks; abort if not given
1075 [ -z "${pcat}" ] && die "build_douninstall() \$pcat not given."
1076 [ -z "${pname}" ] && die "build_douninstall() \$pname not given."
1077 [ -z "${pver}" ] && die "build_douninstall() \$pver not given."
1078 [ -z "${pbuild}" ] && die "build_douninstall() \$pbuild not given."
1079
1080 # this is only a wrapper
1081
1082 # NOTE:
1083 # !! we use § as field seperator !!
1084 # doing so prevent us to get errors by filenames with spaces
1085
1086 for i in symlinks files blockdevices characterdevices directories
1087 do
1088 remove_${i} \
1089 --pcat "${pcat}" \
1090 --pname "${pname}" \
1091 --pver "${pver}" \
1092 --pbuild "${pbuild}" \
1093 || die "remove ${i} ${pcat}/${pname}-${pver}-${pbuild}"
1094 done
1095 }
1096
1097 # fetch_packages /path/to/mage/file1 /path/to/mage/file2
1098 fetch_packages()
1099 {
1100 local list="$@"
1101 local pkg
1102 local mirr
1103 local magefile
1104 local md5file
1105 local opt
1106 local count_current
1107 local count_total
1108
1109 [ -z "${MIRRORS}" ] && die "You have no mirrors defined. Please edit your /etc/mage.rc."
1110
1111 # get count of total packages
1112 declare -i count_current=0
1113 declare -i count_total=0
1114
1115 for i in ${list}; do (( count_total++ )); done
1116
1117 for magefile in ${list}
1118 do
1119 pkg="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}"
1120 pkgtype="$(get_value_from_magefile PKGTYPE ${magefile})"
1121
1122 (( count_current++ ))
1123 xtitle "[ (${count_current}/${count_total}) Fetching ${pkg} ]"
1124
1125 # abort on virtual pkg
1126 if [[ ${pkgtype} = virtual ]]
1127 then
1128 echo -ne " ${COLBLUE}---${COLDEFAULT}"
1129 echo " !fetch virtual (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... "
1130 continue
1131 fi
1132
1133 # abort on sources pkg
1134 if [[ ${pkgtype} = sources ]]
1135 then
1136 echo -ne " ${COLBLUE}---${COLDEFAULT}"
1137 echo " !fetch sources (${count_current}/${count_total}): ${pkg/.${PKGSUFFIX}/} ... "
1138 continue
1139 fi
1140
1141 # abort if already exist
1142 if [ -f ${PKGDIR}/${pkg} ]
1143 then
1144 echo -ne " ${COLBLUE}***${COLDEFAULT}"
1145 echo " fetch complete (${count_current}/${count_total}): ${pkg} ... "
1146 continue
1147 fi
1148
1149 for mirr in ${MIRRORS}
1150 do
1151 echo -ne " ${COLBLUE}***${COLDEFAULT}"
1152 #echo -e " fetching (${count_current}/${count_total}): ${mirr}/${pkg} ... "
1153 echo -e " fetching (${count_current}/${count_total}): ${pkg} ... "
1154 [[ ${VERBOSE} = off ]] && opt="--quiet"
1155 wget \
1156 --passive-ftp \
1157 --tries 3 \
1158 --continue \
1159 --progress bar \
1160 --directory-prefix=${PKGDIR} \
1161 ${opt} ${mirr}/${PACKAGES_SERVER_PATH}/${pkg}
1162 if [[ $? = 0 ]]
1163 then
1164 break
1165 else
1166 continue
1167 fi
1168 done
1169
1170 if [ ! -f ${PKGDIR}/${pkg} ]
1171 then
1172 die "Could not download ${pkg}"
1173 fi
1174 done
1175
1176 # add a crlf for a better view
1177 if [ ${count_total} -gt 1 ]; then echo; fi
1178 }
1179
1180 syncmage()
1181 {
1182 if [ -z "${RSYNC}" ]
1183 then
1184 die "You have no rsync-mirrors defined. Please edit your /etc/mage.rc."
1185 fi
1186
1187 local i
1188 for i in ${RSYNC}
1189 do
1190 rsync \
1191 --recursive \
1192 --links \
1193 --perms \
1194 --times \
1195 --devices \
1196 --timeout=600 \
1197 --verbose \
1198 --compress \
1199 --progress \
1200 --stats \
1201 --delete \
1202 --delete-after \
1203 ${i} ${MAGEDIR}
1204 if [[ $? = 0 ]]
1205 then
1206 break
1207 else
1208 continue
1209 fi
1210 done
1211
1212 # clean up backup files (foo~)
1213 find ${MAGEDIR} -name *~ -exec rm '{}' ';'
1214
1215 # check if an newer mage version is available
1216 is_newer_mage_version_available
1217 }
1218
1219 cleanpkg()
1220 {
1221 if [ -d "${PKGDIR}" ]
1222 then
1223 echo -n "Removing downloaded packages... "
1224 rm -rf ${PKGDIR}/*
1225 echo "done."
1226 fi
1227 }
1228
1229 xtitle()
1230 {
1231 if [[ ${TERM} = xterm ]]
1232 then
1233 echo -ne "\033]0;Mage: $1\007"
1234 fi
1235 return 0
1236 }
1237
1238
1239 xtitleclean()
1240 {
1241 if [[ ${TERM} = xterm ]]
1242 then
1243 echo -ne "\033]0;\007"
1244 fi
1245 return 0
1246 }
1247
1248
1249 # cuts full pathnames or versioniezed names down to basename
1250 choppkgname()
1251 {
1252 #we want this only if full name was used
1253 if [ -n "$(echo ${MAGENAME}|fgrep .mage)" ]
1254 then
1255 #cuts ARCH and PBUILD
1256 #ARCH comes from /etc/mage.rc
1257 MAGENAME=$(echo ${MAGENAME} |sed -e "s:-${ARCH}-r*.::g")
1258
1259 #cuts version number
1260 MAGENAME=$(basename ${MAGENAME%-*} .mage)
1261 fi
1262 }
1263
1264 # get_categorie $PNAME, returns CATEGORIE
1265 # $1=pname
1266 # ret 0=ok, 1=not_found
1267 pname2pcat()
1268 {
1269 local pname="$1"
1270 local repo="$2"
1271 local pcat
1272 local categorie
1273
1274 for pcat in ${MAGEDIR}/*
1275 do
1276 if [ -d ${pcat}/${pname} ]
1277 then
1278 categorie=$(basename ${pcat})
1279 fi
1280 done
1281
1282 echo "${categorie}"
1283 }
1284
1285 # check_stable_package /path/to/foo.mage
1286 # returns 0=stable 1=unstable
1287 check_stable_package()
1288 {
1289 local STATE
1290 STATE="$(get_value_from_magefile STATE "$1")"
1291
1292 # state testing
1293 if [[ ${USE_TESTING} = true ]] || [[ ${MAGE_DISTRIBUTION} = testing ]]
1294 then
1295 case ${STATE} in
1296 testing|stable) return 0 ;;
1297 *) return 1 ;;
1298 esac
1299 fi
1300
1301 # state unstable
1302 if [[ ${USE_UNSTABLE} = true ]] || [[ ${MAGE_DISTRIBUTION} = unstable ]]
1303 then
1304 case ${STATE} in
1305 unstable|testing|stable) return 0 ;;
1306 *) return 1 ;;
1307 esac
1308 fi
1309
1310 # no use_state given = stable
1311 case ${STATE} in
1312 stable) return 0 ;;
1313 *) return 1 ;;
1314 esac
1315 }
1316
1317
1318 # get_highest_magefile ${PCAT} ${PNAME}
1319 # fake at moment returns only stable pkgs (must set to be one)
1320 # return $HIGHEST_MAGEFILE
1321 get_highest_magefile()
1322 {
1323 local HIGHEST_MAGEFILE
1324 local PCAT="$1"
1325 local PNAME="$2"
1326 local magefile
1327
1328 for magefile in $(ls --format=single-column -v ${MAGEDIR}/${PCAT}/${PNAME}/*)
1329 do
1330 # we exclude subdirs (for stuff like a md5sum dir)
1331 [ -d ${magefile} ] && continue
1332 if check_stable_package ${magefile}
1333 then
1334 HIGHEST_MAGEFILE=${magefile}
1335 #for debug only
1336 [[ ${MAGEDEBUG} = on ]] && echo "HIGHEST_MAGEFILE=${HIGHEST_MAGEFILE}"
1337 fi
1338 done
1339
1340 # stop here if HIGHEST_MAGEFILE is zero
1341 # this package must be unstable or old
1342 if [ -z "${HIGHEST_MAGEFILE}" ]
1343 then
1344 echo
1345 echo -n "All packages named "
1346 echo -en ${COLRED}\""${PKGNAME%-*-*-*}\""${COLDEFAULT}
1347 echo -n " are marked "
1348 echo -en ${COLRED}"*UNSTABLE*"${COLDEFAULT}
1349 echo "."
1350 echo "You need to declare USE_UNSTABLE=true to install this."
1351 echo
1352 echo "Example:"
1353 echo " USE_UNSTABLE=true mage install ${PKGNAME%-*-*-*}"
1354 echo
1355 echo "Be warned that these packages are not stable and may cause serious problems."
1356 echo "You should know what you are doing, so don't complain about any damage."
1357 echo
1358 return 1
1359 fi
1360
1361 echo "${HIGHEST_MAGEFILE}"
1362 return 0
1363 }
1364
1365
1366 ###################################################
1367 # function is_config_protected #
1368 # is_config_protected /path/to/file #
1369 # #
1370 # returns: #
1371 # 0 - not protected #
1372 # 1 - error #
1373 # 2 - protected #
1374 # 3 - protected but masked #
1375 # #
1376 ###################################################
1377 is_config_protected()
1378 {
1379 local EXPFILE
1380 local TEST
1381 local PROTECTED
1382 local IFS
1383
1384 EXPFILE="${MROOT}$1"
1385
1386 # file does not exist; it can be written
1387 [ ! -e ${EXPFILE} ] && return 0
1388
1389 # to be safe; it may be '§'
1390 IFS=' '
1391
1392 # check ob in config protect
1393 for i in ${CONFIG_PROTECT}
1394 do
1395 # ersetzen von $i nur wenn am anfang der variable
1396 TEST="${EXPFILE/#${MROOT}${i}/Protected}"
1397 if [ "${TEST}" != "${EXPFILE}" ]
1398 then
1399 # setzen das es protected ist
1400 PROTECTED=TRUE
1401
1402 # check ob nicht doch maskiert
1403 for x in ${CONFIG_PROTECT_MASK}
1404 do
1405 TEST="${EXPFILE/#${MROOT}${x}/Protect_Masked}"
1406 if [ "${TEST}" != "${EXPFILE}" ]
1407 then
1408 PROTECTED=MASKED
1409 fi
1410 done
1411 fi
1412 done
1413
1414 unset IFS
1415
1416 case ${PROTECTED} in
1417 TRUE)
1418 #echo "I'm protected"
1419 return 2
1420 ;;
1421 MASKED)
1422 #echo "I'm protected, but masked - delete me"
1423 return 3
1424 ;;
1425 *)
1426 #echo "delete me"
1427 return 0
1428 ;;
1429 esac
1430 }
1431
1432
1433 ###################################################
1434 # function count_protected_files #
1435 # count_protected_files /path/to/file #
1436 # #
1437 # note: prints number of protected files #
1438 # exp: 0012 #
1439 ###################################################
1440 count_protected_files()
1441 {
1442 ${MLIBDIR}/writeprotected "$1"
1443 }
1444
1445 # call with
1446 # 'get_uninstall_candidates (--pcat cat --protected pcat/pfull) --pname PNAME'
1447 # returns /path/to/magefile(s)
1448 get_uninstall_candidates()
1449 {
1450 local search_pname
1451 local pkg
1452 local pcat
1453 local pname
1454 local pver
1455 local pbuild
1456 local list
1457 local pcatdir
1458 local protected
1459
1460 # very basic getops
1461 for i in $*
1462 do
1463 case $1 in
1464 --pcat|-c) shift; pcatdir="$1" ;;
1465 --pname|-n) shift; search_pname="$1" ;;
1466 --protected|-p) shift; protected="$1" ;;
1467 esac
1468 shift
1469 done
1470
1471 # sanity checks; abort if not given
1472 [ -z "${search_pname}" ] && die "get_uninstall_candidates() \$search_pname not given."
1473
1474
1475 # check needed global vars
1476 [ -z "${INSTALLDB}" ] && die "get_uninstall_candidates() \$INSTALLDB not set."
1477
1478 # set pcatdir to '*' if empty
1479 [ -z "${pcatdir}" ] && pcatdir=*
1480
1481 for pkg in ${MROOT}${INSTALLDB}/${pcatdir}/*
1482 do
1483 # abort if not a dir
1484 [ ! -d ${pkg} ] && continue
1485
1486 pname="$(magename2pname ${pkg})"
1487
1488 if [[ ${search_pname} = ${pname} ]]
1489 then
1490 pcat="$(magename2pcat ${pkg} installdb)"
1491 pver="$(magename2pver ${pkg})"
1492 pbuild="$(magename2pbuild ${pkg})"
1493
1494 # exclude proteced
1495 [[ ${protected} = ${pcat}/${pname}-${pver}-${pbuild} ]] && continue
1496
1497 list="${list} ${pcat}/${pname}-${pver}-${pbuild}"
1498 fi
1499 done
1500
1501 echo "${list}"
1502 }
1503
1504 # reads virtualdb file
1505 #$1 = virtualname; $2 commands: showpkgs, showline
1506 #return 0 == installed -> shows installed pkg as well
1507 #return 1 == not installed
1508 virtuals_read()
1509 {
1510 local virtualname="$1"
1511 local command="$2"
1512 local virtline
1513 local line x i
1514
1515 # parse file to get virtual_name line
1516 IFS=$'\n'
1517 for line in $(< ${MROOT}${VIRTUALDB_FILE})
1518 do
1519 IFS=$' '
1520 for x in ${line}
1521 do
1522 if [[ ${x} = ${virtualname} ]]
1523 then
1524 virtline="${line}"
1525 [[ ${command} = showline ]] && echo "${line}"
1526 fi
1527 done
1528 IFS=$'\n'
1529 done
1530
1531 unset IFS
1532
1533 # now read the packages linked to VIRTUAL_NAME and output them
1534 if [ -n "${virtline}" ]
1535 then
1536 if [[ ${command} = showpkgs ]]
1537 then
1538 declare -i x=0
1539 for i in ${virtline}
1540 do
1541 if [ ${x} -ge 1 ]
1542 then
1543 echo "${i}"
1544 fi
1545 ((x++))
1546 done
1547 fi
1548 return 0
1549 fi
1550 return 1
1551 }
1552
1553
1554 #add pkg to virtualdb
1555 # $1 == virtualname $2= pkgname
1556 # retvals: 0=ok,added; 1=error; 3=pkg already in virtual
1557 virtuals_add()
1558 {
1559 local virtualname="$1"
1560 local pkgname="$2"
1561 local oldline
1562 local line i
1563 local installed_file
1564 local OLDIFS
1565
1566 if virtuals_read ${virtualname}
1567 then
1568 # make shure ${PKG_NAME} is *not* in ${VIRTUAL_NAME} already
1569 for i in $(virtuals_read ${virtualname} showpkgs)
1570 do
1571 if [[ ${i} = ${pkgname} ]]
1572 then
1573 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1574 echo "${pkgname} already linked as ${virtualname} ..."
1575 #return 3
1576 return 0
1577 fi
1578 done
1579
1580 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
1581 echo "updating ${virtualname} entry with ${pkgname} ..."
1582 oldline="$(virtuals_read ${virtualname} showline)"
1583
1584 # make a backup
1585 mv ${MROOT}${VIRTUALDB_FILE} ${MROOT}${VIRTUALDB_FILE}.old
1586
1587 OLDIFS="${IFS}"
1588 IFS=$'\n'
1589 for line in $(< ${MROOT}${VIRTUALDB_FILE}.old)
1590 do
1591 # if the right line, append ${pkgname}, else do nothing
1592 if [[ ${line} = ${oldline} ]]
1593 then
1594 echo "${line} ${pkgname}" >> ${MROOT}${VIRTUALDB_FILE}
1595 else
1596 echo "${line}" >> ${MROOT}${VIRTUALDB_FILE}
1597 fi
1598 done
1599 # unset IFS
1600 IFS="${OLDIFS}"
1601 else
1602 echo -ne "${COLBLUE} >>> ${COLDEFAULT}"
1603 echo "register ${pkgname} as ${virtualname} ..."
1604 echo "${virtualname} ${pkgname}" >> ${MROOT}${VIRTUALDB_FILE}
1605 fi
1606
1607 return 0
1608 }
1609
1610 #deletes pakages from virtual database
1611 #$1 virtualname; $2 pkgname
1612 virtuals_del() {
1613
1614 local virtualname="$1"
1615 local pkgname="$2"
1616 local oldline
1617 local method
1618 local line i x
1619 local pkg_installed
1620 local OLDIFS
1621
1622 # first check if exists
1623 if virtuals_read ${virtualname}
1624 then
1625 # get method -> delall or update and check if ${PKG_NAME} exists in ${VIRTUAL_NAME}
1626 declare -i x=0
1627 for i in $(virtuals_read ${virtualname} showpkgs)
1628 do
1629 if [[ ${i} = ${pkgname} ]]
1630 then
1631 pkg_installed=true
1632 fi
1633 ((x++))
1634 done
1635
1636 # abort if not installed
1637 if [[ ${pkg_installed} != true ]]
1638 then
1639 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1640 echo "${pkgname} does not exists in ${virtualname}."
1641 return 0
1642 fi
1643
1644 if [ ${x} -ge 2 ]
1645 then
1646 method=update
1647 else
1648 method=delall
1649 fi
1650
1651 # get the complete line
1652 oldline="$(virtuals_read ${virtualname} showline)"
1653
1654 # make a backup of the db
1655 mv ${VIRTUALDB_FILE} ${VIRTUALDB_FILE}.old
1656
1657 # parse virtualdb
1658 OLDIFS="${IFS}"
1659 IFS=$'\n'
1660 for line in $(< ${VIRTUALDB_FILE}.old)
1661 do
1662 if [[ ${line} = ${oldline} ]]
1663 then
1664 #delall or update?
1665 case ${method} in
1666 update)
1667 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
1668 echo "Unlinking ${pkgname} from ${virtualname} in virtual database ..."
1669 # del PKG_NAME from line
1670 echo "${line/ ${pkgname}/}" >> ${VIRTUALDB_FILE}
1671 ;;
1672 delall)
1673 echo -ne "${COLBLUE} <<< ${COLDEFAULT}"
1674 echo "Deleting ${virtualname} in virtual database ..."
1675 # continue; do not write anything
1676 continue
1677 ;;
1678 esac
1679 else
1680 echo "${line}" >> ${VIRTUALDB_FILE}
1681 fi
1682 done
1683 # unset IFS
1684 IFS="${OLDIFS}"
1685 else
1686 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
1687 echo "${virtualname} does not exists in virtual database."
1688 fi
1689 }
1690
1691 # gets real pkgname from virtuals.default
1692 #$1=VIRTUAL_NAME; returns PKG_NAME
1693 default_virtualname_to_pkgname()
1694 {
1695 local VIRTUAL_NAME PKG_NAME db_virtualname db_pkgname
1696
1697 VIRTUAL_NAME=$1
1698
1699 while read db_virtualname db_pkgname
1700 do
1701 if [ "${db_virtualname}" == "${VIRTUAL_NAME}" ]
1702 then
1703 PKG_NAME="${db_pkgname}"
1704 fi
1705 done << EOF
1706 $(< ${VIRTUALDB_DEFAULTS})
1707 EOF
1708
1709 if [ -n "${PKG_NAME}" ]
1710 then
1711 echo "${PKG_NAME}"
1712 fi
1713 }
1714
1715 minclude()
1716 {
1717 local i
1718
1719 if [ -n "$@" ]
1720 then
1721 for i in $@
1722 do
1723 [[ ${MAGEDEBUG} = on ]] && \
1724 echo "--- Including ${MAGEDIR}/include/${i}.minc"
1725 source ${MAGEDIR}/include/${i}.minc
1726 done
1727 [[ ${MAGEDEBUG} = on ]] && echo
1728 fi
1729 }
1730
1731 sminclude()
1732 {
1733 local i
1734
1735 if [ -n "$@" ]
1736 then
1737 for i in $@
1738 do
1739 echo "--- Including ${SMAGESCRIPTSDIR}/include/${i}.sminc"
1740 source ${SMAGESCRIPTSDIR}/include/${i}.sminc
1741 done
1742 echo
1743 fi
1744 }
1745
1746 # checks if an newer mage version is available
1747 is_newer_mage_version_available()
1748 {
1749 local newest_mage
1750 local installed_mage
1751
1752 newest_mage="$(basename $(get_highest_magefile app-mage mage) .mage)"
1753 installed_mage="$(magequery -n mage | cut -d' ' -f5)"
1754
1755 if [[ ${newest_mage} > ${installed_mage} ]]
1756 then
1757 echo
1758 echo -en ${COLRED}"An update for your packetmanager is available. "${COLDEFAULT}
1759 echo -e ${COLBLUE}"[ ${newest_mage} ]"${COLDEFAULT}
1760 echo "It is recommened to install this newer version"
1761 echo "or your current system installation may brake."
1762 echo
1763 echo -en "Please update mage by running "
1764 echo -e ${COLGREEN}"'mage install mage'"${COLDEFAULT}
1765 echo
1766 fi
1767 }
1768
1769
1770 # returns pname from pkgname
1771 # pkgname2pname $PKGNAME
1772 pkgname2pname()
1773 {
1774 local pname
1775
1776 pname="${1%-*-*-*}"
1777 echo "${pname}"
1778 }
1779
1780 # returns pver from pkgname
1781 # pkgname2pver $PKGNAME
1782 pkgname2pver()
1783 {
1784 local i pver
1785
1786 i="${1/$(pkgname2pname $1)-/}"
1787 pver="${i%-*-*}"
1788 echo "${pver}"
1789 }
1790
1791 # returns pbuild from pkgname
1792 # pkgname2pbuild $PKGNAME
1793 pkgname2pbuild()
1794 {
1795 local pbuild
1796
1797 pbuild="${1##*-}"
1798 echo "${pbuild}"
1799 }
1800
1801 # returns parch from pkgname
1802 # pkgname2parch $PKGNAME
1803 pkgname2parch()
1804 {
1805 local i x parch
1806
1807 i="${1%-*-*}-"
1808 x="${1%-*}"
1809 parch="${x/${i}/}"
1810 echo "${parch}"
1811 }
1812
1813 # returns pname from magename
1814 # magename2pname /PATH/TO/MAGE/FILE
1815 magename2pname()
1816 {
1817 local i pname
1818
1819 i="$(basename $1 .mage)"
1820 pname="${i%-*-*}"
1821 echo "${pname}"
1822 }
1823
1824 # returns pver from magename
1825 # magename2pver /PATH/TO/MAGE/FILE
1826 magename2pver()
1827 {
1828 local i pver
1829
1830 i="$(basename $1 .mage)"
1831 i="${i/$(magename2pname $1)-/}"
1832 pver="${i%-*}"
1833 echo "${pver}"
1834 }
1835
1836 # returns pbuild from magename
1837 # magename2pbuild /PATH/TO/MAGE/FILE
1838 magename2pbuild()
1839 {
1840 local i pbuild
1841
1842 i="$(basename $1 .mage)"
1843 pbuild="${i##*-}"
1844 echo "${pbuild}"
1845 }
1846
1847 # returns pcat from magename
1848 # magename2pcat /PATH/TO/MAGE/FILE
1849 magename2pcat()
1850 {
1851 local i pcat
1852
1853 if [[ ${2} = installdb ]]
1854 then
1855 # go 1 dir back
1856 i="${1%/*}"
1857 else
1858 # go 2 dirs back
1859 i="${1%/*/*}"
1860 fi
1861
1862 # get basename
1863 pcat="${i##*/}"
1864 echo "${pcat}"
1865 }
1866
1867 # returns pcat from DEPEND (without operand ! PCAT/PNAME-VERSION)
1868 # dep2pcat DEPEND
1869 dep2pcat()
1870 {
1871 local pcat
1872
1873 pcat="${1%/*}"
1874 echo "${pcat}"
1875 }
1876
1877 # returns pname from DEPEND (without operand ! PCAT/PNAME-VERSION)
1878 # $2=virtual is used to resolv VDEPEND from virtual packages
1879 # dep2pcat DEPEND (virtual)
1880 dep2pname()
1881 {
1882 local pname
1883
1884 pname="${1##*/}"
1885
1886 # cut version only if not virtual or it will cut the name
1887 if [[ $(dep2pcat $1) != virtual ]] && \
1888 [[ $2 != virtual ]]
1889 then
1890 pname="${pname%-*}"
1891 fi
1892
1893 echo "${pname}"
1894 }
1895
1896 dep2highest_magefile()
1897 {
1898 local pcat
1899 local pname
1900 local magefile
1901 local installed_virtuals
1902
1903 pcat="$(dep2pcat $1)"
1904 pname="$(dep2pname $1)"
1905
1906 if [[ ${pcat} = virtual ]]
1907 then
1908 # first check if virtual is already installed
1909 installed_virtuals="$(virtuals_read ${pcat}/${pname} showpkgs)"
1910 if [ -n "${installed_virtuals}" ]
1911 then
1912 for vpkg in ${installed_virtuals}
1913 do
1914 realpkgname="${vpkg}"
1915 virtualpkgname="${pcat}/${pname}"
1916 pcat="$(dep2pcat ${realpkgname})"
1917 pname="$(dep2pname ${realpkgname} virtual)"
1918 done
1919 else
1920 # choose one from virtualdb defaults (virtuals.defaults)
1921 realpkgname="$(default_virtualname_to_pkgname ${pcat}/${pname})"
1922 virtualpkgname="${pcat}/${pname}"
1923 pcat="$(dep2pcat ${realpkgname})"
1924 pname="$(dep2pname ${realpkgname} virtual)"
1925 fi
1926 fi
1927
1928 magefile="$(get_highest_magefile ${pcat} ${pname})"
1929 echo "${magefile}"
1930 }
1931
1932 # is_installed ${PCAT}/${PNAME}-${PVER}-${PBUILD}
1933 is_installed()
1934 {
1935 local fullpkgname="$1"
1936
1937 # return 0 if installed
1938 [ -d ${MROOT}${INSTALLDB}/${fullpkgname} ] && return 0
1939
1940 return 1
1941 }
1942
1943 install_packages()
1944 {
1945 local list="$@"
1946 local pkg
1947 local pcat
1948 local pname
1949 local pver
1950 local pbuild
1951 local total_pkgs
1952 local current_pkg
1953 local src_install
1954 local uninstall_list
1955
1956 # check for --src-install
1957 if [[ $1 = --src-install ]]
1958 then
1959 # remove --src-install from list
1960 list=${list/--src-install/}
1961 # enable src-install
1962 src_install="--src-install"
1963 fi
1964
1965 # reset MAGE_PROTECT_COUNTER
1966 declare -i MAGE_PROTECT_COUNTER=0
1967 export MAGE_PROTECT_COUNTER
1968
1969 # get count of total packages
1970 declare -i total_pkgs=0
1971 declare -i current_pkg=0
1972 for i in ${list}; do (( total_pkgs++ )); done
1973
1974 echo
1975
1976 if [[ -n ${MROOT} ]]
1977 then
1978 echo -ne ${COLRED}
1979 echo "!! installing in MROOT=${MROOT}"
1980 echo -ne ${COLDEFAULT}
1981 echo
1982 fi
1983
1984 for pkg in ${list}
1985 do
1986 (( current_pkg++ ))
1987 pcat=$(magename2pcat ${pkg})
1988 pname=$(magename2pname ${pkg})
1989 pver=$(magename2pver ${pkg})
1990 pbuild=$(magename2pbuild ${pkg})
1991
1992 mage_install \
1993 --pcat ${pcat} \
1994 --pname ${pname} \
1995 --pver ${pver} \
1996 --pbuild ${pbuild} \
1997 --count-total ${total_pkgs} \
1998 --count-current ${current_pkg} \
1999 ${src_install}
2000
2001 # check for allready installed packages and remove them
2002 # except the package we have installed
2003 uninstall_list="$(get_uninstall_candidates \
2004 --pcat "${pcat}" \
2005 --pname "${pname}" \
2006 --protected ${pcat}/${pname}-${pver}-${pbuild})"
2007
2008 # uninstall all packges in uninstall_list if not empty
2009 if [ -n "${uninstall_list}" ]
2010 then
2011 echo
2012 uninstall_packages ${uninstall_list} \
2013 || die "install_packges() uninstalling not-needed."
2014 fi
2015
2016 # crlf for better view in VERBOSE mode
2017 #if [[ ${VERBOSE} = on ]]; then echo; fi
2018 echo
2019 done
2020
2021 #echo "DEBUG MAGE_PROTECT_COUNTER=${MAGE_PROTECT_COUNTER}"
2022 show_etc_update_mesg
2023 }
2024
2025 # get_value_from_magefile VARIABLE
2026 # returns the content of this VAR
2027 get_value_from_magefile()
2028 {
2029 local var="$1"
2030 local magefile="$2"
2031 local value
2032
2033 # local all possible vars of a mage file
2034 # to prevent bad issues
2035 local PKGNAME
2036 local STATE
2037 local DESCRIPTION
2038 local HOMEPAGE
2039 local DEPEND
2040 local SDEPEND
2041 local PROVIDE
2042 local PKGTYPE
2043 local preinstall
2044 local postinstall
2045 local preremove
2046 local postremove
2047
2048 # sanity checks
2049 [ -f ${magefile} ] && source ${magefile} || \
2050 die "get_value_from_magefile: ${magefile} not found."
2051 [ -z "${var}" ] && die "get_value_from_magefile: \$var not given."
2052
2053 source ${magefile}
2054 eval value=\$$(echo ${var})
2055 echo "${value}"
2056
2057 # unset these functions
2058 unset -f preinstall
2059 unset -f postinstall
2060 unset -f preremove
2061 unset -f postremove
2062 }
2063
2064 mage_install()
2065 {
2066 # local all possible vars of a mage file
2067 # to prevent bad issues
2068 local PKGNAME
2069 local STATE
2070 local DESCRIPTION
2071 local HOMEPAGE
2072 local DEPEND
2073 local SDEPEND
2074 local PROVIDE
2075 local PKGTYPE
2076 local preinstall
2077 local postinstall
2078 local preremove
2079 local postremove
2080
2081 local pcat
2082 local pname
2083 local pver
2084 local pbuild
2085 local count_total
2086 local count_current
2087 local magefile
2088 local src_install
2089
2090 # very basic getops
2091 for i in $*
2092 do
2093 case $1 in
2094 --pcat|-c) shift; pcat="$1" ;;
2095 --pname|-n) shift; pname="$1" ;;
2096 --pver|-v) shift; pver="$1" ;;
2097 --pbuild|-b) shift; pbuild="$1" ;;
2098 --count-total) shift; count_total="$1" ;;
2099 --count-current) shift; count_current="$1" ;;
2100 --src-install|-s) shift; src_install=true ;;
2101 esac
2102 shift
2103 done
2104
2105 # sanity checks; abort if not given
2106 [ -z "${pcat}" ] && die "mage_install() \$pcat not given."
2107 [ -z "${pname}" ] && die "mage_install() \$pname not given."
2108 [ -z "${pver}" ] && die "mage_install() \$pver not given."
2109 [ -z "${pbuild}" ] && die "mage_install() \$pbuild not given."
2110
2111 # check needed global vars
2112 [ -z "${MAGEDIR}" ] && die "mage_install() \$MAGEDIR not set."
2113 [ -z "${INSTALLDB}" ] && die "mage_install() \$INSTALLDB not set."
2114 [ -z "${BUILDDIR}" ] && die "mage_install() \$BUILDDIR not set."
2115
2116 xtitle "[ (${count_current}/${count_total}) Installing ${pcat}/${pname}-${pver}-${pbuild} ]"
2117 echo -ne "${COLBLUE} >>> ${COLDEFAULT}"
2118 echo -n "installing (${count_current}/${count_total}): "
2119 echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2120 echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}"
2121
2122 magefile="${MAGEDIR}/${pcat}/${pname}/${pname}-${pver}-${pbuild}.mage"
2123 source ${magefile}
2124
2125 # abort on sources if no srcinstall
2126 if [[ ${PKGTYPE} = sources ]] && [[ ${src_install} != true ]]
2127 then
2128 echo
2129 echo -e "This Package is a Source Package."
2130 echo
2131 echo -e "Only 'srcinstall' works with this type of packages"
2132 echo -en "If you have done a srcinstall before, "
2133 echo -e "you will find the files in /usr/src."
2134 echo
2135 exit 1
2136 fi
2137
2138 ## preinstall scripts
2139 if [ -n "$(typeset -f preinstall)" ]
2140 then
2141 echo -e " ${COLBLUE}***${COLDEFAULT} running preinstall ... "
2142 preinstall
2143 unset preinstall
2144 fi
2145
2146 if [[ ${src_install} = true ]]
2147 then
2148 local smage2file
2149 # check needed global vars
2150 [ -z "${SMAGESCRIPTSDIR}" ] && die "\$SMAGESCRIPTSDIR not set."
2151 [ -z "${SOURCEDIR}" ] && die "\$SOURCEDIR not set."
2152 [ -z "${BINDIR}" ] && die "\$BINDIR not set."
2153
2154 # build the package first
2155 if [[ ${MAGEDEBUG} = on ]]
2156 then
2157 echo M:${pname}
2158 echo V:${pver}
2159 echo B:${pbuild}
2160 fi
2161
2162 smage2file=${SMAGESCRIPTSDIR}/${pname}/${pname}-${pver}-${pbuild}.smage2
2163 if [ -f "${smage2file}" ]
2164 then
2165 smage2 ${smage2file} || die "compile failed"
2166 else
2167 echo
2168 echo "$(basename ${SMAGEFILE}) not found."
2169 echo "update your smage-tree and try it again."
2170 echo
2171 die
2172 fi
2173 fi
2174
2175 if [[ ${PKGTYPE} != virtual ]] && \
2176 [[ ${PKGTYPE} != sources ]]
2177 then
2178 # show a verbose message on src-install
2179 if [[ ${src_install} = true ]]
2180 then
2181 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2182 echo -ne "merging files: "
2183 echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2184 echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}"
2185 fi
2186 build_doinstall ${PKGNAME}
2187 fi
2188
2189 ## postinstall scripts
2190 if [ -n "$(typeset -f postinstall)" ]
2191 then
2192 echo -e " ${COLBLUE}***${COLDEFAULT} running postinstall ... "
2193 postinstall
2194 unset postinstall
2195 fi
2196
2197 # install a database entry
2198 install_database_entry \
2199 --pcat "${pcat}" \
2200 --pname "${pname}" \
2201 --pver "${pver}" \
2202 --pbuild "${pbuild}" \
2203 --pkgname "${PKGNAME}" \
2204 --pkgtype "${PKGTYPE}" \
2205 || die "error in mage_install() running install_database_entry()."
2206
2207 # remove the package dir now
2208 if [ -d ${BUILDDIR}/${PKGNAME} ]
2209 then
2210 rm -rf ${BUILDDIR}/${PKGNAME}
2211 fi
2212
2213 # rebuilds toplevel info node
2214 if [[ ${MAGE_INFO_REBUILD} = true ]]
2215 then
2216 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2217 echo -n "rebuilding top-level info node ... "
2218 ${MLIBDIR}/mkinfodir ${MROOT}/usr/share/info \
2219 > ${MROOT}/usr/share/info/dir && \
2220 echo "done." || echo "failure."
2221 unset MAGE_INFO_REBUILD
2222 fi
2223
2224 # rebuilds the enviroment with the content of /etc/env.d
2225 if [[ ${MAGE_ENV_REBUILD} = true ]]
2226 then
2227 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2228 echo -n "rebuilding environment ... "
2229 ${MLIBDIR}/env-rebuild.sh > /dev/null && \
2230 echo "done." || echo "failure."
2231 unset MAGE_ENV_REBUILD
2232 fi
2233
2234 xtitleclean
2235
2236 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2237 echo -n "package "
2238 # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2239 # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} "
2240 echo "successfully installed."
2241
2242 # unset these functions
2243 unset -f preinstall
2244 unset -f postinstall
2245 unset -f preremove
2246 unset -f postremove
2247 }
2248
2249 md5sum_packages()
2250 {
2251 local list="$@"
2252 local magefile
2253 local pcat
2254 local pname
2255 local pkgname
2256 local pkgfile
2257 local pkgtype
2258 local count_current
2259 local count_total
2260
2261 # get count of total packages
2262 declare -i count_current=0
2263 declare -i count_total=0
2264
2265 for i in ${list}; do (( count_total++ )); done
2266
2267 for magefile in ${list}
2268 do
2269 pcat=$(magename2pcat ${magefile})
2270 pname=$(magename2pname ${magefile})
2271 pkgname="$(get_value_from_magefile PKGNAME ${magefile})"
2272 md5file="${MAGEDIR}/${pcat}/${pname}/md5/${pkgname}.md5"
2273 pkgfile="$(get_value_from_magefile PKGNAME ${magefile}).${PKGSUFFIX}"
2274 pkgtype="$(get_value_from_magefile PKGTYPE ${magefile})"
2275
2276 (( count_current++ ))
2277 xtitle "[ (${count_current}/${count_total}) MD5SUM: ${pkgfile} ]"
2278
2279 # abort on virtual pkg
2280 if [[ ${pkgtype} = virtual ]]
2281 then
2282 echo -ne " ${COLBLUE}---${COLDEFAULT}"
2283 echo " !md5sum virtual (${count_current}/${count_total}): ${pkgfile/.${PKGSUFFIX}/} ... "
2284 continue
2285 fi
2286
2287 # abort on sources pkg
2288 if [[ ${pkgtype} = sources ]]
2289 then
2290 echo -ne " ${COLBLUE}---${COLDEFAULT}"
2291 echo " !md5sum sources (${count_current}/${count_total}): ${pkgfile/.${PKGSUFFIX}/} ... "
2292 continue
2293 fi
2294
2295 if [ -f "${md5file}" ]
2296 then
2297 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2298 echo -ne "checking md5sum (${count_current}/${count_total}): "
2299 ( cd ${PKGDIR}; md5sum --check ${md5file}) || die "md5 for ${pkgfile} failed"
2300 else
2301 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2302 echo -e "!! no md5sum file found for ${pkgfile} :("
2303 fi
2304 done
2305
2306 # add a crlf for a better view
2307 if [ ${count_total} -gt 1 ]; then echo; fi
2308 }
2309
2310 ## uninstall_packages ulist
2311 uninstall_packages()
2312 {
2313 local list="$@"
2314 local pcat
2315 local pname
2316 local pver
2317 local pbuild
2318 local can_pcat
2319 local can_pname
2320 local can_ver_list
2321
2322 if [[ -n ${MROOT} ]]
2323 then
2324 echo -ne ${COLRED}
2325 echo "!! uninstalling from MROOT=${MROOT}"
2326 echo -ne ${COLDEFAULT}
2327 echo
2328 fi
2329
2330 # generate a candidates list
2331 for pkg in ${list}
2332 do
2333 pcat=$(dep2pcat ${pkg})
2334 pname=$(magename2pname ${pkg})
2335 pver=$(magename2pver ${pkg})
2336 pbuild=$(magename2pbuild ${pkg})
2337 can_pcat="${pcat}"
2338 can_pname="${pname}"
2339
2340 if [ -z "${can_ver_list}" ]
2341 then
2342 can_ver_list=" ${pver}-${pbuild}"
2343 else
2344 can_ver_list="${can_ver_list}, ${pver}-${pbuild}"
2345 fi
2346 done
2347
2348 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2349 echo "following candidate(s) will be removed:"
2350 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2351 echo -ne "${COLBOLD}${can_pcat}/${can_pname}:${COLDEFAULT}"
2352 echo -e "${COLRED} ${can_ver_list} ${COLDEFAULT}"
2353 echo
2354 if [ ${MAGE_UNINSTALL_TIMEOUT} -gt 0 ]
2355 then
2356 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2357 echo "( Press [CTRL+C] to abort )"
2358 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2359 echo -n "Waiting ${MAGE_UNINSTALL_TIMEOUT} seconds ..."
2360 for ((i=MAGE_UNINSTALL_TIMEOUT; i >= 0; i--))
2361 do
2362 echo -ne "${COLRED} ${i}${COLDEFAULT}"
2363 sleep 1
2364 done
2365 echo
2366 echo
2367 fi
2368
2369 for pkg in ${list}
2370 do
2371 pcat=$(dep2pcat ${pkg})
2372 pname=$(magename2pname ${pkg})
2373 pver=$(magename2pver ${pkg})
2374 pbuild=$(magename2pbuild ${pkg})
2375
2376 mage_uninstall \
2377 --pcat ${pcat} \
2378 --pname ${pname} \
2379 --pver ${pver} \
2380 --pbuild ${pbuild} \
2381 --count-total ${total_pkgs} \
2382 --count-current ${current_pkg} \
2383 ${src_install}
2384
2385 # crlf for better view in VERBOSE mode
2386 #if [[ ${VERBOSE} = on ]]; then echo; fi
2387 echo
2388 done
2389 }
2390
2391 mage_uninstall()
2392 {
2393 # local all possible vars of a mage file
2394 # to prevent bad issues
2395 local PKGNAME
2396 local STATE
2397 local DESCRIPTION
2398 local HOMEPAGE
2399 local DEPEND
2400 local SDEPEND
2401 local PROVIDE
2402 local PKGTYPE
2403 local preinstall
2404 local postinstall
2405 local preremove
2406 local postremove
2407
2408 local pcat
2409 local pname
2410 local pver
2411 local pbuild
2412 local magefile
2413 local i
2414
2415 # very basic getops
2416 for i in $*
2417 do
2418 case $1 in
2419 --pcat|-c) shift; pcat="$1" ;;
2420 --pname|-n) shift; pname="$1" ;;
2421 --pver|-v) shift; pver="$1" ;;
2422 --pbuild|-b) shift; pbuild="$1" ;;
2423 esac
2424 shift
2425 done
2426
2427 # sanity checks; abort if not given
2428 [ -z "${pcat}" ] && die "mage_uninstall() \$pcat not given."
2429 [ -z "${pname}" ] && die "mage_uninstall() \$pname not given."
2430 [ -z "${pver}" ] && die "mage_uninstall() \$pver not given."
2431 [ -z "${pbuild}" ] && die "mage_uninstall() \$pbuild not given."
2432
2433 # check needed global vars
2434 [ -z "${MAGEDIR}" ] && die "mage_uninstall() \$MAGEDIR not set."
2435 [ -z "${INSTALLDB}" ] && die "mage_uninstall() \$INSTALLDB not set."
2436 [ -z "${BUILDDIR}" ] && die "mage_uninstall() \$BUILDDIR not set."
2437
2438 xtitle "[ (${count_current}/${count_total}) Removing ${pcat}/${pname}-${pver}-${pbuild} ]"
2439 echo -ne "${COLBLUE} <<< ${COLDEFAULT}"
2440 echo -n "removing: "
2441 echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2442 echo -e "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT}"
2443
2444 magefile="${INSTALLDB}/${pcat}/${pname}-${pver}-${pbuild}/${pname}-${pver}-${pbuild}.mage"
2445 source ${magefile}
2446
2447 ## preremove scripts
2448 if [ -n "$(typeset -f preremove)" ]
2449 then
2450 echo -e " ${COLBLUE}***${COLDEFAULT} running preremove ... "
2451 preremove
2452 unset preremove
2453 fi
2454
2455 # runs uninstall
2456 build_douninstall \
2457 --pcat "${pcat}" \
2458 --pname "${pname}" \
2459 --pver "${pver}" \
2460 --pbuild "${pbuild}"
2461
2462 ## postremove scripts
2463 if [ -n "$(typeset -f postremove)" ]
2464 then
2465 echo -e " ${COLBLUE}***${COLDEFAULT} running postremove ... "
2466 postremove
2467 unset postremove
2468 fi
2469
2470 # removes the database entry
2471 remove_database_entry \
2472 --pcat "${pcat}" \
2473 --pname "${pname}" \
2474 --pver "${pver}" \
2475 --pbuild "${pbuild}" \
2476 || die "error in mage_uninstall() running remove_database_entry()."
2477
2478 # rebuilds toplevel info node
2479 if [[ ${MAGE_INFO_REBUILD} = true ]]
2480 then
2481 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2482 echo -n "rebuilding top-level info node ... "
2483 ${MLIBDIR}/mkinfodir ${MROOT}/usr/share/info \
2484 > ${MROOT}/usr/share/info/dir && \
2485 echo "done." || echo "failure."
2486 unset MAGE_INFO_REBUILD
2487 fi
2488
2489 # rebuilds the enviroment with the content of /etc/env.d
2490 if [[ ${MAGE_ENV_REBUILD} = true ]]
2491 then
2492 echo -ne "${COLBLUE} *** ${COLDEFAULT}"
2493 echo -n "rebuilding environment ... "
2494 ${MLIBDIR}/env-rebuild.sh > /dev/null && \
2495 echo "done." || echo "failure."
2496 unset MAGE_ENV_REBUILD
2497 fi
2498
2499 echo -ne "${COLBLUE} --- ${COLDEFAULT}"
2500 echo -n "package "
2501 # echo -ne "${COLBLUE}${pcat}/${COLDEFAULT}"
2502 # echo -ne "${COLGREEN}${pname}-${pver}-${pbuild}${COLDEFAULT} "
2503 echo "successfully removed."
2504
2505 # unset these functions
2506 unset -f preinstall
2507 unset -f postinstall
2508 unset -f preremove
2509 unset -f postremove
2510 }
2511
2512 show_etc_update_mesg() {
2513 [ ${MAGE_PROTECT_COUNTER} -eq 0 ] && return 0
2514
2515 echo
2516 echo -ne "${COLRED}"
2517 echo "Important:"
2518 echo -ne ${COLDEFAULT}
2519 echo "${MAGE_PROTECT_COUNTER} protected file(s) were installed."
2520 echo
2521 echo "Please run 'etc-update' to update your configuration files."
2522 echo
2523 }
2524
2525 pkgsearch()
2526 {
2527 local string="$1"
2528 local result
2529 local pkg
2530 local pcat
2531 local pname
2532 local magefile
2533 local pver
2534 local pbuild
2535 local state
2536 local descriptiom
2537 local homepage
2538 local i
2539 local all_installed
2540 local ipver
2541 local ipbuild
2542
2543 # only names no versions
2544 result="$(find ${MAGEDIR} -mindepth 2 -maxdepth 2 -type d -name *${string}*)"
2545 #result="$(find ${MAGEDIR} -type f -name *${string}*.mage | sort)"
2546
2547 # nothing found
2548 [[ -z ${result} ]] && die "No package found containing '${string}' in the name."
2549
2550 for pkg in ${result}
2551 do
2552 # dirty, but does the job
2553 pcat="$(magename2pcat ${pkg}/foo)"
2554 pname="$(magename2pname ${pkg}-foo-foo)"
2555
2556 # get highest version available
2557 magefile=$(get_highest_magefile ${pcat} ${pname})
2558
2559 # now get all needed infos to print a nice output
2560 pver="$(magename2pver ${magefile})"
2561 pbuild="$(magename2pbuild ${magefile})"
2562 state="$(get_value_from_magefile STATE ${magefile})"
2563 description="$(get_value_from_magefile DESCRIPTION ${magefile})"
2564 homepage="$(get_value_from_magefile HOMEPAGE ${magefile})"
2565
2566 # all installed
2567 for i in $(get_uninstall_candidates --pname ${pname} --pcat ${pcat})
2568 do
2569 ipver="$(magename2pver ${i})"
2570 ipbuild="$(magename2pbuild ${i})"
2571
2572 if [[ -z ${all_installed} ]]
2573 then
2574 all_installed="${ipver}-${ipbuild}"
2575 else
2576 all_installed="${all_installed} ${ipver}-${ipbuild}"
2577 fi
2578 done
2579 [[ -z ${all_installed} ]] && all_installed="none"
2580
2581 case ${state} in
2582 stable) state=${COLGREEN}"[s] ";;
2583 testing) state=${COLYELLOW}"[t] ";;
2584 unstable) state=${COLRED}"[u] ";;
2585 old) state=${COLGRAY}"[o] ";;
2586 esac
2587
2588 echo -e "${state}${pcat}/${pname}"${COLDEFAULT}
2589 echo " Latest available: ${pver}-${pbuild}"
2590 echo " Installed versions: ${all_installed}"
2591 echo " Description: ${description}"
2592 echo " Homepage: ${homepage}"
2593 echo
2594
2595 unset pcat
2596 unset pname
2597 unset magefile
2598 unset pver
2599 unset pbuild
2600 unset state
2601 unset descriptiom
2602 unset homepage
2603 unset all_installed
2604 unset ipver
2605 unset ipbuild
2606 done
2607 }
2608
2609 export_inherits()
2610 {
2611 local include="$1"
2612 shift
2613
2614 while [ "$1" ]
2615 do
2616 local functions="$1"
2617
2618 # sanity checks
2619 [ -z "${include}" ] && die "export_inherits(): \$include not given."
2620 [ -z "${functions}" ] && die "export_inherits(): \$functions not given."
2621
2622 eval "${functions}() { ${include}_${functions} ; }"
2623
2624 # debug
2625 [[ ${MAGEDEBUG} = on ]] && typeset -f "${functions}"
2626
2627 shift
2628 done
2629 }